iszolea-ui 1.2.1 → 1.2.2
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.
|
@@ -8490,6 +8490,9 @@
|
|
|
8490
8490
|
this.lastStateChecked = new Date();
|
|
8491
8491
|
this.callback();
|
|
8492
8492
|
}
|
|
8493
|
+
dispose() {
|
|
8494
|
+
this.activeTimerId--;
|
|
8495
|
+
}
|
|
8493
8496
|
tickTimerFunction(timerId) {
|
|
8494
8497
|
if (timerId !== this.activeTimerId) {
|
|
8495
8498
|
return;
|
|
@@ -8634,7 +8637,8 @@
|
|
|
8634
8637
|
this.initInternal();
|
|
8635
8638
|
}
|
|
8636
8639
|
refresh() {
|
|
8637
|
-
|
|
8640
|
+
var _a3;
|
|
8641
|
+
(_a3 = this.grid) == null ? void 0 : _a3.refresh();
|
|
8638
8642
|
}
|
|
8639
8643
|
dispose() {
|
|
8640
8644
|
var _a3, _b3, _c, _d;
|
|
@@ -9614,7 +9618,8 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
9614
9618
|
return DASHBOARD_MODE_KEY + this.reportId;
|
|
9615
9619
|
}
|
|
9616
9620
|
refresh() {
|
|
9617
|
-
|
|
9621
|
+
var _a3;
|
|
9622
|
+
(_a3 = this.dashboard) == null ? void 0 : _a3.refresh();
|
|
9618
9623
|
}
|
|
9619
9624
|
};
|
|
9620
9625
|
function removeRedundantToolboxItems(control) {
|
|
@@ -9628,6 +9633,238 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
9628
9633
|
});
|
|
9629
9634
|
}
|
|
9630
9635
|
|
|
9636
|
+
// src/Scripts/Reports/Pages/GanntChart/Index.ts
|
|
9637
|
+
var GanttTasksColumnType = /* @__PURE__ */ ((GanttTasksColumnType2) => {
|
|
9638
|
+
GanttTasksColumnType2[GanttTasksColumnType2["Key"] = 1] = "Key";
|
|
9639
|
+
GanttTasksColumnType2[GanttTasksColumnType2["Title"] = 2] = "Title";
|
|
9640
|
+
GanttTasksColumnType2[GanttTasksColumnType2["Start"] = 3] = "Start";
|
|
9641
|
+
GanttTasksColumnType2[GanttTasksColumnType2["End"] = 4] = "End";
|
|
9642
|
+
GanttTasksColumnType2[GanttTasksColumnType2["ParentId"] = 5] = "ParentId";
|
|
9643
|
+
GanttTasksColumnType2[GanttTasksColumnType2["Progress"] = 6] = "Progress";
|
|
9644
|
+
return GanttTasksColumnType2;
|
|
9645
|
+
})(GanttTasksColumnType || {});
|
|
9646
|
+
var GanntChart = class {
|
|
9647
|
+
constructor(options) {
|
|
9648
|
+
this.SWITCH_TO_DESIGNER_TEXT = "Switch to Designer";
|
|
9649
|
+
this.SWITCH_TO_VIEWER_TEXT = "Switch to Viewer";
|
|
9650
|
+
this.CHART_STORAGE_MODE_KEY = "CHART_STORAGE_MODE_KEY";
|
|
9651
|
+
this.hasForm = false;
|
|
9652
|
+
this.chart = null;
|
|
9653
|
+
this.chartPositionMarker = options.chartPositionMarker;
|
|
9654
|
+
this.reportParams = options.reportParams;
|
|
9655
|
+
this.addRefreshButton = options.addRefreshButton;
|
|
9656
|
+
this.allowEditing = options.allowEditing;
|
|
9657
|
+
this.ganttReportControllerUrl = options.ganttReportControllerUrl;
|
|
9658
|
+
this.showHeader = options.showHeader;
|
|
9659
|
+
this.mode = window.sessionStorage.getItem(this.getSessionKey()) || "Viewer" /* Viewer */;
|
|
9660
|
+
}
|
|
9661
|
+
init() {
|
|
9662
|
+
let ganttSettings = {
|
|
9663
|
+
DbConnectionName: "",
|
|
9664
|
+
TableName: "",
|
|
9665
|
+
TaskColumns: [],
|
|
9666
|
+
ResourcesTableName: "",
|
|
9667
|
+
ResourcesTextField: "",
|
|
9668
|
+
ResourcesKeyField: "",
|
|
9669
|
+
ResourceAssignmentTaskIdField: "",
|
|
9670
|
+
ResourceAssignmentResourceIdField: "",
|
|
9671
|
+
ResourceAssignmentKeyField: "",
|
|
9672
|
+
ResourceAssignmentTableName: ""
|
|
9673
|
+
};
|
|
9674
|
+
const columns = [];
|
|
9675
|
+
let isInitialized = false;
|
|
9676
|
+
sendRequest(`${this.ganttReportControllerUrl}/GetGanttChartSettings`, "post", { id: this.reportParams.ReportId }, false, { dataType: "json" }).then((data) => {
|
|
9677
|
+
ganttSettings = data;
|
|
9678
|
+
if (!ganttSettings.DbConnectionName || !ganttSettings.TableName || !ganttSettings.TaskColumns || !ganttSettings.TaskColumns.length) {
|
|
9679
|
+
ganttSettings.TaskColumns = [];
|
|
9680
|
+
for (let item = 0; item < 6; item++) {
|
|
9681
|
+
ganttSettings.TaskColumns.push({ taskColumnType: GanttTasksColumnType[GanttTasksColumnType[item + 1]] });
|
|
9682
|
+
}
|
|
9683
|
+
this.setupForm(ganttSettings, true);
|
|
9684
|
+
return;
|
|
9685
|
+
}
|
|
9686
|
+
data.TaskColumns.forEach((c) => {
|
|
9687
|
+
columns[c.taskColumnType - 1] = c;
|
|
9688
|
+
});
|
|
9689
|
+
ganttSettings.TaskColumns = columns;
|
|
9690
|
+
isInitialized = true;
|
|
9691
|
+
return sendRequest(`${this.ganttReportControllerUrl}/GetGanttChartData`, "post", { id: this.reportParams.ReportId }, false, {
|
|
9692
|
+
dataType: "json"
|
|
9693
|
+
});
|
|
9694
|
+
}).then((data) => {
|
|
9695
|
+
if (!isInitialized) {
|
|
9696
|
+
return false;
|
|
9697
|
+
}
|
|
9698
|
+
if (this.mode === "Designer" /* Designer */) {
|
|
9699
|
+
this.setupForm(ganttSettings, !isInitialized);
|
|
9700
|
+
}
|
|
9701
|
+
this.setupChart(data.Data, columns, ganttSettings);
|
|
9702
|
+
}).catch(() => {
|
|
9703
|
+
this.setupForm(ganttSettings, true);
|
|
9704
|
+
});
|
|
9705
|
+
if (this.allowEditing) {
|
|
9706
|
+
this.initSwitchModeButton();
|
|
9707
|
+
}
|
|
9708
|
+
if (this.reportParams.Details) {
|
|
9709
|
+
this.popover = initPopover(".diagram-details-link", this.reportParams.Details);
|
|
9710
|
+
}
|
|
9711
|
+
}
|
|
9712
|
+
initSwitchModeButton() {
|
|
9713
|
+
const button = $(".switch-mode-btn").dxButton({
|
|
9714
|
+
text: this.mode === "Viewer" /* Viewer */ ? this.SWITCH_TO_DESIGNER_TEXT : this.SWITCH_TO_VIEWER_TEXT,
|
|
9715
|
+
onClick: () => {
|
|
9716
|
+
this.mode = this.mode === "Viewer" /* Viewer */ ? "Designer" /* Designer */ : "Viewer" /* Viewer */;
|
|
9717
|
+
window.sessionStorage.setItem(this.getSessionKey(), this.mode);
|
|
9718
|
+
button.option("text", this.mode === "Viewer" /* Viewer */ ? this.SWITCH_TO_DESIGNER_TEXT : this.SWITCH_TO_VIEWER_TEXT);
|
|
9719
|
+
window.location.reload();
|
|
9720
|
+
}
|
|
9721
|
+
}).addClass("iszolea-md").dxButton("instance");
|
|
9722
|
+
}
|
|
9723
|
+
setupForm(ganttSettings, initialSetup) {
|
|
9724
|
+
this.hasForm = true;
|
|
9725
|
+
const formItems = [
|
|
9726
|
+
{ dataField: "DbConnectionName", caption: "Connection Name" },
|
|
9727
|
+
{ dataField: "TableName", caption: "Table" }
|
|
9728
|
+
];
|
|
9729
|
+
for (let item = 1; item < 7; item++) {
|
|
9730
|
+
formItems.push({
|
|
9731
|
+
itemType: "group",
|
|
9732
|
+
colCount: 8,
|
|
9733
|
+
items: [
|
|
9734
|
+
{ dataField: `TaskColumns[${item - 1}].taskColumnType`, visible: false },
|
|
9735
|
+
{ dataField: `TaskColumns[${item - 1}].dataField`, label: { location: "top", text: `${GanttTasksColumnType[item]} Data Field` } },
|
|
9736
|
+
{ dataField: `TaskColumns[${item - 1}].caption`, label: { location: "top", text: "Caption" } },
|
|
9737
|
+
{ dataField: `TaskColumns[${item - 1}].dataType`, label: { location: "top", text: "DataType" } },
|
|
9738
|
+
{ dataField: `TaskColumns[${item - 1}].width`, label: { location: "top", text: "Width" }, editorType: "dxNumberBox" },
|
|
9739
|
+
{ dataField: `TaskColumns[${item - 1}].sortIndex`, label: { location: "top", text: "SortIndex" }, editorType: "dxNumberBox" },
|
|
9740
|
+
{ dataField: `TaskColumns[${item - 1}].sortOrder`, label: { location: "top", text: "SortOrder" }, editorType: "dxSelectBox", editorOptions: { items: ["asc", "desc"], showClearButton: true } },
|
|
9741
|
+
{ dataField: `TaskColumns[${item - 1}].visible`, label: { location: "top", text: "Visible" }, editorType: "dxCheckBox" },
|
|
9742
|
+
{ dataField: `TaskColumns[${item - 1}].visibleIndex`, label: { location: "top", text: "VisibleIndex" } }
|
|
9743
|
+
]
|
|
9744
|
+
});
|
|
9745
|
+
}
|
|
9746
|
+
formItems.push({
|
|
9747
|
+
itemType: "group",
|
|
9748
|
+
caption: "Resources",
|
|
9749
|
+
colCount: 4,
|
|
9750
|
+
items: [
|
|
9751
|
+
{ dataField: "ResourcesTableName", label: { location: "top", text: "Table" }, colSpan: 2 },
|
|
9752
|
+
{ dataField: "ResourcesKeyField", label: { location: "top", text: "Key Field" } },
|
|
9753
|
+
{ dataField: "ResourcesTextField", label: { location: "top", text: "Text Field" } }
|
|
9754
|
+
]
|
|
9755
|
+
});
|
|
9756
|
+
formItems.push({
|
|
9757
|
+
itemType: "group",
|
|
9758
|
+
caption: "Resource Assignments",
|
|
9759
|
+
colCount: 5,
|
|
9760
|
+
items: [
|
|
9761
|
+
{ dataField: "ResourceAssignmentTableName", label: { location: "top", text: "Table" }, colSpan: 2 },
|
|
9762
|
+
{ dataField: "ResourceAssignmentKeyField", label: { location: "top", text: "Key Field" } },
|
|
9763
|
+
{ dataField: "ResourceAssignmentTaskIdField", label: { location: "top", text: "Task Id Field" } },
|
|
9764
|
+
{ dataField: "ResourceAssignmentResourceIdField", label: { location: "top", text: "Resource Id Field" } }
|
|
9765
|
+
]
|
|
9766
|
+
});
|
|
9767
|
+
formItems.push({
|
|
9768
|
+
itemType: "button",
|
|
9769
|
+
buttonOptions: {
|
|
9770
|
+
text: "Save",
|
|
9771
|
+
onClick: () => {
|
|
9772
|
+
const data = form.option("formData");
|
|
9773
|
+
if (data.TaskColumns) {
|
|
9774
|
+
data.TaskColumns = data.TaskColumns.filter((c) => !!c.dataField);
|
|
9775
|
+
}
|
|
9776
|
+
sendRequest(`${this.ganttReportControllerUrl}/UpdateGanttChartSettings`, "post", { id: this.reportParams.ReportId, settings: JSON.stringify(form.option("formData")) }, true, { dataType: "json" }).then(() => window.location.reload());
|
|
9777
|
+
}
|
|
9778
|
+
}
|
|
9779
|
+
});
|
|
9780
|
+
const form = $("<div />").css("padding", 20).insertAfter(this.chartPositionMarker).dxForm({
|
|
9781
|
+
width: "100%",
|
|
9782
|
+
height: initialSetup ? "calc(100% - 50px)" : "calc(50% - 50px)",
|
|
9783
|
+
formData: ganttSettings,
|
|
9784
|
+
scrollingEnabled: true,
|
|
9785
|
+
items: formItems
|
|
9786
|
+
}).dxForm("instance");
|
|
9787
|
+
}
|
|
9788
|
+
setupChart(data, columns, ganttSettings) {
|
|
9789
|
+
let totalWidth = 0;
|
|
9790
|
+
let useAutoWidth = false;
|
|
9791
|
+
const columnsMapping = {};
|
|
9792
|
+
columns.forEach((c) => {
|
|
9793
|
+
if (c.taskColumnType) {
|
|
9794
|
+
columnsMapping[c.taskColumnType] = c.dataField;
|
|
9795
|
+
}
|
|
9796
|
+
});
|
|
9797
|
+
columns.filter((c) => c.visible).forEach((c) => {
|
|
9798
|
+
const w = parseInt(c.width);
|
|
9799
|
+
if (!isNaN(w)) {
|
|
9800
|
+
totalWidth += w;
|
|
9801
|
+
} else {
|
|
9802
|
+
useAutoWidth = true;
|
|
9803
|
+
}
|
|
9804
|
+
});
|
|
9805
|
+
this.chart = this.chartPositionMarker.dxGantt({
|
|
9806
|
+
width: "100%",
|
|
9807
|
+
height: this.hasForm ? "50%" : "calc(100% - 60px)",
|
|
9808
|
+
firstDayOfWeek: 6,
|
|
9809
|
+
taskListWidth: !useAutoWidth && totalWidth > 0 ? totalWidth : void 0,
|
|
9810
|
+
toolbar: {
|
|
9811
|
+
items: ["zoomIn", "zoomOut", "separator", "taskDetails"]
|
|
9812
|
+
},
|
|
9813
|
+
editing: {
|
|
9814
|
+
enabled: true
|
|
9815
|
+
},
|
|
9816
|
+
columns: columns.filter((c) => c.visible).map((c) => {
|
|
9817
|
+
return {
|
|
9818
|
+
dataField: c.dataField,
|
|
9819
|
+
dataType: c.dataType,
|
|
9820
|
+
width: c.width,
|
|
9821
|
+
visibleIndex: c.visibleIndex,
|
|
9822
|
+
sortIndex: c.sortIndex,
|
|
9823
|
+
sortOrder: c.sortOrder && (c.sortOrder === "asc" ? "asc" : "desc"),
|
|
9824
|
+
caption: c.caption || void 0
|
|
9825
|
+
};
|
|
9826
|
+
}),
|
|
9827
|
+
tasks: {
|
|
9828
|
+
dataSource: data.Tasks,
|
|
9829
|
+
keyExpr: columnsMapping[1 /* Key */],
|
|
9830
|
+
startExpr: columnsMapping[3 /* Start */],
|
|
9831
|
+
endExpr: columnsMapping[4 /* End */],
|
|
9832
|
+
parentIdExpr: columnsMapping[5 /* ParentId */],
|
|
9833
|
+
progressExpr: columnsMapping[6 /* Progress */],
|
|
9834
|
+
titleExpr: columnsMapping[2 /* Title */]
|
|
9835
|
+
},
|
|
9836
|
+
dependencies: {
|
|
9837
|
+
dataSource: data.Dependencies,
|
|
9838
|
+
keyExpr: "Id",
|
|
9839
|
+
predecessorIdExpr: "PredecessorId",
|
|
9840
|
+
successorIdExpr: "SuccessorId",
|
|
9841
|
+
typeExpr: "Type"
|
|
9842
|
+
},
|
|
9843
|
+
resources: {
|
|
9844
|
+
dataSource: data.Resources,
|
|
9845
|
+
keyExpr: ganttSettings.ResourcesKeyField,
|
|
9846
|
+
textExpr: ganttSettings.ResourcesTextField
|
|
9847
|
+
},
|
|
9848
|
+
resourceAssignments: {
|
|
9849
|
+
dataSource: data.ResourceAssignments,
|
|
9850
|
+
keyExpr: ganttSettings.ResourceAssignmentKeyField,
|
|
9851
|
+
resourceIdExpr: ganttSettings.ResourceAssignmentResourceIdField,
|
|
9852
|
+
taskIdExpr: ganttSettings.ResourceAssignmentTaskIdField
|
|
9853
|
+
}
|
|
9854
|
+
}).dxGantt("instance");
|
|
9855
|
+
}
|
|
9856
|
+
refresh() {
|
|
9857
|
+
}
|
|
9858
|
+
dispose() {
|
|
9859
|
+
var _a3;
|
|
9860
|
+
(_a3 = this.chart) == null ? void 0 : _a3.dispose();
|
|
9861
|
+
this.chart = null;
|
|
9862
|
+
}
|
|
9863
|
+
getSessionKey() {
|
|
9864
|
+
return this.CHART_STORAGE_MODE_KEY + this.reportParams.ReportId;
|
|
9865
|
+
}
|
|
9866
|
+
};
|
|
9867
|
+
|
|
9631
9868
|
// src/Scripts/Reports/Pages/Report/Index.ts
|
|
9632
9869
|
var SWITCH_TO_DESIGNER_TEXT = "Switch to Designer";
|
|
9633
9870
|
var SWITCH_TO_VIEWER_TEXT = "Switch to Viewer";
|
|
@@ -9805,9 +10042,10 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
9805
10042
|
var _a3;
|
|
9806
10043
|
this.diagram.dispose();
|
|
9807
10044
|
(_a3 = this.popover) == null ? void 0 : _a3.dispose();
|
|
10045
|
+
this.diagram = null;
|
|
9808
10046
|
}
|
|
9809
10047
|
refresh() {
|
|
9810
|
-
sendRequest(`${this.diagramControllerUrl}?id=${this.reportParams.ReportId}`, "get").then((data) => {
|
|
10048
|
+
this.diagram && sendRequest(`${this.diagramControllerUrl}?id=${this.reportParams.ReportId}`, "get").then((data) => {
|
|
9811
10049
|
this.diagram.import(JSON.stringify(data), false);
|
|
9812
10050
|
this.diagram.option("hasChanges", false);
|
|
9813
10051
|
});
|
|
@@ -9876,12 +10114,22 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
9876
10114
|
this.renderContent();
|
|
9877
10115
|
}
|
|
9878
10116
|
dispose() {
|
|
9879
|
-
this.reports
|
|
9880
|
-
|
|
9881
|
-
|
|
10117
|
+
if (!!this.reports) {
|
|
10118
|
+
this.reports.forEach((report) => {
|
|
10119
|
+
report.dispose();
|
|
10120
|
+
});
|
|
10121
|
+
while (this.reports.length) {
|
|
10122
|
+
this.reports.pop();
|
|
10123
|
+
}
|
|
10124
|
+
this.reports = null;
|
|
10125
|
+
}
|
|
10126
|
+
if (!!this.refreshTimer) {
|
|
10127
|
+
this.refreshTimer.dispose();
|
|
10128
|
+
this.refreshTimer = null;
|
|
10129
|
+
}
|
|
9882
10130
|
}
|
|
9883
10131
|
refresh() {
|
|
9884
|
-
this.reports.forEach((report) => {
|
|
10132
|
+
this.reports && this.reports.forEach((report) => {
|
|
9885
10133
|
report.refresh();
|
|
9886
10134
|
});
|
|
9887
10135
|
}
|
|
@@ -9960,6 +10208,15 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
9960
10208
|
reportParams
|
|
9961
10209
|
}));
|
|
9962
10210
|
break;
|
|
10211
|
+
case 7 /* GanttChart */:
|
|
10212
|
+
const $ganttPositionElement = $("<div />", { class: "slideshow-report__grid-position" });
|
|
10213
|
+
$slideElement.addClass("iszolea-theme").addClass("panel-body");
|
|
10214
|
+
$ganttPositionElement.appendTo($slideElement);
|
|
10215
|
+
reportSlide = new GanntChart(__spreadProps(__spreadValues({}, this.defaultReportSettings[7 /* GanttChart */] || {}), {
|
|
10216
|
+
chartPositionMarker: $ganttPositionElement,
|
|
10217
|
+
reportParams
|
|
10218
|
+
}));
|
|
10219
|
+
break;
|
|
9963
10220
|
case 2 /* MenuNode */:
|
|
9964
10221
|
case 6 /* Slideshow */:
|
|
9965
10222
|
break;
|
|
@@ -9974,241 +10231,9 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
9974
10231
|
});
|
|
9975
10232
|
this.dxGallery = $gallery.dxGallery("instance");
|
|
9976
10233
|
$gallery.appendTo($view);
|
|
9977
|
-
this.
|
|
10234
|
+
this.refreshTimer = new RefreshTimer({ callback: () => this.refresh(), elapsedCallback: (e) => {
|
|
9978
10235
|
} });
|
|
9979
|
-
this.
|
|
9980
|
-
}
|
|
9981
|
-
};
|
|
9982
|
-
|
|
9983
|
-
// src/Scripts/Reports/Pages/GanntChart/Index.ts
|
|
9984
|
-
var GanttTasksColumnType = /* @__PURE__ */ ((GanttTasksColumnType2) => {
|
|
9985
|
-
GanttTasksColumnType2[GanttTasksColumnType2["Key"] = 1] = "Key";
|
|
9986
|
-
GanttTasksColumnType2[GanttTasksColumnType2["Title"] = 2] = "Title";
|
|
9987
|
-
GanttTasksColumnType2[GanttTasksColumnType2["Start"] = 3] = "Start";
|
|
9988
|
-
GanttTasksColumnType2[GanttTasksColumnType2["End"] = 4] = "End";
|
|
9989
|
-
GanttTasksColumnType2[GanttTasksColumnType2["ParentId"] = 5] = "ParentId";
|
|
9990
|
-
GanttTasksColumnType2[GanttTasksColumnType2["Progress"] = 6] = "Progress";
|
|
9991
|
-
return GanttTasksColumnType2;
|
|
9992
|
-
})(GanttTasksColumnType || {});
|
|
9993
|
-
var GanntChart = class {
|
|
9994
|
-
constructor(options) {
|
|
9995
|
-
this.SWITCH_TO_DESIGNER_TEXT = "Switch to Designer";
|
|
9996
|
-
this.SWITCH_TO_VIEWER_TEXT = "Switch to Viewer";
|
|
9997
|
-
this.CHART_STORAGE_MODE_KEY = "CHART_STORAGE_MODE_KEY";
|
|
9998
|
-
this.hasForm = false;
|
|
9999
|
-
this.chart = null;
|
|
10000
|
-
this.chartPositionMarker = options.chartPositionMarker;
|
|
10001
|
-
this.reportParams = options.reportParams;
|
|
10002
|
-
this.addRefreshButton = options.addRefreshButton;
|
|
10003
|
-
this.allowEditing = options.allowEditing;
|
|
10004
|
-
this.ganttReportControllerUrl = options.ganttReportControllerUrl;
|
|
10005
|
-
this.showHeader = options.showHeader;
|
|
10006
|
-
this.mode = window.sessionStorage.getItem(this.getSessionKey()) || "Viewer" /* Viewer */;
|
|
10007
|
-
}
|
|
10008
|
-
init() {
|
|
10009
|
-
let ganttSettings = {
|
|
10010
|
-
DbConnectionName: "",
|
|
10011
|
-
TableName: "",
|
|
10012
|
-
TaskColumns: [],
|
|
10013
|
-
ResourcesTableName: "",
|
|
10014
|
-
ResourcesTextField: "",
|
|
10015
|
-
ResourcesKeyField: "",
|
|
10016
|
-
ResourceAssignmentTaskIdField: "",
|
|
10017
|
-
ResourceAssignmentResourceIdField: "",
|
|
10018
|
-
ResourceAssignmentKeyField: "",
|
|
10019
|
-
ResourceAssignmentTableName: ""
|
|
10020
|
-
};
|
|
10021
|
-
const columns = [];
|
|
10022
|
-
let isInitialized = false;
|
|
10023
|
-
sendRequest(`${this.ganttReportControllerUrl}/GetGanttChartSettings`, "post", { id: this.reportParams.ReportId }, false, { dataType: "json" }).then((data) => {
|
|
10024
|
-
ganttSettings = data;
|
|
10025
|
-
if (!ganttSettings.DbConnectionName || !ganttSettings.TableName || !ganttSettings.TaskColumns || !ganttSettings.TaskColumns.length) {
|
|
10026
|
-
ganttSettings.TaskColumns = [];
|
|
10027
|
-
for (let item = 0; item < 6; item++) {
|
|
10028
|
-
ganttSettings.TaskColumns.push({ taskColumnType: GanttTasksColumnType[GanttTasksColumnType[item + 1]] });
|
|
10029
|
-
}
|
|
10030
|
-
this.setupForm(ganttSettings, true);
|
|
10031
|
-
return;
|
|
10032
|
-
}
|
|
10033
|
-
data.TaskColumns.forEach((c) => {
|
|
10034
|
-
columns[c.taskColumnType - 1] = c;
|
|
10035
|
-
});
|
|
10036
|
-
ganttSettings.TaskColumns = columns;
|
|
10037
|
-
isInitialized = true;
|
|
10038
|
-
return sendRequest(`${this.ganttReportControllerUrl}/GetGanttChartData`, "post", { id: this.reportParams.ReportId }, false, {
|
|
10039
|
-
dataType: "json"
|
|
10040
|
-
});
|
|
10041
|
-
}).then((data) => {
|
|
10042
|
-
if (!isInitialized) {
|
|
10043
|
-
return false;
|
|
10044
|
-
}
|
|
10045
|
-
if (this.mode === "Designer" /* Designer */) {
|
|
10046
|
-
this.setupForm(ganttSettings, !isInitialized);
|
|
10047
|
-
}
|
|
10048
|
-
this.setupChart(data.Data, columns, ganttSettings);
|
|
10049
|
-
}).catch(() => {
|
|
10050
|
-
this.setupForm(ganttSettings, true);
|
|
10051
|
-
});
|
|
10052
|
-
if (this.allowEditing) {
|
|
10053
|
-
this.initSwitchModeButton();
|
|
10054
|
-
}
|
|
10055
|
-
if (this.reportParams.Details) {
|
|
10056
|
-
this.popover = initPopover(".diagram-details-link", this.reportParams.Details);
|
|
10057
|
-
}
|
|
10058
|
-
}
|
|
10059
|
-
initSwitchModeButton() {
|
|
10060
|
-
const button = $(".switch-mode-btn").dxButton({
|
|
10061
|
-
text: this.mode === "Viewer" /* Viewer */ ? this.SWITCH_TO_DESIGNER_TEXT : this.SWITCH_TO_VIEWER_TEXT,
|
|
10062
|
-
onClick: () => {
|
|
10063
|
-
this.mode = this.mode === "Viewer" /* Viewer */ ? "Designer" /* Designer */ : "Viewer" /* Viewer */;
|
|
10064
|
-
window.sessionStorage.setItem(this.getSessionKey(), this.mode);
|
|
10065
|
-
button.option("text", this.mode === "Viewer" /* Viewer */ ? this.SWITCH_TO_DESIGNER_TEXT : this.SWITCH_TO_VIEWER_TEXT);
|
|
10066
|
-
window.location.reload();
|
|
10067
|
-
}
|
|
10068
|
-
}).addClass("iszolea-md").dxButton("instance");
|
|
10069
|
-
}
|
|
10070
|
-
setupForm(ganttSettings, initialSetup) {
|
|
10071
|
-
this.hasForm = true;
|
|
10072
|
-
const formItems = [
|
|
10073
|
-
{ dataField: "DbConnectionName", caption: "Connection Name" },
|
|
10074
|
-
{ dataField: "TableName", caption: "Table" }
|
|
10075
|
-
];
|
|
10076
|
-
for (let item = 1; item < 7; item++) {
|
|
10077
|
-
formItems.push({
|
|
10078
|
-
itemType: "group",
|
|
10079
|
-
colCount: 8,
|
|
10080
|
-
items: [
|
|
10081
|
-
{ dataField: `TaskColumns[${item - 1}].taskColumnType`, visible: false },
|
|
10082
|
-
{ dataField: `TaskColumns[${item - 1}].dataField`, label: { location: "top", text: `${GanttTasksColumnType[item]} Data Field` } },
|
|
10083
|
-
{ dataField: `TaskColumns[${item - 1}].caption`, label: { location: "top", text: "Caption" } },
|
|
10084
|
-
{ dataField: `TaskColumns[${item - 1}].dataType`, label: { location: "top", text: "DataType" } },
|
|
10085
|
-
{ dataField: `TaskColumns[${item - 1}].width`, label: { location: "top", text: "Width" }, editorType: "dxNumberBox" },
|
|
10086
|
-
{ dataField: `TaskColumns[${item - 1}].sortIndex`, label: { location: "top", text: "SortIndex" }, editorType: "dxNumberBox" },
|
|
10087
|
-
{ dataField: `TaskColumns[${item - 1}].sortOrder`, label: { location: "top", text: "SortOrder" }, editorType: "dxSelectBox", editorOptions: { items: ["asc", "desc"], showClearButton: true } },
|
|
10088
|
-
{ dataField: `TaskColumns[${item - 1}].visible`, label: { location: "top", text: "Visible" }, editorType: "dxCheckBox" },
|
|
10089
|
-
{ dataField: `TaskColumns[${item - 1}].visibleIndex`, label: { location: "top", text: "VisibleIndex" } }
|
|
10090
|
-
]
|
|
10091
|
-
});
|
|
10092
|
-
}
|
|
10093
|
-
formItems.push({
|
|
10094
|
-
itemType: "group",
|
|
10095
|
-
caption: "Resources",
|
|
10096
|
-
colCount: 4,
|
|
10097
|
-
items: [
|
|
10098
|
-
{ dataField: "ResourcesTableName", label: { location: "top", text: "Table" }, colSpan: 2 },
|
|
10099
|
-
{ dataField: "ResourcesKeyField", label: { location: "top", text: "Key Field" } },
|
|
10100
|
-
{ dataField: "ResourcesTextField", label: { location: "top", text: "Text Field" } }
|
|
10101
|
-
]
|
|
10102
|
-
});
|
|
10103
|
-
formItems.push({
|
|
10104
|
-
itemType: "group",
|
|
10105
|
-
caption: "Resource Assignments",
|
|
10106
|
-
colCount: 5,
|
|
10107
|
-
items: [
|
|
10108
|
-
{ dataField: "ResourceAssignmentTableName", label: { location: "top", text: "Table" }, colSpan: 2 },
|
|
10109
|
-
{ dataField: "ResourceAssignmentKeyField", label: { location: "top", text: "Key Field" } },
|
|
10110
|
-
{ dataField: "ResourceAssignmentTaskIdField", label: { location: "top", text: "Task Id Field" } },
|
|
10111
|
-
{ dataField: "ResourceAssignmentResourceIdField", label: { location: "top", text: "Resource Id Field" } }
|
|
10112
|
-
]
|
|
10113
|
-
});
|
|
10114
|
-
formItems.push({
|
|
10115
|
-
itemType: "button",
|
|
10116
|
-
buttonOptions: {
|
|
10117
|
-
text: "Save",
|
|
10118
|
-
onClick: () => {
|
|
10119
|
-
const data = form.option("formData");
|
|
10120
|
-
if (data.TaskColumns) {
|
|
10121
|
-
data.TaskColumns = data.TaskColumns.filter((c) => !!c.dataField);
|
|
10122
|
-
}
|
|
10123
|
-
sendRequest(`${this.ganttReportControllerUrl}/UpdateGanttChartSettings`, "post", { id: this.reportParams.ReportId, settings: JSON.stringify(form.option("formData")) }, true, { dataType: "json" }).then(() => window.location.reload());
|
|
10124
|
-
}
|
|
10125
|
-
}
|
|
10126
|
-
});
|
|
10127
|
-
const form = $("<div />").css("padding", 20).insertAfter(this.chartPositionMarker).dxForm({
|
|
10128
|
-
width: "100%",
|
|
10129
|
-
height: initialSetup ? "calc(100% - 50px)" : "calc(50% - 50px)",
|
|
10130
|
-
formData: ganttSettings,
|
|
10131
|
-
scrollingEnabled: true,
|
|
10132
|
-
items: formItems
|
|
10133
|
-
}).dxForm("instance");
|
|
10134
|
-
}
|
|
10135
|
-
setupChart(data, columns, ganttSettings) {
|
|
10136
|
-
let totalWidth = 0;
|
|
10137
|
-
let useAutoWidth = false;
|
|
10138
|
-
const columnsMapping = {};
|
|
10139
|
-
columns.forEach((c) => {
|
|
10140
|
-
if (c.taskColumnType) {
|
|
10141
|
-
columnsMapping[c.taskColumnType] = c.dataField;
|
|
10142
|
-
}
|
|
10143
|
-
});
|
|
10144
|
-
columns.filter((c) => c.visible).forEach((c) => {
|
|
10145
|
-
const w = parseInt(c.width);
|
|
10146
|
-
if (!isNaN(w)) {
|
|
10147
|
-
totalWidth += w;
|
|
10148
|
-
} else {
|
|
10149
|
-
useAutoWidth = true;
|
|
10150
|
-
}
|
|
10151
|
-
});
|
|
10152
|
-
this.chart = this.chartPositionMarker.dxGantt({
|
|
10153
|
-
width: "100%",
|
|
10154
|
-
height: this.hasForm ? "50%" : "calc(100% - 60px)",
|
|
10155
|
-
firstDayOfWeek: 6,
|
|
10156
|
-
taskListWidth: !useAutoWidth && totalWidth > 0 ? totalWidth : void 0,
|
|
10157
|
-
toolbar: {
|
|
10158
|
-
items: ["zoomIn", "zoomOut", "separator", "taskDetails"]
|
|
10159
|
-
},
|
|
10160
|
-
editing: {
|
|
10161
|
-
enabled: true
|
|
10162
|
-
},
|
|
10163
|
-
columns: columns.filter((c) => c.visible).map((c) => {
|
|
10164
|
-
return {
|
|
10165
|
-
dataField: c.dataField,
|
|
10166
|
-
dataType: c.dataType,
|
|
10167
|
-
width: c.width,
|
|
10168
|
-
visibleIndex: c.visibleIndex,
|
|
10169
|
-
sortIndex: c.sortIndex,
|
|
10170
|
-
sortOrder: c.sortOrder && (c.sortOrder === "asc" ? "asc" : "desc"),
|
|
10171
|
-
caption: c.caption || void 0
|
|
10172
|
-
};
|
|
10173
|
-
}),
|
|
10174
|
-
tasks: {
|
|
10175
|
-
dataSource: data.Tasks,
|
|
10176
|
-
keyExpr: columnsMapping[1 /* Key */],
|
|
10177
|
-
startExpr: columnsMapping[3 /* Start */],
|
|
10178
|
-
endExpr: columnsMapping[4 /* End */],
|
|
10179
|
-
parentIdExpr: columnsMapping[5 /* ParentId */],
|
|
10180
|
-
progressExpr: columnsMapping[6 /* Progress */],
|
|
10181
|
-
titleExpr: columnsMapping[2 /* Title */]
|
|
10182
|
-
},
|
|
10183
|
-
dependencies: {
|
|
10184
|
-
dataSource: data.Dependencies,
|
|
10185
|
-
keyExpr: "Id",
|
|
10186
|
-
predecessorIdExpr: "PredecessorId",
|
|
10187
|
-
successorIdExpr: "SuccessorId",
|
|
10188
|
-
typeExpr: "Type"
|
|
10189
|
-
},
|
|
10190
|
-
resources: {
|
|
10191
|
-
dataSource: data.Resources,
|
|
10192
|
-
keyExpr: ganttSettings.ResourcesKeyField,
|
|
10193
|
-
textExpr: ganttSettings.ResourcesTextField
|
|
10194
|
-
},
|
|
10195
|
-
resourceAssignments: {
|
|
10196
|
-
dataSource: data.ResourceAssignments,
|
|
10197
|
-
keyExpr: ganttSettings.ResourceAssignmentKeyField,
|
|
10198
|
-
resourceIdExpr: ganttSettings.ResourceAssignmentResourceIdField,
|
|
10199
|
-
taskIdExpr: ganttSettings.ResourceAssignmentTaskIdField
|
|
10200
|
-
}
|
|
10201
|
-
}).dxGantt("instance");
|
|
10202
|
-
}
|
|
10203
|
-
refresh() {
|
|
10204
|
-
}
|
|
10205
|
-
dispose() {
|
|
10206
|
-
var _a3;
|
|
10207
|
-
(_a3 = this.chart) == null ? void 0 : _a3.dispose();
|
|
10208
|
-
this.chart = null;
|
|
10209
|
-
}
|
|
10210
|
-
getSessionKey() {
|
|
10211
|
-
return this.CHART_STORAGE_MODE_KEY + this.reportParams.ReportId;
|
|
10236
|
+
this.refreshTimer.start(this.options.RefreshSec * 1e3);
|
|
10212
10237
|
}
|
|
10213
10238
|
};
|
|
10214
10239
|
|
|
@@ -10268,4 +10293,4 @@ By default grid shows only first 10 rows in the Edit mode.`).dxPopover({
|
|
|
10268
10293
|
var Scripts_default = IszoleaUI;
|
|
10269
10294
|
window.IszoleaUI = IszoleaUI;
|
|
10270
10295
|
})();
|
|
10271
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL0hlYWRlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcy50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL2NkbUltcG9ydEZpbGVNb2RlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvSUdyaWRTdGF0ZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Gb290ZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9BdXRvUmVzaXplLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRnVsbFNjcmVlbi50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1RoZW1lLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVG9vbGJhci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0RlZmF1bHRUb29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvUGFuZWxIZWlnaHQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dyaWRFeHBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9SZXBvcnQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EaWFncmFtL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcclxuICBJbnZhbGlkLFxyXG4gIFZhbGlkLFxyXG4gIEV4cGlyZVNvb24sXHJcbiAgRXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMaWNlbmNlIHtcclxuICByZWFkb25seSBTdGF0dXM/OiBMaWNlbmNlU3RhdHVzO1xyXG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBPd25lcjogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEV4cGlyYXRpb25EYXRlOiBEYXRlIHwgc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IFNvdXJjZUNvbnRlbnQ6IHN0cmluZztcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcclxuICBHcmlkVmlldyA9IDAsXHJcbiAgRGFzaGJvYXJkID0gMSxcclxuICBNZW51Tm9kZSA9IDIsXHJcbiAgUmVwb3J0ID0gMyxcclxuICBEaWFncmFtID0gNCxcclxuICBDRE0gPSA1LFxyXG4gIFNsaWRlc2hvdyA9IDYsXHJcbiAgR2FudHRDaGFydCA9IDdcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm90aWZ5KG1zZzogc3RyaW5nLCBzdWNjZWVkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWQgPyAnc3VjY2VzcycgOiAnZXJyb3InO1xyXG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xyXG5cclxuICBEZXZFeHByZXNzLnVpLm5vdGlmeSh7XHJcbiAgICBtZXNzYWdlOiBtc2csXHJcbiAgICB0eXBlOiBzdGF0dXMsXHJcbiAgICBvblNob3dpbmc6IChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XHJcbiAgICAgIG1lc3NhZ2VFbGVtZW50Lmh0bWwoKG1lc3NhZ2VFbGVtZW50Lmh0bWwoKSB8fCAnJykucmVwbGFjZSgnXFxcXG4nLCAnPGJyIC8+JykpO1xyXG4gICAgfVxyXG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBjb25zdCBpc0Vycm9ySW5mbyA9IChcclxuICByZXNwb25zZURhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkIHwgbnVsbFxyXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XHJcbiAgaWYgKCFyZXNwb25zZURhdGEpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YSlcclxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXHJcbiAgICA6IChyZXNwb25zZURhdGEuRXJyb3IgIT09IHVuZGVmaW5lZCk7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvckluZm8ge1xyXG4gIEVycm9yOiBzdHJpbmc7XHJcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XHJcbiAgRGF0YTogVCB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQ7XHJcbiAgTWVzc2FnZTogc3RyaW5nO1xyXG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIFN0YXR1c0NvZGU6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTG9va3VwRHRvPFQ+IHtcclxuICBWYWx1ZTogVDtcclxuICBUZXh0OiBzdHJpbmc7XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIFJlcXVlc3RTdGF0ZSB7XHJcbiAgQ29tcGxldGVkID0gMSxcclxuICBFcnJvcmVkID0gMlxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xyXG5cclxuY29uc3QgUE9QVVBfQ09OVEVOVF9DTEFTUyA9ICdwb3B1cC1jb250ZW50JztcclxuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XHJcbmNvbnN0IEJVVFRPTlNfQ0xBU1MgPSAnYnV0dG9ucyc7XHJcbmNvbnN0IE9LX0JUTl9DTEFTUyA9ICdvay1idG4nO1xyXG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xyXG5cclxuaW50ZXJmYWNlIElQb3B1cCB7XHJcbiAgc2hvdzogKCkgPT4gdm9pZDtcclxuICBoaWRlOiAoKSA9PiB2b2lkO1xyXG4gIHJlbW92ZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBCdXR0b25PcHRpb25zIHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbj86IHN0cmluZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0NPTlRFTlRfQ0xBU1MpLmFkZENsYXNzKGNvbnRlbnRDbGFzc05hbWUpLmFwcGVuZFRvKCRjb250YWluZXIpLFxyXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBzaG93blBvcHVwcyA9IFtdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcclxuICBjb25zdCBzYXZlZE9uU2hvd2luZyA9IGR4UG9wdXBPcHRpb25zLm9uU2hvd2luZztcclxuXHJcbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XHJcbiAgICBpZiAoc2F2ZWRPblNob3dpbmcpIHtcclxuICAgICAgc2F2ZWRPblNob3dpbmcoZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsSW5wdXRzID0gcG9wdXAuY29udGVudCgpLmZpbmQoJ2lucHV0W3R5cGU9dGV4dF0nKTtcclxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XHJcblxyXG4gICAgZmlyc3RJbnB1dC5mb2N1cygpO1xyXG5cclxuICAgIGNvbnN0IGtleUhhbmRsZXJzID0ge1xyXG4gICAgICBrZXlkb3duOiAoZXY6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICAgICAgJChldi5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uS2V5RG93bihldik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcclxuICAgICAgYWxsSW5wdXRzLm9uKGtleUhhbmRsZXJzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xyXG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgcG9wdXAuY29udGVudCgpLmZpbmQoYC4ke0NTU19DTEFTU0VTLmR4QnV0dG9ufS4ke0NBTkNFTF9CVE5fQ0xBU1N9YCkuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHBvcHVwID0gJGVsXHJcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcclxuICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICBwb3B1cC5zaG93KCk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xyXG4gICAgICBzaG93blBvcHVwcy5wdXNoKHBvcHVwKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9mZih7IGtleWRvd246IG9uS2V5RG93biB9KTtcclxuICAgICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcclxuICAgIH0sXHJcbiAgICByZW1vdmU6ICgpID0+ICRlbC5yZW1vdmUoKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxyXG4gIG9rT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsT3B0aW9uczogRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuKSB7XHJcbiAgY29uc3QgJHRhYmxlID0gJCgnPHRhYmxlIC8+JykuYWRkQ2xhc3MoQlVUVE9OU19DTEFTUyk7XHJcbiAgY29uc3QgJHRyID0gJCgnPHRyPicpLmFwcGVuZFRvKCR0YWJsZSk7XHJcblxyXG4gIGlmIChva09wdGlvbnMpIHtcclxuICAgICQoJzx0ZCAvPicpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxyXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoT0tfQlROX0NMQVNTKS5keEJ1dHRvbihva09wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIGlmIChjYW5jZWxPcHRpb25zKSB7XHJcbiAgICAkKCc8dGQgLz4nKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnNTAlJylcclxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKENBTkNFTF9CVE5fQ0xBU1MpLmR4QnV0dG9uKGNhbmNlbE9wdGlvbnMpKVxyXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkdGFibGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XHJcbiAgcmV0dXJuICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXRlbScpXHJcbiAgICAuYXBwZW5kKFxyXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcclxuICAgICAgJCgnPGRpdiAvPicpLmFkZENsYXNzKCd2YWx1ZScpLmFwcGVuZCgkdmFsdWUpXHJcbiAgICApO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cE9wdGlvbnMge1xyXG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXHJcbiAgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMsXHJcbiAgJHBvcHVwQ29udGVudDogSlF1ZXJ5LFxyXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgY2FuY2VsQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXHJcbiAgYWRkaXRpb25hbE9wdGlvbnM/OiBJUG9wdXBPcHRpb25zXHJcbikge1xyXG4gIGNvbnN0ICRlbCA9ICQoJzxkaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcclxuICBsZXQgJGJ1dHRvbnM6IEpRdWVyeSA9IG51bGw7XHJcblxyXG4gIGxldCBwb3B1cDogSVBvcHVwID0gbnVsbDtcclxuXHJcbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xyXG5cclxuICBmdW5jdGlvbiBjbG9zZVBvcHVwKCkge1xyXG4gICAgcG9wdXAuaGlkZSgpO1xyXG4gICAgcG9wdXAucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkeFBvcHVwT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFBvcHVwLlByb3BlcnRpZXMgPSB7XHJcbiAgICBjb250ZW50VGVtcGxhdGU6ICgkcG9wdXBDb250YWluZXIpID0+IHtcclxuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XHJcblxyXG4gICAgICAkY29udGVudC5hcHBlbmQoJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgICBpZiAob2tCdG5PcHRpb25zICYmIGNhbmNlbEJ0bk9wdGlvbnMpIHtcclxuICAgICAgICAkYnV0dG9ucyA9IGNyZWF0ZUJ1dHRvbnMoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IG9rQnRuT3B0aW9ucy50ZXh0LFxyXG4gICAgICAgICAgICBpY29uOiBva0J0bk9wdGlvbnMuaWNvbixcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gb2tCdG5PcHRpb25zLm9uQ2xpY2soY2xvc2VQb3B1cClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IGNhbmNlbEJ0bk9wdGlvbnMudGV4dCxcclxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogY2FuY2VsQnRuT3B0aW9ucy5kaXNhYmxlZCxcclxuICAgICAgICAgICAgb25DbGljazogKGUpID0+IGNhbmNlbEJ0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkZm9vdGVyLnJlbW92ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6ICdpc3pvbGVhLWR4LXBvcHVwJyB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAkLmV4dGVuZCh0cnVlLCBwb3B1cE9wdGlvbnMsIG9wdGlvbnMsIGR4UG9wdXBPcHRpb25zKTtcclxuXHJcbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XHJcblxyXG4gIHBvcHVwLnNob3coKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcHJlZmVyLXRlbXBsYXRlXHJcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXHJcbiAgICBjbG9zZTogKCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgfTtcclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IENTU19DTEFTU0VTID0ge1xyXG4gIGR4RGF0YUdyaWQ6ICdpc3pvbGVhLWR4LWRhdGFncmlkJyxcclxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcclxuICBkeFBvcHVwOiAnaXN6b2xlYS1keC1wb3B1cCdcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xyXG5pbXBvcnQgeyBJRXJyb3JJbmZvIH0gZnJvbSAnLi4vRGF0YS9BcGlSZXNwb25zZSc7XHJcblxyXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XHJcbmNvbnN0IFBPUFVQX0NPTlRFTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fY29udGVudCc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX01FU1NBR0VfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItbWVzc2FnZSc7XHJcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XHJcblxyXG5jb25zdCBTSE9XX0RFVEFJTFNfVEVYVCA9ICdTaG93IGRldGFpbHMnO1xyXG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9ySW5mb1BvcHVwKHRpdGxlTWVzc2FnZTogc3RyaW5nLCBlcnJvckluZm86IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10pOiB2b2lkIHtcclxuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBjb25zdCBpbmZvQXJyYXkgPSBBcnJheS5pc0FycmF5KGVycm9ySW5mbykgPyBlcnJvckluZm8gOiBbZXJyb3JJbmZvXTtcclxuXHJcbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcclxuXHJcbiAgaW5mb0FycmF5LmZvckVhY2goKGksIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcclxuICAgIGNvbnN0ICRlcnJvckRldGFpbHNFbGVtZW50ID0gJCgnPHAgLz4nKS5hZGRDbGFzcyhFUlJPUl9QT1BVUF9ERVRBSUxTX0NMQVNTKS50ZXh0KGkuU3RhY2tUcmFjZSk7XHJcbiAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkZXJyb3JNZXNzYWdlRWxlbWVudCwgJGVycm9yRGV0YWlsc0VsZW1lbnQpLmhpZGUoKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPCBpbmZvQXJyYXkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAkcG9wdXBDb250ZW50LmFwcGVuZCgkKCc8aHIgLz4nKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6IHRpdGxlTWVzc2FnZSxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGFuaW1hdGlvbjoge1xyXG4gICAgICAgIHNob3c6IHsgZGlyZWN0aW9uOiAnYm90dG9tJywgdHlwZTogJ3NsaWRlSW4nIH0sXHJcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cclxuICAgICAgfSxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdib3R0b20nLCBhdDogJ2JvdHRvbScsIG9mZnNldDogeyB5OiAtNTAgfSB9LFxyXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XHJcbiAgICAgICAgZS5lbGVtZW50LmFkZENsYXNzKE1BSU5fRUxFTUVOVF9DTEFTUyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAkcG9wdXBDb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGlzRnVsbFNjcmVlblJlcXVpcmVkOiBib29sZWFuID0gIXBvcHVwLm9wdGlvbignZnVsbFNjcmVlbicpO1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgICAgIHBvcHVwSW5mby5va0J0bi5vcHRpb24oJ3RleHQnLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCA/IEhJREVfREVUQUlMU19URVhUIDogU0hPV19ERVRBSUxTX1RFWFQpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnQ2xvc2UnLFxyXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgJHBvcHVwQ29udGVudC50b2dnbGUoaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJywgaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xyXG4gICAgcG9wdXAucmVwYWludCgpO1xyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xyXG4gIFVuZXhwZWN0ZWRFeGNlcHRpb24gPSAwLFxyXG4gIFNxbEV4Y2VwdGlvbiA9IDEsXHJcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuLi9EYXRhL0V4Y2VwdGlvblR5cGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAoZXhjZXB0aW9uVHlwZSkge1xyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcclxuICAgICAgcmV0dXJuICdXZSBhdHRlbXB0ZWQgdG8gZXhlY3V0ZSB0aGUgZGF0YSBxdWVyeSBob3dldmVyIGl0IGFwcGVhcnMgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGRhdGEgc291cmNlLic7XHJcblxyXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1NvbWV0aGluZyB3cm9uZyB3aXRoIGlzem9sZWEgY29uZmlndXJhdGlvbi4gQ2hlY2sgQ2xpZW50SWQvQ2xpZW50U2VjcmV0IGZpZWxkcyBpbiB0aGUgYXBwc2V0dGluZ3MuanNvbiBmaWxlLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCBub3RpZnkgZnJvbSAnLi4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgeyBJQXBpUmVzcG9uc2UsIGlzRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuaW1wb3J0IHsgY3JlYXRlRXJyb3JJbmZvUG9wdXAgfSBmcm9tICcuLi9XaWRnZXRzL0Vycm9ySW5mb1BvcHVwJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4vRXhjZXB0aW9uVHlwZSc7XHJcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcclxuXHJcbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY29udGFjdCB0byBkZXZlbG9wZXJzLic7XHJcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlID0gKCkgPT4gREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN1Y2Nlc3MocmVzOiBJQXBpUmVzcG9uc2U8YW55Piwgbm90aWZ5U3VjY2VzcyA9IGZhbHNlKSB7XHJcbiAgaWYgKG5vdGlmeVN1Y2Nlc3MpIHtcclxuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXHJcbiAgcmVzOiBJQXBpUmVzcG9uc2U8VD4sXHJcbiAgbm90aWZ5RXJyb3I6IGJvb2xlYW4sXHJcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xyXG4pOiB7IG1lc3NhZ2U6IHN0cmluZyB9IHtcclxuICBjb25zdCBtZXNzYWdlID0gcmVzLk1lc3NhZ2U7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHsgbWVzc2FnZSB9O1xyXG5cclxuICBsZXQgbWVzc2FnZVRvU2hvdztcclxuICBjb25zdCBleGNlcHRpb25UeXBlID0gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2UpO1xyXG4gIGlmIChleGNlcHRpb25UeXBlICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcclxuICAgIG1lc3NhZ2VUb1Nob3cgPSBjdXN0b21FcnJvck1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XHJcbiAgfVxyXG5cclxuICBpZiAobm90aWZ5RXJyb3IpIHtcclxuICAgIGNvbnN0IGVycm9ySW5mbyA9IHJlcy5EYXRhO1xyXG4gICAgaWYgKGlzRXJyb3JJbmZvKGVycm9ySW5mbykpIHtcclxuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGlzRXJyb3JJbmZvSGFzRGF0YSA9ICFBcnJheS5pc0FycmF5KGVycm9ySW5mbykgJiYgKGVycm9ySW5mby5TdGFja1RyYWNlIHx8IGVycm9ySW5mby5FcnJvcik7XHJcblxyXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xyXG4gICAgICAgIGNyZWF0ZUVycm9ySW5mb1BvcHVwKG1lc3NhZ2VUb1Nob3csIGVycm9ySW5mbyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3RpZnkobWVzc2FnZVRvU2hvdywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VFeGNlcHRpb25UeXBlKG1lc3NhZ2U6IHN0cmluZyk6IEV4Y2VwdGlvblR5cGUgfCBudWxsIHtcclxuICByZXR1cm4gKCFpc05hTihtZXNzYWdlIGFzIGFueSkpICYmIEV4Y2VwdGlvblR5cGVbK21lc3NhZ2VdID8gK21lc3NhZ2UgOiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlVXBsb2FkKGU6IHsgcmVxdWVzdDogeyByZXNwb25zZTogc3RyaW5nOyB9IH0pIHtcclxuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcclxuXHJcbiAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXNwb25zZSwgdHJ1ZSk7XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVNlbmRSZXF1ZXN0U2V0dGluZ3MgPSBKUXVlcnlBamF4U2V0dGluZ3MgJiB7XHJcbiAgbm90aWZ5RXJyb3I/OiBib29sZWFuO1xyXG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXHJcbiAgdXJsOiBzdHJpbmcsXHJcbiAgdHlwZTogc3RyaW5nID0gJ0dFVCcsXHJcbiAgZGF0YSA9IG51bGwsXHJcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW4sXHJcbiAgc2V0dGluZ3M/OiBJU2VuZFJlcXVlc3RTZXR0aW5ncyxcclxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcclxuICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcclxuXHJcbiAgY29uc3QgbWFuZGF0b3J5T3B0aW9ucyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbidcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBhamF4U2V0dGluZ3MgPSAkLmV4dGVuZCh7IHR5cGUsIHVybCwgZGF0YSB9LCBzZXR0aW5ncywgbWFuZGF0b3J5T3B0aW9ucyk7XHJcblxyXG4gICQuYWpheChhamF4U2V0dGluZ3MpXHJcbiAgICAuZG9uZSgocmVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlLkRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgfSlcclxuICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoIU5PVF9FU1NFTlRJQUxfU1RBVFVTRVMuaW5jbHVkZXMoanFYSFIuc3RhdHVzKSAmJiBub3RpZnlFcnJvcikge1xyXG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xyXG4gICAgfSk7XHJcblxyXG4gIHJldHVybiBkZWZlcnJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUFwaVJlc3BvbnNlIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XHJcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcclxuXHJcbmV4cG9ydCB0eXBlIElEeERhdGFTb3VyY2VPcHRpb25zID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5PcHRpb25zICYge1xyXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuO1xyXG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcclxuICBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2U/OiAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSkgPT4gc3RyaW5nO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUR4RGF0YVNvdXJjZShvcHRpb25zOiBJRHhEYXRhU291cmNlT3B0aW9ucykge1xyXG4gIGNvbnN0IHN0b3JlID0gRGV2RXhwcmVzcy5kYXRhLkFzcE5ldC5jcmVhdGVTdG9yZSh7XHJcbiAgICAuLi5vcHRpb25zLFxyXG4gICAgb25CZWZvcmVTZW5kOiAoanFYaHIsIHNldHRpbmdzKSA9PiB7XHJcbiAgICAgIGlmIChvcHRpb25zLm9uQmVmb3JlU2VuZCkge1xyXG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xyXG5cclxuICAgICAgc2V0dGluZ3MuZGF0YUZpbHRlciA9IChyYXdSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5SZXF1ZXN0U3RhdGUgPT09IFJlcXVlc3RTdGF0ZS5Db21wbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBJQXBpUmVzcG9uc2U8YW55PiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCB8fCAne30nKTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghcmVzLlJlcXVlc3RTdGF0ZSkge1xyXG4gICAgICAgICAgaGFuZGxlRXJyb3IocmVzLCBub3RpZnlFcnJvciwgb3B0aW9ucz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdG9yZSBhcyBhbnkpLl9lcnJvckhhbmRsZXIgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgIGVycm9yLm1lc3NhZ2UgPSBnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4vUmVxdWVzdCc7XHJcblxyXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxUPih1cmw6IHN0cmluZykge1xyXG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xyXG4gICAgcmV0dXJuIGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgbG9hZFByb21pc2VzW3VybF0gPSBzZW5kUmVxdWVzdDxUPih1cmwpO1xyXG4gIGxvYWRQcm9taXNlc1t1cmxdLmNhdGNoKChlcnIpID0+IHtcclxuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcclxuXHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogVCA9IGF3YWl0IGxvYWRQcm9taXNlc1t1cmxdO1xyXG5cclxuICBsb2FkUHJvbWlzZXNbdXJsXSA9IG51bGw7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0LCBoYW5kbGVFcnJvciwgaGFuZGxlU3VjY2VzcywgaGFuZGxlVXBsb2FkIH0gZnJvbSAnLi9SZXF1ZXN0JztcclxuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgKiBhcyBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbi8vIFRPRE86IGV4cG9ydCB0eXBlXHJcbmV4cG9ydCB7IElBcGlSZXNwb25zZSwgSUVycm9ySW5mbyB9IGZyb20gJy4vQXBpUmVzcG9uc2UnO1xyXG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcclxuZXhwb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4vSUxvZ29TZXR0aW5ncyc7XHJcbmV4cG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBzZW5kUmVxdWVzdCxcclxuICBoYW5kbGVFcnJvcixcclxuICBoYW5kbGVTdWNjZXNzLFxyXG4gIGhhbmRsZVVwbG9hZCxcclxuICBjcmVhdGVEeERhdGFTb3VyY2UsXHJcbiAgaXNFcnJvckluZm8sXHJcbiAgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb25cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlbmRlcmVkIHtcclxuICByZW5kZXIoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGVzdHJveWFibGUge1xyXG4gIGRlc3Ryb3koKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcclxuICByZXR1cm4gdHlwZW9mIG9iai5kZXN0cm95ID09PSAnZnVuY3Rpb24nO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHRocm93UmVuZGVyRXJyb3IgPSAoZWxlbWVudE5hbWU/OiBzdHJpbmcpOiBuZXZlciA9PiB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcclxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcclxuICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IFJlYWRvbmx5QXJyYXk8RGVlcFJlYWRvbmx5PFUxPj4gOiAoXHJcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXHJcbiAgICAgICAgVFtQXSBleHRlbmRzIFNldDxpbmZlciBVMz4gPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUPiA9IHtcclxuICBbUCBpbiBrZXlvZiBUXT86IChcclxuICAgIFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBVMT4gPyBBcnJheTxEZWVwUGFydGlhbDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUGFydGlhbDxVMj4+IDogKFxyXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXHJcbiAgICAgICAgICBUW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBUW1BdIDogKFxyXG4gICAgICAgICAgICBEZWVwUGFydGlhbDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBEZWVwUmVxdWlyZWQ8VD4gPSB7XHJcbiAgW1AgaW4ga2V5b2YgVF0tPzogKFxyXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxyXG4gICAgICBUW1BdIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFUyPiA/IE1hcDxLLCBEZWVwUmVxdWlyZWQ8VTI+PiA6IChcclxuICAgICAgICBUW1BdIGV4dGVuZHMgU2V0PGluZmVyIFUzPiA/IFNldDxEZWVwUmVxdWlyZWQ8VTM+PiA6IChcclxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXHJcbiAgICAgICAgICAgIERlZXBSZXF1aXJlZDxUW1BdPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uL0hlYWRlci9JTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xyXG4gIGNvbnN0IHsgQXJlYSwgQ29udHJvbGxlciwgQWN0aW9uLCBJc0NsaWNrYWJsZSB9ID0gaXRlbURhdGE7XHJcblxyXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XHJcbiAgICByZXR1cm4gQXJlYSA/IGVuY29kZVVSSShgLyR7QXJlYX0vJHtDb250cm9sbGVyfS8ke0FjdGlvbn1gKSA6IGVuY29kZVVSSShgLyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgeyBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuZXhwb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyJztcclxuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYXlvdXRCcmVha3BvaW50IHtcclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbWluV2lkdGg6IG51bWJlcjtcclxuICByZWFkb25seSBtYXhXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XHJcbiAgcmVhZG9ubHkgcHJldmlvdXNCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICByZWFkb25seSBjdXJyZW50QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xyXG4gIHhzOiB7XHJcbiAgICBuYW1lOiAneHMnLFxyXG4gICAgbWluV2lkdGg6IDAsXHJcbiAgICBtYXhXaWR0aDogNTc1XHJcbiAgfSxcclxuICBzbToge1xyXG4gICAgbmFtZTogJ3NtJyxcclxuICAgIG1pbldpZHRoOiA1NzYsXHJcbiAgICBtYXhXaWR0aDogNzY3XHJcbiAgfSxcclxuICBtZDoge1xyXG4gICAgbmFtZTogJ21kJyxcclxuICAgIG1pbldpZHRoOiA3NjgsXHJcbiAgICBtYXhXaWR0aDogOTkxXHJcbiAgfSxcclxuICBsZzoge1xyXG4gICAgbmFtZTogJ2xnJyxcclxuICAgIG1pbldpZHRoOiA5OTIsXHJcbiAgICBtYXhXaWR0aDogMTE5OVxyXG4gIH0sXHJcbiAgeGw6IHtcclxuICAgIG5hbWU6ICd4bCcsXHJcbiAgICBtaW5XaWR0aDogMTIwMCxcclxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxyXG4gIH1cclxufSBhcyBjb25zdDtcclxuXHJcbmNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzTGlzdDogcmVhZG9ubHkgSUxheW91dEJyZWFrcG9pbnRbXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzKVxyXG4gIC5tYXAoKGJyZWFrcG9pbnROYW1lKSA9PiBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c1ticmVha3BvaW50TmFtZV0pO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyIGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcclxuICBwdWJsaWMgY3VycmVudExheW91dEJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25XaW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNpemVEZWxheTogbnVtYmVyO1xyXG4gIC8vIFRPRE86IHVzZSBtdWx0aXBsZSBldmVudCBsaXN0ZW5lclxyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZDogKChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcm90ZWN0ZWQgbGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIG9uUmVzaXplPzogKGU6IFVJRXZlbnQpID0+IHZvaWQsXHJcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXHJcbiAgICByZXNpemVEZWxheSA9IDEwMCxcclxuICAgIGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdID0gYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHNMaXN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uUmVzaXplID0gb25SZXNpemU7XHJcbiAgICB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQgPSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkO1xyXG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xyXG4gICAgdGhpcy5sYXlvdXRCcmVha3BvaW50cyA9IGxheW91dEJyZWFrcG9pbnRzO1xyXG5cclxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXR0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93V2lkdGg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0QnJlYWtwb2ludHMuZmluZCgobGF5b3V0QnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZShlOiBVSUV2ZW50KSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0V2luZG93UmVzaXplVGltZW91dElkKTtcclxuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XHJcbiAgICBjb25zdCBsYXlvdXRCcmVha3BvaW50ID0gdGhpcy5nZXRMYXlvdXRCcmVha3BvaW50QnlXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCAhPT0gbGF5b3V0QnJlYWtwb2ludCkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ID0gbGF5b3V0QnJlYWtwb2ludDtcclxuXHJcbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcclxuICAgICAgICBwcmV2aW91c0JyZWFrcG9pbnQ6IHByZXZpb3VzTGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBjdXJyZW50QnJlYWtwb2ludDogdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCxcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdFJlc2l6ZUV2ZW50KGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRSZXNpemVFdmVudChlOiBVSUV2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnIHtcclxuICBpc0xlZ2FjeVJlbmRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjb25maWc6IElDb25maWcgPSB7XHJcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXHJcbn07XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJVXNlck1lbnVJdGVtTW9kZWwsIElCYWRnZU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi9Db25maWcvSW5kZXgnO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBpbnRlcmZhY2UtbmFtZVxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQge1xyXG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xyXG4gIHJlYWRvbmx5IG9yaWdpbmFsRXZlbnQ6IFVJRXZlbnQ7XHJcbiAgY2FuY2VsPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlck1lbnVPcHRpb25zIHtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBnZXREaXNwbGF5ZWRVc2VySW5mbz86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIGRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICh1c2VyTmFtZSkgPT4gYFdlbGNvbWUgJHt1c2VyTmFtZX1gO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckF2YXRhcjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZW1DbGljazogKChlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcclxuICAvLyBFbGVtZW50c1xyXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9iaWxlQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRlc2t0b3BDb250ZW50VHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB1c2VySW5mb0RpdmlkZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaXRlbXNDb250YWluZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XHJcbiAgICB0aGlzLnVzZXJBdmF0YXIgPSBvcHRpb25zLnVzZXJBdmF0YXI7XHJcbiAgICB0aGlzLnVzZXJOYW1lID0gb3B0aW9ucy51c2VyTmFtZTtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQgPSBvcHRpb25zLmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuICAgIHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8gPSBvcHRpb25zLmdldERpc3BsYXllZFVzZXJJbmZvIHx8IFVzZXJNZW51LmRlZmF1bHRHZXREaXNwbGF5ZWRVc2VySW5mbztcclxuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcclxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYWluRWxlbWVudHMoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlckluZm8oKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoaXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnNlcnRJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10sIHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFkZ2UoaXRlbU5hbWU6IHN0cmluZyk6IElCYWRnZU1vZGVsIHwgbnVsbCB7XHJcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIG1lbnVJdGVtPy5CYWRnZSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcsIGJhZGdlOiBJQmFkZ2VNb2RlbCkge1xyXG4gICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uVGV4dD8udG9Mb3dlckNhc2UoKSA9PT0gaXRlbU5hbWUpO1xyXG5cclxuICAgIGlmIChtZW51SXRlbSkge1xyXG4gICAgICBtZW51SXRlbS5CYWRnZSA9IGJhZGdlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5fcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5fcm9vdC5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnUnKTtcclxuXHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC8qJ25hdmJhci1uYXYnLCAqL2BkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tbm9uZWApO1xyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcclxuXHJcbiAgICBsZXQgYXZhdGFyO1xyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBpZiAodGhpcy51c2VyQXZhdGFyKSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdoZWFkZXJfX2ljb24tYnV0dG9uLWF2YXRhcicpO1xyXG4gICAgICAgIGF2YXRhci5zcmMgPSB0aGlzLnVzZXJBdmF0YXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgJ2ZhLXVzZXInKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51JywgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQnKTtcclxuXHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xyXG5cclxuICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGl0ZW0pID0+ICEhaXRlbS5CYWRnZSkpIHtcclxuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9fYmFkZ2UnKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVza3RvcFJvb3REcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlcik7XHJcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5pdGVtc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mbycsICdoNicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnZHJvcGRvd24taXRlbScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckluZm9EaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlci5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1kaXZpZGVyJywgJ2Qtbm9uZScsIGBkLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX0tYmxvY2tgKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcclxuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xyXG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc0NvbnRhaW5lcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xyXG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9EaXZpZGVyKTtcclxuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLml0ZW1zQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lcik7XHJcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XHJcbiAgICBpZiAoIXRoaXMudXNlckluZm9Db250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3VzZXJJbmZvQ29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3VzZXItaW5mb19fY29udGVudCcpO1xyXG4gICAgICB1c2VySW5mb0NvbnRlbnRFbGVtZW50LmlubmVyVGV4dCA9IHRoaXMuZ2V0RGlzcGxheWVkVXNlckluZm8odGhpcy51c2VyTmFtZSk7XHJcblxyXG4gICAgICB0aGlzLnVzZXJJbmZvQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJJbmZvQ29udGVudEVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLml0ZW1zQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudChpdGVtLCB0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCwgaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbSk7XHJcblxyXG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKGlzTW9iaWxlID8gJ25hdi1saW5rJyA6ICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBsaW5rRWxlbWVudC50ZXh0ID0gaXRlbS5UZXh0O1xyXG4gICAgaWYoaXRlbS5PcGVuSW5OZXdQYWdlKSB7XHJcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoaXRlbS5CYWRnZSkge1xyXG4gICAgICBjb25zdCBiYWRnZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXNvei1iYWRnZScpO1xyXG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuY2xhc3NMaXN0LmFkZChgaXNvei1iYWRnZS0tJHtpdGVtLkJhZGdlLlR5cGUgfHwgJ2luZm9ybWF0aW9uJ31gKTtcclxuICAgICAgYmFkZ2VsZW1lbnQuaW5uZXJIVE1MID0gaXRlbS5CYWRnZS5UZXh0O1xyXG5cclxuICAgICAgbGlua0VsZW1lbnQuYXBwZW5kQ2hpbGQoYmFkZ2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudEJhc2UoaXRlbTogSVVzZXJNZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xyXG5cclxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwpIHtcclxuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICB0aGlzLmFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCk7XHJcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xyXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbUVsZW1lbnQgb2YgdGhpcy5pdGVtc0NvbnRhaW5lci5jaGlsZHJlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseURlc2t0b3BWaWV3Rm9ySXRlbXMoKSB7XHJcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLml0ZW1zQ29udGFpbmVyLCBudWxsKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW1FbGVtZW50IG9mIHRoaXMuaXRlbXNDb250YWluZXIuY2hpbGRyZW4pIHtcclxuICAgICAgaXRlbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcclxuICAgIHdoaWxlICh0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xyXG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldyh0aGlzLmlzTW9iaWxlVmlldyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBVc2VyTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XHJcblxyXG4gICAgaWYgKGUuY2FuY2VsKSB7XHJcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29yZSc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZW51SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgaXRlbXM/OiBJTWVudUl0ZW1bXTtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgaGlkZGVuPzogYm9vbGVhbjtcclxuICBhY3RpdmU/OiBib29sZWFuO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBtZW51SXRlbUVsPzogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgb3JpZ2luYWxNb2RlbDogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJTWVudUl0ZW07XHJcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudU9wdGlvbnMge1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgaXRlbXM6IElNZW51SXRlbVtdO1xyXG4gIG9uSXRlbUNsaWNrPzogKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1lbnUgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBpdGVtczogSU1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uSXRlbUNsaWNrOiAoKGU6IE1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgLy8gZWxlbWVudHNcclxuICBwcm90ZWN0ZWQgcm9vdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xyXG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XHJcbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNZW51LCBJTWVudU9wdGlvbnMsIElNZW51SXRlbSB9IGZyb20gJy4vTWVudSc7XHJcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcclxuaW1wb3J0IHsgSUxheW91dEJyZWFrcG9pbnQsIFdpbmRvd1Jlc2l6ZUxpc3RlbmVyLCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwsIGlzSXRlbUFjdGl2ZSB9IGZyb20gJy4uLy4uL0hlYWRlcic7XHJcblxyXG5leHBvcnQgZW51bSBDb2xsYXBzaW5nTW9kZSB7XHJcbiAgRGlzYWJsZWQsXHJcbiAgQ29sbGFwc2VkLFxyXG4gIEV4cGFuZGVkLFxyXG4gIEFkYXB0aXZlQ29sbGFwc2luZ1xyXG59XHJcblxyXG50eXBlIEl0ZW1BY3Rpb25Nb2RlID0gJ2hvdmVyJyB8ICdjbGljayc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XHJcbiAgaXRlbUFjdGlvbj86IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIGNvbGxhcHNpbmdNb2RlPzogQ29sbGFwc2luZ01vZGU7XHJcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgY29sbGFwc2VJY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgZXh0ZW5kcyBNZW51IHtcclxuICBwcm90ZWN0ZWQgc3RhdGljIEhPVkVSX01PREVfQ1NTX0NMQVNTID0gJ25hdmJhci1uYXZfaG92ZXItYWN0aW9uJztcclxuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUFjdGlvbk1vZGU6IEl0ZW1BY3Rpb25Nb2RlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsYXBzaW5nTW9kZTogQ29sbGFwc2luZ01vZGU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2luZG93UmVzaXplTGlzdGVuZXI6IFdpbmRvd1Jlc2l6ZUxpc3RlbmVyO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrSGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlciA9IHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcclxuICAvLyBlbGVtZW50c1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZVJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjb2xsYXBzZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gIHByb3RlY3RlZCBjdXJyZW50T3BlbmluZ1N1Yk1lbnU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XHJcbiAgICB0aGlzLmNvbGxhcHNpbmdNb2RlID0gb3B0aW9ucy5jb2xsYXBzaW5nTW9kZSA/PyBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmc7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xyXG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIoXHJcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuYWRhcHRpdml0eUNvbGxhcHNpbmdEZWxheVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlclJvb3QoKTtcclxuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcclxuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucm9vdCkge1xyXG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xyXG4gICAgICB0aGlzLnJvb3QuZmlyc3RDaGlsZC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlckl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpbmdNb2RlICE9PSBDb2xsYXBzaW5nTW9kZS5BZGFwdGl2ZUNvbGxhcHNpbmdcclxuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZVJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcclxuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24obGFzdEl0ZW1FbGVtZW50KTtcclxuICAgICAgfSB3aGlsZSAodGhpcy5pc05lZWRDb2xsYXBzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Sb290KHRoaXMuY29sbGFwc2VEcm9wZG93bi5maXJzdEVsZW1lbnRDaGlsZCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RJdGVtRWxlbWVudCA9IHRoaXMucm9vdC5jaGlsZHJlblt0aGlzLnJvb3QuY2hpbGRyZW4ubGVuZ3RoIC0gMl07XHJcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9sZEFjdGl2ZVZhbHVlID0gaXRlbS5hY3RpdmU7XHJcbiAgICAgIGl0ZW0uYWN0aXZlID0gaXNJdGVtQWN0aXZlKGl0ZW0ub3JpZ2luYWxNb2RlbCk7XHJcblxyXG4gICAgICBpZiAoaXRlbS5hY3RpdmUgIT09IG9sZEFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbS5tZW51SXRlbUVsLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50LCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VPcGVuZWREcm9wZG93bih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgICAkKHRhcmdldEVsZW1lbnQpLm9uZSgnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvckVhY2hNZW51SXRlbVJlY3Vyc2l2ZShyb290SXRlbXM6IElNZW51SXRlbVtdLCBhY3Rpb246IChpdGVtOiBJTWVudUl0ZW0pID0+IHZvaWQpIHtcclxuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFjdGlvbihpKTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXN0ZWRJdGVtc093bmVySXRlbShpKSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ25hdmJhci1uYXYnLCAnbXItYXV0bycpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUFjdGlvbk1vZGUgPT09ICdob3ZlcicpIHtcclxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW1zKCkge1xyXG4gICAgdGhpcy5yZW5kZXJSb290SXRlbXMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggJiYgdGhpcy5jb2xsYXBzaW5nTW9kZSAhPT0gQ29sbGFwc2luZ01vZGUuRGlzYWJsZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgIHRoaXMucmVuZGVyQ29sbGFwc2VFbGVtZW50cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2hhbmdlRGVmYXVsdERyb3Bkb3duQmVoYXZpb3JGb3JOZXN0ZWREcm9wZG93bigpIHtcclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGUudGFyZ2V0ICE9PSB0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSAmJiBlLnRhcmdldC5jb250YWlucyh0aGlzLmN1cnJlbnRPcGVuaW5nU3ViTWVudSk7XHJcblxyXG4gICAgICByZXR1cm4gIXJlc3VsdDtcclxuICAgIH0pO1xyXG5cclxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW5kZXJDb2xsYXBzZUVsZW1lbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScsICdkcm9wZG93bicsICdjb2xsYXBzaW5nLW1lbnVfX2NvbGxhcHNlLXJvb3QnKTtcclxuXHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24nLCAnYnRuJywgJ2J0bi1vdXRsaW5lLWxpZ2h0Jyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcclxuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCB0aGlzLmNvbGxhcHNlSWNvbk5hbWUpO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XHJcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcclxuICAgIHRoaXMuY29sbGFwc2VSb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VCdXR0b24pO1xyXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZURyb3Bkb3duKTtcclxuXHJcbiAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jb2xsYXBzZVJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbmRlclJvb3RJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtIGFzIElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtV2l0aE5lc3RlZEl0ZW1zKGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVSb290SXRlbUVsZW1lbnQoaXRlbSk7XHJcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ25hdi1saW5rJyk7XHJcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XHJcbiAgICBpdGVtQ29udGVudC50ZXh0ID0gaXRlbS50ZXh0O1xyXG5cclxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XHJcbiAgICBpY29uRWxlbWVudCAmJiBpdGVtQ29udGVudC5pbnNlcnRCZWZvcmUoaWNvbkVsZW1lbnQsIGl0ZW1Db250ZW50LmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGl0ZW1Db250ZW50LCBpdGVtKTtcclxuXHJcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XHJcblxyXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShpdGVtKTtcclxuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGl0ZW1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1pdGVtJyk7XHJcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XHJcblxyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuY3JlYXRlRHJvcGRvd25NZW51KGl0ZW0pO1xyXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5lc3RlZEl0ZW0oaXRlbTogSU1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICBpdGVtLnRpdGxlICYmIGl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBpdGVtLnRpdGxlKTtcclxuXHJcbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWl0ZW0nKTtcclxuICAgIGl0ZW1Db250ZW50LmhyZWYgPSBpdGVtLnVybCB8fCAnamF2YXNjcmlwdDp2b2lkKDApJztcclxuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XHJcblxyXG4gICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtKTtcclxuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgdGhpcy5hcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xyXG5cclxuICAgIGl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1Db250ZW50KTtcclxuXHJcbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgZHJvcGRvd25NZW51RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51Jyk7XHJcblxyXG4gICAgaXRlbS5pdGVtcy5mb3JFYWNoKChuZXN0ZWRJdGVtKSA9PiB7XHJcbiAgICAgIGxldCBjb250ZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0obmVzdGVkSXRlbSkpIHtcclxuICAgICAgICBjb250ZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQobmVzdGVkSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlTmVzdGVkSXRlbShuZXN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZHJvcGRvd25NZW51RWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkcm9wZG93bk1lbnVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUl0ZW1JY29uRWxlbWVudChpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmICghaXRlbS5pY29uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xyXG4gICAgaXRlbUljb24uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybCgke2l0ZW0uaWNvbn0pYDtcclxuXHJcbiAgICByZXR1cm4gaXRlbUljb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGl0ZW1Db250ZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXRvZ2dsZScpO1xyXG4gICAgaXRlbUNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdkcm9wZG93bicpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xyXG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVN0YXRlc1RvSXRlbUVsZW1lbnQoaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpdGVtOiBJTWVudUl0ZW0pIHtcclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmhpZGRlbikge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XHJcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xyXG4gICAgaXRlbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5lbWl0SXRlbUNsaWNrKHtcclxuICAgICAgaXRlbSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbTogSU1lbnVJdGVtKTogaXRlbSBpcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9IHtcclxuICAgIHJldHVybiBpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoICYmIGl0ZW0uaXRlbXMuc29tZSgoaSkgPT4gIWkuaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKHJvb3RJdGVtT3JJdGVtczogRWxlbWVudCB8IEl0ZXJhYmxlPEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24uaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sbGFwc2luZ1ZpZXdGb3JSb290SXRlbShyb290SXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5hcHBlbmRDaGlsZCh0ZW1wSXRlbUVsZW1lbnRzU3RvcmUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGlmIChyb290SXRlbU9ySXRlbXMgaW5zdGFuY2VvZiBFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbU9ySXRlbXMpO1xyXG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBJdGVtRWxlbWVudHNTdG9yZSA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmluc2VydEJlZm9yZShyb290SXRlbSwgdGVtcEl0ZW1FbGVtZW50c1N0b3JlLmZpcnN0RWxlbWVudENoaWxkKTtcclxuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW06IEVsZW1lbnQpIHtcclxuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvb3RJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCduYXYtbGluaycsICdkcm9wZG93bi1pdGVtJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xyXG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tc3VibWVudScpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc05lZWRDb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcclxuICAgIGNvbnN0IGN1cnJlbnRSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XHJcblxyXG4gICAgY29uc3Qgbm9ybWFsUm9vdFJlY3QgPSB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xyXG4gICAgdGhpcy5yb290LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcblxyXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcclxuICAgIHJldHVybiBkcm9wZG93blJlY3QxLmxlZnQgPCAoZHJvcGRvd25SZWN0Mi5yaWdodCAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi5sZWZ0ICsgZGVsdGEpIDwgZHJvcGRvd25SZWN0MS5yaWdodFxyXG4gICAgICAmJiBkcm9wZG93blJlY3QxLnRvcCA8IChkcm9wZG93blJlY3QyLmJvdHRvbSAtIGRlbHRhKSAmJiAoZHJvcGRvd25SZWN0Mi50b3AgKyBkZWx0YSkgPCBkcm9wZG93blJlY3QxLmJvdHRvbTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChvcGVuZWREcm9wZG93bkVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXHJcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xyXG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5zdHlsZS5sZWZ0ID0gYC0ke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRyb3Bkb3duRWxlbWVudCBvZiBkcm9wZG93bkVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duUmVjdHNJbnRlcnNlY3QoZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCByZWN0KSkge1xyXG4gICAgICAgIG9wZW5lZERyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1tZW51LWxlZnQtc2hhZG93ZWQnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uV2luZG93UmVzaXplKGU6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gZS50YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5tYXhXaWR0aCAmJlxyXG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XHJcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xyXG4gICAgICB0aGlzLmFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5pbXBvcnQgeyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSB9IGZyb20gJy4uL0NvbXBvbmVudHMvTWVudSc7XHJcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1DbGlja0V2ZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9NZW51L01lbnUnO1xyXG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcclxuXHJcbmNvbnN0IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkgPSAoaXRlbXM6IHJlYWRvbmx5IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLCBpdGVtTmFtZTogc3RyaW5nKTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIHwgdW5kZWZpbmVkID0+IHtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgIGlmIChpdGVtLk5hbWUgPT09IGl0ZW1OYW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbmVzdGVkSXRlbSA9IGZpbmRJdGVtQnlOYW1lUmVjdXJzaXZlbHkoaXRlbS5JdGVtcywgaXRlbU5hbWUpO1xyXG5cclxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gbmVzdGVkSXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkgPSAoaXRlbURhdGE6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCBpdGVtcyA9IGl0ZW1EYXRhLkl0ZW1zO1xyXG5cclxuICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IG93blVybCA9IGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhKTtcclxuXHJcbiAgICByZXR1cm4gb3duVXJsID8gW293blVybF0gOiBbXTtcclxuICB9XHJcblxyXG4gIGxldCB1cmxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XHJcbiAgICB1cmxzID0gdXJscy5jb25jYXQoZ2V0SXRlbVVybHNSZWN1cnNpdmVseShjaGlsZCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybHM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJdGVtQWN0aXZlID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpID0+IHtcclxuICBjb25zdCBjdXJyZW50TG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoO1xyXG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XHJcblxyXG4gIGZvciAoY29uc3QgdXJsIG9mIGl0ZW1VcmxzKSB7XHJcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XHJcblxyXG4gICAgaWYgKHVybFJlLnRlc3QoY3VycmVudExvY2F0aW9uKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHtcclxuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcclxuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xyXG4gIGNhbmNlbD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uTWVudSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnU6IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51O1xyXG4gIHByaXZhdGUgaXNHbG9iYWxNZW51OiBib29sZWFuO1xyXG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcbiAgICBpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sXHJcbiAgICBpc0dsb2JhbE1lbnU6IGJvb2xlYW4sXHJcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxyXG4gICAgb25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWRcclxuICApIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnUsXHJcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xyXG4gICAgdGhpcy5tZW51ID0gbmV3IEJvb3RzdHJhcENvbGxhcHNpbmdNZW51KHtcclxuICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25NZW51SXRlbUNsaWNrSGFuZGxlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xyXG4gICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnM6IG9mZiAqL1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XHJcbiAgICB0aGlzLm1lbnUudXBkYXRlSXRlbXModGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKHRoaXMuaXRlbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLm1lbnUucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpIHtcclxuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcclxuICAgIHRoaXMubWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uTWVudUl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMubWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZSk7XHJcbiAgICBpZiAoZXZlbnRBcmdzKSB7XHJcbiAgICAgIHRoaXMuZW1pdE5hdmlnYXRpb25NZW51SXRlbUNsaWNrKGV2ZW50QXJncyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xyXG4gICAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tZW51LmNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s/LihlKTtcclxuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIHJldHVybiBtZW51SXRlbU1vZGVscy5tYXA8SU1lbnVJdGVtPigobWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBtZW51SXRlbU1vZGVsLk5hbWUsXHJcbiAgICAgICAgaWNvbjogbWVudUl0ZW1Nb2RlbC5JY29uLFxyXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHVybDogZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW1Nb2RlbCksXHJcbiAgICAgICAgaGlkZGVuOiBtZW51SXRlbU1vZGVsLlZpc2libGUgPT09IGZhbHNlLFxyXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxyXG4gICAgICAgIGRpc2FibGVkOiBtZW51SXRlbU1vZGVsLkRpc2FibGVkLFxyXG4gICAgICAgIHRpdGxlOiBtZW51SXRlbU1vZGVsLkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiBtZW51SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlOiBNZW51SXRlbUNsaWNrRXZlbnQpOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtID0gZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSh0aGlzLml0ZW1zLCBlLml0ZW0udGV4dCk7XHJcblxyXG4gICAgcmV0dXJuICFpdGVtID8gbnVsbCA6IHtcclxuICAgICAgb3JpZ2luYWxFdmVudDogZS5vcmlnaW5hbEV2ZW50LFxyXG4gICAgICBjYW5jZWw6IGZhbHNlLFxyXG4gICAgICBpdGVtOiB7IC4uLml0ZW0sIGlzR2xvYmFsOiB0aGlzLmlzR2xvYmFsTWVudSB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGNvbnN0IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZID0gJ2lzem9sZWEtdWl8bG9nby1zZXR0aW5ncyc7XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IExPR09fU0VUVElOR1NfQ0FDSEVfS0VZIH0gZnJvbSAnLi4vQ29uc3RhbnRzL0NhY2hlS2V5cyc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBMb2dvIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgJHRpdGxlQ29udGFpbmVyOiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVEYXRhKCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xyXG4gICAgY29uc3QgY2FjaGVkU2V0dGluZ3NSYXcgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XHJcblxyXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ28oSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XHJcblxyXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XHJcbiAgICBpZiAodHlwZW9mIGRhdGFTb3VyY2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGNvbnN0IGxvZ29TZXR0aW5ncyA9IGRhdGFTb3VyY2UgYXMgSUxvZ29TZXR0aW5ncztcclxuXHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcclxuXHJcbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgPSB7fTtcclxuICAgICAgbG9nb1NldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSA9IGRhdGEuQXBwbGljYXRpb25OYW1lO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XHJcbiAgICAgIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UgPSBkYXRhLkxvZ29JbWFnZTtcclxuICAgICAgbG9nb1NldHRpbmdzLmxhbmRpbmdQYWdlTG9nbyA9IGRhdGEuTGFuZGluZ1BhZ2VMb2dvO1xyXG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xyXG5cclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGxvZ29TZXR0aW5ncykpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlTG9nb01hcmt1cChsb2dvU2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncykge1xyXG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCd0aXRsZS1jb250YWluZXInKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpO1xyXG5cclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2J1c2luZXNzLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5idXNpbmVzc05hbWUpKTtcclxuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2FwcC1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lLnRvVXBwZXJDYXNlKCkpKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElEZXN0cm95YWJsZSwgSVJlbmRlcmVkIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudVN3aXRjaGVyT3B0aW9ucyB7XHJcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBjb2xsYXBzZUJyZWFrcG9pbnQ/OiBJTGF5b3V0QnJlYWtwb2ludDtcclxuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcclxuICBvblN3aXRjaD86ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1lbnVTd2l0Y2hlciBpbXBsZW1lbnRzIElSZW5kZXJlZCwgSURlc3Ryb3lhYmxlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc2t0b3BDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblN3aXRjaDogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1Jlc2l6ZUxpc3RlbmVyOiBXaW5kb3dSZXNpemVMaXN0ZW5lcjtcclxuICBwcml2YXRlIF92YWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJTWVudVN3aXRjaGVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5kZXNrdG9wQ29udGFpbmVyID0gb3B0aW9ucy5kZXNrdG9wQ29udGFpbmVyO1xyXG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XHJcbiAgICB0aGlzLm9uU3dpdGNoID0gb3B0aW9ucy5vblN3aXRjaDtcclxuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xyXG5cclxuICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBuZXcgV2luZG93UmVzaXplTGlzdGVuZXIodW5kZWZpbmVkLCB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWRMaXN0ZW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBjb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KCk7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlcj8uZGlzcG9zZSgpO1xyXG5cclxuICAgIHJvb3Q/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlci5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVZhbHVlQ2hhbmdlZChvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcclxuICAgIHRoaXMubWVudVN3aXRjaGVyID0gJCgnPGRpdj4nKS5keFN3aXRjaCh7XHJcbiAgICAgIHN3aXRjaGVkT2ZmVGV4dDogJ1BlcnNvbmFsJyxcclxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgd2lkdGg6ICcxMDBweCcsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vblN3aXRjaCkge1xyXG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keFN3aXRjaCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpIHtcclxuICAgIHRoaXMuc3dpdGNoVmlldygpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xyXG5pbXBvcnQgeyBNZW51SXRlbVR5cGUgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IGJvb2xlYW47XHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbUNsaWNrPzogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25NZW51SXRlbU9wZW5lZD86IChlOiBJT3BlblJlcG9ydEV2ZW50QXJncykgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcclxuICBwZXJzb25hbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlblJlcG9ydEV2ZW50QXJncyB7XHJcbiAgbWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCA9IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCAmIHtcclxuICBpc0dsb2JhbDogYm9vbGVhbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRNZW51RGF0YVNvdXJjZTogKCkgPT4gSVNlYXJjaERhdGFTb3VyY2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaERyb3BEb3duOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVNlYXJjaE9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZ2V0TWVudURhdGFTb3VyY2UgPSBvcHRpb25zLmdldE1lbnVEYXRhU291cmNlO1xyXG4gICAgdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93biA9IG9wdGlvbnMuZ2V0SXNHbG9iYWxNZW51U2hvd247XHJcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgPSBvcHRpb25zLm9uTWVudUl0ZW1PcGVuZWQ7XHJcbiAgICB0aGlzLm9uTWVudUl0ZW1DbGljayA9IG9wdGlvbnMub25NZW51SXRlbUNsaWNrO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xyXG4gICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkTWVudUl0ZW1zKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgIGZvcm1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0taW5saW5lJyk7XHJcblxyXG4gICAgY29uc3QgJGlucHV0ID0gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCcsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93RHJvcERvd25CdXR0b246IGZhbHNlLFxyXG4gICAgICBhcHBseVZhbHVlTW9kZTogJ2luc3RhbnRseScsXHJcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICBvcGVuT25GaWVsZENsaWNrOiBmYWxzZSxcclxuICAgICAgbW9kZTogJ3NlYXJjaCcsXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgJ3R5cGUnOiAnc2VhcmNoJyxcclxuICAgICAgICAnYXJpYS1sYWJlbCc6ICdTZWFyY2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUsICRlbCkgPT4ge1xyXG4gICAgICAgICRlbC5hZGRDbGFzcygnaGVhZGVyLXNlYXJjaC1yZXN1bHRzLXRyZWUtbGlzdCcpO1xyXG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmdldERhdGFTb3VyY2VGb3JTZWFyY2godGhpcy5nZXRNZW51RGF0YVNvdXJjZSgpKSxcclxuICAgICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsbG93RGVsZXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcclxuICAgICAgICAgIGRhdGFTdHJ1Y3R1cmU6ICd0cmVlJyxcclxuICAgICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXHJcbiAgICAgICAgICBmaWx0ZXJNb2RlOiAnZnVsbEJyYW5jaCcsXHJcbiAgICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogZmFsc2UsXHJcbiAgICAgICAgICBjb2x1bW5zOiBbe1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIG9uQ2VsbENsaWNrOiAoeyBkYXRhIH0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTWVudUl0ZW0oZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25LZXlEb3duOiAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGFyZ3MuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFJvd0tleSA9IHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0Lm9wdGlvbignZm9jdXNlZFJvd0tleScpO1xyXG4gICAgICAgICAgICBpZiAoZm9jdXNlZFJvd0tleSAhPT0gbnVsbCAmJiBmb2N1c2VkUm93S2V5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Tm9kZUJ5S2V5KGZvY3VzZWRSb3dLZXkpLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5leHBhbmRSb3coZm9jdXNlZFJvd0tleSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdCA9ICR0cmVlTGlzdC5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICByZXR1cm4gJHRyZWVMaXN0O1xyXG4gICAgICB9LFxyXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgb2Y6ICcuc2VhcmNoLWRyb3Bkb3duJyxcclxuICAgICAgICAgIG15OiAndG9wJyxcclxuICAgICAgICAgIGF0OiAnYm90dG9tJyxcclxuICAgICAgICAgIG9mZnNldDogeyB4OiAxNDksIHk6IDQgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDUxOCxcclxuICAgICAgICBhbmltYXRpb246IHtcclxuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcclxuICAgICAgICAgIGhpZGU6IHsgZHVyYXRpb246IDAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRm9jdXNJbjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgJiYgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nKTtcclxuICAgICAgfSxcclxuICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xyXG4gICAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25LZXlVcDogKGUpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlLmNvbXBvbmVudC5lbGVtZW50KCkuZmluZCgnaW5wdXQuZHgtdGV4dGVkaXRvci1pbnB1dCcpLnZhbCgpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Quc2VhcmNoQnlUZXh0KHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XHJcbiAgICAgICAgICBpZiAodHJpZ2dlcmVkRm9jdXNCdXR0b25zLnNvbWUoKGIpID0+IGIgPT09IGV2ZW50LmtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZm9jdXModGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3QuZ2V0Q2VsbEVsZW1lbnQoMCwgJ05hbWUnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBldmVudDogS2V5Ym9hcmRFdmVudCA9IGUuZXZlbnQgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5hZGRDbGFzcyhbJ2Zvcm0tY29udHJvbCcsICdtci1zbS0yJywgJ3NlYXJjaC1kcm9wZG93biddKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgZm9ybUVsZW1lbnQuYXBwZW5kQ2hpbGQoJGlucHV0WzBdKTtcclxuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XHJcbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShtZW51SXRlbSk7XHJcblxyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICB0aGlzLmNsb3NlU2VhcmNoRHJvcERvd24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XHJcbiAgICAgICAgaXRlbTogbWVudUl0ZW0sXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDogbnVsbCxcclxuICAgICAgICBjYW5jZWw6IGZhbHNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZVNlYXJjaERyb3BEb3duKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCAnJyk7XHJcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcGVuKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlRm9yU2VhcmNoKGRzOiBJU2VhcmNoRGF0YVNvdXJjZSk6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFkcykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldFJlZHVjZXIgPSAoaXNHbG9iYWw6IGJvb2xlYW4pID0+IHtcclxuICAgICAgY29uc3QgcmVkdWNlciA9IChyZXM6IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW06IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpdGVtLkl0ZW1zID0gaXRlbS5JdGVtcy5yZWR1Y2UocmVkdWNlciwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5WaXNpYmxlID09PSB1bmRlZmluZWQgfHwgaXRlbS5WaXNpYmxlID09PSBudWxsIHx8IGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5EaXNhYmxlZCA9PT0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSAmJiAhaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgcmVzLnB1c2goeyAuLi5pdGVtLCBpc0dsb2JhbCB9IGFzIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gcmVkdWNlcjtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGRzLnBlcnNvbmFsSXRlbXMgJiYgZHMucGVyc29uYWxJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XHJcbiAgICAgICAgTmFtZTogJ0dsb2JhbCBNZW51JywgSWQ6IC0xLCBpc0dsb2JhbDogdHJ1ZSwgVHlwZTogTWVudUl0ZW1UeXBlLk1lbnVOb2RlLFxyXG4gICAgICAgIEl0ZW1zOiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcGVyc29uYWxNZW51Um9vdCA9IHtcclxuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXHJcbiAgICAgICAgSXRlbXM6IGRzLnBlcnNvbmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIoZmFsc2UpLCBbXSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCkgPyBbZ2xvYmFsTWVudVJvb3QsIHBlcnNvbmFsTWVudVJvb3RdIDogW3BlcnNvbmFsTWVudVJvb3QsIGdsb2JhbE1lbnVSb290XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmV4cG9ydCB7IERldkV4cHJlc3NFdmVudEFyZ3MgfSBmcm9tICcuL0RldkV4cHJlc3NFdmVudEFyZ3MnO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlcic7XHJcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudExpc3RlbmVyczogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGV2dCwgbGlzdGVuZXIpIHtcclxuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XHJcbiAgICB0aGlzLm9uKGV2dCwgKGUpID0+IHtcclxuICAgICAgbGlzdGVuZXIoZSk7XHJcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldnQsIGUgPSBudWxsKSB7XHJcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XHJcblxyXG4gICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcclxuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgICBjdXJyZW50TGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvZmYoZXZ0LCBsaXN0ZW5lcikge1xyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldnRdO1xyXG5cclxuICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xyXG4gICAgICAgIGlmIChjdXJyZW50TGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBmaWx0ZXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIG9yaWdpbkhhbmRsZXIsIGdldEFyZ3VtZW50cykge1xyXG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBvcmlnaW5IYW5kbGVyKFxyXG4gICAgICAgIGdldEFyZ3VtZW50cygpLFxyXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGludGVybmFsSGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgTXV0YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IElMYXlvdXRCcmVha3BvaW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cywgZ2V0VXJsQnlNZW51SXRlbURhdGEgfSBmcm9tICcuLi9IZWxwZXJzL0luZGV4JztcclxuaW1wb3J0IHsgVXNlck1lbnUsIFVzZXJNZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL1VzZXJNZW51JztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnUsIE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL05hdmlnYXRpb25NZW51JztcclxuaW1wb3J0IHsgTG9nbyB9IGZyb20gJy4vTG9nbyc7XHJcbmltcG9ydCB7IE1lbnVTd2l0Y2hlciB9IGZyb20gJy4vTWVudVN3aXRjaGVyJztcclxuaW1wb3J0IHsgSVVzZXJNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcclxuaW1wb3J0IHsgSU1lbnVTZXR0aW5ncyB9IGZyb20gJy4vSU1lbnVTZXR0aW5ncyc7XHJcbmltcG9ydCB7IElBcHBNZW51TW9kZWwgfSBmcm9tICcuL0lBcHBNZW51TW9kZWwnO1xyXG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XHJcbmltcG9ydCBTZWFyY2gsIHsgSU9wZW5SZXBvcnRFdmVudEFyZ3MsIElTZWFyY2hEYXRhU291cmNlIH0gZnJvbSAnLi9TZWFyY2gnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9VdGlscy9JbmRleCc7XHJcblxyXG5jb25zdCBIRUFERVJfREFUQV9DQUNIRV9GSUVMRCA9ICdpc3pvbGVhLXVpfGhlYWRlci1kYXRhLWNhY2hlJztcclxuY29uc3QgU0hPV19HTE9CQUxfTUVOVV9LRVkgPSAnaXN6b2xlYS11aXxzaG93LWdsb2JhbC1tZW51JztcclxuXHJcbmNvbnN0IGdldERhdGFTb3VyY2VDYWNoZUZpZWxkID0gKHVzZXJOYW1lPzogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIGAke0hFQURFUl9EQVRBX0NBQ0hFX0ZJRUxEfSR7dXNlck5hbWUgPyBgfCR7dXNlck5hbWV9YCA6ICcnfWA7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBIZWFkZXJUaGVtZXMgPSAnaXN6b2xlYSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUhlYWRlck9wdGlvbnMge1xyXG4gICRlbDogSlF1ZXJ5O1xyXG4gIG1lbnVTZXR0aW5ncz86IElNZW51U2V0dGluZ3M7XHJcbiAgbG9nb1NldHRpbmdzPzogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcclxuICBkaXNwbGF5U2VhcmNoPzogYm9vbGVhbjtcclxuICBpbW1lZGlhdGVSZW5kZXI/OiBib29sZWFuO1xyXG4gIHRoZW1lPzogSGVhZGVyVGhlbWVzO1xyXG4gIG9uSW5pdD86ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJSGVhZGVyRWxlbWVudHMge1xyXG4gIHJlYWRvbmx5IHJvb3Q/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBsb2dvQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XHJcbiAgcmVhZG9ubHkgY29udGVudENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbkNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbj86IEhUTUxFbGVtZW50O1xyXG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxuICByZWFkb25seSBtZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/OiBIVE1MRWxlbWVudDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElBamF4UGFnZU1hcmtlciB7XHJcbiAgaXNMb2FkZWRCeUFqYXg6IHRydWU7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbiAgaXNNZW51U3dpdGNoZXJHbG9iYWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCA9ICdtZW51LXN3aXRjaGVyLWluaXRpYWxpemVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0xPQkFMX1VSTF9SRUdFWCA9IG5ldyBSZWdFeHAoJ14oPzpbYS16XSs6KT8vLycsICdpJyk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9DVFlQRV9NQVJLRVJfUkVHRVggPSBuZXcgUmVnRXhwKCchRE9DVFlQRSBodG1sPicsICdpJyk7XHJcblxyXG4gIHB1YmxpYyB1c2VyTWVudTogVXNlck1lbnUgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIG5hdmlnYXRpb25NZW51OiBOYXZpZ2F0aW9uTWVudSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgbWVudVN3aXRjaGVyOiBNZW51U3dpdGNoZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGxvZ286IExvZ28gfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGRhdGE6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWU6IEhlYWRlclRoZW1lcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1lbnVTZXR0aW5nczogSU1lbnVTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlTZWFyY2g6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZFBhbmVsOiBEZXZFeHByZXNzLnVpLmR4TG9hZFBhbmVsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblBhcnRpYWxWaWV3TG9hZGVkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBiZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZEhhbmRsZXIgPSB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtT3BlbmVkLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlciA9IHRoaXMub25Vc2VyTWVudUl0ZW1DbGljay5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgc2VhcmNoOiBTZWFyY2ggfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZWw6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRzOiBNdXRhYmxlPElIZWFkZXJFbGVtZW50cz4gPSB7fTtcclxuICBwcml2YXRlICRsb2FkQmFyOiBKUXVlcnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElIZWFkZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncyA9IG9wdGlvbnMubWVudVNldHRpbmdzO1xyXG4gICAgdGhpcy5sb2dvU2V0dGluZ3MgPSBvcHRpb25zLmxvZ29TZXR0aW5ncztcclxuICAgIHRoaXMudGhlbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdpc3pvbGVhJztcclxuICAgIHRoaXMuZGlzcGxheVNlYXJjaCA9IG9wdGlvbnMuZGlzcGxheVNlYXJjaDtcclxuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcclxuXHJcbiAgICB0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LnBhcnRpYWxWaWV3UGxhY2VIb2xkZXI7XHJcbiAgICB0aGlzLnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8udXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZztcclxuICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZCA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5vblBhcnRpYWxWaWV3TG9hZGVkO1xyXG4gICAgdGhpcy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8uYmVmb3JlUGFydGlhbFZpZXdMb2FkaW5nO1xyXG5cclxuICAgIHRoaXMubG9hZFBhbmVsID0gdGhpcy5jcmVhdGVMb2FkUGFuZWwoKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBcXCdpbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlXFwnIG9wdGlvbiBpc25cXCd0IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTk9URTogVG8gb3ZlcnJpZGUgYm9vdHN0cmFwIGhlYWRlciB6LWluZGV4IHdoaWNoIGlzIDE2MDBcclxuICAgIERldkV4cHJlc3MudWkuZHhPdmVybGF5LmJhc2VaSW5kZXgoMTcwMCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgICAgIC50aGVuKCgpID0+IG9wdGlvbnM/Lm9uSW5pdD8uKCkpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEYXRhKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFwcE1lbnVNb2RlbENhY2hlKCk7XHJcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLnJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIC8qKlxyXG4gICAgICogPFJvb3Q+XHJcbiAgICAgKiAgPEJyYW5kPlxyXG4gICAgICogICAgPExvZ28gLz5cclxuICAgICAqICA8L0JyYW5kPlxyXG4gICAgICogIDxDb250ZW50VG9nZ2xlciAvPlxyXG4gICAgICogIDxDb250ZW50PlxyXG4gICAgICogICAgPFNlYXJjaCAvPlxyXG4gICAgICogICAgPE5hdmlnYXRpb25NZW51IC8+XHJcbiAgICAgKiAgICA8VXNlck1lbnUgLz5cclxuICAgICAqICA8L0NvbnRlbnQ+XHJcbiAgICAgKiAgPE1lbnVTd2l0Y2hlciAvPlxyXG4gICAgICogPC9Sb290PlxyXG4gICAgICogPExvYWRCYXIgLz5cclxuICAgICAqL1xyXG5cclxuICAgIHRoaXMucmVuZGVyUm9vdCgpO1xyXG4gICAgdGhpcy5yZW5kZXJCcmFuZCgpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50VG9nZ2xlcigpO1xyXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XHJcbiAgICB0aGlzLnJlbmRlckxvYWRCYXIoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVPbkhpc3RvcnlQb3BTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyKSB7XHJcbiAgICAgICQod2luZG93KS5iaW5kKCdwb3BzdGF0ZScsIChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQgYXMgUG9wU3RhdGVFdmVudDtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlIGFzIElBamF4UGFnZU1hcmtlcjtcclxuICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaXNMb2FkZWRCeUFqYXgpIHtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2VWaWFBamF4Q29yZShzdGF0ZS51cmwpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShzdGF0ZS5pc01lbnVTd2l0Y2hlckdsb2JhbCk7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnVwZGF0ZUFjdGl2ZUl0ZW1zU3RhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTG9hZFBhbmVsKCk6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWwge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keExvYWRQYW5lbCh7XHJcbiAgICAgIHNoYWRpbmdDb2xvcjogJ3JnYmEoMCwwLDAsMC40KScsXHJcbiAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzaG93UGFuZTogdHJ1ZSxcclxuICAgICAgc2hhZGluZzogdHJ1ZSxcclxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXHJcbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRlbCkuZHhMb2FkUGFuZWwoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclJvb3QoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcclxuICAgIHRoaXMuZWxlbWVudHMucm9vdC5jbGFzc0xpc3QuYWRkKCdoZWFkZXInLCB0aGlzLnRoZW1lLCAnbmF2YmFyJywgJ25hdmJhci1kYXJrJywgYG5hdmJhci1leHBhbmQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCcmFuZCgpIHtcclxuICAgIGlmICh0aGlzLmxvZ28gfHwgIXRoaXMubG9nb1NldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyYW5kRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGJyYW5kRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2JyYW5kJywgJ25hdmJhci1icmFuZCcpO1xyXG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuYXBwZW5kQ2hpbGQoYnJhbmRFbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5sb2dvID0gbmV3IExvZ28oJCh0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIpLCB0aGlzLmxvZ29TZXR0aW5ncyk7XHJcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzcGxheVNlYXJjaCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xyXG4gICAgICAkY29udGFpbmVyOiAkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciksXHJcbiAgICAgIGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiB0aGlzLmdldFNlYXJjaERhdGFTb3VyY2UodGhpcy5kYXRhKSxcclxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcclxuICAgICAgb25EaW1lbnNpb25zQ2hhbmdlZDogKCkgPT4gdGhpcy5uYXZpZ2F0aW9uTWVudT8uYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpLFxyXG4gICAgICBvbk1lbnVJdGVtQ2xpY2s6IHRoaXMub25OYXZpYWd0aW9uTWVudUl0ZW1DbGlja0hhbmRsZXIsXHJcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlYXJjaC5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNHbG9iYWxNZW51U2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcclxuICAgIHRoaXMudXBkYXRlTWVudVN3aXRjaGVyU3RhdGUoZS5tZW51SXRlbS5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMubWVudVN3aXRjaGVyLnNldFZhbHVlKGlzR2xvYmFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudFRvZ2dsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCduYXZiYXItdG9nZ2xlcicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRvZ2dsZScsICdjb2xsYXBzZScpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcsICcuaGVhZGVyX19jb250ZW50Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0U2VhcmNoVGV4dCgnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyLWljb24nKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX190b2dnbGUtYnV0dG9uLWNvbnRhaW5lcicpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmFwcGVuZENoaWxkKGljb24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xyXG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcclxuICAgIHRoaXMucmVuZGVyTmF2aWdhdGlvbk1lbnUoW10pO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxNZW51ID0gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpO1xyXG5cclxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25NZW51KSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlRGF0YShtZW51SXRlbU1vZGVscywgaXNHbG9iYWxNZW51KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUgPSBuZXcgTmF2aWdhdGlvbk1lbnUoXHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxyXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxyXG4gICAgICAgIGlzR2xvYmFsTWVudSxcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51LnJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcclxuICAgIHRoaXMubWVudVNldHRpbmdzLm9uVXNlck1lbnVDbGljaz8uKGUpO1xyXG4gICAgaWYgKGUuY2FuY2VsIHx8IHRoaXMuaXNLZXlQcmVzc2VkKGUub3JpZ2luYWxFdmVudCBhcyBNb3VzZUV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcclxuXHJcbiAgICBpZiAoZS5pdGVtLkFsd2F5c1JlbG9hZFBhZ2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlLmNhbmNlbCA9IHRoaXMudHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrPy4oZSk7XHJcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XHJcblxyXG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoZS5pdGVtKTtcclxuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudCAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgJiYgdXJsICYmIHRoaXMuY2hlY2tJc0xvY2FsVXJsKHVybCkpIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlOiBJQWpheFBhZ2VNYXJrZXIgPSB7XHJcbiAgICAgICAgICBpc0xvYWRlZEJ5QWpheDogdHJ1ZSxcclxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcclxuICAgICAgICAgIHVybFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgbnVsbCwgdXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHVybCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzTG9jYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhSGVhZGVyLkdMT0JBTF9VUkxfUkVHRVgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XHJcbiAgICB3aW5kb3cuaXNJc296U2VydmVyRXhjZXB0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xyXG5cclxuICAgIGNvbnN0IHVybEZvclBhcnRpYWxMb2FkaW5nID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgdXJsKTtcclxuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XHJcbiAgICBjb25zdCBwYXJ0aWFsVXJsID0gdXJsRm9yUGFydGlhbExvYWRpbmcudG9TdHJpbmcoKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XHJcblxyXG4gICAgJC5hamF4KHBhcnRpYWxVcmwsIHsgZGF0YVR5cGU6ICdodG1sJyB9KS5hbHdheXMoKGRhdGEsIHRleHRTdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xyXG4gICAgICAgIHRoaXMub25QYXJ0aWFsVmlld0xvYWRlZD8uKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGFuZWwuaGlkZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVXNlck1lbnUoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcclxuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudXNlck1lbnUpIHtcclxuICAgICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcclxuICAgICAgdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG5cclxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XHJcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXHJcbiAgICAgICAgdXNlck5hbWU6IHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lLFxyXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXHJcbiAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgY29sbGFwc2VCcmVha3BvaW50OiB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCxcclxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcclxuICAgICAgICBnZXREaXNwbGF5ZWRVc2VySW5mbzogdGhpcy5tZW51U2V0dGluZ3MuZ2V0RGlzcGxheWVkVXNlckluZm9cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJNZW51LnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGE/LkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIpIHtcclxuICAgICAgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XHJcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXI/LnJlbW92ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyTW9iaWxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21lbnUtc3dpdGNoZXInKTtcclxuXHJcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xyXG4gICAgICBkZXNrdG9wQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIsXHJcbiAgICAgIG1vYmlsZUNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsXHJcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXHJcbiAgICAgIHN0YXJ0VmFsdWU6IHRoaXMuaXNTaG93R2xvYmFsTWVudSgpLFxyXG4gICAgICBvblN3aXRjaDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcclxuICAgICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uTWVudShuYXZpZ2F0aW9uSXRlbXMgfHwgW10pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XHJcbiAgICB0aGlzLmVtaXQoSGVhZGVyLk1FTlVfU1dJVENIRVJfSU5JVElBTElaRURfRVZFTlQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcclxuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lciwgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMb2FkQmFyKCkge1xyXG4gICAgdGhpcy4kbG9hZEJhciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZC1iYXInKS5oaWRlKCkuYXBwZW5kVG8odGhpcy4kZWwpO1xyXG5cclxuICAgIGNvbnN0ICRsb2FkID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkJykuYXBwZW5kVG8odGhpcy4kbG9hZEJhcik7XHJcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2JhcicpLmFwcGVuZFRvKCRsb2FkKTtcclxuXHJcbiAgICBmdW5jdGlvbiByb3RhdGUoc2VsZWN0b3I6IHN0cmluZykge1xyXG4gICAgICAkKHNlbGVjdG9yKS5hbmltYXRlKHsgbGVmdDogJCgnLmxvYWQnKS53aWR0aCgpIH0sIDIwMDAsICgpID0+IHtcclxuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcclxuICAgICAgICByb3RhdGUoc2VsZWN0b3IpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGUoJy5iYXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVyZW5kZXJNZW51cygpIHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCB1c2VySXRlbXMgPSB0aGlzLmdldFVzZXJJdGVtcyh0aGlzLmRhdGEpO1xyXG4gICAgLy8gSWYgaXRlbXMgYXJlIHVuZGVmaW5lZCB3ZSBkb24ndCB1cGRhdGUgbWVudXNcclxuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XHJcbiAgICB1c2VySXRlbXMgJiYgdGhpcy5yZW5kZXJVc2VyTWVudSh1c2VySXRlbXMpO1xyXG4gICAgdGhpcy5yZW5kZXJNZW51U3dpdGNoZXIoKTtcclxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyICYmICF0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmF2aWdhdGlvbkl0ZW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uSXRlbXModGhpcy5kYXRhKTtcclxuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBpc1Zpc2libGUgPSAobmF2aWdhdGlvbkl0ZW1zICYmIG5hdmlnYXRpb25JdGVtcy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCB0aGlzLm1lbnVTZXR0aW5ncz8udXNlck5hbWVcclxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoISFpc1Zpc2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhID0gYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlcmVuZGVyTWVudXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTxJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tZW51U2V0dGluZ3MuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0Q2FjaGVkQXBwTWVudU1vZGVsKCk7XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgIHRoaXMuJGxvYWRCYXI/LnNob3coKTtcclxuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xyXG4gICAgICB0aGlzLmNhY2hlQXBwTWVudU1vZGVsKGRhdGEpO1xyXG4gICAgICB0aGlzLnNlYXJjaD8ucmVsb2FkTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICB0aGlzLiRsb2FkQmFyPy5oaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25JdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hvd0dsb2JhbE1lbnUgPSB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKTtcclxuXHJcbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXHJcbiAgICAgID8gYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtc1xyXG4gICAgICA6IGFwcE1lbnVNb2RlbC5QZXJzb25hbE5hdmlnYXRpb25JdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VhcmNoRGF0YVNvdXJjZShhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpOiBJU2VhcmNoRGF0YVNvdXJjZSB7XHJcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGdsb2FiYWxJdGVtczogYXBwTWVudU1vZGVsLk5hdmlnYXRpb25JdGVtcyxcclxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJdGVtcyhhcHBNZW51TW9kZWw6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJhd1ZhbHVlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZ2V0RGF0YVNvdXJjZUNhY2hlRmllbGQodGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUpKTtcclxuXHJcbiAgICByZXR1cm4gcmF3VmFsdWUgPT09IG51bGwgPyByYXdWYWx1ZSA6IEpTT04ucGFyc2UocmF3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWNoZUFwcE1lbnVNb2RlbChkYXRhOiBJQXBwTWVudU1vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMubWVudVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJBcHBNZW51TW9kZWxDYWNoZSgpIHtcclxuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGdldERhdGFTb3VyY2VDYWNoZUZpZWxkKHRoaXMubWVudVNldHRpbmdzLnVzZXJOYW1lKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByYXdJc0dsb2JhbCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTSE9XX0dMT0JBTF9NRU5VX0tFWSk7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHJhd0lzR2xvYmFsID09PSBudWxsID8gcmF3SXNHbG9iYWwgYXMgbnVsbCA6IEpTT04ucGFyc2UocmF3SXNHbG9iYWwpIGFzIGJvb2xlYW47XHJcblxyXG4gICAgcmV0dXJuIGlzR2xvYmFsID09PSBudWxsIHx8IGlzR2xvYmFsO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgZ3JpZENvbHVtblR5cGVzID0gWydkZWZhdWx0JywgJ3N0cmluZycsICdudW1iZXInLCAnZGF0ZScsICdib29sZWFuJywgJ29iamVjdCcsICdkYXRldGltZSddO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xyXG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gQ2RtSW1wb3J0RmlsZU1vZGUge1xyXG4gIE5vbmUgPSAwLFxyXG4gIEFkZE5ld1Jvd3MgPSAxLFxyXG4gIFJlcGxhY2VBbGxSb3dzID0gMixcclxufVxyXG4iLCAiXHVGRUZGXHJcbmV4cG9ydCBlbnVtIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUge1xyXG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXHJcbiAgU3RyaW5nID0gJ3N0cmluZycsXHJcbiAgTnVtYmVyID0gJ251bWJlcicsXHJcbiAgRGF0ZSA9ICdkYXRlJyxcclxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG4gIE9iamVjdCA9ICdvYmplY3QnLFxyXG4gIERhdGV0aW1lID0gJ2RhdGV0aW1lJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQ29sdW1uU3RhdGUge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xyXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydEluZGV4PzogbnVtYmVyO1xyXG4gIHNvcnRPcmRlcj86IG51bWJlcjtcclxuICB2aXNpYmxlPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XHJcbiAgY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW107XHJcbn1cclxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xyXG4gIC8vIFNodWZmbGUgdXJsc1xyXG4gIGNvbnN0IHNodWZmbGVkVXJscyA9IGltYWdlVXJscy5zb3J0KChhLCBiKSA9PiAwLjUgLSBNYXRoLnJhbmRvbSgpKTtcclxuXHJcbiAgJGNvbnRhaW5lci5hZGRDbGFzcygnaXN6b2xlYS1iYWNrZ3JvdW5kLWltYWdlLXZpZXdlcicpLmNzcyh7XHJcbiAgICAndHJhbnNpdGlvbic6IGBiYWNrZ3JvdW5kLWltYWdlICR7dHJhbnNpdGlvblRpbWVTZWN9cyBlYXNlLWluLW91dCAwc2AsXHJcbiAgfSk7XHJcblxyXG4gIHNodWZmbGVkVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcclxuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XHJcblxyXG4gICAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaW1nLnNyYyA9IHVybDtcclxuICAgIH0sIGluZGV4ICogMTAwKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TmV4dEluZGV4VG9TaG93IChjdXJyZW50SW5kZXg6IG51bWJlcikge1xyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwID8gMSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXh0SW5kZXggPSByYW5kb21JbnRlZ2VyKDAsIGxvYWRlZFVybHMubGVuZ3RoIC0gMSk7XHJcblxyXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XHJcbiAgICByZXR1cm4gbmV4dEluZGV4ID09PSBsb2FkZWRVcmxzLmxlbmd0aCAtIDEgPyAwIDogbmV4dEluZGV4ICsgMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXh0SW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRJbWFnZXNDaGFuZ2luZyAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYzogbnVtYmVyKSB7XHJcbiAgbGV0IGN1cnJlbnRTaG93bkluZGV4ID0gMDtcclxuXHJcbiAgc2hvd0ltYWdlKCRjb250YWluZXIsIGN1cnJlbnRTaG93bkluZGV4KTtcclxuXHJcbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50U2hvd25JbmRleCA9IGdldE5leHRJbmRleFRvU2hvdyhjdXJyZW50U2hvd25JbmRleCk7XHJcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xyXG4gIH0sIGltZ0NoYW5nZUludGVydmFsU2VjICogMTAwMCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dJbWFnZSAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgJGNvbnRhaW5lci5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHtsb2FkZWRVcmxzW2luZGV4XX1cIilgKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxpY2VuY2UgfSBmcm9tICcuLi9CdXNpbmVzcyc7XHJcblxyXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xyXG4gIFN1Y2Nlc3MsXHJcbiAgV2FybmluZyxcclxuICBFcnJvclxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XHJcbiAgc3RhdHVzOiBGb290ZXJJbmRpY2F0b3JTdGF0dXM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3RlckluZGljYXRvck9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZTtcclxuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcclxuICBnZXRWYWx1ZUludGVydmFsTXM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvb3Rlck9wdGlvbnMge1xyXG4gICRyb290OiBKUXVlcnk7XHJcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XHJcbiAgbGljZW5jZTogSUxpY2VuY2UgfCBmYWxzZTtcclxuICB5ZWFyPzogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlO1xyXG4gIHZlcnNpb24/OiBzdHJpbmc7XHJcbiAgc2VydmVyTmFtZT86IHN0cmluZztcclxuICBkYXRhYmFzZT86IHN0cmluZztcclxuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xyXG4gIHllYXI6ICdsb2NhbCdcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvb3RlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q3VycmVudFllYXIoY3VycmVudFllYXI6IG51bWJlciB8ICdsb2NhbCcgfCBmYWxzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXHJcbiAgICAgID8gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXHJcbiAgICAgIDogY3VycmVudFllYXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWRUbzogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsaWNlbmNlOiBJTGljZW5jZSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dMaWNlbmNlOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1llYXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93Q29ubmVjdGVkVG86IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeU5hbWU6IE1hcDxzdHJpbmcsIEpRdWVyeT47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JDbGFzc0J5U3RhdHVzID0gbmV3IE1hcDxGb290ZXJJbmRpY2F0b3JTdGF0dXMsIHN0cmluZz4oW1xyXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXHJcbiAgICBbRm9vdGVySW5kaWNhdG9yU3RhdHVzLldhcm5pbmcsICdmb290ZXJfX2luZGljYXRvcl90eXBlX3dhcm5pbmcnXSxcclxuICAgIFtGb290ZXJJbmRpY2F0b3JTdGF0dXMuRXJyb3IsICdmb290ZXJfX2luZGljYXRvcl90eXBlX2Vycm9yJ11cclxuICBdKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZvb3Rlck9wdGlvbnMpIHtcclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xyXG5cclxuICAgIHRoaXMuJHJvb3QgPSBtZXJnZWRPcHRpb25zLiRyb290O1xyXG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubGljZW5jZSA9IG1lcmdlZE9wdGlvbnMubGljZW5jZSAhPT0gZmFsc2UgPyBtZXJnZWRPcHRpb25zLmxpY2VuY2UgOiB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnllYXIgPSBGb290ZXIuZ2V0Q3VycmVudFllYXIobWVyZ2VkT3B0aW9ucy55ZWFyKTtcclxuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5zaG93TmFtZSA9IG1lcmdlZE9wdGlvbnMubmFtZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1llYXIgPSBtZXJnZWRPcHRpb25zLnllYXIgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gPSAhIW1lcmdlZE9wdGlvbnMuc2VydmVyTmFtZSAmJiAhIW1lcmdlZE9wdGlvbnMuZGF0YWJhc2U7XHJcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEpRdWVyeT4oKTtcclxuXHJcbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpIHtcclxuICAgIHRoaXMuJHJvb3QuYWRkQ2xhc3MoJ2Zvb3RlcicpO1xyXG5cclxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xyXG4gICAgdGhpcy5yZW5kZXJDb3B5cmlnaHQoKTtcclxuICAgIHRoaXMuc2hvd1llYXIgJiYgdGhpcy5yZW5kZXJZZWFyKCk7XHJcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xyXG4gICAgdGhpcy5zaG93Q29ubmVjdGVkVG8gJiYgdGhpcy5yZW5kZXJDb25uZWN0ZWRUbygpO1xyXG4gICAgdGhpcy5zaG93TGljZW5jZSAmJiB0aGlzLnJlbmRlckxpY2VuY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRpY2F0b3JWYWx1ZShpbmRpY2F0b3JOYW1lOiBzdHJpbmcsIHZhbHVlOiBJRm9vdGVySW5kaWNhdG9yVmFsdWUpIHtcclxuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XHJcbiAgICBpZiAoJGluZGljYXRvckVsKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xyXG4gICAgdGhpcy5pbmRpY2F0b3JzT3B0aW9ucz8uZm9yRWFjaCgobykgPT4ge1xyXG4gICAgICBpZiAoby50ZXh0KSB7XHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3ItdGV4dCcpXHJcbiAgICAgICAgICAuaHRtbChgJHtvLnRleHR9OmApXHJcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2luZGljYXRvcicpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG5cclxuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCBvLnZhbHVlKTtcclxuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlOYW1lLnNldChvLm5hbWUsICRpbmRpY2F0b3JFbCk7XHJcblxyXG4gICAgICBpZiAoby5nZXRWYWx1ZSAmJiBvLmdldFZhbHVlSW50ZXJ2YWxNcykge1xyXG4gICAgICAgIHNldEludGVydmFsKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XHJcbiAgICAgICAgfSwgby5nZXRWYWx1ZUludGVydmFsTXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbDogSlF1ZXJ5LCB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlKSB7XHJcbiAgICAkaW5kaWNhdG9yRWwuYXR0cigndGl0bGUnLCB2YWx1ZS50aXRsZSk7XHJcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xyXG4gICAgJGluZGljYXRvckVsLmFkZENsYXNzKHRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy5nZXQodmFsdWUuc3RhdHVzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNvcHlyaWdodCgpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxyXG4gICAgICAuaHRtbCgnJmNvcHk7JylcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJOYW1lKCkge1xyXG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2FwcC1uYW1lJylcclxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb25uZWN0ZWRUbygpIHtcclxuICAgIHRoaXMubmFtZSAmJiAkKCc8c3Bhbj4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb25uZWN0ZWQtdG8nKVxyXG4gICAgICAudGV4dChgQ29ubmVjdGVkIHRvOiAke3RoaXMuY29ubmVjdGVkVG99LmApXHJcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcclxuICAgICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXHJcbiAgICAgIC50ZXh0KHRoaXMueWVhcilcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaWNlbmNlKCkge1xyXG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pdGVtJylcclxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtaW5mbycpXHJcbiAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgJCgnPHNwYW4+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLW93bmVyJylcclxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICAkKCc8c3Bhbj4nKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2UtZGF0ZScpXHJcbiAgICAgICAgICAudGV4dCh0aGlzLmdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KHRoaXMubGljZW5jZSkpXHJcbiAgICAgIClcclxuICAgICAgLmFwcGVuZFRvKHRoaXMuJHJvb3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaWNlbmNlT3duZXJEaXNwbGF5VGV4dChsaWNlbmNlOiBJTGljZW5jZSkge1xyXG4gICAgcmV0dXJuIGBMaWNlbmNlZCB0bzogJHtsaWNlbmNlLk93bmVyfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpY2VuY2VFeHBpcmF0aW9uRGF0ZURpc3BsYXlUZXh0KGxpY2VuY2U6IElMaWNlbmNlKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xyXG5cclxuICAgIHJldHVybiBgTGljZW5jZSBFeHBpcnk6ICR7ZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX1gO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGbGV0IHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XHJcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XHJcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJlcGFpbnRUaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHJlcGFpbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgcmVzaXplSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcigpKTtcclxuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcclxuICB9LCAxMDApO1xyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uUmVzaXplOiAoKSA9PiB2b2lkKSB7XHJcbiAgcmVzaXplSGFuZGxlcnMucHVzaChvblJlc2l6ZSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBhdXRvUmVzaXplIGZyb20gJy4vQXV0b1Jlc2l6ZSc7XHJcblxyXG5jb25zdCBDU1MgPSB7XHJcbiAgbWFpbjogJy5tYWluJyxcclxuICBoZWFkZXI6ICcubWFpbiAuaGVhZGVyJyxcclxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXHJcbiAgcGFuZWw6ICcucGFuZWwnLFxyXG4gIGZvb3RlcjogJ2Zvb3RlcidcclxufTtcclxuXHJcbmxldCBsYXN0V2luZG93SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcclxubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xyXG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XHJcblxyXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4sIGlnbm9yZVNpYmxpbmdzOiBib29sZWFuID0gZmFsc2UsIGFkZE93blNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGNvbnN0ICRtYWluID0gJChDU1MubWFpbik7XHJcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XHJcbiAgY29uc3QgJGNvbnRlbnQgPSAkKENTUy5jb250ZW50KTtcclxuICBjb25zdCAkZm9vdGVyID0gJChDU1MuZm9vdGVyKTtcclxuXHJcbiAgY29uc3QgcGFkZGluZ3MgPSAkY29udGVudC5vdXRlckhlaWdodCgpIC0gJGNvbnRlbnQuaGVpZ2h0KCk7XHJcblxyXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XHJcbiAgbGV0IGNvbnRlbnRFbGVtZW50c0hlaWdodCA9IDA7XHJcblxyXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcclxuICAgIGNvbnN0ICR3aWRnZXRFbGVtZW50ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICAgICRjb250ZW50RWxlbWVudHMuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xyXG5cclxuICAgICAgaWYgKCRjaGlsZC5pcygkd2lkZ2V0RWxlbWVudCkgfHwgJGNoaWxkLmhhcygkd2lkZ2V0RWxlbWVudFswXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxhc3RXaWRnZXRIZWlnaHQgPSBsYXN0Q29udGVudEhlaWdodCAtIGNvbnRlbnRFbGVtZW50c0hlaWdodDtcclxuXHJcbiAgaWYgKGFkZE93blNpemUpIHtcclxuICAgIGxhc3RXaWRnZXRIZWlnaHQgKz0gd2lkZ2V0LmVsZW1lbnQoKS5vdXRlckhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xyXG4gIGNvbnN0IHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcclxuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcclxuXHJcbiAgbGFzdENvbnRlbnRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XHJcbiAgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodDtcclxuXHJcbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCwgaWdub3JlU2libGluZ3MsIGFkZE93blNpemUpO1xyXG5cclxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZjb25zdCBESVNBQkxFRF9DTEFTUyA9ICdpc296LWljb24tZGlzYWJsZWQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NMQVNTRVMgPSB7XHJcbiAgbGc6ICdpc3pvbGVhLWxnJyxcclxuICBtZDogJ2lzem9sZWEtbWQnLFxyXG4gIHNtOiAnaXN6b2xlYS1zbSdcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaGVtZUhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50TWlkZGxlU2l6ZShlbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XHJcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcclxuICAgIGVsZW1lbnQuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5zbSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldE1pZGRsZVNpemUoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZSwgVEhFTUVfQ0xBU1NFUy5tZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHNldFdpZGdldFNtYWxsU2l6ZShpbnN0YW5jZTogYW55KSB7XHJcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcclxuICAgIGNvbnN0IGljb25DbGFzcyA9IGBpc296IGlzb3otaWNvbi0ke2ljb259LSR7c2l6ZX1gO1xyXG5cclxuICAgIHJldHVybiAhZGlzYWJsZWRcclxuICAgICAgPyBpY29uQ2xhc3NcclxuICAgICAgOiBgJHtpY29uQ2xhc3N9ICR7RElTQUJMRURfQ0xBU1N9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHNldFdpZGdldFNpemUoaW5zdGFuY2U6IGFueSwgc2l6ZUNsYXNzOiBzdHJpbmcpIHtcclxuICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICBpbnN0YW5jZS5vcHRpb24oJ2VsZW1lbnRBdHRyJywgeyBjbGFzczogc2l6ZUNsYXNzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGY29uc3QgQ0xBU1NFUyA9IHtcclxuICB0aXRsZTogJ2lzb3otdGl0bGUnXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XHJcbiAgcHVibGljIHN0YXRpYyBnZXRUb29sYmFyVGl0bGVUZW1wbGF0ZUl0ZW0odGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbCA9ICQoYDxzcGFuIGNsYXNzPVwiJHtDTEFTU0VTLnRpdGxlfVwiPiR7dGl0bGV9PC9zcGFuPmApO1xyXG5cclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICRlbC5hcHBlbmQoJCgnPGkgLz4nKS5hZGRDbGFzcygnZmFzJykuYWRkQ2xhc3MoJ2ZhLWluZm8tY2lyY2xlJykuYWRkQ2xhc3MoJ3JlcG9ydC1kZXRhaWxzLWxpbmsnKS5hdHRyKCd0aXRsZScsICdSZXBvcnQgZGV0YWlscycpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAkZWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBUSEVNRV9DTEFTU0VTIH0gZnJvbSAnLi4vSGVscGVycy9UaGVtZSc7XHJcbmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVG9vbGJhclNldHRpbmcge1xyXG4gIG9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENMQVNTRVMgPSB7XHJcbiAgdGl0bGU6ICdpc296LXRpdGxlJyxcclxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcclxuICBkcm9wRG93bkJ1dHRvbjogJ2R4LWRyb3Bkb3dubWVudS1idXR0b24nXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcjogc3RyaW5nLCBzZXR0aW5nczogSVRvb2xiYXJTZXR0aW5nID0geyB0aXRsZTogJycsIGRlc2NyaXB0aW9uOiAnJywgb3B0aW9uczoge30gfSk6XHJcbiAgRGV2RXhwcmVzcy51aS5keFRvb2xiYXIge1xyXG4gIGNvbnN0IHtcclxuICAgIHRpdGxlID0gJycsXHJcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxyXG4gICAgb3B0aW9ucyA9IHt9LFxyXG4gIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7XHJcbiAgICBpdGVtcyA9IFtdLFxyXG4gICAgZWxlbWVudEF0dHIgPSB7fVxyXG4gIH0gPSBvcHRpb25zO1xyXG5cclxuICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICBjb25zdCBtaWRsZGVTaXplRWxlbWVudEF0dHIgPSB7IGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kIH07XHJcblxyXG4gICAgaWYgKGl0ZW0ub3B0aW9ucykge1xyXG4gICAgICBsZXQgeyBlZGl0b3JPcHRpb25zIH0gPSBpdGVtLm9wdGlvbnM7XHJcblxyXG4gICAgICBpZiAoIWVkaXRvck9wdGlvbnMpIHtcclxuICAgICAgICBlZGl0b3JPcHRpb25zID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVkaXRvck9wdGlvbnMuZWxlbWVudEF0dHIgPSBtaWRsZGVTaXplRWxlbWVudEF0dHI7XHJcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcclxuICAgICAgaXRlbS5vcHRpb25zLmVkaXRvck90aW9ucyA9IGVkaXRvck9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKGUpID0+IHtcclxuICAgIGUuZWxlbWVudFxyXG4gICAgICAuZmluZChgLiR7Q0xBU1NFUy5kcm9wRG93bkJ1dHRvbn1gKVxyXG4gICAgICAuYWRkQ2xhc3MoVEhFTUVfQ0xBU1NFUy5tZCk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgIG9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcclxuICAgIC5keFRvb2xiYXIoe1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlLCBkZXNjcmlwdGlvbiksXHJcbiAgICAgICAgLi4uaXRlbXNcclxuICAgICAgXSxcclxuICAgICAgb25Db250ZW50UmVhZHksXHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXHJcbiAgICAgICAgY2xhc3M6IENMQVNTRVMuaGVhZGVyXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuZHhUb29sYmFyKCdpbnN0YW5jZScpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xyXG5cclxuY29uc3QgQ1NTID0ge1xyXG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXHJcbn07XHJcblxyXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0Q29udGVudEhlaWdodCA9IG51bGw7XHJcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUhlaWdodCh3aWRnZXQpIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgJHBhbmVsLmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcclxuICBjb25zdCAkd2lkZ2V0ID0gd2lkZ2V0LmVsZW1lbnQoKTtcclxuICBjb25zdCAkcGFuZWwgPSB3aWRnZXQuZWxlbWVudCgpLnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcclxuXHJcbiAgY29uc3QgcGFuZWxUb3AgPSAkcGFuZWwucG9zaXRpb24oKS50b3A7XHJcbiAgY29uc3QgcGFuZWxIZWlnaHQgPSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XHJcbiAgY29uc3Qgd2lkZ2V0VG9wID0gJHdpZGdldC5wb3NpdGlvbigpLnRvcDtcclxuXHJcbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcclxuXHJcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0Jywgd2lkZ2V0SGVpZ2h0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gIGNvbnN0IGRpZmYgPSB3aW5kb3dIZWlnaHQgLSBsYXN0V2luZG93SGVpZ2h0O1xyXG5cclxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xyXG4gIGxhc3RXaWRnZXRIZWlnaHQgKz0gZGlmZjtcclxuICBsYXN0V2luZG93SGVpZ2h0ID0gd2luZG93SGVpZ2h0O1xyXG5cclxuICB1cGRhdGVIZWlnaHQod2lkZ2V0KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24od2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+KSB7XHJcbiAgY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCk7XHJcblxyXG4gIGF1dG9SZXNpemUoKCkgPT4gY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHBhbmVsSGVpZ2h0IGZyb20gJy4uL1BhbmVsSGVpZ2h0JztcclxuaW1wb3J0IHsgQ1NTX0NMQVNTRVMgfSBmcm9tICcuLi8uLi9TdHlsaW5nL0luZGV4JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB7XHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIGluUGFuZWxHcmlkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZChpZDogSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBpc0luUGFuZWxHcmlkID0gZmFsc2UpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XHJcblxyXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcclxuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XHJcbiAgICAgIHBhbmVsSGVpZ2h0KGdyaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnVsbFNjcmVlbihncmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0YUdyaWQoZWw6IEpRdWVyeSwgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgY29uc3QgZ3JpZCA9IGVsLmR4RGF0YUdyaWQob3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxyXG4gIGVsOiBzdHJpbmcgfCBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdC5Qcm9wZXJ0aWVzLCBpc0luUGFuZWwgPSBmYWxzZVxyXG4pOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3Qge1xyXG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XHJcblxyXG4gIHRyZWVMaXN0LmVsZW1lbnQoKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keERhdGFHcmlkKTtcclxuXHJcbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xyXG4gICAgaWYgKGlzSW5QYW5lbCkge1xyXG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmdWxsU2NyZWVuKHRyZWVMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0cmVlTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xyXG4gIHJldHVybiAkKCc8c3Bhbj4nKVxyXG4gICAgLmF0dHIoJ3RpdGxlJywgdGl0bGUpXHJcbiAgICAudGV4dCh0ZXh0KTtcclxufVxyXG4iLCAiaW1wb3J0IHNhdmVBcyBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENyZWF0ZUdyaWRFeHBvcnRGdW5jdGlvbihyZXBvcnROYW1lOiBzdHJpbmcpOiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB2b2lkIHtcclxuICByZXR1cm4gKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldChyZXBvcnROYW1lKTtcclxuXHJcbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xyXG4gICAgICB3b3Jrc2hlZXQsXHJcbiAgICAgIGNvbXBvbmVudDogZS5jb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhjZWxDZWxsID0gb3B0aW9ucy5leGNlbENlbGw7XHJcblxyXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xyXG4gICAgICAgIGV4Y2VsQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JyB9O1xyXG4gICAgICB9XHJcbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCkudGhlbihmdW5jdGlvbihidWZmZXIpIHtcclxuICAgICAgICBzYXZlQXMobmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSksIGAke3JlcG9ydE5hbWV9Lnhsc3hgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGUuY2FuY2VsID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IFRvb2xiYXJIZWxwZXIgfSBmcm9tICcuLi8uLi9IZWxwZXJzL1Rvb2xiYXInO1xyXG5pbXBvcnQgeyBUaGVtZUhlbHBlciwgVEhFTUVfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGhlbWUnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9Db25maWcvSW5kZXgnO1xyXG5pbXBvcnQgY3JlYXRlR3JpZEV4cG9ydEZuIGZyb20gJy4uLy4uL1V0aWxzL0dyaWRFeHBvcnQnO1xyXG5cclxuaW50ZXJmYWNlIElHcmlkU2V0dGluZ3NCYXNlPFQ+IHtcclxuICBvcHRpb25zPzogVDtcclxuXHJcbiAgZXhwb3J0RmlsZU5hbWU/OiBzdHJpbmc7XHJcbiAgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgc2V0RGVmYXVsdENvbHVtbldpZHRoPzogYm9vbGVhbjtcclxuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgZGlzYWJsZVN1bW1hcnlDb2x1bW5EZXRlY3Rpb24/OiBib29sZWFuO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lPzogc3RyaW5nO1xyXG4gIHRvb2xiYXJJdGVtcz86IGFueVtdO1xyXG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XHJcbn1cclxuXHJcbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcclxuICByZXR1cm4gd2lkZ2V0XHJcbiAgICAuc2xpY2UoJ2R4Jy5sZW5ndGgpXHJcbiAgICAudG9Mb3dlckNhc2UoKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IGdyaWROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2VhcmNoUGFuZWw6IGAuZHgtJHtncmlkTmFtZX0tc2VhcmNoLXBhbmVsYCxcclxuICAgIHRvb2xiYXJFZGl0QnV0dG9uOiBgLmR4LSR7Z3JpZE5hbWV9LXRvb2xiYXItYnV0dG9uLmR4LWVkaXQtYnV0dG9uYCxcclxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcclxuICAgIHNlbGVjdENoZWNrQm94OiAnLmR4LXNlbGVjdC1jaGVja2JveCdcclxuICB9O1xyXG59O1xyXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhR3JpZFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTGlzdFNldHRpbmdzIGV4dGVuZHMgSUdyaWRTZXR0aW5nc0Jhc2U8RGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4ge1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZERlZmF1bHRPcHRpb25zKHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncykge1xyXG4gIGNvbnN0IHJlc3VsdDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyBnZXRMZWdhY3lEZWZhdWx0T3B0aW9ucyhzZXR0aW5ncykgOiBnZXREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcblxyXG4gIGlmIChzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4pIHtcclxuICAgIChyZXN1bHQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMpLnN1bW1hcnkgPSB7XHJcbiAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgY29sdW1uOiBzZXR0aW5ncy5zdW1tYXJ5Q29sdW1uIHx8IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4sXHJcbiAgICAgICAgc2hvd0luQ29sdW1uOiBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uIHx8IHNldHRpbmdzLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcclxuICAgICAgfV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZXN1bHQuZXhwb3J0ID0ge1xyXG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcclxuICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlLFxyXG4gIH07XHJcblxyXG4gIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICByZXN1bHQuZ3JvdXBQYW5lbCA9IHsgdmlzaWJsZTogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyZWVMaXN0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzKSB7XHJcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xyXG5cclxuICByZXN1bHQuc2VsZWN0aW9uID0geyBtb2RlOiAnbm9uZScgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnNcclxuICA8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5ncyk6IFQge1xyXG4gIHJldHVybiB7XHJcbiAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgY2FjaGVFbmFibGVkOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRydWUsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogODAgfSxcclxuICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgc2Nyb2xsaW5nOiB7XHJcbiAgICAgIG1vZGU6ICd2aXJ0dWFsJyxcclxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXHJcbiAgICB9LFxyXG4gICAgc2VhcmNoUGFuZWw6IHtcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDI0MCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2guLi4nXHJcbiAgICB9LFxyXG4gICAgc2hvd1Jvd0xpbmVzOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgd29yZFdyYXBFbmFibGVkOiB0cnVlXHJcbiAgfSBhcyBUO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMZWdhY3lEZWZhdWx0T3B0aW9uc1xyXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxyXG5cclxuICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnbXVsdGlwbGUnIH0sXHJcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXHJcbiAgICBzZWFyY2hQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdHJ1ZSB9LFxyXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxyXG4gIH0gYXMgVDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9uczogYW55LCB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZykge1xyXG4gIGNvbnN0IGZpbmRUb29sYmFySXRlbSA9IChpdGVtczogYW55W10sIG5hbWU6IHN0cmluZykgPT4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcclxuXHJcbiAgaWYgKHRvb2xiYXJPcHRpb25zPy5pdGVtcykge1xyXG4gICAgY29uc3QgeyBpdGVtcyB9ID0gdG9vbGJhck9wdGlvbnM7XHJcblxyXG4gICAgaWYgKHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IGFjY2VudEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsIHRvb2xiYXJBY2NlbnRCdXR0b25OYW1lKTtcclxuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcclxuICAgICAgICBhY2NlbnRCdXR0b25JdGVtLm9wdGlvbnMudHlwZSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhdmVCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAnc2F2ZUJ1dHRvbicpO1xyXG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHNhdmVCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdTYXZlJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXZlcnRCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmV2ZXJ0QnV0dG9uJyk7XHJcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xyXG4gICAgICByZXZlcnRCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJldmVydEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ0Rpc2NhcmQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hCdXR0b25JdGVtID0gZmluZFRvb2xiYXJJdGVtKGl0ZW1zLCAncmVmcmVzaCcpO1xyXG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLnNob3dUZXh0ID0gJ2Fsd2F5cyc7XHJcbiAgICAgIHJlZnJlc2hCdXR0b25JdGVtLm9wdGlvbnMudGV4dCA9ICdSZWZyZXNoJztcclxuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGFuZGxlcnM8VCBleHRlbmRzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgfCBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPihcclxuICB3aWRnZXQ6ICdkeERhdGFHcmlkJyB8ICdkeFRyZWVMaXN0JyxcclxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xyXG4pOiBUIHtcclxuICBjb25zdCBzZWxlY3RvcnMgPSBnZXRTZWxlY3RvcnMod2lkZ2V0KTtcclxuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnaGVhZGVyJykge1xyXG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25DZWxsUHJlcGFyZWQpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zPy5vbkNlbGxQcmVwYXJlZChlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgaWYgKCFzZXR0aW5ncy5kaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbikge1xyXG4gICAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGRhdGFHcmlkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpc0dyaWRJbml0aWFsaXphZWQpIHtcclxuICAgICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZGF0YUdyaWQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyaWQuY29sdW1uQ291bnQoKTsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2RhdGFUeXBlJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5zZXREZWZhdWx0Q29sdW1uV2lkdGggfHwgc2V0dGluZ3Muc2V0RGVmYXVsdENvbHVtbldpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGlmICghZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICc0NXB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTM1cHgnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE0MHB4Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScgfHwgZGF0YVR5cGUgPT09ICdkYXRlJykge1xyXG4gICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ2FsaWdubWVudCcsICdyaWdodCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ2RkIE1NTSB5eXl5Jyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ0hIOm1tLCBkZCBNTU0geXl5eScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNtYWxsU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoc2VsZWN0b3JzLnNlbGVjdENoZWNrQm94KSk7XHJcblxyXG4gICAgICAgIGlmICgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcclxuICAgICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0U21hbGxTaXplKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmR4QnV0dG9uKCdpbnN0YW5jZScpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldE1pZGRsZVNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGVudFJlYWR5KSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zID0ge31cclxuICAgICAgfSA9IGU7XHJcblxyXG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xyXG5cclxuICAgICAgY29uc3Qge1xyXG4gICAgICAgIGl0ZW1zID0gW11cclxuICAgICAgfSA9IHRvb2xiYXJPcHRpb25zO1xyXG5cclxuICAgICAgaWYgKGNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy50aXRsZSkge1xyXG4gICAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZSgpIHtcclxuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoc2V0dGluZ3MudGl0bGUpO1xyXG4gICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicgJiYgaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLnRpdGxlKSB7XHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHNldHRpbmdzLnRpdGxlLCBzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtLndpZGdldCA9PT0gJ2R4QnV0dG9uJykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XHJcbiAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHNldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gMTYgOiAyNDtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnYWRkUm93QnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdwbHVzJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdzYXZlQnV0dG9uJzpcclxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdzYXZlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBjYXNlICdyZXZlcnRCdXR0b24nOlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSBUaGVtZUhlbHBlci5nZXRJY29uQ2xhc3MoJ2Nsb3NlJywgZmFsc2UsIGljb25TaXplKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIpIHtcclxuICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyLmNsYXNzID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZDtcclxuICAgICAgICAgICAgaXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcmVwYXJlRGVmYXVsdFRvb2xiYXJCdXR0b25zKHRvb2xiYXJPcHRpb25zLCBzZXR0aW5ncy50b29sYmFyQWNjZW50QnV0dG9uTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy50b29sYmFySXRlbXMpIHtcclxuICAgICAgICAgIGl0ZW1zLnB1c2goLi4uc2V0dGluZ3MudG9vbGJhckl0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2xiYXJPcHRpb25zLmVsZW1lbnRBdHRyID0ge1xyXG4gICAgICAgICAgY2xhc3M6ICdpc296LXRvb2xiYXItaGVhZGVyJ1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNhdmVCdXR0b25JbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzYXZlQnV0dG9uJyk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKTtcclxuICAgICAgbGV0IGluZGV4Rm9yVXBkYXRlID0gLTE7XHJcblxyXG4gICAgICBpZiAoc2F2ZUJ1dHRvbkluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNhdmVCdXR0b25JbmRleDtcclxuICAgICAgfSBlbHNlIGlmIChzZWFyY2hQYW5lbEluZGV4ID4gLTEpIHtcclxuICAgICAgICBpbmRleEZvclVwZGF0ZSA9IHNlYXJjaFBhbmVsSW5kZXg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmxlbmd0aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy5zcGxpY2UoaW5kZXhGb3JVcGRhdGUsIDAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICBuYW1lOiAncmVmcmVzaCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGljb246ICdyZWZyZXNoJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAzMCA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZWxlbWVudEF0dHI6IHsgY2xhc3M6IGBkeC1kYXRhZ3JpZC10b29sYmFyLWJ1dHRvbiAke3NldHRpbmdzLmJ1dHRvbnNTaXplID09PSAnc20nID8gVEhFTUVfQ0xBU1NFUy5zbSA6IFRIRU1FX0NMQVNTRVMubWR9YCB9LFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gJ3RleHQnIDogJ2NvbnRhaW5lZCcsXHJcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGRhdGFHcmlkPy5yZWZyZXNoKCksXHJcbiAgICAgICAgICAgIG9uQ29udGVudFJlYWR5OiBjb25maWcuaXNMZWdhY3lSZW5kZXIgPyAoY29udGVudFJlYWR5RXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb250ZW50UmVhZHlFdmVudC5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiA2LFxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b24uUHJvcGVydGllc1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vblRvb2xiYXJQcmVwYXJpbmcpIHtcclxuICAgICAgICBzZXR0aW5ncy5vcHRpb25zLm9uVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucyA9IHtcclxuICAgICAgICAgIC4uLmUuZWRpdG9yT3B0aW9ucyxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7XHJcbiAgICAgICAgICAgIGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4U2VsZWN0Qm94Jykge1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyxcclxuICAgICAgICAgICAgb25TaG93aW5nOiAoYXJnczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0TmFtZSA9IGdldFdpZGdldE5hbWUod2lkZ2V0KTtcclxuICAgICAgICAgICAgICBhcmdzLmNvbXBvbmVudC5fJHBvcHVwQ29udGVudC5hZGRDbGFzcyhgaXNvei0ke3dpZGdldE5hbWV9LXNlbGVjdGJveC1wb3B1cGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGUuZWRpdG9yTmFtZSA9PT0gJ2R4Q2hlY2tCb3gnKSB7XHJcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRFbGVtZW50U21hbGxTaXplKGUuZWRpdG9yRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGUucGFyZW50VHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2ZpbHRlclJvdyc6XHJcbiAgICAgICAgICBjb25zdCBhcHBseUZpbHRlcjogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcclxuICAgICAgICAgICAgZS5lbGVtZW50ICYmIGUuZWxlbWVudC5maW5kKCcuZHgtYXBwbHktYnV0dG9uJykudHJpZ2dlcignZHhjbGljaycpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5RmlsdGVyO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseUZpbHRlcjtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnc2VhcmNoUGFuZWwnOlxyXG4gICAgICAgICAgY29uc3QgYXBwbHlTZWFyY2g6IERldkV4cHJlc3MudWkuZHhUZXh0RWRpdG9yLlByb3BlcnRpZXNbJ29uRW50ZXJLZXknXSA9IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNlYXJjaEJ5VGV4dChhcmdzLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJykpO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRm9jdXNPdXQgPSBhcHBseVNlYXJjaDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uRWRpdG9yUHJlcGFyaW5nKSB7XHJcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkVkaXRvclByZXBhcmluZyhlKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uQ29udGV4dE1lbnVQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSAnY29udGVudCcgJiYgISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkge1xyXG4gICAgICAgICAgaWYgKCFlLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGUuaXRlbXMgPSBbXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBlLml0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IGFsbCBkYXRhJyxcclxuICAgICAgICAgICAgb25JdGVtQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5leHBvcnRUb0V4Y2VsKGZhbHNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaWNvbjogJ3hsc3hmaWxlJ1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnVJdGVtKTtcclxuXHJcbiAgICAgICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucy5zZWxlY3Rpb24/Lm1vZGUgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSBlLmNvbXBvbmVudC5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuXHJcbiAgICAgICAgICAgIGUuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ0V4cG9ydCBzZWxlY3RlZCByb3dzJyxcclxuICAgICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4gZS5jb21wb25lbnQuZXhwb3J0VG9FeGNlbCh0cnVlKSxcclxuICAgICAgICAgICAgICBpY29uOiAnZXhwb3J0c2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgIGRpc2FibGVkOiAhc2VsZWN0ZWRSb3dzIHx8ICFzZWxlY3RlZFJvd3MubGVuZ3RoXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51SXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZXh0TWVudVByZXBhcmluZykge1xyXG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGV4dE1lbnVQcmVwYXJpbmcoZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkV4cG9ydGluZzogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSA/IGNyZWF0ZUdyaWRFeHBvcnRGbihzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkgOiB2b2lkIDAsXHJcbiAgfSBhcyBUO1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCB7IGdldEdyaWREZWZhdWx0T3B0aW9ucywgZ2V0SGFuZGxlcnMsIElEYXRhR3JpZFNldHRpbmdzIH0gZnJvbSAnLi9EZWZhdWx0R3JpZEJhc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWw6IEpRdWVyeSwgc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldEdyaWREZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XHJcbiAgbGV0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIHNldHRpbmdzLm9wdGlvbnMpO1xyXG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnM8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4oJ2R4RGF0YUdyaWQnLCAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9KSk7XHJcblxyXG4gIG1lcmdlZE9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgbWVyZ2VkT3B0aW9ucywgaGFuZGxlcnMpO1xyXG5cclxuICBpZiAoc2V0dGluZ3MuaXNGdWxsU2NyZWVuIHx8IHNldHRpbmdzLmlzRnVsbFNjcmVlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGVsLCBtZXJnZWRPcHRpb25zLCBzZXR0aW5ncy5pblBhbmVsR3JpZCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBjcmVhdGVEYXRhR3JpZChlbCwgbWVyZ2VkT3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuL0RlZmF1bHRHcmlkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKFxyXG4gIGlkOiBzdHJpbmcsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZ1xyXG4pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gIHJldHVybiBkZWZhdWx0R3JpZCgkKGAjJHtpZH1gKSwge1xyXG4gICAgb3B0aW9uczogZGF0YUdyaWRPcHRpb25zLFxyXG4gICAgZXhwb3J0RmlsZU5hbWU6IGFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgaW5QYW5lbEdyaWQ6IGFkZGl0aW9uYWxPcHRpb25zLmluUGFuZWxHcmlkLFxyXG4gICAgc2hvd1N1bW1hcnlJbkNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc2hvd1N1bW1hcnlJbkNvbHVtbixcclxuICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICBoZWFkZXJEZXNjcmlwdGlvbixcclxuICAgIHRpdGxlOiBoZWFkZXJUZXh0XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElUcmVlTGlzdFNldHRpbmdzLCBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcclxuaW1wb3J0IHsgY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0IH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcclxuICBpZDogc3RyaW5nIHwgSlF1ZXJ5LFxyXG4gIHNldHRpbmdzOiBJVHJlZUxpc3RTZXR0aW5ncyA9IHt9XHJcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XHJcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcclxuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XHJcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPignZHhUcmVlTGlzdCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcclxuXHJcbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XHJcblxyXG4gIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuVHJlZUxpc3QoaWQsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcclxufVxyXG4iLCAiaW1wb3J0IENyb3BwciBmcm9tICdjcm9wcHInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi9Qb3B1cCc7XHJcblxyXG5pbXBvcnQgSW5pdGlhbGl6ZWRFdmVudEluZm8gPSBEZXZFeHByZXNzLmV2ZW50cy5Jbml0aWFsaXplZEV2ZW50SW5mbztcclxuXHJcbmNvbnN0IGF2YXRhclNpemUgPSB7XHJcbiAgaGVpZ2h0OiAzMDAsXHJcbiAgd2lkdGg6IDMwMCxcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0SW1hZ2VUb1ByZXZpZXcgKHByZXZpZXc6IEpRdWVyeSwgYmFzZTY0SW1nOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgcHJldmlldy5hdHRyKCdzcmMnLCBiYXNlNjRJbWcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb250ZW50TWFya3VwIChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCkge1xyXG4gIGNvbnN0ICRhdmF0YXJQb3B1cENvbnRlbnQgPSAkKCc8ZGl2PicpXHJcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fZHJvcHpvbmUnKTtcclxuICAvLy5vbignZHJvcCcgLCBldiA9PiBldi5kYXRhVHJhbnNmZXIuZmlsZXMpXHJcblxyXG4gIGNvbnN0ICRjcm9wcGVyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX2Nyb3AtY29udGFpbmVyJylcclxuICAgIC5hcHBlbmRUbygkYXZhdGFyUG9wdXBDb250ZW50KTtcclxuXHJcbiAgY29uc3QgJGNyb3BJbWFnZSA9ICQoJzxpbWcgLz4nKS5wcmVwZW5kVG8oJGNyb3BwZXJDb250YWluZXIpO1xyXG5cclxuICBzZXRJbWFnZVRvUHJldmlldygkY3JvcEltYWdlLCBpbWFnZUJhc2U2NCk7XHJcblxyXG4gIGNvbnN0IGNyb3BwZXIgPSBuZXcgQ3JvcHByKCRjcm9wSW1hZ2VbMF0sIHtcclxuICAgIGFzcGVjdFJhdGlvOiAxLFxyXG4gICAgc3RhcnRTaXplOiBbOTAsIDkwXSxcclxuICB9KTtcclxuXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAkY29udGVudDogJGF2YXRhclBvcHVwQ29udGVudCxcclxuICAgIGNyb3BwZXJcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAgKCRjb250ZW50OiBKUXVlcnksIGNyb3BwZXI6IENyb3Bwciwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNyZWF0ZURpYWxvZyhcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdVcGRhdGUgcHJvZmlsZSBwaWN0dXJlJyxcclxuICAgICAgc2hvd1RpdGxlOiB0cnVlLFxyXG4gICAgICBkcmFnRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICBtYXhXaWR0aDogMTAyNCxcclxuICAgICAgb25Jbml0aWFsaXplZDogKGU6IEluaXRpYWxpemVkRXZlbnRJbmZvPERldkV4cHJlc3MudWkuZHhQb3B1cD4pID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudCAmJiBlLmNvbXBvbmVudC5vcHRpb24oJ2Z1bGxTY3JlZW4nLCB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDI0KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICRjb250ZW50LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiAnVXBkYXRlJyxcclxuICAgICAgb25DbGljazogKGNsb3NlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY3JvcE9wdGlvbnMgPSBjcm9wcGVyLmdldFZhbHVlKCk7XHJcbiAgICAgICAgY29uc3QgJGNhbnZhczogSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PiA9ICQoJzxjYW52YXM+JykuYXR0cignaGVpZ2h0JywgYXZhdGFyU2l6ZS5oZWlnaHQpLmF0dHIoJ3dpZHRoJywgYXZhdGFyU2l6ZS53aWR0aCkgYXMgSlF1ZXJ5PEhUTUxDYW52YXNFbGVtZW50PjtcclxuICAgICAgICBjb25zdCBjdHggPSAoJGNhbnZhc1swXSBhcyBhbnkpLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgY29uc3QgJGltYWdlID0gJGNvbnRlbnQuZmluZCgnaW1nLmNyb3Bwci1pbWFnZScpWzBdO1xyXG5cclxuICAgICAgICBjdHguZHJhd0ltYWdlKCRpbWFnZSwgY3JvcE9wdGlvbnMueCwgY3JvcE9wdGlvbnMueSwgY3JvcE9wdGlvbnMud2lkdGgsIGNyb3BPcHRpb25zLmhlaWdodCwgMCwgMCwgYXZhdGFyU2l6ZS53aWR0aCwgYXZhdGFyU2l6ZS5oZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCBjcm9wcGVkID0gJGNhbnZhc1swXS50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjkpO1xyXG5cclxuICAgICAgICBvbkF2YXRhclVwZGF0ZWQoY3JvcHBlZCk7XHJcbiAgICAgICAgY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgIG9uQ2xpY2s6IChjbG9zZSkgPT4gY2xvc2UoKVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93IChpbWFnZUJhc2U2NDogc3RyaW5nIHwgbnVsbCwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xyXG4gIGNvbnN0IGNvbnRlbnQgPSBjcmVhdGVDb250ZW50TWFya3VwKGltYWdlQmFzZTY0KTtcclxuXHJcbiAgc2hvd1BvcHVwKGNvbnRlbnQuJGNvbnRlbnQsIGNvbnRlbnQuY3JvcHBlciwgb25BdmF0YXJVcGRhdGVkKTtcclxufVxyXG4iLCAiZXhwb3J0IGNvbnN0IGdldEJhc2U2NCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsZVJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgcmVzb2x2ZSh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6IG51bGwpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcbiIsICJpbXBvcnQge0lSZW5kZXJlZH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuaW1wb3J0IHtEZXZFeHByZXNzRXZlbnRBcmdzfSBmcm9tICcuLi8uLi9VdGlscy9EZXZFeHByZXNzRXZlbnRBcmdzJztcclxuaW1wb3J0IHsgc2hvdyB9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nJztcclxuaW1wb3J0IHtnZXRCYXNlNjR9IGZyb20gJy4uLy4uL1dpZGdldHMvSW1hZ2VDcm9wRGlhbG9nL0hlbHBlcnMnO1xyXG5pbXBvcnQgZHhUZXh0Qm94T3B0aW9ucyA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94T3B0aW9ucztcclxuaW1wb3J0IGR4VGV4dEJveCA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94O1xyXG5pbXBvcnQgSXN6b2xlYVVJIGZyb20gJy4uLy4uL2luZGV4JztcclxuXHJcbmNvbnN0IG1heEZpbGVNYlNpemUgPSAxMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjY291bnRTZXR0aW5nc0RhdGEge1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XHJcbiAgTGFzdE5hbWU6IHN0cmluZztcclxuICBQaG9uZU51bWJlcjogc3RyaW5nO1xyXG4gIEVtYWlsOiBzdHJpbmc7XHJcbiAgT2xkUGFzc3dvcmQ6IHN0cmluZztcclxuICBOZXdQYXNzd29yZDogc3RyaW5nO1xyXG4gIE5ld1Bhc3N3b3JkUmVwZWF0OiBzdHJpbmc7XHJcbiAgQXZhdGFyOiBzdHJpbmc7XHJcbiAgSGFzQ2hhbmdlczogYm9vbGVhbjtcclxuICBFcnJvck1lc3NhZ2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XHJcbiAgSWQ6IHN0cmluZztcclxuICBVc2VyTmFtZTogc3RyaW5nO1xyXG4gIEZpcnN0TmFtZTogc3RyaW5nO1xyXG4gIExhc3ROYW1lOiBzdHJpbmc7XHJcbiAgVXNlckF2YXRhcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWNjb3VudFNldHRpbmdzUGFnZSBpbXBsZW1lbnRzIElSZW5kZXJlZCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkO1xyXG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50U2V0dGluZ3NEYXRhOiBJQWNjb3VudFNldHRpbmdzRGF0YSB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUFjdGlvbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgYXZhdGFyVXBsb2FkZXI6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBhY2NvdW50U2V0dGluZ3NGb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gZWxlbWVudHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF8kcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgJGNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PixcclxuICAgIGZvcm1BY3Rpb246IHN0cmluZyxcclxuICAgIGFjY291bnRTZXR0aW5nc0RhdGE6IElBY2NvdW50U2V0dGluZ3NEYXRhIHwgdW5kZWZpbmVkLFxyXG4gICAgdXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEgPSBhY2NvdW50U2V0dGluZ3NEYXRhO1xyXG4gICAgdGhpcy5jdXJyZW50VXNlckluZm8gPSB1c2VySW5mbztcclxuICAgIHRoaXMuXyRyb290RWxlbWVudCA9ICRjb250YWluZXI7XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24gPSBmb3JtQWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMucmVuZGVyVXBsb2FkZXIodGhpcy4kcm9vdEVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJBY2NvdW50U2V0dGluZ3NGb3JtKHRoaXMuJHJvb3RFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0ICRyb290RWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5fJHJvb3RFbGVtZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJvb3QgZWxlbWVudCBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fJHJvb3RFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcclxuICAgIHRoaXMuYXZhdGFyVXBsb2FkZXIgPSAkKCc8ZGl2PicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXZhdGFyLXBvcHVwX191cGxvYWRlcicpXHJcbiAgICAgIC5keEZpbGVVcGxvYWRlcih7XHJcbiAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxyXG4gICAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgICBhY2NlcHQ6ICdpbWFnZS8qJyxcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgICBtYXhGaWxlU2l6ZTogbWF4RmlsZU1iU2l6ZSAqIDEwMDAwMDAsXHJcblxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzc0V2ZW50QXJnczxEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyT3B0aW9ucywgJ29uVmFsdWVDaGFuZ2VkJz4pID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQgfHwgIWUudmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGUudmFsdWVbMF07XHJcbiAgICAgICAgICBjb25zdCBtYXhTaXplID0gZS5jb21wb25lbnQub3B0aW9uKCdtYXhGaWxlU2l6ZScpIHx8IG1heEZpbGVNYlNpemU7XHJcblxyXG4gICAgICAgICAgaWYgKCFmaWxlIHx8IGZpbGUuc2l6ZSA+IG1heFNpemUpIHtcclxuICAgICAgICAgICAgRGV2RXhwcmVzcy51aS5ub3RpZnkoYEZpbGUgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7bWF4RmlsZU1iU2l6ZX0gTUIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlYCwgJ2Vycm9yJywgNTAwMCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZ2V0QmFzZTY0KGZpbGUpXHJcbiAgICAgICAgICAgIC50aGVuKChpbWFnZUJhc2U2NCkgPT4ge1xyXG4gICAgICAgICAgICAgIHNob3coaW1hZ2VCYXNlNjQsIChuZXdJbWdTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8udXBkYXRlRGF0YSgnQXZhdGFyJywgbmV3SW1nU291cmNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8ucmVwYWludCgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBEZXZFeHByZXNzLnVpLm5vdGlmeShlcnJvciwgJ2Vycm9yJywgMzAwMCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKVxyXG4gICAgICAuZHhGaWxlVXBsb2FkZXIoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckFjY291bnRTZXR0aW5nc0Zvcm0oJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICBpZiAodGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0gPSAkKCc8Zm9ybSAvPicpXHJcbiAgICAgIC5hdHRyKCdhY3Rpb24nLCB0aGlzLmZvcm1BY3Rpb24pXHJcbiAgICAgIC5hdHRyKCdtZXRob2QnLCAncG9zdCcpXHJcbiAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fZm9ybScpXHJcbiAgICAgIC5hZGRDbGFzcygnZm9ybS1jb250ZW50JylcclxuICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpXHJcbiAgICAgIC5keEZvcm0odGhpcy5nZXRGb3JtT3B0aW9ucygpKVxyXG4gICAgICAuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBJc3pvbGVhVUkud2lkZ2V0cy5ub3RpZnkoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJywgdHJ1ZSksIDUwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1PcHRpb25zKCkgOiBEZXZFeHByZXNzLnVpLmR4Rm9ybU9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9ybURhdGE6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSxcclxuICAgICAgbWluQ29sV2lkdGg6IDIwMCxcclxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXHJcbiAgICAgIGFsaWduSXRlbUxhYmVsczogdHJ1ZSxcclxuICAgICAgc2hvd1ZhbGlkYXRpb25TdW1tYXJ5OiB0cnVlLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICAgICAgY29sQ291bnQ6IDE2LFxyXG4gICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDYsXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ1Byb2ZpbGUgUGljdHVyZScsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdBdmF0YXInLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICRhdmF0YXJWaWV3Q29udGFpbmVyID0gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1jb250YWluZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoJGF2YXRhclZpZXdDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItYnV0dG9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdwaG90bycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnVXBsb2FkIG5ldyBpbWFnZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5hdmF0YXJVcGxvYWRlciAmJiB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZGlhbG9nVHJpZ2dlcicsIGUuZWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgKS5hcHBlbmRUbygkYXZhdGFyQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZhdGFyQmFzZTY0ID0gZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlIHx8IHRoaXMuY3VycmVudFVzZXJJbmZvPy5Vc2VyQXZhdGFyO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXZhdGFyQmFzZTY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aW1nPicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgYXZhdGFyQmFzZTY0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhclZpZXdDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0PicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItaW5wdXQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ0F2YXRhcicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aT4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoWydhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1kZWZhdWx0JywgJ2ZhcycsICdmYS11c2VyJ10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkYXZhdGFyVmlld0NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZih0aGlzLmF2YXRhclVwbG9hZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZHJvcFpvbmUnLCAkYXZhdGFyQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXZhdGFyVXBsb2FkZXIub3B0aW9uKCdvbkRyb3Bab25lRW50ZXInLCAoKSA9PiAkYXZhdGFyQ29udGFpbmVyLmFkZENsYXNzKCdkcm9wJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5hdmF0YXJVcGxvYWRlci5vcHRpb24oJ29uRHJvcFpvbmVMZWF2ZScsICgpID0+ICRhdmF0YXJDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2Ryb3AnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGF2YXRhckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlOiAnZW1wdHknLFxyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbFNwYW46IDksXHJcbiAgICAgICAgICAgICAgY2FwdGlvbjogJ0FjY291bnQgRGV0YWlscycsXHJcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFcnJvck1lc3NhZ2UnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGRhdGEgJiYgZGF0YS5lZGl0b3JPcHRpb25zICYmIGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZSAmJiAkKCc8ZGl2IC8+JykudGV4dChlcnJvck1lc3NhZ2UpLmFkZENsYXNzKCdlcnJvci1tZXNzYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgLy8gICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAvLyAgIGRhdGFGaWVsZDogJ0hhc0NoYW5nZXMnLFxyXG4gICAgICAgICAgICAgICAgLy8gICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyAgIHZpc2libGU6IHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YT8uSGFzQ2hhbmdlcyAmJiAhdGhpcy5hY2NvdW50U2V0dGluZ3NEYXRhLkVycm9yTWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIC8vICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gJCgnPGRpdiAvPicpLnRleHQoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJykuYWRkQ2xhc3MoJ3N1Y2Nlc3MtbWVzc2FnZScpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdVc2VyTmFtZScsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1VzZXJuYW1lJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdVc2VybmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgICAgICAgICAgIGNvbENvdW50OiAyLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0ZpcnN0TmFtZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRmlyc3QgTmFtZSdcclxuICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRmlyc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0xhc3ROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdMYXN0IE5hbWUnXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJywgbWVzc2FnZTogJ0xhc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnUGhvbmVOdW1iZXInLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdQaG9uZSBOdW1iZXInXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRW1haWwnLFxyXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdFbWFpbCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRW1haWwgaXMgcmVxdWlyZWQnIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZW1haWwnLCBtZXNzYWdlOiAnUGxlYXNlIHVzZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnIH1cclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3Bhc3N3b3JkLWFyZWEnLFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4gJCgnPGRpdiAvPicpLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpLnRleHQoJ0NoYW5nZSBQYXNzd29yZCcpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ09sZFBhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ3VycmVudCBwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZWV2YWx1YXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEhdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy5nZXRFZGl0b3IoJ05ld1Bhc3N3b3JkJyk/Lm9wdGlvbigndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXBhcmFtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ09sZCBwYXNzd29yZCBpcyByZXF1aXJlZCdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ05ld1Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dEF0dHI6IHsgYXV0b2NvbXBsZXRlOiAnbmV3LXBhc3N3b3JkJyB9XHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgZHhUZXh0Qm94T3B0aW9uczxkeFRleHRCb3g+LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZFJlcGVhdCcsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0NvbmZpcm0gbmV3IHBhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IChwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpIHx8ICcnKSA9PT0gcGFyYW1zLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQYXNzd29yZCBtaXNtYXRjaCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdidXR0b24nLFxyXG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3N1Ym1pdC1idG4nLFxyXG4gICAgICAgICAgICAgICAgICBidXR0b25PcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1NhdmUgQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVN1Ym1pdEJlaGF2aW9yOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29uZmlybSh0ZXh0OiBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxib29sZWFuPiB7XHJcbiAgICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPGJvb2xlYW4+ID0gJC5EZWZlcnJlZCgpO1xyXG4gICAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5hcHBlbmRUbyh3aW5kb3cuZG9jdW1lbnQuYm9keSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXAgPSAkZWxlbWVudC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IGZhbHNlLFxyXG4gICAgICAgIGhlaWdodDogMTQwLFxyXG4gICAgICAgIHdpZHRoOiAzNzAsXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRlbnQpID0+IHtcclxuICAgICAgICAgICAgJGNvbnRlbnQuYWRkQ2xhc3MoJ2lzem9sZWEtZHgtY29uZmlybScpO1xyXG5cclxuICAgICAgICAgICAgJCgnPGIvPicpLmFkZENsYXNzKCdtZXNzYWdlJykudGV4dCh0ZXh0KS5hcHBlbmRUbygkY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCAkYnV0dG9uc1NlY3Rpb24gPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnYnV0dG9ucycpLmFwcGVuZFRvKCRjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnNTZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICQoJzxkaXYvPicpLmR4QnV0dG9uKHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgcG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgICAgIHBvcHVwLmVsZW1lbnQoKS5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICBwb3B1cC5zaG93KCk7XHJcblxyXG4gICAgcmV0dXJuICRkZWZmZXJlZDtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xyXG5pbXBvcnQgeyBMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSB9IGZyb20gJy4uL0NvbnN0YW50cy9DYWNoZUtleXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL0NvbmZpZy9JbmRleCc7XHJcbmltcG9ydCB7IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEvSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzJztcclxuaW1wb3J0IHsgc2hvdyBhcyBzaG93SW1hZ2VWaWV3ZXIgfSBmcm9tICcuLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZGluZygkY29udGFpbmVyOiBKUXVlcnksIGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZywgc2hvd1NpZ25JbkJ1dHRvbjogYm9vbGVhbiwgcGhvdG9HYWxsZXJ5U2V0dGluZ3M6IElCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyA9IHsgZW5hYmxlZDogZmFsc2UgfSkge1xyXG4gIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3MpLnRoZW4oKHNldHRpbmdzKSA9PiB7XHJcbiAgICBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXIsIHNldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uLCBwaG90b0dhbGxlcnlTZXR0aW5ncyk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldExvZ29TZXR0aW5ncyhsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcpOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiB7XHJcbiAgY29uc3QgJGRlZmZlcmVkOiBKUXVlcnlEZWZlcnJlZDxJTG9nb1NldHRpbmdzPiA9ICQuRGVmZXJyZWQoKTtcclxuXHJcbiAgaWYgKHR5cGVvZiBsb2dvU2V0dGluZ3MgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBjb25zdCBjYWNoZWRTZXR0aW5nc1JhdyA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZWRTZXR0aW5nc1Jhdykge1xyXG4gICAgICAkZGVmZmVyZWQucmVzb2x2ZShKU09OLnBhcnNlKGNhY2hlZFNldHRpbmdzUmF3KSBhcyBJTG9nb1NldHRpbmdzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbmRSZXF1ZXN0KGxvZ29TZXR0aW5ncywgJ3Bvc3QnKS5kb25lKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgYXBwbGljYXRpb25OYW1lOiBkYXRhLkFwcGxpY2F0aW9uTmFtZSxcclxuICAgICAgICAgIGJ1c2luZXNzTmFtZTogZGF0YS5CdXNpbmVzc05hbWUsXHJcbiAgICAgICAgICBsYW5kaW5nUGFnZUxvZ286IGRhdGEuTGFuZGluZ1BhZ2VMb2dvLFxyXG4gICAgICAgICAgbG9nb0ltYWdlOiBkYXRhLkxvZ29JbWFnZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgfSBhcyBJTG9nb1NldHRpbmdzO1xyXG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKExPR09fU0VUVElOR1NfQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcclxuICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgJGRlZmZlcmVkLnJlc29sdmUobG9nb1NldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHJldHVybiAkZGVmZmVyZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxhbmRpbmdNYXJrdXAoJGNvbnRhaW5lcjogSlF1ZXJ5LCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MsIHNob3dTaWduSW5CdXR0b246IGJvb2xlYW4sIHBob3RvR2FsbGVyeVNldHRpbmdzOiBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MpIHtcclxuICBjb25zdCAkbGFuZGluZ1BhZ2UgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2lzem9sZWEtbGFuZGluZy1wYWdlJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgbGV0ICRsYW5kaW5nQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsYW5kaW5nLWNvbnRhaW5lcicpLmFwcGVuZFRvKCRsYW5kaW5nUGFnZSk7XHJcblxyXG4gIGlmKHBob3RvR2FsbGVyeVNldHRpbmdzLmVuYWJsZWQpIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygncGhvdG8tZ2FsbGVyeS1tb2RlJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygnZGVmYXVsdC1tb2RlJyk7XHJcbiAgICAkbGFuZGluZ0NvbnRhaW5lciA9ICRsYW5kaW5nUGFnZTtcclxuICB9XHJcblxyXG4gICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9nby1jb250YWluZXInKVxyXG4gICAgLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKVxyXG4gICAgLmFwcGVuZChcclxuICAgICAgJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sYW5kaW5nUGFnZUxvZ28pLmFkZENsYXNzKCdsb2dvLWxhcmdlJykuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpLFxyXG4gICAgICAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdidXNpbmVzcy1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcilcclxuICApO1xyXG5cclxuICAkKCc8aDIgLz4nKS50ZXh0KGBXZWxjb21lIHRvICR7bG9nb1NldHRpbmdzLmRlc2NyaXB0aW9ufWApLmFwcGVuZFRvKCRsYW5kaW5nQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKHNob3dTaWduSW5CdXR0b24pIHtcclxuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnc2lnbi1pbi1idXR0b24nKS5hcHBlbmQoJCgnPGRpdiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgdGV4dDogJ1NpZ24gSW4nLFxyXG4gICAgICB3aWR0aDogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gdW5kZWZpbmVkIDogJzE0MHB4JyxcclxuICAgICAgdHlwZTogJ2RlZmF1bHQnLFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgL0hvbWUvTG9naW4/cmV0dXJuVXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCkpfWA7XHJcbiAgICAgIH1cclxuICAgIH0pKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBpZihwaG90b0dhbGxlcnlTZXR0aW5ncy5lbmFibGVkKSB7XHJcbiAgICBzaG93SW1hZ2VWaWV3ZXIoXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLiRjb250YWluZXIgfHwgJGxhbmRpbmdQYWdlLFxyXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWFnZVVybHMgfHwgW10sXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLmltZ0NoYW5nZUludGVydmFsU2VjIHx8IDgsXHJcbiAgICAgIHBob3RvR2FsbGVyeVNldHRpbmdzLnRyYW5zaXRpb25UaW1lU2VjIHx8IDJcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWNjZXNzRGVuaWVkVG9SZXBvcnQoJGNvbnRhaW5lcjogSlF1ZXJ5LCBhbGxvd2VkUmVwb3J0Um9sZXM6IHN0cmluZ1tdLCBhbGxvd2VkQ29ubmVjdGlvblJvbGVzOiBzdHJpbmdbXSkge1xyXG4gIGNvbnN0ICRpc3pvbGVhQ29udGFpbmVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnYWNjZXNzLWRlbmllZC10by1yZXBvcnQtcGFnZScpLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICQoJzxoMj4nKS5hZGRDbGFzcygnZXJyb3ItdGV4dCcpLnRleHQoJ0FjY2VzcyBkZW5pZWQgdG8gdGhlIHJlcG9ydCcpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuXHJcbiAgaWYgKGFsbG93ZWRSZXBvcnRSb2xlcyAmJiBhbGxvd2VkUmVwb3J0Um9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCByZXBvcnRSb2xlcyA9IGFsbG93ZWRSZXBvcnRSb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgcmVwb3J0OiAnKS5hcHBlbmQocmVwb3J0Um9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIGlmIChhbGxvd2VkQ29ubmVjdGlvblJvbGVzICYmIGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjb25uZWN0aW9uc1JvbGVzID0gYWxsb3dlZENvbm5lY3Rpb25Sb2xlcy5tYXAoKHIpID0+ICQoJzxzcGFuPicpLmFkZENsYXNzKCdyb2xlJykudGV4dChyKSk7XHJcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgZGIgY29ubmVjdGlvbjogJykuYXBwZW5kKGNvbm5lY3Rpb25zUm9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElDZG1SZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgQ29udHJvbENvbmZpZ3VyYXRvciwgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIH0gZnJvbSAnLi9Db250cm9sQ29uZmlndXJhdG9yJztcclxuaW1wb3J0IHsgQ29udHJvbERpc3BsYXksIElDb250cm9sRGlzcGxheU9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5JztcclxuaW1wb3J0IHsgRGlzcGxheU1hbmFnZXIsIElEaXNwbGF5TWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0Rpc3BsYXlNYW5hZ2VyJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNETVJlcG9ydFBhZ2VPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RNUmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIFNldHRpbmdzJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGlzcGxheSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBTVE9SQUdFX01PREVfS0VZID0gJ0NETV9TVE9SQUdFX01PREVfS0VZJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD47XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sQ29uZmlndXJhdG9yT3B0aW9uczogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU1hbmFnZXJPcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbERpc3BsYXlPcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgbXVsdGlWaWV3OiBEZXZFeHByZXNzLnVpLmR4TXVsdGlWaWV3O1xyXG4gIHByaXZhdGUgdGFiUGFuZWw6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbDtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyO1xyXG5cclxuICBwcml2YXRlIG1vZGU6IE1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDRE1SZXBvcnRQYWdlT3B0aW9ucykge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IGAvJHtvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmx9LyR7b3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YDtcclxuICAgIHRoaXMuJHJvb3RFbGVtZW50ID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zID0gdGhpcy5nZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmwpO1xyXG4gICAgdGhpcy5kaXNwbGF5TWFuYWdlck9wdGlvbnMgPSB0aGlzLmdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsKTtcclxuICAgIHRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zID0gdGhpcy5nZXRDb250cm9sRGlzcGxheU9wdGlvbnMoYmFzZVVybCwgb3B0aW9ucy51c2VyTmFtZSwgb3B0aW9ucy5yZXBvcnRQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLm11bHRpVmlldz8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy50YWJQYW5lbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJEaXNwbGF5KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlclRhYlBhbmVsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zKGJhc2VVcmw6IHN0cmluZywgY2RtUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nKTogSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICRjb250YWluZXI6IG51bGwsXHJcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBwYWdlVGl0bGU6ICcnLFxyXG4gICAgICBhdmFpbGFibGVSb2xlc1VybDogYC8ke2NkbVJlcG9ydENvbnRyb2xsZXJVcmx9L0F2YWlsYWJsZVJvbGVzYCxcclxuICAgICAgZ3JvdXBGaWVsZHNVcmw6IGAke2Jhc2VVcmx9L0FsbENvbnRyb2xGaWVsZHNgLFxyXG4gICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vQ29uZmlndXJhdG9yRGF0YWAsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgXHJcbiAgICB9IGFzIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGlzcGxheU1hbmFnZXJPcHRpb25zKGJhc2VVcmw6IHN0cmluZyk6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcclxuICAgICAgaXNTdGFuZGFsb25lUGFnZTogZmFsc2UsXHJcbiAgICAgIHBhZ2VUaXRsZTogJycsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2AsXHJcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlckFzc2lnbm1lbnRzYFxyXG4gICAgfSBhcyBJRGlzcGxheU1hbmFnZXJPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb250cm9sRGlzcGxheU9wdGlvbnMoXHJcbiAgICBiYXNlVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zXHJcbiAgKTogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkY29udGFpbmVyOiBudWxsLFxyXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcclxuICAgICAgcGFnZVRpdGxlOiAnJyxcclxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHJlcG9ydFBhcmFtcy5OYW1lLFxyXG4gICAgICB1c2VyQ29uZmlnVXJsOiBgJHtiYXNlVXJsfS9GaWVsZHNQZXJtaXNzaW9uc2AsXHJcbiAgICAgIGNvbnRyb2xMb2dzVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sTG9nc2AsXHJcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheURhdGFgLFxyXG4gICAgICB1c2VyTmFtZSxcclxuICAgICAgaW1wb3J0RmlsZU9wdGlvbnM6IHJlcG9ydFBhcmFtcy5BbGxvd0ltcG9ydGluZyA/IHtcclxuICAgICAgICBtb2RlOiByZXBvcnRQYXJhbXMuSW1wb3J0RmlsZU1vZGUsXHJcbiAgICAgICAgY3JlYXRlVGFibGVVcmw6IGAke2Jhc2VVcmx9L2NyZWF0ZS10YWJsZWAsXHJcbiAgICAgICAgYWRkUm93c1VybDogYCR7YmFzZVVybH0vYWRkLXJvd3NgLFxyXG4gICAgICAgIGZpbGVVcGxvYWRVcmw6IGAke2Jhc2VVcmx9L2dldC1jb2x1bW5zYCxcclxuICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHJlcG9ydFBhcmFtcy5GaWxlSW1wb3J0ZXJUYWJsZUluZm9cclxuICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRmlsdGVyc2AsXHJcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbEZpbHRlcmAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbEZpbHRlcmBcclxuICAgICAgfSxcclxuICAgICAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IHtcclxuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbFZpZXdzYCxcclxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sVmlld2AsXHJcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbFZpZXdgLFxyXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xWaWV3YFxyXG4gICAgICB9LFxyXG4gICAgICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczoge1xyXG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheXNgLFxyXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xEaXNwbGF5YCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheWAsXHJcbiAgICAgICAgZGVsZXRlRGF0YVVybDogYCR7YmFzZVVybH0vUmVtb3ZlQ29udHJvbERpc3BsYXlgXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiB7XHJcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcclxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXHJcbiAgICAgIH1cclxuICAgIH0gYXMgSUNvbnRyb2xEaXNwbGF5T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5KCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5tdWx0aVZpZXcgPSAkdmlldy5keE11bHRpVmlldyh7XHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xEaXNwbGF5KHsgLi4udGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMsICRjb250YWluZXI6ICQoJzxkaXYgLz4nKSB9KTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC4kY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2NkbS1yZXBvcnRfX2Rpc3BseS1ncmlkJykuZHhNdWx0aVZpZXcoJ2luc3RhbmNlJyk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMubXVsdGlWaWV3LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhYlBhbmVsKCkge1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XHJcblxyXG4gICAgY29uc3QgJG1haW5UYWJQYW5lbCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy50YWJQYW5lbCA9IHRoaXMuY3JlYXRlVGFiUGFuZWwoJG1haW5UYWJQYW5lbCk7XHJcbiAgICBmdWxsU2NyZWVuKHRoaXMudGFiUGFuZWwsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFiUGFuZWwoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbCB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5keFRhYlBhbmVsKHtcclxuICAgICAgc3dpcGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgIGZvY3VzU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgYWN0aXZlU3RhdGVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICdDb25maWd1cmF0b3InLFxyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbnRyb2xDb25maWd1cmF0b3IoeyAuLi50aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAnRGlzcGxheSBNYW5hZ2VyJyxcclxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBEaXNwbGF5TWFuYWdlcih7IC4uLnRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXIoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fY29uZmlndXJhdGlvbi10YWItcGFuZWwnKVxyXG4gICAgICAuZHhUYWJQYW5lbCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGluaXRQb3BvdmVyKGxpbms6IHN0cmluZywgZGV0YWlsczogc3RyaW5nKTogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIge1xyXG4gIGNvbnN0IGh0bWwgPSAkKCc8cC8+JykuaHRtbChkZXRhaWxzKS50ZXh0KCk7XHJcblxyXG4gIGNvbnN0IHBvcG92ZXIgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICdyZXBvcnQtZGV0YWlscy1wb3BvdmVyJyB9KVxyXG4gICAgLmh0bWwoaHRtbClcclxuICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcclxuXHJcbiAgcmV0dXJuICQocG9wb3ZlcikuZHhQb3BvdmVyKHtcclxuICAgIHRhcmdldDogbGluayxcclxuICAgIHNob3dFdmVudDogJ2R4Y2xpY2snLFxyXG4gICAgcG9zaXRpb246ICdib3R0b20nLFxyXG4gICAgd2lkdGg6IDUwMFxyXG4gIH0pLmR4UG9wb3ZlcignaW5zdGFuY2UnKTtcclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcclxuaW1wb3J0IHtDU1NfQ0xBU1NFU30gZnJvbSAnLi4vLi4vLi4vU3R5bGluZy9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xyXG4gIGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIHN1bW1hcnlDb2x1bW4/OiBzdHJpbmc7XHJcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRhR3JpZChcclxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXHJcbiAgaGVhZGVyVGV4dD86IHN0cmluZywgaGVhZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsIGRlZmF1bHRDb2x1bW5XaWR0aCA9IGZhbHNlXHJcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgbGV0IGlzR3JpZEluaXRpYWxpemFlZCA9IGZhbHNlO1xyXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xyXG4gICAgZXhwb3J0OiB7XHJcbiAgICAgIGVuYWJsZWQ6ICEhYWRkaXRpb25hbE9wdGlvbnMuZXhwb3J0RmlsZU5hbWUsXHJcbiAgICAgIGFsbG93RXhwb3J0U2VsZWN0ZWREYXRhOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcclxuXHJcbiAgICBzZWxlY3Rpb246IHttb2RlOiAnbXVsdGlwbGUnfSxcclxuICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge2VuYWJsZWQ6IGZhbHNlfSxcclxuICAgIHBhZ2luZzoge3BhZ2VTaXplOiA1MH0sXHJcbiAgICBzZWFyY2hQYW5lbDoge3Zpc2libGU6IHRydWV9LFxyXG4gICAgZmlsdGVyUm93OiB7dmlzaWJsZTogdHJ1ZX0sXHJcbiAgICBoZWFkZXJGaWx0ZXI6IHt2aXNpYmxlOiB0cnVlfSxcclxuICAgIHNjcm9sbGluZzoge21vZGU6ICd2aXJ0dWFsJ30sXHJcbiAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZS5jb21wb25lbnQpO1xyXG5cclxuICAgICAgaWYgKGlzR3JpZEluaXRpYWxpemFlZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNHcmlkSW5pdGlhbGl6YWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICghZGVmYXVsdENvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmNvbXBvbmVudC5jb2x1bW5Db3VudCgpOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICdkYXRhVHlwZScpO1xyXG5cclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcpKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMDBweCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTUwcHgnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy90byBmaXggYXV0b3Njcm9sbFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZS5jb21wb25lbnQuZ2V0U2Nyb2xsYWJsZSgpO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsYWJsZSkge1xyXG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgIGlmIChoZWFkZXJUZXh0KSB7XHJcbiAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgIHRlbXBsYXRlKCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoaGVhZGVyVGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXJEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICAgIGhlYWRlckVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ0NsaWNrIHRvIHNlZSBmdXJ0aGVyIGRldGFpbHMnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5XHJcbiAgICA/IChlKSA9PiB7XHJcbiAgICAgIGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5KGUpO1xyXG4gICAgICBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XHJcbiAgICB9XHJcbiAgICA6IGRlZmF1bHRPcHRpb25zLm9uQ29udGVudFJlYWR5O1xyXG5cclxuICB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIGRhdGFHcmlkT3B0aW9ucywge29uQ29udGVudFJlYWR5fSk7XHJcblxyXG4gIGNvbnN0IGdyaWQgPSAkdGFyZ2V0LmR4RGF0YUdyaWQobWVyZ2VkT3B0aW9ucykuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgZ3JpZC5lbGVtZW50KCkuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhEYXRhR3JpZCk7XHJcblxyXG4gIHJldHVybiBncmlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucykge1xyXG4gIGlmIChkYXRhR3JpZE9wdGlvbnM/LnN1bW1hcnk/LnRvdGFsSXRlbXM/LnNvbWUoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBsZXQgc3VtbWFyeUNvbHVtbiA9IGFkZGl0aW9uYWxPcHRpb25zPy5zdW1tYXJ5Q29sdW1uO1xyXG4gIGlmICghc3VtbWFyeUNvbHVtbiAmJiBkYXRhR3JpZE9wdGlvbnM/LmNvbHVtbnM/Lmxlbmd0aCkge1xyXG4gICAgc3VtbWFyeUNvbHVtbiA9IHR5cGVvZiBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXSA9PT0gJ3N0cmluZydcclxuICAgICAgPyBkYXRhR3JpZE9wdGlvbnMuY29sdW1uc1swXVxyXG4gICAgICA6IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcclxuICB9XHJcblxyXG4gIGlmIChzdW1tYXJ5Q29sdW1uKSB7XHJcbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5KSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zKSB7XHJcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICBjb2x1bW46IHN1bW1hcnlDb2x1bW4sXHJcbiAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XHJcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XHJcblxyXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XHJcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdyaWQub3B0aW9uKCdzZWxlY3Rpb24nKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xyXG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcclxuXHJcbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcclxuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xyXG4gICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcclxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICB9XVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKFxyXG4gICR0YXJnZXQsIGRhdGFHcmlkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnM6IElHcmlkQWRkaXRpb25hbE9wdGlvbnMgPSB7fSxcclxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2UsIHNraXBGdWxsU2NyZWVuID0gZmFsc2VcclxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICBjb25zdCBncmlkID0gY3JlYXRlRGVmYXVsdERhdGFHcmlkKCR0YXJnZXQsIGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIGhlYWRlclRleHQsIGhlYWRlckRlc2NyaXB0aW9uLCBkZWZhdWx0Q29sdW1uV2lkdGgpO1xyXG5cclxuICBpZiAoIXNraXBGdWxsU2NyZWVuKSB7XHJcbiAgICBmdWxsU2NyZWVuKGdyaWQpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdyaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGV4dCwgdGl0bGUpIHtcclxuICByZXR1cm4gJCgnPHNwYW4+JylcclxuICAgIC5hdHRyKCd0aXRsZScsIHRpdGxlKVxyXG4gICAgLnRleHQodGV4dCk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHtJTG9va3VwRHRvfSBmcm9tICcuLi8uLi8uLi9EYXRhL0FwaVJlc3BvbnNlJztcclxuXHJcbi8vIE5PVEU6IGNvbnN0IGRlZmF1bHRTaG93ZWRSb2xlcyA9IFsnUHJvZHVjdGlvbicsICdTYWxlcycsICdGbG9vciddO1xyXG5jb25zdCByb2xlc09yZGVyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIERpc3BsYXlUeXBlIHtcclxuICBJY29ucyA9IDEsXHJcbiAgUHJlZGVmaW5lZFZhbHVlcyA9IDIsXHJcbiAgUmFiYml0QWN0aW9uID0gM1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElJY29uc0NvbHVtbkVkaXRvckl0ZW0ge1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBpbWFnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbSB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgYWN0aW9uVHlwZTogc3RyaW5nO1xyXG4gIGZpZWxkczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIElEaXNwbGF5VHlwZVNldHRpbmdzID0gSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3M7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SWNvbnNUeXBlU2V0dGluZ3Mge1xyXG4gIHR5cGU6IERpc3BsYXlUeXBlLkljb25zO1xyXG4gIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRGlzcGxheUlQcmVkZWZpbmVkVmFsdWVzVHlwZVNldHRpbmdzIHtcclxuICB0eXBlOiBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzO1xyXG4gIGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncyB7XHJcbiAgdHlwZTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uO1xyXG4gIGRhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcclxuICBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhIHtcclxuICBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbmZpZ3VyYXRvciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJsZVJvbGVzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cEZpZWxkc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VHlwZXM6IGFueVtdID0gW1xyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLkljb25zLCB2YWx1ZTogJ0ljb25zJyB9LFxyXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMsIHZhbHVlOiAnUHJlZGVmaW5lZFZhbHVlcycgfSxcclxuICAgIHsga2V5OiBEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb24sIHZhbHVlOiAnUmFiYml0QWN0aW9uJyB9XHJcbiAgXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnMgPSB7XHJcbiAgICBbRGlzcGxheVR5cGUuSWNvbnNdOiBJY29uc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzXTogUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvcixcclxuICAgIFtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dOiBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3IsXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnNJbml0RGF0YSA6IHtbaWQ6IG51bWJlcl0gOiBvYmplY3Q7fSA9IHt9O1xyXG4gIHByaXZhdGUgcm9sZXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBmaWVsZHM6IElMb29rdXBEdG88c3RyaW5nPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5hdmFpbGFibGVSb2xlc1VybCA9IG9wdGlvbnMuYXZhaWxhYmxlUm9sZXNVcmw7XHJcbiAgICB0aGlzLmdyb3VwRmllbGRzVXJsID0gb3B0aW9ucy5ncm91cEZpZWxkc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoJ2Fwcy1ncmlkJyk7XHJcblxyXG4gICAgUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmdldEF2YWlsYWJsZVJvbGVzKCksXHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlRmllbGRzKClcclxuICAgIF0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnJvbGVzID0gcmVzdWx0WzBdO1xyXG4gICAgICB0aGlzLmZpZWxkcyA9IHJlc3VsdFsxXTtcclxuICAgICAgdGhpcy5lZGl0b3JzSW5pdERhdGFbRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uXSA9IHsgZmllbGRzOiB0aGlzLmZpZWxkcyB9O1xyXG4gICAgICB0aGlzLmNyZWF0ZU1haW5HcmlkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlUm9sZXMoKSB7XHJcbiAgICByZXR1cm4gc2VuZFJlcXVlc3Q8QXJyYXk8eyBOYW1lOiBzdHJpbmcgfT4+KHRoaXMuYXZhaWxhYmxlUm9sZXNVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5tYXAoKHIpID0+IHIuTmFtZSkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGEpIHx8IDk5OTk7XHJcbiAgICAgICAgY29uc3QgYk9yZGVyID0gcm9sZXNPcmRlci5nZXQoYikgfHwgOTk5OTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdmFpbGFibGVGaWVsZHMoKTogUHJvbWlzZTxJTG9va3VwRHRvPHN0cmluZz5bXT4ge1xyXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZ3JvdXBGaWVsZHNVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZUVkaXRvcigkY29udGFpbmVyLCB0eXBlLCBkYXRhKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcnNbdHlwZV07XHJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMuZWRpdG9yc0luaXREYXRhW3R5cGVdO1xyXG5cclxuICAgIHJldHVybiBlZGl0b3JcclxuICAgICAgPyBuZXcgZWRpdG9yKCRjb250YWluZXIsIGRhdGEsIGluaXREYXRhKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkKCkge1xyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuXHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKSxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWxsb3dTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ3NlbGVjdCdcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBtb2RlOiAnY2VsbCcsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczoge1xyXG4gICAgICAgIHN1bW1hcnk6IHRydWUsXHJcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxyXG4gICAgICAgIGdyb3VwaW5nOiBmYWxzZSxcclxuICAgICAgICBzb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwaW5nOiB7XHJcbiAgICAgICAgYWxsb3dDb2xsYXBzaW5nOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlb3JkZXJpbmc6IGZhbHNlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbkF1dG9XaWR0aDogZmFsc2UsXHJcbiAgICAgIHJvd0FsdGVybmF0aW9uRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1uTWluV2lkdGg6IDgwLFxyXG4gICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5uZXdEYXRhIHx8ICFlLm9sZERhdGEpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUuY29tcG9uZW50LmJlZ2luQ3VzdG9tTG9hZGluZygnVXBkYXRpbmcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFJvbGVzID0gZS5uZXdEYXRhLlJvbGVzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlcyA9IGUub2xkRGF0YS5Sb2xlcztcclxuXHJcbiAgICAgICAgY29uc3QgYWRkT2xkRGF0YVRvTmV3RGF0YSA9IChmaWVsZE5hbWU6IHN0cmluZywgbmV3RGF0YVNlY3Rpb24gPSBlLm5ld0RhdGEsIG9sZERhdGFTZWN0aW9uID0gZS5vbGREYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIW5ld0RhdGFTZWN0aW9uLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgICAgbmV3RGF0YVNlY3Rpb25bZmllbGROYW1lXSA9IG9sZERhdGFTZWN0aW9uW2ZpZWxkTmFtZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZWRSb2xlcyAmJiBjdXJyZW50Um9sZXMpIHtcclxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHVwZGF0ZWRSb2xlcylcclxuICAgICAgICAgICAgLmZvckVhY2goKHJvbGVOYW1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJvbGUgPSB1cGRhdGVkUm9sZXNbcm9sZU5hbWVdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSb2xlID0gY3VycmVudFJvbGVzW3JvbGVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgdXBkYXRlZFJvbGUuSWQgPSBjdXJyZW50Um9sZS5JZDtcclxuXHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVDcmVhdGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVJlYWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xyXG4gICAgICAgICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0NhbkJlVXBkYXRlZCcsIHVwZGF0ZWRSb2xlLCBjdXJyZW50Um9sZSk7XHJcbiAgICAgICAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnQ2FuQmVEZWxldGVkJywgdXBkYXRlZFJvbGUsIGN1cnJlbnRSb2xlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdMYWJlbCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ09yZGVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnVG9vbFRpcCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzRGVmYXVsdFZpZXdGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzS2V5Q29sdW1uJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnR3JvdXBGaWVsZCcpO1xyXG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0Rpc3BsYXlUeXBlJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnRGF0YU93bmVyJyk7XHJcbiAgICAgICAgYWRkT2xkRGF0YVRvTmV3RGF0YSgnWExTU2NoZWR1bGVMYWJlbCcpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblJvd1VwZGF0ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogdGhpcy5wcmVwYXJlTWFpbkdyaWRDb2x1bW5zKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdOYW1lJyxcclxuICAgICAgICAgIGNhcHRpb246ICdGaWVsZCcsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgZml4ZWQ6IHRydWUsXHJcbiAgICAgICAgICBmaXhlZFBvc2l0aW9uOiAnbGVmdCcsXHJcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0dyb3VwRmllbGQnLFxyXG4gICAgICAgICAgY2FwdGlvbjogJ0dyb3VwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IFsuLi5uZXcgU2V0KGdyaWQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLkdyb3VwRmllbGQpLm1hcCgoaSkgPT4gaS5Hcm91cEZpZWxkKS5zb3J0KCkpXSxcclxuICAgICAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnTGFiZWwnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ1R5cGUnLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0RhdGFPd25lcicsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRE8nLCAnRGF0YSBPd25lcicpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdYTFNTY2hlZHVsZUxhYmVsJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdYTFMnLCAnWExTIFNjaGVkdWxlIExhYmVsJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0Rpc3BsYXlUeXBlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIHdpZHRoOiAxNjAsXHJcbiAgICAgICAgICBjdXN0b21pemVUZXh0OiAoY2VsbEluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjZWxsSW5mby52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUgYXMgc3RyaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlzcGxheVR5cGVzXHJcbiAgICAgICAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBzZXR0aW5ncy50eXBlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZWRpdENlbGxUZW1wbGF0ZTogKF8sIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjZWxsSW5mby52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZXR0aW5ncyA/IHNldHRpbmdzLnR5cGUgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXRhIDogW107XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xyXG4gICAgICAgICAgICAgIGRyb3BEb3duT3B0aW9uczogeyB3aWR0aDogNDAwIH0sXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5kaXNwbGF5VHlwZXMsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcclxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaXRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RvciA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbjogOHB4IDA7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRidXR0b25zID0gJCgnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCAkc2F2ZUJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICRjYW5jZWxCdXR0b24gPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA4cHg7XCIgLz4nKS5hcHBlbmRUbygkYnV0dG9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHR5cGVcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCB0eXBlLCBkYXRhKVxyXG4gICAgICAgICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICRzZWxlY3Rvci5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLmRpc3BsYXlUeXBlcyxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCBlLnZhbHVlLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAkYm9keS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVuZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oJ2luc3RhbmNlJykub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFlZGl0b3IsXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhID0gZWRpdG9yLmdldERhdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAkc2VsZWN0b3IuZHhTZWxlY3RCb3goJ2luc3RhbmNlJykub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWRpdG9yRGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICRjYW5jZWxCdXR0b24uZHhCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jbG9zZUVkaXRDZWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkY29udGFpdGVyLmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaXRlcjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNEZWZhdWx0Vmlld0ZpZWxkJyxcclxuICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5IGluIGRlZmF1bHQgdmlldycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICB3aWR0aDogMTAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ09yZGVyJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDAsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ09yZGVyIGNhblxcJ3QgYmUgbmVnYXRpdmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdXaWR0aCcsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnV2lkdGgnLCAnV2lkdGggKGluIHBpeGVscyknKSxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHsgZm9ybWF0OiAnIycgfSxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ3JhbmdlJyxcclxuICAgICAgICAgICAgICBtaW46IDEsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1dpZHRoIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDFweCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ0hpZGluZ09yZGVyJyxcclxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdIaWRlJywgJ0hpZGluZyBPcmRlcicpLFxyXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxyXG4gICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAnSGlkaW5nIG9yZGVyIGNhblxcJ3QgYmUgbGVzcyB0aGVuIDEnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aWR0aDogNzAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICdUb29sVGlwJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1pbldpZHRoOiAxODBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdSb2xlcycsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0hpZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgICAgY29sdW1uczogdGhpcy5jcmVhdGVSb2xlc0NvbHVtbnModGhpcy5yb2xlcylcclxuICAgICAgICB9XHJcbiAgICAgIF0pLFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnTmFtZSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xyXG4gICAgICBncmlkID0gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKHRoaXMuJGNvbnRhaW5lciwgZ3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCB0aGlzLnBhZ2VUaXRsZSwgJycsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xyXG4gICAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWFpbkdyaWRDb2x1bW5zKGNvbHVtbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLmFsbG93SGlkaW5nID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmFsbG93SGlkaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLmFsbG93SGlkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSBudWxsKSB7XHJcbiAgICAgICAgY29sdW1uLnNob3dJbkNvbHVtbkNob29zZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzQ29sdW1ucyhyb2xlczogc3RyaW5nW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gcm9sZXNcclxuICAgICAgLm1hcCgocm9sZSkgPT4gKHtcclxuICAgICAgICBuYW1lOiByb2xlLFxyXG4gICAgICAgIGNhcHRpb246IHJvbGUsXHJcbiAgICAgICAgYWxsb3dIaWRpbmc6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVJlYWQnLCB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdSZWFkJywgJ1JlYWQnKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihyb2xlLCAnQ2FuQmVVcGRhdGVkJywge1xyXG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRWRpdCcsICdFZGl0JylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihcclxuICAgIHJvbGU6IHN0cmluZywgcGVybWlzc2lvbk5hbWU6IHN0cmluZywgYmFzZUNvbHVtbk9wdGlvbnM/OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW5cclxuICApOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYmFzZUNvbHVtbk9wdGlvbnMsXHJcbiAgICAgIG5hbWU6IGAke3JvbGV9XyR7cGVybWlzc2lvbk5hbWV9YCxcclxuICAgICAgZGF0YUZpZWxkOiBgUm9sZXMuJHtyb2xlfS4ke3Blcm1pc3Npb25OYW1lfWAsXHJcbiAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcclxuICAgICAgc2hvd0luQ29sdW1uQ2hvb3NlcjogZmFsc2UsXHJcbiAgICAgIGFsbG93SGVhZGVyRmlsdGVyaW5nOiBmYWxzZSxcclxuICAgICAgYWxsb3dGaWx0ZXJpbmc6IGZhbHNlLFxyXG4gICAgICBtaW5XaWR0aDogNjBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcclxuICAgICAgICB1cGRhdGVVcmw6IHRoaXMudXBkYXRlRGF0YVVybCxcclxuICAgICAgICBrZXk6ICdOYW1lJyxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBJY29uc0NvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgcHJpdmF0ZSBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5kYXRhLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgbW9kZTogJ3JvdycsXHJcbiAgICAgICAgYWxsb3dBZGRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIHVzZUljb25zOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBncm91cGluZzogeyBjb250ZXh0TWVudUVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ3RpdGxlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2ltYWdlJyxcclxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGNvbnRhaW5lciwgY2VsbERhdGEpID0+IHtcclxuICAgICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsRGF0YS5kYXRhLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbWcgPSBjZWxsSW5mby52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkaW1nID0gJChgPGltZyBzcmM9XCIke2ltZ31cIiAvPmApO1xyXG4gICAgICAgICAgICBjb25zdCAkbGluayA9ICQoJzxhIGNsYXNzPVwiZHgtbGluayBkeC1pY29uLXVwbG9hZFwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMThweDtcIiAvPicpO1xyXG4gICAgICAgICAgICBjb25zdCAkZmlsZUlucHV0ID0gJCgnPGlucHV0IHR5cGU9XCJmaWxlXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCIgLz4nKTtcclxuXHJcbiAgICAgICAgICAgICRsaW5rLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgICAkZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0IGFzIGFueSkuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpKTtcclxuICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAoZS50YXJnZXQgYXMgYW55KS5maWxlc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICRpbWcuYXR0cignc3JjJywgJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkaW1nLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG4gICAgICAgICAgICAkbGluay5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICAgICAgJGZpbGVJbnB1dC5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICdlZGl0JyxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgICAgIGljb246ICd0cmFzaCcsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5ncmlkID0gY3JlYXRlRGVmYXVsdEdyaWQoXHJcbiAgICAgICRncmlkLFxyXG4gICAgICB7XHJcbiAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xyXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuZGF0YSxcclxuICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcclxuICAgICAgICB1c2VJY29uczogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgY29udGV4dE1lbnVFbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgJ2VkaXQnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGludDogJ0RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcclxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCByb3dzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCgkZ3JpZCwge1xyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFJhYmJpdEFjdGlvbkNvbHVtbkVkaXRvciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGE7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IoJGNvbnRhaW5lcjogSlF1ZXJ5LCBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSwgaW5pdERhdGE6IElSYWJiaXRBY3Rpb25FZGl0b3JJbml0RGF0YSkge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLmluaXREYXRhID0gaW5pdERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgdGhpcy5mb3JtID0gJCgnPGRpdiAvPicpLmR4Rm9ybSh7XHJcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRhdGFGaWVsZDogJ2FjdGlvblR5cGUnLFxyXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZGF0YUZpZWxkOiAnZmllbGRzJyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcclxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiAoZS52YWx1ZSBhcyBhbnkpLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1aXJlZCdcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGFnQm94JyxcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5pbml0RGF0YS5maWVsZHMsXHJcbiAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnVGV4dCcsXHJcbiAgICAgICAgICAgIHZhbHVlRXhwcjogJ1ZhbHVlJyxcclxuICAgICAgICAgICAgc2VhcmNoRW5hYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGFnQm94T3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSkuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKS5keEZvcm0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSgpOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdhY3Rpb25UeXBlJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZztcclxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybS5nZXRFZGl0b3IoJ2ZpZWxkcycpLm9wdGlvbigndmFsdWUnKSBhcyBzdHJpbmdbXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICBmaWVsZHNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4oRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIGFzIGFueSkucmVnaXN0ZXJNb2R1bGUoJ2NvbHVtbkNob29zZXJTb3J0aW5nJywge1xyXG4gIGV4dGVuZGVyczoge1xyXG4gICAgY29udHJvbGxlcnM6IHtcclxuICAgICAgY29sdW1uczoge1xyXG4gICAgICAgIGdldENob29zZXJDb2x1bW5zKGxvYWRBbGxDb2x1bW5zKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcyBhcyBhbnkpLmNhbGxCYXNlKGxvYWRBbGxDb2x1bW5zKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGNvbHVtbjEsIGNvbHVtbjIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjEgPSBjb2x1bW4xPy5jYXB0aW9uIHx8ICcnO1xyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uMiA9IGNvbHVtbjI/LmNhcHRpb24gfHwgJyc7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbjEubG9jYWxlQ29tcGFyZShjYXB0aW9uMik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG4iLCAiXHVGRUZGY29uc3QgYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwgPSAocHJldjogYW55W10gfCBudWxsLCBuZXh0OiBhbnlbXSB8IG51bGwpID0+IHtcclxuICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAocHJldltpXSAhPT0gbmV4dFtpXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vaXplID0gPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCk6IFQgPT4ge1xyXG4gIGxldCBsYXN0QXJnczogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBsZXQgbGFzdFJlc3VsdDogdW5rbm93biB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG9ubHktYXJyb3ctZnVuY3Rpb25zXHJcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgIGlmICghYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwobGFzdEFyZ3MsIGFyZ3MpKSB7XHJcbiAgICAgIGxhc3RSZXN1bHQgPSBmdW5jKC4uLmFyZ3MgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBsYXN0QXJncyA9IGFyZ3M7XHJcblxyXG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XHJcbiAgfSBhcyBUO1xyXG59O1xyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcclxuaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3IHtcclxuICByZWFkb25seSBpZDogbnVtYmVyO1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuICByZWFkb25seSBncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG4gIGlzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgR3JpZFN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZFZpZXdJZDogbnVtYmVyO1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlWaWV3LCAnbmFtZScgfCAnZ3JpZFN0YXRlJyB8ICdpc0dsb2JhbCc+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sRGlzcGxheVZpZXc6IElDb250cm9sRGlzcGxheVZpZXcgPSB7XHJcbiAgICBpZDogMCxcclxuICAgIG5hbWU6ICdEZWZhdWx0JyxcclxuICAgIGdyaWRTdGF0ZTogbnVsbCxcclxuICAgIGlzR2xvYmFsOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRWaWV3cyA9IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9jdXJyZW50Vmlld0lkOiBudW1iZXIgPSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XHJcbiAgcHJpdmF0ZSB2aWV3czogSUNvbnRyb2xEaXNwbGF5Vmlld1tdID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3M7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFZpZXdCeUlkSW50ZXJuYWwgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzICYmIHRoaXMudmlld3MuZmluZCgodikgPT4gdi5pZCA9PT0gdmlld0lkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRWaWV3QnlJZCh0aGlzLl9jdXJyZW50Vmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXdJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Vmlld0lkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Vmlld0lkKGlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRWaWV3SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3cygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXdbXT4ge1xyXG4gICAgaWYgKHRoaXMudmlld3MgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdFZpZXdzKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudFZpZXcodmlld1VwZGF0ZXM6IENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXcodGhpcy5jdXJyZW50Vmlldy5pZCwgdmlld1VwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld1ZpZXcodmlld05hbWU6IHN0cmluZywgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlLCBpc0dsb2JhbCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlldz4ge1xyXG4gICAgbGV0IG5ld1ZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHtcclxuICAgICAgaWQ6IC0xLFxyXG4gICAgICBuYW1lOiB2aWV3TmFtZSxcclxuICAgICAgZ3JpZFN0YXRlLFxyXG4gICAgICBpc0dsb2JhbFxyXG4gICAgfSk7XHJcblxyXG4gICAgbmV3Vmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWFwVmlld0R0b1RvTW9kZWwobmV3Vmlld0R0byk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlldyh2aWV3SWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkVmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcclxuICAgICAgLi4udmlldyxcclxuICAgICAgLi4udXBkYXRlc1xyXG4gICAgfTtcclxuICAgIGxldCB1cGRhdGVkVmlld0R0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byA9IHRoaXMubWFwVmlld01vZGVsVG9EdG8odXBkYXRlZFZpZXcpO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICB1cGRhdGVkVmlld0R0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheVZpZXdEdG8+KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHVwZGF0ZWRWaWV3RHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmlldyh2aWV3SWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IHZpZXdJZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3cygpIHtcclxuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5Vmlld0R0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuXHJcbiAgICB0aGlzLnZpZXdzID0gdmlld3MubWFwKChkdG8pID0+IHRoaXMubWFwVmlld0R0b1RvTW9kZWwoZHRvKSk7XHJcbiAgICB0aGlzLnZpZXdzLnVuc2hpZnQoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3KTtcclxuICAgIC8vIE5PVEU6IHJlc2V0IG1lbW9pemVcclxuICAgIHRoaXMucmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwVmlld01vZGVsVG9EdG8obW9kZWw6IElDb250cm9sRGlzcGxheVZpZXcpOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgR3JpZFN0YXRlOiBKU09OLnN0cmluZ2lmeShtb2RlbC5ncmlkU3RhdGUpLFxyXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcFZpZXdEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byk6IElDb250cm9sRGlzcGxheVZpZXcge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IGR0by5JZCxcclxuICAgICAgbmFtZTogZHRvLk5hbWUsXHJcbiAgICAgIGdyaWRTdGF0ZTogSlNPTi5wYXJzZShkdG8uR3JpZFN0YXRlKSxcclxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldFZpZXdCeUlkRnVuY3Rpb24oKSB7XHJcbiAgICB0aGlzLmdldFZpZXdCeUlkID0gbWVtb2l6ZSh0aGlzLmdldFZpZXdCeUlkSW50ZXJuYWwpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIge1xyXG4gIHB1YmxpYyBjdXJyZW50U2F2ZWRHcmlkU3RhdGU6IElHcmlkU3RhdGU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gb3B0aW9ucy5pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3RhdGVTdG9yaW5nJywge1xyXG4gICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICB0eXBlOiAnY3VzdG9tJyxcclxuICAgICAgY3VzdG9tTG9hZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKVxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdGF0ZVN0b3JpbmcnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICAvLyBUT0RPOiB1c2UgZGVlcCBlcXVhbFxyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlICE9PSBudWxsICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUpICE9PSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VW5zYXZlZEdyaWRTdGF0ZSgpOiBJR3JpZFN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLnByZXBhcmVVbnNhdmVkR3JpZFN0YXRlKHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseShncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsLCByZXNldEZpbHRlciA9IHRydWUpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSByZXNldEZpbHRlciA/IHVuZGVmaW5lZCA6IHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoKTtcclxuXHJcbiAgICAgIC8qIE5PVEU6IFNvbWV0aW1lcyBhIGdyaWQgY2FuIHJldHVybiBhIG5ldyBzdGF0ZSB3aXRoIG9sZCBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICBzbyB3ZSBzaG91bGQgcmVzZXQgdGhlIGZpbHRlclZhbHVlIGJlZm9yZSBzdGF0ZSBhcHBseWluZ1xyXG4gICAgICAgIGlmIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgb24gdGhlIERldkV4dHJlbWUgc2lkZSB3ZSBjYW4gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZVxyXG4gICAgICAqL1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuYmVnaW5VcGRhdGUoKTtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNsZWFyRmlsdGVyKCdmaWx0ZXJWYWx1ZScpO1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKGdyaWRTdGF0ZSk7XHJcblxyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5vd25lci5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbHRlcigoYykgPT4gIWMudHlwZSk7XHJcblxyXG4gICAgICBpZiAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3VtbWFyeScsIHtcclxuICAgICAgICAgIHRvdGFsSXRlbXM6IFt7XHJcbiAgICAgICAgICAgIGNvbHVtbjogdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkLFxyXG4gICAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VycmVudEZpbHRlciAmJiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKGN1cnJlbnRGaWx0ZXIpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuZW5kVXBkYXRlKCk7XHJcblxyXG4gICAgICBjb25zdCBvbkNvbnRlbnRSZWFkeSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9mZignY29udGVudFJlYWR5Jywgb25Db250ZW50UmVhZHkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9uKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUgPSB0aGlzLmN1cnJlbnRVbnNhdmVkR3JpZFN0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodW5zYXZlZEdyaWRTdGF0ZTogSUdyaWRTdGF0ZSk6IElHcmlkU3RhdGUge1xyXG4gICAgaWYgKHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1ucykge1xyXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB2aXNpYmxlQ29sdW1uc1t2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxXTtcclxuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5zYXZlZEdyaWRTdGF0ZTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvUG9wdXAnO1xyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvTm90aWZ5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlTWFuYWdlcjogT25lVGltZUdyaWRTdGF0ZU1hbmFnZXI7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcmVhZG9ubHkgb25WaWV3RGVsZXRlZD86ICh2aWV3SWQ6IG51bWJlcikgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxWaWV3czogYm9vbGVhbjtcclxuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PiAmXHJcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xyXG4gIC8vIHRvb2xiYXIgaXRlbXNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfdmlld3NUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIHZpZXdzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSB2aWV3c0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Vmlld1RpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVWaWV3QnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZVZpZXdBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNvbHVtbkNob29zZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGdyaWRTdGF0ZU1hbmFnZXI6IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA/IG9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlciA6IG5ldyBPbmVUaW1lR3JpZFN0YXRlTWFuYWdlcih7XHJcbiAgICAgICAgb3duZXI6IG9wdGlvbnMub3duZXIsXHJcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBudWxsXHJcbiAgICAgIH0pLFxyXG4gICAgICBncmlkVmlld3NNYW5hZ2VyOiBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgPyBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgOiBuZXcgR3JpZFZpZXdzTWFuYWdlcihvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlWaWV3KHZpZXdJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc0NhbkJlVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xyXG5cclxuICAgIGlmIChpc0NhbkJlVmlld0FwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodmlld0lkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXNDYW5CZVZpZXdBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5iZWdpblZpZXdBcHBseWluZ0xvYWRpbmcoKTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID0gdmlld0lkO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuYXBwbHkodGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuZ3JpZFN0YXRlLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5lbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCk7XHJcbiAgICB0aGlzLnN5bmNVSVdpdGhDdXJyZW50VmlldygpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkKHZpZXdJZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VG9vbGJhclByZXBhcmluZyA9IGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnKTtcclxuXHJcbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBjdXJyZW50VG9vbGJhclByZXBhcmluZyAmJiBjdXJyZW50VG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcclxuICAgIGNvbnN0IHRvb2xiYXJJdGVtcyA9IGUudG9vbGJhck9wdGlvbnMgJiYgZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtcyk7XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLnZpZXdzVG9vbGJhckl0ZW0sXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXM6IEFycmF5PHsgbmFtZT86IHN0cmluZyB9Pikge1xyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSh0b29sYmFySXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJyksIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgdmlld3NUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fdmlld3NUb29sYmFySXRlbSkge1xyXG4gICAgICB0aGlzLl92aWV3c1Rvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVWaWV3c1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpc0RlZmF1bHRWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmlldyA9IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3O1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpICE9PSBjdXJyZW50Vmlldy5uYW1lIHx8IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmhhc0NoYW5nZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdWaWV3cycsXHJcbiAgICAgIHZpc2libGU6IHRoaXMub3B0aW9ucy52aXNpYmxlLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy12aWV3c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgaXRlbXM6IFtHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXddLFxyXG4gICAgICAgIHZhbHVlOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQsXHJcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZScsXHJcbiAgICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHtcclxuICAgICAgICAgIHdpZHRoOiA1NTBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUudmFsdWUgPT09IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgfHwgIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5VmlldyhlLnZhbHVlKTtcclxuICAgICAgICAgIGlmIChpc1ZpZXdBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy52aWV3c0RhdGFHcmlkID0gdGhpcy5jcmVhdGVWaWV3c0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSA9IHRoaXMuY3JlYXRlQ3VycmVudFZpZXdUaXRsZShlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbkNob29zZXJCdXR0b24gPSB0aGlzLmNyZWF0ZUNvbHVtbkNob29zZXJCdXR0b24oKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX2hlYWRlcicpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50Vmlld1RpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVWaWV3QXNCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuaGVpZ2h0KCcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy52aWV3c0RhdGFHcmlkLmVsZW1lbnQoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgICB9LFxyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVZpZXdzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcclxuICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB2aWV3PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzR2xvYmFsJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA3MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2RlbGV0ZScsXHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoZSkgPT4gZS5yb3cgJiYgZS5yb3cua2V5ICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgc2hvd0NvbHVtbkxpbmVzOiBmYWxzZSxcclxuICAgICAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3NpbmdsZScgfSxcclxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXHJcbiAgICAgICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICdzdGFuZGFyZCcgfSxcclxuICAgICAgICBwYWdpbmc6IHsgZW5hYmxlZDogZmFsc2UgfSxcclxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gdmlld3MnLFxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzICYmIGUuc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA/IGUuc2VsZWN0ZWRSb3dLZXlzWzBdIDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmRhdGFGaWVsZCA9PT0gJ2lzR2xvYmFsJykge1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMudmlzaWJsZSA9IGUucm93LmRhdGEuaWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xyXG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQgPSBhc3luYyAob3B0KSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuYmVnaW5DdXN0b21Mb2FkaW5nKCdVcGRhdGluZycpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZVZpZXcoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxyXG4gICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cyk7XHJcblxyXG4gICAgICAgICAgaWYgKCFlbmFibGVkKSB7XHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgJChjKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICB9KS5vZmYoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGVsZXRlVmlldyhlLmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudFZpZXdUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jdXJyZW50LXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLmlzRGVmYXVsdFZpZXdcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXcgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGVmYXVsdFZpZXcsXHJcbiAgICAgICAgb25DbGljazogdGhpcy5zYXZlLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiA4N1xyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19zYXZlLXZpZXctYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nLmJpbmQodGhpcyksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMThcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY29sdW1uLWNob29zZXIgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgb25DbGljazogdGhpcy5vcGVuQ29sdW1uQ2hvb3Nlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdjb2x1bW4tY2hvb3NlcidcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdWaWV3IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveFZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHZpZXdOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgY29uc3Qgdmlld0lzR2xvYmFsQ2hlY2tib3ggPSAkKCc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiIC8+JylcclxuICAgICAgLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgIHRleHQ6ICdHbG9iYWwgdmlldycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3NcclxuICAgICAgfSlcclxuICAgICAgLmR4Q2hlY2tCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgdmlld0lzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgVmlldycsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmlld05hbWVUZXh0Qm94VmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlQXModmlld05hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSwgdmlld0lzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbkNvbHVtbkNob29zZXIoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc2hvd0NvbHVtbkNob29zZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMudmlld3NEcm9wZG93bkJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgIGtleTogJ2lkJyxcclxuICAgICAgZGF0YTogdmlld3NcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIudXBkYXRlQ3VycmVudFZpZXcoe1xyXG4gICAgICBuYW1lOiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICBncmlkU3RhdGU6IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbm90aWZ5KCdTYXZlZCcsIHRydWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUFzKHZpZXdOYW1lOiBzdHJpbmcsIGlzR2xvYmFsOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5zYXZlKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVmlldyA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmNyZWF0ZU5ld1ZpZXcoXHJcbiAgICAgIHZpZXdOYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUsXHJcbiAgICAgIGlzR2xvYmFsXHJcbiAgICApO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodXBkYXRlZFZpZXcuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnVmlldyBpcyBjcmVhdGVkJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmRlbGV0ZVZpZXcodmlld0lkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCh2aWV3SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xyXG4gICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlICYmIHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3JlYWRPbmx5JywgdHJ1ZSk7XHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnQXBwbHlpbmcuLi4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kVmlld0FwcGx5aW5nTG9hZGluZygpIHtcclxuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIGZhbHNlKTtcclxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy5zYXZlVmlld0FzQnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNVSVdpdGhDdXJyZW50VmlldyhpZ25vcmVDdXJyZW50Vmlld1RpdGxlID0gZmFsc2UpIHtcclxuICAgIGlmICghaWdub3JlQ3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5uYW1lKTtcclxuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLmlzRGVmYXVsdFZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMudmlld3NEYXRhR3JpZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzQnlJbmRleGVzKFswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzKFt0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgY29uc3QgaXNHbG9iYWxWaWV3ID0gdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXcuaXNHbG9iYWxcclxuICAgICAgJiYgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcclxuXHJcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRoaXMuaXNEZWZhdWx0VmlldyB8fCBpc0dsb2JhbFZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXHJcbiAgICAgICdVbnNhdmVkIGNoYW5nZXMnXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL01lbW9pemUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlGaWx0ZXIge1xyXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICByZWFkb25seSBpc0dsb2JhbDogYm9vbGVhbjtcclxuICByZWFkb25seSBmaWx0ZXJTdGF0ZTogYW55IHwgbnVsbDtcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0OiBib29sZWFuO1xyXG4gIElzR2xvYmFsOiBib29sZWFuO1xyXG4gIEZpbHRlclN0YXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zIHtcclxuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkRmlsdGVySWQ6IG51bWJlcjtcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENvbnRyb2xEaXNwbGF5RmlsdGVyVXBkYXRlcyA9IFBhcnRpYWw8UGljazxJQ29udHJvbERpc3BsYXlGaWx0ZXIsICduYW1lJyB8ICdmaWx0ZXJTdGF0ZScgfCAnaXNHbG9iYWwnPj47XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2N1cnJlbnRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyczogSUNvbnRyb2xEaXNwbGF5RmlsdGVyW10gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RmlsdGVyQnlJZEludGVybmFsID0gKGZpbHRlcklkOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMgJiYgdGhpcy5maWx0ZXJzLmZpbmQoKHYpID0+IHYuaWQgPT09IGZpbHRlcklkKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbHRlckJ5SWQodGhpcy5fY3VycmVudEZpbHRlcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEZpbHRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudEZpbHRlcklkKGlkOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEZpbHRlcnMoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXJbXT4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudEZpbHRlcihmaWx0ZXJVcGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpIHtcclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEZpbHRlciAmJiB0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuaWQsIGZpbHRlclVwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld0ZpbHRlcihmaWx0ZXJOYW1lOiBzdHJpbmcsIGZpbHRlclN0YXRlOiBhbnksIGlzRGVmYXVsdDogYm9vbGVhbiwgaXNHbG9iYWw6IGJvb2xlYW4pXHJcbiAgICA6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyPiB7XHJcbiAgICBsZXQgbmV3RmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8oe1xyXG4gICAgICBpZDogLTEsXHJcbiAgICAgIG5hbWU6IGZpbHRlck5hbWUsXHJcbiAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgaXNHbG9iYWwsXHJcbiAgICAgIGZpbHRlclN0YXRlXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXdGaWx0ZXJEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8+KHRoaXMuaW5zZXJ0RGF0YVVybCxcclxuICAgICAgJ1BPU1QnLCBuZXdGaWx0ZXJEdG8pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwobmV3RmlsdGVyRHRvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRGaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlciA9IHtcclxuICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAuLi51cGRhdGVzXHJcbiAgICB9O1xyXG4gICAgbGV0IHVwZGF0ZWRGaWx0ZXJEdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byA9IHRoaXMubWFwRmlsdGVyTW9kZWxUb0R0byh1cGRhdGVkRmlsdGVyKTtcclxuXHJcbiAgICB1cGRhdGVkRmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsXHJcbiAgICAgICdQVVQnLCB1cGRhdGVkRmlsdGVyRHRvKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmRlbGV0ZURhdGFVcmwsICdERUxFVEUnLCB7IGZpbHRlcklkIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVycygpIHtcclxuICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG9bXT4odGhpcy5sb2FkRGF0YVVybCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycy5tYXAoKGR0bykgPT4gdGhpcy5tYXBGaWx0ZXJEdG9Ub01vZGVsKGR0bykpO1xyXG4gICAgLy8gTk9URTogcmVzZXQgbWVtb2l6ZVxyXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyTW9kZWxUb0R0byhtb2RlbDogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogSUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIElkOiBtb2RlbC5pZCxcclxuICAgICAgTmFtZTogbW9kZWwubmFtZSxcclxuICAgICAgSXNEZWZhdWx0OiBtb2RlbC5pc0RlZmF1bHQsXHJcbiAgICAgIElzR2xvYmFsOiBtb2RlbC5pc0dsb2JhbCxcclxuICAgICAgRmlsdGVyU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmZpbHRlclN0YXRlKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byk6IElDb250cm9sRGlzcGxheUZpbHRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZDogZHRvLklkLFxyXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcclxuICAgICAgaXNEZWZhdWx0OiBkdG8uSXNEZWZhdWx0IHx8IGZhbHNlLFxyXG4gICAgICBpc0dsb2JhbDogZHRvLklzR2xvYmFsIHx8IGZhbHNlLFxyXG4gICAgICBmaWx0ZXJTdGF0ZTogSlNPTi5wYXJzZShkdG8uRmlsdGVyU3RhdGUpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCkge1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJCeUlkID0gbWVtb2l6ZSh0aGlzLmdldEZpbHRlckJ5SWRJbnRlcm5hbCk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRmlsdGVyc01hbmFnZXIsIElDb250cm9sRGlzcGxheUZpbHRlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxuICByZWFkb25seSBvbkZpbHRlckFwcGxpZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBvbkZpbHRlckRlbGV0ZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcclxuICByZWFkb25seSBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnMge1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxudHlwZSBNdXRhYmxlPFQ+ID0ge1xyXG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudERlZmF1bHRPcHRpb25zPj4gJlxyXG4gIE11dGFibGU8UGFydGlhbDxJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucztcclxuICAvLyB0b29sYmFyIGl0ZW1zXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2ZpbHRlcnNUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG5cclxuICAvLyB0b29sYmFyIHdpZGdldHNcclxuICBwcml2YXRlIGZpbHRlcnNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsdGVyc0RhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RmlsdGVyVGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbmV3RmlsdGVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xyXG4gIC8vIHdpZGdldHNcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZSB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZmlsdGVyUG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlck5hbWVUZXh0Qm94OiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGZpbHRlckJ1aWxkZXI6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3I6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyO1xyXG4gIHByaXZhdGUgZmlsdGVySXNHbG9iYWxDaGVja2JveDogRGV2RXhwcmVzcy51aS5keENoZWNrQm94IHwgdW5kZWZpbmVkO1xyXG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlclxyXG4gICAgICAgID8gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcclxuICAgICAgICA6IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIob3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSxcclxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcclxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgICB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHRyeUFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGlzQ2FuQmVGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcclxuXHJcbiAgICBpZiAoaXNDYW5CZUZpbHRlckFwcGxpZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzQ2FuQmVGaWx0ZXJBcHBsaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmVycmVkTG9hZGluZyA9IGZhbHNlKSB7XHJcbiAgICAvLyBOT1RFOiBJZiB3ZSBjaGFuZ2UgdGhlIGZpbHRlciwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZCBpbiB0aGUgZmlsdGVyc0Ryb3Bkb3duQm94Lm9uVmFsdWVDaGFuZ2VkXHJcbiAgICAvLyBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgIT09IGZpbHRlcklkO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQgPSBmaWx0ZXJJZDtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuXHJcbiAgICBsZXQgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgLy8gTk9URTogbmVlZCB0byBwcm9jZXNzIGZpbHRlciB2YWx1ZSBieSB0aGUgZ2V0RmlsdGVyRXhwcmVzc2lvbiBtZXRob2RcclxuICAgICAgLy8gdG8gYmUgc3VyZSBpdCB3aWxsIHdvcmsgaW4gZGF0YXNvdXJjZSAoZm9yIGV4YW1wbGUsIHRoZSAnYmV0d2VlbicgY29uZGl0aW9uKVxyXG4gICAgICAvLyB3aWxsIGJlIG1vZGlmaWVkIHRvIFwiPj0gYW5kIDw9XCIgYmVjYXVzZSBkYXRhIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgJ2JldHdlZW4nLlxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5vcHRpb24oJ3ZhbHVlJywgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmZpbHRlclN0YXRlKTtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvci5nZXRGaWx0ZXJFeHByZXNzaW9uKCk7XHJcblxyXG4gICAgICBpZiAoZ3JpZERhdGFTb3VyY2UuaXNMb2FkaW5nKCkpIHtcclxuICAgICAgICBjb25zdCBhcHBseVZhbHVlID0gKCkgPT4ge1xyXG4gICAgICAgICAgZ3JpZERhdGFTb3VyY2Uub2ZmKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGdyaWREYXRhU291cmNlID0gdGhpcy5vcHRpb25zLm93bmVyLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5vbignbG9hZGluZ0NoYW5nZWQnLCBhcHBseVZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWREYXRhU291cmNlLmZpbHRlcihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoIWZpbHRlckNoYW5nZWQpIHtcclxuICAgIGlmICghZGVmZXJyZWRMb2FkaW5nKSB7XHJcbiAgICAgIGF3YWl0IGdyaWREYXRhU291cmNlLmxvYWQoKTtcclxuICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vbkZpbHRlckFwcGxpZWQoZmlsdGVySWQpO1xyXG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxyXG4gICAgICB0aGlzLmZpbHRlcnNUb29sYmFySXRlbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlcnNUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5fZmlsdGVyc1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbHRlclBvcHVwKCkge1xyXG4gICAgaWYgKCF0aGlzLl9maWx0ZXJQb3B1cCkge1xyXG4gICAgICB0aGlzLl9maWx0ZXJQb3B1cCA9IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyUG9wdXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoYXNDaGFuZ2VzKCkge1xyXG4gICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcjtcclxuXHJcbiAgICBjb25zdCBuZXdOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveCAmJiB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZE5hbWUgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIubmFtZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSB0aGlzLmZpbHRlckJ1aWxkZXIgJiYgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IG9sZEZpbHRlciA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZTtcclxuXHJcbiAgICBjb25zdCBuZXdJc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCAmJiB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3Qgb2xkSXNHbG9iYWwgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuaXNHbG9iYWw7XHJcblxyXG4gICAgcmV0dXJuIG5ld05hbWUgIT09IG9sZE5hbWUgfHwgbmV3RmlsdGVyICE9PSBvbGRGaWx0ZXIgfHwgbmV3SXNHbG9iYWwgIT09IG9sZElzR2xvYmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcclxuICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgIHRleHQ6ICdEYXRhIFNldHMnLFxyXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZmlsdGVyc19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgICAgdmFsdWU6IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgIGNvbnN0IFssIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLmdldFVzZXJTZXR0aW5ncygpXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkICYmIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkZpbHRlckFwcGx5aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCB2YWx1ZSA9IGUudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICAgICAgICBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFsdWUgPSBlLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyh2YWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgJiYgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUub3B0aW9uKCd2YWx1ZScsXHJcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndGV4dCcpIHx8IGUuY29tcG9uZW50Lm9wdGlvbigncGxhY2Vob2xkZXInKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbk9wZW5lZDogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3MoZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCA9IHRoaXMuY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RmlsdGVyVGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgICAgdGhpcy5uZXdGaWx0ZXJCdXR0b24gPSB0aGlzLmNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudEhlYWRlciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19oZWFkZXInKVxyXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY3VycmVudEZpbHRlclRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLm5ld0ZpbHRlckJ1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udGVudCA9ICQoJzxkaXYgLz4nKS5jc3MoJ2hlaWdodCcsICcxMDAlJylcclxuICAgICAgICAgICAgLmFwcGVuZChkcm9wZG93bkNvbnRlbnRIZWFkZXIpXHJcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5maWx0ZXJzRGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyc0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcclxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGF0YSBzZXQ/J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbmFtZScsXHJcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzRGVmYXVsdCcsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdJcyBEZWZhdWx0JyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgR2xvYmFsJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgd2lkdGg6IDcwXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXHJcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpY29uOiAnZWRpdCcsXHJcbiAgICAgICAgICAgICAgICBoaW50OiAnRWRpdCcsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlsdGVyQXBwbGllZCA9IGF3YWl0IHRoaXMudHJ5QXBwbHlGaWx0ZXIoZS5yb3cua2V5KTtcclxuICAgICAgICAgICAgICAgICAgaXNGaWx0ZXJBcHBsaWVkICYmICF0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndmlzaWJsZScpXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vcGVuRWRpdEZpbHRlclBvcHVwKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAnZGVsZXRlJ1xyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdzaW5nbGUnIH0sXHJcbiAgICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gNTFweCknLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRhdGEgc2V0cycsXHJcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgPyBlLnNlbGVjdGVkUm93S2V5c1swXSA6IG51bGwpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5kYXRhRmllbGQgPT09ICdpc0dsb2JhbCcpIHtcclxuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLmRpc2FibGVkID0gIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZWQgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XHJcbiAgICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IGFzeW5jIChvcHQpID0+IHtcclxuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci51cGRhdGVGaWx0ZXIoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ2VsbFByZXBhcmVkOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlID09PSAnYnV0dG9ucycpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9ICFlLmRhdGEuaXNHbG9iYWxcclxuICAgICAgICAgICAgICB8fCAoZS5kYXRhLmlzR2xvYmFsICYmIHRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxGaWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgIEFycmF5LmZyb20oZS5jZWxsRWxlbWVudC5jaGlsZHJlbigpKS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAkKGMpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2RkZCAhaW1wb3J0YW50JyxcclxuICAgICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcclxuICAgICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25Sb3dVcGRhdGluZzogKGUpID0+IHtcclxuICAgICAgICAgIGlmICghZS5rZXkgfHwgZS5uZXdEYXRhLmlzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZS5jb21wb25lbnQuZ2V0RGF0YVNvdXJjZSgpLml0ZW1zKCkuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuaXNEZWZhdWx0KTtcclxuICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIuaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51cGRhdGVVc2VyU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVySWQ6IGUubmV3RGF0YS5pc0RlZmF1bHQgPyBlLmtleSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFlLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWZpbHRlcnNfX2N1cnJlbnQtZmlsdGVyJylcclxuICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgdmFsdWU6IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd0ZXh0JykgfHwgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3BsYWNlaG9sZGVyJyksXHJcbiAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTmV3RmlsdGVyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19hZGQtbmV3LWZpbHRlciBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnTmV3IERhdGEgU2V0JyxcclxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5OZXdGaWx0ZXJQb3B1cCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3BsdXMnXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCAkcG9wdXBSb290ID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKCdib2R5Jyk7XHJcbiAgICBsZXQgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiAkcG9wdXBSb290LmR4UG9wdXAoe1xyXG4gICAgICBjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCksXHJcbiAgICAgIHNoYWRpbmc6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNjUwLFxyXG4gICAgICBoZWlnaHQ6IDUwMCxcclxuICAgICAgb25TaG93aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94LmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkaW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8IGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLmNhbmNlbCA9IHRydWU7XHJcbiAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XHJcbiAgICAgICAgaWYgKGlzUG9wdXBIaWRpbmdDb25maXJtZWQpIHtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIERhdGEgU2V0IE5hbWUuLi4nLFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCkge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhDaGVja0JveCh7XHJcbiAgICAgICAgdGV4dDogJ0dsb2JhbCBkYXRhIHNldCcsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1ucywgLi4ucmVzdCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc291cmNlQ29sdW1uIG9mIHNvdXJjZUNvbHVtbnMpIHtcclxuICAgICAgaWYgKHNvdXJjZUNvbHVtbi5jb2x1bW5zICYmIHNvdXJjZUNvbHVtbi5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1uLmNvbHVtbnMpO1xyXG5cclxuICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KG5lc3RlZENvbHVtbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbiA9ICQuZXh0ZW5kKHt9LCBzb3VyY2VDb2x1bW4pO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZScgfHwgY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpc0RhdGVUaW1lID0gY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9ICdkZCBNTU0geXknO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXQgPSAnaGg6bW0sIGRkIE1NTSB5eSc7XHJcbiAgICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gaXNEYXRlVGltZSA/IGRhdGVUaW1lRm9ybWF0IDogZGF0ZUZvcm1hdDtcclxuXHJcbiAgICAgICAgICBjb25zdCBwYXJzZURhdGVUaW1lID0gKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZVBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLCAnKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShkYXRlVGltZVBhcnRzWzFdLCBkYXRlRm9ybWF0KSB8fCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0aW1lUGFydHMgPSBkYXRlVGltZVBhcnRzWzBdLnNwbGl0KCc6Jyk7XHJcblxyXG4gICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMocGFyc2VJbnQodGltZVBhcnRzWzBdKSk7XHJcbiAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKHBhcnNlSW50KHRpbWVQYXJ0c1sxXSkpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gZGlzcGxheUZvcm1hdDtcclxuICAgICAgICAgIGNvbHVtbi5lZGl0b3JUZW1wbGF0ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEYXRlQm94KHtcclxuICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0LFxyXG4gICAgICAgICAgICAgIHR5cGU6IGlzRGF0ZVRpbWUgPyAnZGF0ZXRpbWUnIDogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXHJcbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24uZm9ybWF0RGF0ZSh2YWx1ZSwgZGlzcGxheUZvcm1hdCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IChpc0RhdGVUaW1lID8gcGFyc2VEYXRlVGltZShlLnZhbHVlKSA6IERldkV4cHJlc3MubG9jYWxpemF0aW9uLnBhcnNlRGF0ZShlLnZhbHVlLCBkaXNwbGF5Rm9ybWF0KSlcclxuICAgICAgICAgICAgICAgIHx8IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29sdW1uLmZpbHRlck9wZXJhdGlvbnMgPSBbJz0nLCAnPD4nLCAnPCcsICc+JywgJzw9JywgJz49JywgJ2lzYmxhbmsnLCAnaXNub3RibGFuayddO1xyXG4gICAgICAgICAgY29sdW1uLmNhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24gPSBmdW5jdGlvbihmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gW3NvdXJjZUNvbHVtbnMsIC4uLnJlc3RdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcclxuICAgICAgICAgICAgICBpZiAoaXNEYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgYXJnc1swXSA9IHBhcnNlRGF0ZVRpbWUoYXJnc1swXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZmlsdGVyVmFsdWUsIGRpc3BsYXlGb3JtYXQpIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Q2FsY3VsYXRlRmlsdGVyRXhwcmVzc2lvbiguLi5hcmdzKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KChjb2wxLCBjb2wyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24xID0gKGNvbDEuY2FwdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgY2FwdGlvbjIgPSAoY29sMi5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgaWYgKGNhcHRpb24xIDwgY2FwdGlvbjIpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjYXB0aW9uMSA+IGNhcHRpb24yKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlckJ1aWxkZXIoKSB7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoe1xyXG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJCdWlsZGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgIGNvbnN0ICRuYW1lQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImFwcy1maWx0ZXJzX19uYW1lLWNvbnRhaW5lclwiIC8+JykuaGVpZ2h0KCczNnB4Jyk7XHJcblxyXG4gICAgLy8gTk9URTogUmVjcmVhdGUgd2lkZ2V0c1xyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveCA9IHRoaXMuY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKTtcclxuICAgIHRoaXMuZmlsdGVyQnVpbGRlciA9IHRoaXMuY3JlYXRlRmlsdGVyQnVpbGRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ID0gdGhpcy5jcmVhdGVGaWx0ZXJJc0dsb2JhbENoZWNrYm94KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5uYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIuaXNHbG9iYWwpO1xyXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94LmVsZW1lbnQoKS5hcHBlbmRUbygkbmFtZUNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XHJcblxyXG4gICAgJG5hbWVDb250YWluZXIuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmZpbHRlclN0YXRlKTtcclxuXHJcbiAgICBjb25zdCAkZmlsdGVyQnVpbGRlckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJ2NhbGMoMTAwJSAtIDM2cHgpJykuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJCdWlsZGVyLmVsZW1lbnQoKS5hcHBlbmRUbygkZmlsdGVyQnVpbGRlckNvbnRhaW5lcik7XHJcblxyXG4gICAgJGZpbHRlckJ1aWxkZXJDb250YWluZXIuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgc2Nyb2xsQnlDb250ZW50OiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gJHBvcHVwQ29udGVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbXMoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtW10ge1xyXG4gICAgcmV0dXJuIGZpbHRlciA/IFtcclxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCksXHJcbiAgICAgIHRoaXMuY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxyXG4gICAgICB0aGlzLmNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKVxyXG4gICAgXSA6IFt0aGlzLmNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ0FwcGx5IGFuZCBTYXZlJyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFVwZGF0ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZSdcclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUZpbHRlckFzTmV3UG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMgTmV3JyxcclxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGljb246ICdzYXZlJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZXNldEZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIHRleHQ6ICdSZXNldCcsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgdW5zYXZlZCBjaGFuZ2VzPycsXHJcbiAgICAgICAgICAgICdSZXNldCB0aGUgZGF0YSBzZXQnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXNldENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGljb246ICd1bmRvJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnRGVsZXRlIERhdGEgU2V0JyxcclxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgXCIke3RoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lfVwiIGRhdGEgc2V0P2AsXHJcbiAgICAgICAgICAgICdEZWxldGUgdGhlIGRhdGEgc2V0J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUG9wdXAuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3RyYXNoJ1xyXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTmV3RmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcGVuRWRpdEZpbHRlclBvcHVwKGZpbHRlcjogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb24gPSB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbignYW5pbWF0aW9uJyk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmZpbHRlclBvcHVwLm9wdGlvbigndGl0bGUnLCBmaWx0ZXIgPyBgRWRpdCB0aGUgXCIke2ZpbHRlci5uYW1lfVwiIGRhdGEgc2V0YCA6ICdDcmVhdGUgYSBuZXcgZGF0YSBzZXQnKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCdjb250ZW50VGVtcGxhdGUnLCAoKSA9PiB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXIpKTtcclxuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0b29sYmFySXRlbXMnLCB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcikpO1xyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5yZXBhaW50KCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIGN1cnJlbnRBbmltYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyTmFtZVRleHRCb3ggfHwgIXRoaXMuZmlsdGVyQnVpbGRlciB8fCAhdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xyXG4gICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sRGlzcGxheUZpbHRlciA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3JlYXRlTmV3RmlsdGVyKFxyXG4gICAgICBmaWx0ZXJOYW1lLCBmaWx0ZXJCdWlsZGVyU3RhdGUsIGlzRGVmYXVsdCwgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoY29udHJvbERpc3BsYXlGaWx0ZXIuaWQpO1xyXG5cclxuICAgIG5vdGlmeSgnQ3JlYXRlZCcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGZpbHRlclN0YXRlID0gdGhpcy5maWx0ZXJCdWlsZGVyLm9wdGlvbigndmFsdWUnKTtcclxuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzVXBkYXRlZCA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGZpbHRlci5pZCwge1xyXG4gICAgICBuYW1lOiBmaWx0ZXJOYW1lLFxyXG4gICAgICBmaWx0ZXJTdGF0ZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFpc1VwZGF0ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IHVwZGF0ZSB0aXRsZVxyXG4gICAgbm90aWZ5KCdVcGRhdGVkJywgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcGx5RmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pZCk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuZGVsZXRlRmlsdGVyKGZpbHRlcklkKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMub25GaWx0ZXJEZWxldGVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQoZmlsdGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcclxuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldENoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIubmFtZSk7XHJcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XHJcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5pc0dsb2JhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBbdXNlclNldHRpbmdzLCBmaWx0ZXJzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci5nZXRVc2VyU2V0dGluZ3MoKSxcclxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKClcclxuICAgIF0pO1xyXG5cclxuICAgIGlmICh1c2VyU2V0dGluZ3MuZGVmYXVsdEZpbHRlcklkKSB7XHJcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoKGYpID0+IGYuaWQgPT09IHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xyXG4gICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgIChkZWZhdWx0RmlsdGVyIGFzIGFueSkuaXNEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICBrZXk6ICdpZCcsXHJcbiAgICAgIGRhdGE6IGZpbHRlcnNcclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICB0aGlzLmZpbHRlcnNEYXRhR3JpZCAmJiB0aGlzLmZpbHRlcnNEYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gTk9URTogRGVsYXkgZm9yIHBvcHVwIHZpc2liaWxpdHkgY2hlY2tpbmdcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMCkpO1xyXG4gICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IElBcGlSZXNwb25zZSwgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vLi4vRGF0YSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkZXJPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgbWF4RmlsZVNpemU6IG51bWJlcjtcclxuICBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xyXG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgb25WYWx1ZUNoYW5nZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZDtcclxuICBvblVwbG9hZFN0YXJ0ZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgb25VcGxvYWRlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQ7XHJcbiAgc2VsZWN0QnV0dG9uVGV4dD86IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3MudWkuZHhGaWxlVXBsb2FkZXIuVmFsdWVDaGFuZ2VkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZFN0YXJ0ZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXBsb2FkZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZGVkRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjc3NDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlcjtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVVcGxvYWRlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuY3NzQ2xhc3MgPSBvcHRpb25zLmNzc0NsYXNzO1xyXG4gICAgdGhpcy5tYXhGaWxlU2l6ZSA9IG9wdGlvbnMubWF4RmlsZVNpemU7XHJcbiAgICB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gb3B0aW9ucy5hY2NlcHRlZEZpbGVUeXBlcztcclxuICAgIHRoaXMuc2VsZWN0QnV0dG9uVGV4dCA9IG9wdGlvbnMuc2VsZWN0QnV0dG9uVGV4dDtcclxuICAgIHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zID0gb3B0aW9ucy5hbGxvd2VkRmlsZUV4dGVuc2lvbnM7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIHRoaXMub25VcGxvYWRTdGFydGVkID0gb3B0aW9ucy5vblVwbG9hZFN0YXJ0ZWQ7XHJcbiAgICB0aGlzLm9uVXBsb2FkZWQgPSBvcHRpb25zLm9uVXBsb2FkZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgJGZpbGVVcGxvYWRlciA9ICQoJzxkaXYgLz4nKTtcclxuICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XHJcbiAgICAgICRmaWxlVXBsb2FkZXIuYWRkQ2xhc3ModGhpcy5jc3NDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIgPSAkZmlsZVVwbG9hZGVyLmR4RmlsZVVwbG9hZGVyKHtcclxuICAgICAgc2VsZWN0QnV0dG9uVGV4dDogdGhpcy5zZWxlY3RCdXR0b25UZXh0LFxyXG4gICAgICBsYWJlbFRleHQ6ICcnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHRoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zLFxyXG4gICAgICBhY2NlcHQ6IHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMsXHJcbiAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcclxuICAgICAgbWF4RmlsZVNpemU6IHRoaXMubWF4RmlsZVNpemUsXHJcbiAgICAgIHNob3dGaWxlTGlzdDogZmFsc2UsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbignbGFiZWxUZXh0JywgZS52YWx1ZVswXSA/IGUudmFsdWVbMF0ubmFtZSA6ICcnKTtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkU3RhcnRlZDogKGUpID0+IHtcclxuICAgICAgICBlLmVsZW1lbnQuZmluZCgnLmR4LWZpbGV1cGxvYWRlci11cGxvYWQtYnV0dG9uJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRTdGFydGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBsb2FkZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZGVkPy4oZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KS5keEZpbGVVcGxvYWRlcignaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBsb2FkPFQ+KHVwbG9hZFVybDogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSAodGhpcy5maWxlVXBsb2FkZXIuZWxlbWVudCgpLmZpbmQoJ2lucHV0JylbMF0gYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXNbMF07XHJcblxyXG4gICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcclxuXHJcbiAgICAgIC8qIGVzbGludCBndWFyZC1mb3ItaW46IG9mZiAqL1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYXJhbXMpIHtcclxuICAgICAgICBmZC5hcHBlbmQocHJvcCwgcGFyYW1zW3Byb3BdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJC5hamF4KHtcclxuICAgICAgICB1cmw6IHVwbG9hZFVybCxcclxuICAgICAgICB0eXBlOiAncG9zdCcsXHJcbiAgICAgICAgZGF0YTogZmQsXHJcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxyXG4gICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzcG9uc2U6IElBcGlSZXNwb25zZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLkRhdGEgYXMgYW55KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZS5NZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KCdVbmtub3duIGVycm9yJylcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi9XaWRnZXRzL05vdGlmeSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4uL0ZpbGVVcGxvYWRlci9JbmRleCc7XHJcbmltcG9ydCB7IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvLCBJRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSB9IGZyb20gJy4vSUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGEnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB7XHJcbiAgc2NoZW1hOiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XHJcbiAgYWRkUm93c1VybDogc3RyaW5nO1xyXG4gIGdldFRhYmxlc0xpc3RVcmw/OiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlPzogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxuICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU/OiBJbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xyXG4gIGNyZWF0ZVRhYmxlTW9kZVRleHQ/OiBzdHJpbmc7XHJcbiAgdXBkYXRlVGFibGVNb2RlVGV4dD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gSW1wb3J0RmlsZU1vZGUge1xyXG4gIENyZWF0ZU5ld1RhYmxlID0gMCxcclxuICBBZGROZXdSb3dzID0gMVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZUltcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRBQkxFX1VQREFURURfRVZFTlQgPSAnZmlsZS1pbXBvcnRlci10YWJsZS11cGRhdGVkLWV2ZW50JztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdldFRhYmxlc0xpc3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbkNoYW5nZU1vZGU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVRhYmxlQnV0dG9uVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHBvcHVwOiBEZXZFeHByZXNzLnVpLmR4UG9wdXA7XHJcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcclxuICBwcml2YXRlIGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyO1xyXG4gIHByaXZhdGUgZGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJvd3NDb3VudGVyQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByb3dzQ291bnRlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgbW9kZTogSW1wb3J0RmlsZU1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkVXJsID0gb3B0aW9ucy5maWxlVXBsb2FkVXJsO1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICB0aGlzLmdldFRhYmxlc0xpc3RVcmwgPSBvcHRpb25zLmdldFRhYmxlc0xpc3RVcmw7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlVXJsID0gb3B0aW9ucy5jcmVhdGVUYWJsZVVybDtcclxuICAgIHRoaXMuYWRkUm93c1VybCA9IG9wdGlvbnMuYWRkUm93c1VybDtcclxuICAgIHRoaXMucHJlZGVmaW5lZFRhYmxlID0gb3B0aW9ucy5wcmVkZWZpbmVkVGFibGU7XHJcbiAgICB0aGlzLmNhbkNoYW5nZU1vZGUgPSBvcHRpb25zLnByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlIDogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcbiAgICB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVCdXR0b25UZXh0IHx8ICdDcmVhdGUgVGFibGUnO1xyXG4gICAgdGhpcy51cGRhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICAgIHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVNb2RlVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcclxuICAgIHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVNb2RlVGV4dCB8fCAnQWRkIE5ldyBSb3dzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93KCkge1xyXG4gICAgdGhpcy5wb3B1cCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpXHJcbiAgICAgIC5keFBvcHVwKHtcclxuICAgICAgICBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICBmdWxsU2NyZWVuOiB0cnVlLFxyXG4gICAgICAgIG1heFdpZHRoOiAxMzAwLFxyXG4gICAgICAgIG1heEhlaWdodDogODAwLFxyXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGNvbnN0ICRzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgICAgICAgJHNjcm9sbFZpZXcuYXBwZW5kKHRoaXMuZm9ybS5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICAgICRzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgICAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xiYXJJdGVtczogW3tcclxuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpLFxyXG4gICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBlLmNvbXBvbmVudDtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm93c1RvVGFibGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5wb3B1cC5oaWRlKClcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICB9XVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICB0aGlzLnBvcHVwLnNob3coKTtcclxuICAgIHRoaXMub25Nb2RlU3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIGlmICh0aGlzLnBvcHVwKSB7XHJcbiAgICAgIHRoaXMucG9wdXAuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCk6IERldkV4cHJlc3MudWkuZHhGb3JtIHtcclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2PicpLmR4Rm9ybSh7XHJcbiAgICAgIHNob3dDb2xvbkFmdGVyTGFiZWw6IHRydWUsXHJcbiAgICAgIGxhYmVsTG9jYXRpb246ICd0b3AnLFxyXG4gICAgICBjb2xDb3VudEJ5U2NyZWVuOiB7IG1kOiA0LCBzbTogMSB9LFxyXG4gICAgICBzY3JlZW5CeVdpZHRoOiAod2lkdGgpID0+IHdpZHRoIDwgMTI1NiA/ICdzbScgOiAnbWQnLFxyXG4gICAgICBpdGVtczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdNb2RlJyxcclxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXHJcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2NoZW1hJyxcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZVxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdUYWJsZScsXHJcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXHJcbiAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xyXG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcclxuICAgICAgICB9XVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGVTZWxlY3RvcicsXHJcbiAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgIHRleHQ6ICdUYWJsZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgICAgY29sU3BhbjogMixcclxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBsb2FkVXJsOiB0aGlzLmdldFRhYmxlc0xpc3RVcmwsXHJcbiAgICAgICAgICAgICAgbG9hZFBhcmFtczogeyBjb250ZXh0TmFtZTogJycsIHRhYmxlc09ubHk6IHRydWUsIGlzV2FyZWhvdXNlQ29udGV4dDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgIGxvYWRNZXRob2Q6ICdwb3N0JyxcclxuICAgICAgICAgICAgICBub3RpZnlFcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgc29ydDogJ3RoaXMnLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllcyxcclxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XHJcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdTb3VyY2UgRmlsZScsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBkYXRhRmllbGQ6ICdDb2x1bW5zIFNlbGVjdG9yJyxcclxuICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbFNwYW46IDQsXHJcbiAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRGF0YUdyaWQoJGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICAkKCc8ZGl2IC8+JykuZHhCdXR0b25Hcm91cCh7XHJcbiAgICAgIGl0ZW1zOiBbe1xyXG4gICAgICAgIHRleHQ6IHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCxcclxuICAgICAgICBpY29uOiAnaW5zZXJ0dGFibGUnLFxyXG4gICAgICAgIHZhbHVlOiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgdGV4dDogdGhpcy51cGRhdGVUYWJsZU1vZGVUZXh0LFxyXG4gICAgICAgIGljb246ICdpbnNlcnRyb3diZWxvdycsXHJcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3NcclxuICAgICAgfV0gYXMgYW55LFxyXG4gICAgICBrZXlFeHByOiAndmFsdWUnLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgc3R5bGluZ01vZGU6ICdvdXRsaW5lZCcsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1LZXlzOiBbdGhpcy5tb2RlXSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gZS5pdGVtRGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgfSkuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUZpbGVzVXBsb2FkZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICAkY29udGFpbmVyLFxyXG4gICAgICBjc3NDbGFzczogJ3RhYmxlLWNyZWF0b3JfX3VwbG9hZCcsXHJcbiAgICAgIG1heEZpbGVTaXplOiAxMCAqIDEwMDAwMDAsXHJcbiAgICAgIGFjY2VwdGVkRmlsZVR5cGVzOiAnLnhscywgLnhsc3gnLFxyXG4gICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IFsnLnhscycsICcueGxzeCddLFxyXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiAnU2VsZWN0IEV4Y2VsIGZpbGUnLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdQYXJzaW5nIHNlbGVjdGVkIGZpbGUuLi4nKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8SUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGE+KHRoaXMuZmlsZVVwbG9hZFVybCkudGhlbigodGFibGVNZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGFibGVNZXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Um93c0NvdW50KHRhYmxlTWV0YS5Sb3dzQ291bnQpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgICAgICAgICBzdG9yZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcclxuICAgICAgICAgICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRhYmxlTWV0YS5Db2x1bW5zXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBub3RpZnkoYFBhcnNpbmcgRXJyb3IgOiAke2V9YCwgZmFsc2UpO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZXIucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKCRjb250YWluZXI6IEpRdWVyeSkge1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIG5vRGF0YVRleHQ6ICdTZWxlY3QgRXhjZWwgRmlsZScsXHJcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICBzZWFyY2hQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGdyb3VwUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBoZWFkZXJGaWx0ZXI6IHtcclxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUm93OiB7XHJcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgc29ydGluZzoge1xyXG4gICAgICAgIG1vZGU6ICdub25lJ1xyXG4gICAgICB9LFxyXG4gICAgICBwYWdpbmc6IHtcclxuICAgICAgICBwYWdlU2l6ZTogMTAwMDAsXHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgfSxcclxuICAgICAgc2VsZWN0aW9uOiB7XHJcbiAgICAgICAgbW9kZTogJ25vbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSWQnLFxyXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnU2VsZWN0ZWQnLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNLZXlDb2x1bW4nLFxyXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgY2FwdGlvbjogJ0NvbHVtbiBOYW1lJ1xyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNOdWxsYWJsZScsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlICYmIHRoaXMuY2FuQ2hhbmdlTW9kZSxcclxuICAgICAgICBzZXRDZWxsVmFsdWU6IChuZXdEYXRhLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbmV3RGF0YS5Jc051bGxhYmxlID0gdmFsdWU7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgbmV3RGF0YS5Jc0tleUNvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxyXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuICAgICAgICB0b29sYmFySXRlbXMucHVzaCh7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndGFibGUtY3JlYXRvcl9fdGFibGUtaGVhZGVyJylcclxuICAgICAgICAgICAgICAgIC50ZXh0KCdQYXJzZWQgRmlsZSBNZXRhZGF0YScpLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlciA9ICQoJzxzcGFuPicpLnRleHQoJzEwMDAnKTtcclxuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpLnRleHQoJ1Jvd3MgQ291bnQ6ICcpLCB0aGlzLnJvd3NDb3VudGVyKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lcjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZGF0YVJvdycgJiYgZS5kYXRhRmllbGQgPT09ICdJc0tleUNvbHVtbicpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRvck9wdGlvbnMgPSBlLmVkaXRvck9wdGlvbnMgYXMgRGV2RXhwcmVzcy51aS5keENoZWNrQm94T3B0aW9ucztcclxuICAgICAgICAgIGVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSBlLnJvdy5kYXRhLklzTnVsbGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGF0YUdyaWQgPSBkZWZhdWx0R3JpZCgkKCc8ZGl2IC8+JyksIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJyxcclxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgJGNvbnRhaW5lci5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJsZSgpIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcclxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgY29uc3QgZHMgPSB0aGlzLmRhdGFHcmlkLmdldERhdGFTb3VyY2UoKTtcclxuICAgICAgaWYgKCFkcykge1xyXG4gICAgICAgIG5vdGlmeSgnU2VsZWN0IGZpbGUgd2l0aCBkYXRhJywgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xyXG4gICAgICBpZiAoIXRoaXMuYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnMpKSB7XHJcbiAgICAgICAgbm90aWZ5KCdBdCBsZWFzdCAxIGtleSBjb2x1bW4gbXVzdCBiZSBzZXQnLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlNjaGVtYSxcclxuICAgICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlLFxyXG4gICAgICAgICAgY29sdW1uczogSlNPTi5zdHJpbmdpZnkoY29sdW1ucylcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdDcmVhdGluZyBhbmQgZmlsbGluZyBEQiB0YWJsZS4uLicpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyLnVwbG9hZDxib29sZWFuPih0aGlzLmNyZWF0ZVRhYmxlVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XHJcbiAgICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlIFske3BhcmFtcy5zY2hlbWF9XS5bJHtwYXJhbXMudGFibGV9XSBoYXMgYmVlbiBjcmVhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gY3JlYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgbm90aWZ5KGBUYWJsZSBjcmVhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFJvd3NUb1RhYmxlKCkge1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuZm9ybS52YWxpZGF0ZSgpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xyXG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xyXG4gICAgICBpZiAoIWRzKSB7XHJcbiAgICAgICAgbm90aWZ5KCdTZWxlY3QgZmlsZSB3aXRoIGRhdGEnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29sdW1ucyA9IGRzLml0ZW1zKCk7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZVNlbGVjdG9yLFxyXG4gICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBZGRpbmcgcm93cyB0byBEQiB0YWJsZS4uLicpO1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5hZGRSb3dzVXJsLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcclxuICAgICAgICAgIG5vdGlmeShgVGhlIHRhYmxlICR7cGFyYW1zLnRhYmxlfSBoYXMgYmVlbiB1cGRhdGVkYCwgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoRmlsZUltcG9ydGVyLlRBQkxFX1VQREFURURfRVZFTlQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RpZnkoJ1RoZSB0YWJsZSBoYXMgbm90IGJlZW4gdXBkYXRlZCcsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgbm90aWZ5KGBUYWJsZSB1cGRhdGluZyBlcnJvcjogJHtlfWAsIGZhbHNlKTtcclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vZGVTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBpc0NyZWF0ZVRhYmxlTW9kZSA9IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KCkpO1xyXG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzS2V5Q29sdW1uJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICB0aGlzLmRhdGFHcmlkLmNvbHVtbk9wdGlvbignSXNOdWxsYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG5cclxuICAgIGlmICghdGhpcy5jYW5DaGFuZ2VNb2RlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdTY2hlbWEnLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICB0aGlzLmZvcm0udXBkYXRlRGF0YSgnU2NoZW1hJywgdGhpcy5wcmVkZWZpbmVkVGFibGUuc2NoZW1hKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdUYWJsZScsIHRoaXMucHJlZGVmaW5lZFRhYmxlLnRhYmxlKTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XHJcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZScsICd2aXNpYmxlJywgaXNDcmVhdGVUYWJsZU1vZGUpO1xyXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgIWlzQ3JlYXRlVGFibGVNb2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWN0aW9uQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGUgPyB0aGlzLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCA6IHRoaXMudXBkYXRlVGFibGVCdXR0b25UZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcmVDb2x1bW5zVmFsaWQoY29sdW1uczogSUZpbGVJbXBvcnRlckNvbHVtbkluZm9bXSkge1xyXG4gICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLlNlbGVjdGVkKS5zb21lKChzKSA9PiBzLklzS2V5Q29sdW1uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Um93c0NvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIuc2hvdygpO1xyXG4gICAgdGhpcy5yb3dzQ291bnRlci50ZXh0KGNvdW50KTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIgfSBmcm9tICcuL0dyaWREaXNwbGF5c01hbmFnZXInO1xyXG5pbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRmlsdGVyc01hbmFnZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcbmltcG9ydCB7IEZpbGVJbXBvcnRlciwgSUZpbGVJbXBvcnRlclRhYmxlSW5mbywgSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcclxuICBtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZTtcclxuICBjcmVhdGVUYWJsZVVybDogc3RyaW5nO1xyXG4gIGFkZFJvd3NVcmw6IHN0cmluZztcclxuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgcHJlZGVmaW5lZFRhYmxlOiBJRmlsZUltcG9ydGVyVGFibGVJbmZvO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHtcclxuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xyXG4gIHJlYWRvbmx5IGVkaXRNb2RlOiBib29sZWFuO1xyXG4gIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXI6IEdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXI6IEdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkVmlld3NNYW5hZ2VyOiBHcmlkVmlld3NNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRGaWxlT3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheXNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGN1cnJlbnREaXNwbGF5VGl0bGU6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2F2ZUJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVBc0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGRhdGFHcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBmaWxlSW1wb3J0ZXI6IEZpbGVJbXBvcnRlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUgdmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc3BsYXlzVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pbXBvcnRGaWxlVG9vbGJhckl0ZW06IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB8IHVuZGVmaW5lZDtcclxuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIgPSBvcHRpb25zLmdyaWREaXNwbGF5c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXI7XHJcbiAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlciA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxhaXNMb2FkZWQgPSAoZGlzcGxheXMpID0+IHtcclxuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEZXZFeHByZXNzLmRhdGEuQXJyYXlTdG9yZSh7XHJcbiAgICAgICAga2V5OiAnSWQnLFxyXG4gICAgICAgIGRhdGE6IGRpc3BsYXlzXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5kYXRhR3JpZCAmJiB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSAoZGlzcGxheSkgPT4ge1xyXG4gICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggJiYgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5JZCA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbigndmFsdWUnLCBkaXNwbGF5ID8gZGlzcGxheS5OYW1lIDogbnVsbCk7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZSAmJiB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQXNCdXR0b24gJiYgdGhpcy5zYXZlQXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWRpc3BsYXkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGF0YUdyaWQpIHtcclxuICAgICAgICBkaXNwbGF5XHJcbiAgICAgICAgICA/IHRoaXMuZGF0YUdyaWQuc2VsZWN0Um93cyhbZGlzcGxheS5JZF0sIGZhbHNlKVxyXG4gICAgICAgICAgOiB0aGlzLmRhdGFHcmlkLmRlc2VsZWN0QWxsKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XHJcblxyXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcclxuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICAgIHRoaXMub25HcmlkVG9vbGJhclByZXBhcmluZyhlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XHJcbiAgICBpZiAoIXRvb2xiYXJJdGVtcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBbdGhpcy5kaXNwbGF5c1Rvb2xiYXJJdGVtXTtcclxuXHJcbiAgICBpZiAodGhpcy5pbXBvcnRGaWxlT3B0aW9ucyAmJiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUgIT09IENkbUltcG9ydEZpbGVNb2RlLk5vbmUpIHtcclxuICAgICAgbmV3SXRlbXMucHVzaCh0aGlzLmltcG9ydEZpbGVUb29sYmFySXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLCAuLi5uZXdJdGVtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5keERhdGFHcmlkKHtcclxuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcclxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcclxuICAgICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiBmYWxzZSxcclxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSxcclxuICAgICAgICAgIG1vZGU6ICdyb3cnLFxyXG4gICAgICAgICAgdXNlSWNvbnM6IHRydWUsXHJcbiAgICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXNwbGF5PydcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWRQYW5lbDoge1xyXG4gICAgICAgICAgc2hhZGluZzogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXHJcbiAgICAgICAgd29yZFdyYXBFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGNvbHVtbnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNhcHRpb246ICdEaXNwbGF5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnRmlsdGVySWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGF0YSBTZXQnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdWaWV3SWQnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnVmlldycsXHJcbiAgICAgICAgICAgIGxvb2t1cDoge1xyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIGtleWJvYXJkTmF2aWdhdGlvbjoge1xyXG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxyXG4gICAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGZvY3VzZWRSb3dFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAnY2FsYygxMDAlIC0gNTFweCknIDogJzEwMCUnLFxyXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXHJcbiAgICAgICAgcGFnaW5nOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXHJcbiAgICAgICAgbm9EYXRhVGV4dDogJ05vIGRpc3BsYXlzJyxcclxuICAgICAgICBvbkluaXRpYWxpemVkOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKTtcclxuICAgICAgICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmdldFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdGaWx0ZXJJZCcsICdsb29rdXAuZGF0YVNvdXJjZScsIGZpbHRlcnMpO1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKCdWaWV3SWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCB2aWV3cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNlbGxDbGljazogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLnJvd1R5cGUgIT09ICdkYXRhJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5kYXRhLklkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uUm93UmVtb3Zpbmc6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmJlZ2luQ3VzdG9tTG9hZGluZygnTG9hZGluZycpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmRlbGV0ZURpc3BsYXkoZS5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIGNvbnN0IGJhc2ljT3B0aW9uczogRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIHwgRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94LlByb3BlcnRpZXMgPSB7XHJcbiAgICAgIHZhbHVlRXhwcjogJ0lkJyxcclxuICAgICAgZGlzcGxheUV4cHI6ICdOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxyXG4gICAgICB3aWR0aDogMjAwLFxyXG4gICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5nZXREaXNwbGF5cygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5O1xyXG5cclxuICAgICAgICBjb25zdCBmaWx0ZXJDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LkZpbHRlcklkICE9PSB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQ7XHJcbiAgICAgICAgY29uc3Qgdmlld0NoYW5nZWQgPSBkaXNwbGF5ICYmIGRpc3BsYXkuVmlld0lkICE9PSB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZDtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgKGZpbHRlckNoYW5nZWQgfHwgdmlld0NoYW5nZWRcclxuICAgICAgICAgID8gdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKVxyXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJ1ZSkpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlybWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXlJZCA9IGUudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRyb3BEb3duQm94T3B0aW9uczogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94T3B0aW9ucyA9IHtcclxuICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfSxcclxuICAgICAgZHJvcERvd25PcHRpb25zOiB7XHJcbiAgICAgICAgd2lkdGg6IDgwMFxyXG4gICAgICB9LFxyXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICF0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyB2b2lkIDAgOiAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUdyaWQgPSB0aGlzLmNyZWF0ZURhdGFHcmlkKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZS5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnRIZWFkZXIgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19oZWFkZXInKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUuZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVCdXR0b24uZWxlbWVudCgpKVxyXG4gICAgICAgICAgLmFwcGVuZCh0aGlzLnNhdmVBc0J1dHRvbi5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuaGVpZ2h0KCcxMDAlJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdE1vZGUpIHtcclxuICAgICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3Bkb3duQ29udGVudC5hcHBlbmQodGhpcy5kYXRhR3JpZC5lbGVtZW50KCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZHJvcGRvd25Db250ZW50O1xyXG4gICAgICB9LFxyXG4gICAgICBvbk9wZW5lZDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkKTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gJiYgdGhpcy5zYXZlQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWRnZXQ6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICgnZHhEcm9wRG93bkJveCcgYXMgYW55KSA6ICdkeFNlbGVjdEJveCcsXHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB0ZXh0OiAnRGlzcGxheXMnLFxyXG4gICAgICBjc3NDbGFzczogJ2Fwcy1kaXNwbGF5c19fdG9vbGJhci1pdGVtJyxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJC5leHRlbmQoYmFzaWNPcHRpb25zLCBkcm9wRG93bkJveE9wdGlvbnMpIDogYmFzaWNPcHRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBpY29uOiAndXBsb2FkJyxcclxuICAgICAgICBoaW50OiAnSW1wb3J0IGZpbGUnLFxyXG4gICAgICAgIGhlaWdodDogMzAsXHJcbiAgICAgICAgc3R5bGluZ01vZGU6ICd0ZXh0JyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maWxlSW1wb3J0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlSW1wb3J0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyID0gbmV3IEZpbGVJbXBvcnRlcih7XHJcbiAgICAgICAgICAgICRjb250YWluZXI6IHRoaXMub3B0aW9ucy5vd25lci5lbGVtZW50KCkucGFyZW50KCksXHJcbiAgICAgICAgICAgIHRpdGxlOiAnSW1wb3J0IEZpbGUgdG8gQ0RNJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuY3JlYXRlVGFibGVVcmwsXHJcbiAgICAgICAgICAgIGFkZFJvd3NVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuYWRkUm93c1VybCxcclxuICAgICAgICAgICAgZmlsZVVwbG9hZFVybDogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5maWxlVXBsb2FkVXJsLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGU6IHRoaXMuZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMubW9kZSksXHJcbiAgICAgICAgICAgIHByZWRlZmluZWRUYWJsZTogdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5wcmVkZWZpbmVkVGFibGUsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dDogJ1JlcGxhY2UgQWxsIFJvd3MnLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZU1vZGVUZXh0OiAnUmVwbGFjZSBSb3dzJyxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLm9uKEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5ULCAoKSA9PiB0aGlzLm9wdGlvbnMub3duZXIucmVmcmVzaCgpKTtcclxuICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLnNob3coKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgZS5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IDUsXHJcbiAgICAgICAgICAgIHBhZGRpbmdCb3R0b206IDVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlKG1vZGU6IENkbUltcG9ydEZpbGVNb2RlKTogSW1wb3J0RmlsZU1vZGUge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93czpcclxuICAgICAgICByZXR1cm4gSW1wb3J0RmlsZU1vZGUuQWRkTmV3Um93cztcclxuXHJcbiAgICAgIGNhc2UgQ2RtSW1wb3J0RmlsZU1vZGUuUmVwbGFjZUFsbFJvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG1vZGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQ3VycmVudERpc3BsYXlUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XHJcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19jdXJyZW50LWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICB9KVxyXG4gICAgICAuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcclxuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcclxuICAgICAgLmFkZENsYXNzKCdhcHMtZGlzcGxheXNfX3NhdmUtZGlzcGxheSBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3VycmVudERpc3BsYXksXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIudXBkYXRlQ3VycmVudERpc3BsYXkoXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpY29uOiAnc2F2ZScsXHJcbiAgICAgICAgd2lkdGg6IDEyNVxyXG4gICAgICB9KVxyXG4gICAgICAuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlfX3NhdmUtZGlzcGxheS1hcyBpc3pvbGVhLW1kJylcclxuICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZSBBcycsXHJcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4gKFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2coKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxNjBcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlQXNEaWFsb2coKSB7XHJcbiAgICBjb25zdCAkcG9wdXBDb250ZW50ID0gJCgnPGRpdiAvPicpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnRFbGVtZW50ID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206OHB4O1wiIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgcGxhY2Vob2xkZXI6ICdEaXNwbGF5IE5hbWUnLFxyXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICB9KS5keFZhbGlkYXRvcih7XHJcbiAgICAgIHZhbGlkYXRpb25SdWxlczogW1xyXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG5hbWVUZXh0Qm94ID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yID0gZGlhbG9nQ29udGVudEVsZW1lbnQuZHhWYWxpZGF0b3IoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgbmFtZVRleHRCb3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEaWFsb2coXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogJ0NyZWF0ZSBOZXcgRGlzcGxheScsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzMwMHB4JyxcclxuICAgICAgfSxcclxuICAgICAgJHBvcHVwQ29udGVudCxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdPaycsXHJcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcclxuICAgICAgICAgIGlmICghdmFsaWRhdG9yLnZhbGlkYXRlKCkuaXNWYWxpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuY3JlYXRlTmV3RGlzcGxheShcclxuICAgICAgICAgICAgbmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICAgICAgb25DbGljazogKGNsb3NlUG9wdXApID0+IGNsb3NlUG9wdXAoKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybUNoYW5nZXNMb3NzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCB3aWxsIGJlIGxvc3QgaWYgeW91IGNsb3NlIHRoaXMgcG9wdXAuIERvIHlvdSB3YW50IHRvIGNsb3NlIHRoZSBwb3B1cCBhbmQgbm90IHNhdmUgY2hhbmdlcz8nLFxyXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGRpc3BsYXlzVG9vbGJhckl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRGlzcGxheXNUb29sYmFySXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW1wb3J0RmlsZVRvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRGaWxlVG9vbGJhckl0ZW0pIHtcclxuICAgICAgdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtID0gdGhpcy5jcmVhdGVJbXBvcnRGaWxlVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4uLy4uLy4uL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXkge1xyXG4gIHJlYWRvbmx5IElkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgTmFtZTogc3RyaW5nO1xyXG4gIHJlYWRvbmx5IEZpbHRlcklkOiBudW1iZXI7XHJcbiAgcmVhZG9ubHkgVmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNNYW5hZ2VyIHtcclxuICBwcml2YXRlIGRpc3BsYXlzOiBJQ29udHJvbERpc3BsYXlbXSB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IHtcclxuICAgIGNoYW5nZWQ6IEFycmF5PChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQ+LFxyXG4gICAgbG9hZGVkOiBBcnJheTwoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkPlxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfY3VycmVudERpc3BsYXlJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zZXJ0RGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xyXG5cclxuICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IHtcclxuICAgICAgY2hhbmdlZDogW10sXHJcbiAgICAgIGxvYWRlZDogW11cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZERpc3BsYXlzKCkge1xyXG4gICAgdGhpcy5kaXNwbGF5cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVtdPih0aGlzLmxvYWREYXRhVXJsKTtcclxuICAgIHRoaXMub25EaXNwbGFpc0xvYWRlZFByaXZhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREaXNwbGF5cygpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlzIHx8IGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGlzcGxheUJ5SWQgPSAoaWQ6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKCFpZCB8fCAhdGhpcy5kaXNwbGF5cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cy5maW5kKCh2KSA9PiB2LklkID09PSBpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXdWaWV3RHRvID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgTmFtZTogbmFtZSxcclxuICAgICAgRmlsdGVySWQ6IGZpbHRlcklkLFxyXG4gICAgICBWaWV3SWQ6IHZpZXdJZFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLmluc2VydERhdGFVcmwsICdQT1NUJywgbmV3Vmlld0R0byk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZURpc3BsYXkoaWQ6IG51bWJlcikge1xyXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBpZCB9KTtcclxuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ3VycmVudERpc3BsYXkobmFtZTogc3RyaW5nLCBmaWx0ZXJJZDogbnVtYmVyLCB2aWV3SWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheSh0aGlzLmN1cnJlbnREaXNwbGF5LklkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEaXNwbGF5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsIHtcclxuICAgICAgaWQsIG5hbWUsIGZpbHRlcklkLCB2aWV3SWRcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EaXNwbGF5Q2hhbmdlZFByaXZhdGUoKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2hhbmdlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmN1cnJlbnREaXNwbGF5KVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5mb3JFYWNoKChoYW5kbGVycykgPT4gKFxyXG4gICAgICBoYW5kbGVycyh0aGlzLmRpc3BsYXlzKVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERpc3BsYXlJZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudERpc3BsYXlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50RGlzcGxheUlkID0gaWQ7XHJcbiAgICB0aGlzLm9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnREaXNwbGF5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheUJ5SWQodGhpcy5fY3VycmVudERpc3BsYXlJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9uRGlzcGxheUNoYW5nZWQoaGFuZGxlcjogKGRpc3BsYXk6IElDb250cm9sRGlzcGxheSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgb25EaXNwbGFpc0xvYWRlZChoYW5kbGVyOiAoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMgPVxyXG4gIE11dGFibGU8T21pdDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5PcHRpb25zLCBrZXlvZiBJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0ge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxyXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicsIHtcclxuICAgICAgbW9kZTogJ211bHRpcGxlJ1xyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzZWxlY3Rpb24nXSk7XHJcbiAgICBncmlkLm9uKCdlZGl0b3JQcmVwYXJpbmcnLCB0aGlzLm9uR3JpZEVkaXRvclByZXBhcmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZEVkaXRvclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25FZGl0b3JQcmVwYXJpbmcnXSA9IChlKSA9PiB7XHJcbiAgICBpZiAoIWUuY29tcG9uZW50IHx8ICFlLmVkaXRvck9wdGlvbnMgfHwgZS5wYXJlbnRUeXBlICE9PSAnZGF0YVJvdycgfHwgIWUuZGF0YUZpZWxkIHx8ICFlLnJvdyB8fCAhZS5yb3cua2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhRmllbGQgPSBlLmRhdGFGaWVsZDtcclxuICAgIGNvbnN0IGVkaXRvcktleSA9IGUucm93LmtleTtcclxuICAgIGNvbnN0IGRlZmF1bHRMaXN0ZW5lciA9IGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZDtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IChldmVudDogeyB2YWx1ZTogYW55IH0pID0+IHtcclxuICAgICAgZGVmYXVsdExpc3RlbmVyKGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlTXVsdGlwbGVSb3dzKGRhdGFGaWVsZCwgZWRpdG9yS2V5LCBldmVudC52YWx1ZSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVNdWx0aXBsZVJvd3M8VD4oZGF0YUZpZWxkOiBzdHJpbmcsIGVkaXRvcktleTogc3RyaW5nLCB2YWx1ZTogVCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dLZXlzOiBzdHJpbmdbXSA9IGF3YWl0IHRoaXMub3B0aW9ucy5vd25lci5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICAgIGlmICghc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkUm93S2V5cy5maW5kSW5kZXgoKGspID0+IGsgPT09IGVkaXRvcktleSk7XHJcbiAgICBpZiAoZWRpdG9yS2V5U2VsZWN0ZWRJbmRleCA8IDAgfHwgc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dLZXlzLnNwbGljZShlZGl0b3JLZXlTZWxlY3RlZEluZGV4LCAxKTtcclxuICAgIHNlbGVjdGVkUm93S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmNlbGxWYWx1ZSh0aGlzLm9wdGlvbnMub3duZXIuZ2V0Um93SW5kZXhCeUtleShrZXkpLCBkYXRhRmllbGQsIHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tICcuLi8uLi8uLi9Db21wb25lbnRzL0NvcmUnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICByZWFkb25seSBkZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICByZWFkb25seSBkZWZhdWx0Vmlld0lkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8ge1xyXG4gIERlZmF1bHRGaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIERlZmF1bHRWaWV3SWQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkgbG9hZGVkVXNlclNldHRpbmdzPzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzO1xyXG59XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWVtcHR5LWludGVyZmFjZVxyXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zIHtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBNdXRhYmxlPE9taXQ8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMsIGtleW9mIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJEZWZhdWx0T3B0aW9ucz4+ICZcclxuICBNdXRhYmxlPFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj47XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnM7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSB7XHJcbiAgICBkZWZhdWx0RmlsdGVySWQ6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRWaWV3SWQ6IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZFxyXG4gIH07XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXHJcbiAgcHJvdGVjdGVkIF9sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBhdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFQU0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3MpIHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3ModmFsdWU6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gdmFsdWU7XHJcbiAgICB0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgaWYgKCF0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmxvYWRVc2VyU2V0dGluZ3MoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3ModXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz47XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+O1xyXG5cclxuICBwcm90ZWN0ZWQgc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gdHJ1ZTtcclxuICAgIH0sIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0b3BBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcclxuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuYXV0b1Jlc2V0dGluZ0NhY2hlVGltZXJJZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgZXh0ZW5kcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmFnZUtleSA9ICdhcHM6Y29udHJvbC1kaXNwbGF5OnVzZXItc2V0dGluZ3MnO1xyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFVzZXJTZXR0aW5ncygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgcmF3VXNlclNldHRpbmdzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSk7XHJcbiAgICBpZiAoIXJhd1VzZXJTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXJTZXR0aW5nczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzID0gSlNPTi5wYXJzZShyYXdVc2VyU2V0dGluZ3MpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3NJbnRlcm5hbCh1cGRhdGVzOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQcm9taXNlPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4ge1xyXG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XHJcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodXBkYXRlZFVzZXJTZXR0aW5ncykpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkVXNlclNldHRpbmdzO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMge1xyXG4gIGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XHJcbiAgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnMgJiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zKSB7XHJcbiAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XHJcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KHRoaXMubG9hZERhdGFVcmwpO1xyXG5cclxuICAgIHJldHVybiB1c2VyU2V0dGluZ3NEdG8gPyB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvVG9Nb2RlbCh1c2VyU2V0dGluZ3NEdG8pIDogdGhpcy5kZWZhdWx0VXNlclNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xyXG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KFxyXG4gICAgICB0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLFxyXG4gICAgICB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byh1cGRhdGVkVXNlclNldHRpbmdzKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXBkYXRlZFVzZXJTZXR0aW5nc0R0byk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNb2RlbFRvRHRvKG1vZGVsOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncz4pOiBQYXJ0aWFsPElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0bz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgRGVmYXVsdEZpbHRlcklkOiBtb2RlbC5kZWZhdWx0RmlsdGVySWQsXHJcbiAgICAgIERlZmF1bHRWaWV3SWQ6IG1vZGVsLmRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvKTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRGaWx0ZXJJZDogZHRvLkRlZmF1bHRGaWx0ZXJJZCxcclxuICAgICAgZGVmYXVsdFZpZXdJZDogZHRvLkRlZmF1bHRWaWV3SWRcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gZ2V0U3VtbWFyeUNvbHVtbihjb2x1bW5zOiBBcnJheTx7IHZpc2libGVJbmRleDogbnVtYmVyLCB2aXNpYmxlOiBib29sZWFuLCBkYXRhRmllbGQ6IHN0cmluZyB9PiB8XHJcbiAgUmVhZG9ubHlBcnJheTxQaWNrPERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiwgJ3Zpc2libGVJbmRleCcgfCAndmlzaWJsZScgfCAnZGF0YUZpZWxkJz4+KSB7XHJcbiAgbGV0IGNvbHVtbkZvclN1bW1hcnkgPSAnJztcclxuXHJcbiAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcclxuICBjb25zdCBjb2x1bW5zV2l0aEluZGV4ID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAhPT0gbnVsbCAmJiBjLnZpc2libGVJbmRleCAhPT0gdm9pZCAwKTtcclxuXHJcbiAgaWYgKCEhY29sdW1uc1dpdGhJbmRleC5sZW5ndGgpIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSBjb2x1bW5zV2l0aEluZGV4LnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpWzBdLmRhdGFGaWVsZDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29sdW1uRm9yU3VtbWFyeSA9ICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvbHVtbkZvclN1bW1hcnk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQsIElGaWxlSW1wb3J0ZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZERpc3BsYXlzTWFuYWdlciwgSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciwgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9HcmlkVmlld3NNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNNYW5hZ2VyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfSBmcm9tICcuL011bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luJztcclxuaW1wb3J0IHsgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLCBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcic7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlLCBJRGlzcGxheVR5cGVTZXR0aW5ncywgSUljb25zQ29sdW1uRWRpdG9ySXRlbSB9IGZyb20gJy4vQ29udHJvbENvbmZpZ3VyYXRvcic7XHJcbmltcG9ydCB7IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSwgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4uL0dyaWQvQ3JlYXRlRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcclxuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGdldFN1bW1hcnlDb2x1bW4gfSBmcm9tICcuL0dyaWRTdW1tYXJ5SGVscGVyJztcclxuaW1wb3J0IHsgQ2RtSW1wb3J0RmlsZU1vZGUgfSBmcm9tICcuLi8uLi9CdXNpbmVzcyc7XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb24ge1xyXG4gIFBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zO1xyXG4gIE5hbWU6IHN0cmluZztcclxuICBUeXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ29iamVjdCcgfCAnZGF0ZScgfCAnZGF0ZXRpbWUnO1xyXG4gIExhYmVsOiBzdHJpbmc7XHJcbiAgT3JkZXI6IG51bWJlcjtcclxuICBUb29sVGlwOiBzdHJpbmc7XHJcbiAgSXNEZWZhdWx0Vmlld0ZpZWxkOiBib29sZWFuO1xyXG4gIElzS2V5Q29sdW1uOiBib29sZWFuO1xyXG4gIEdyb3VwRmllbGQ6IHN0cmluZztcclxuICBEaXNwbGF5VHlwZTogc3RyaW5nO1xyXG4gIFdpZHRoPzogbnVtYmVyO1xyXG4gIEhpZGluZ09yZGVyPzogbnVtYmVyO1xyXG4gIENvbHVtbnM/OiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2Uge1xyXG4gIEZpZWxkc0NvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW107XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsVmlld3M6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVGaWx0ZXJzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZVZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZURpc3BsYXlzOiBib29sZWFuO1xyXG4gIENhbkFwcGxheURpc3BsYXlzOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogb2ZmICovXHJcbi8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbmNvbnN0IGVudW0gQ29udHJvbFJvbGVQZXJtaXNzaW9ucyB7XHJcbiAgTm9uZSA9IDAsXHJcbiAgUmVhZCA9IDEgPDwgMCxcclxuICBDcmVhdGUgPSAxIDw8IDEsXHJcbiAgVXBkYXRlID0gMSA8PCAyLFxyXG4gIERlbGV0ZSA9IDEgPDwgMyxcclxufVxyXG4vKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xyXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBsb2FkRGF0YVVybDogc3RyaW5nO1xyXG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkVmlld3NNYW5hZ2VyT3B0aW9uczogSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gIGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBpbXBvcnRGaWxlT3B0aW9ucz86IElGaWxlSW1wb3J0ZXJPcHRpb25zO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udHJvbERpc3BsYXkge1xyXG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwb3J0RmlsZU5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ29uZmlnVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sTG9nc1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zOiBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9uczogSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG1haW5HcmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudDogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50OiBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIG11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucykge1xyXG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xyXG4gICAgdGhpcy5pc1N0YW5kYWxvbmVQYWdlID0gb3B0aW9ucy5pc1N0YW5kYWxvbmVQYWdlO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICAgIHRoaXMuZXhwb3J0RmlsZU5hbWUgPSBvcHRpb25zLmV4cG9ydEZpbGVOYW1lO1xyXG4gICAgdGhpcy51c2VyTmFtZSA9IG9wdGlvbnMudXNlck5hbWU7XHJcbiAgICB0aGlzLnVzZXJDb25maWdVcmwgPSBvcHRpb25zLnVzZXJDb25maWdVcmw7XHJcbiAgICB0aGlzLmNvbnRyb2xMb2dzVXJsID0gb3B0aW9ucy5jb250cm9sTG9nc1VybDtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMucmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnMgPSBvcHRpb25zLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xyXG4gICAgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucyA9IG9wdGlvbnMuaW1wb3J0RmlsZU9wdGlvbnM7XHJcblxyXG4gICAgdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKFsnYXBzLWdyaWQnLCAnY29udHJvbC1kaXNwbGF5LWdyaWQnXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVuZGVyKCkge1xyXG4gICAgc2VuZFJlcXVlc3Q8SVVzZXJDb25maWd1cmF0aW9uUmVzcG9uc2U+KHRoaXMudXNlckNvbmZpZ1VybClcclxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyaWRGaWx0ZXJzTWFuYWdlciA9IG5ldyBHcmlkRmlsdGVyc01hbmFnZXIodGhpcy5ncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBncmlkVmlld3NNYW5hZ2VyID0gbmV3IEdyaWRWaWV3c01hbmFnZXIodGhpcy5ncmlkVmlld3NNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZERpc3BsYXlzTWFuYWdlciA9IG5ldyBHcmlkRGlzcGxheXNNYW5hZ2VyKHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLm1haW5HcmlkID0gdGhpcy5jcmVhdGVNYWluR3JpZChyZXMuRmllbGRzQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbkNyZWF0ZURpc3BsYXlzID0gcmVzLkNhbkNyZWF0ZURpc3BsYXlzICYmIHJlcy5DYW5DcmVhdGVWaWV3cyAmJiByZXMuQ2FuQ3JlYXRlRmlsdGVycztcclxuXHJcbiAgICAgICAgaWYgKGNhbkNyZWF0ZURpc3BsYXlzIHx8IHJlcy5DYW5BcHBsYXlEaXNwbGF5cykge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgICAgZWRpdE1vZGU6IGNhbkNyZWF0ZURpc3BsYXlzLFxyXG4gICAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGdyaWREaXNwbGF5c01hbmFnZXIsXHJcbiAgICAgICAgICAgIGltcG9ydEZpbGVPcHRpb25zOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25WaWV3QXBwbGllZDogdGhpcy5vblZpZXdBcHBsaWVkLFxyXG4gICAgICAgICAgb25WaWV3RGVsZXRlZDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRWaWV3c01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxWaWV3czogcmVzLkNhbkNyZWF0ZUdsb2JhbFZpZXdzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZVZpZXdzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50ID0gbmV3IEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBhcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXI6IG5ldyBSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIoe1xyXG4gICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlck5hbWUsXHJcbiAgICAgICAgICAgIGxvYWREYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLmxvYWREYXRhVXJsLFxyXG4gICAgICAgICAgICB1cGRhdGVEYXRhVXJsOiB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zLnVwZGF0ZURhdGFVcmxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICBvbkZpbHRlckRlbGV0ZWQ6IGFzeW5jIChmaWx0ZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCBncmlkRGlzcGxheXNNYW5hZ2VyLmxvYWREaXNwbGF5cygpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGF1dG9JbnRlZ3JhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGdyaWRGaWx0ZXJzTWFuYWdlcixcclxuICAgICAgICAgIGNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IHJlcy5DYW5DcmVhdGVHbG9iYWxGaWx0ZXJzLFxyXG4gICAgICAgICAgdmlzaWJsZTogcmVzLkNhbkNyZWF0ZUZpbHRlcnNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbiA9IG5ldyBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbih7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLm9uRGlzcGxheUNoYW5nZWQgPSBhc3luYyAoZGlzcGxheSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRpc3BsYXkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIoZGlzcGxheS5GaWx0ZXJJZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoZGlzcGxheS5WaWV3SWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQuYXBwbHlGaWx0ZXIodm9pZCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50LmFwcGx5VmlldyhHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyogdHNsaW50OmRpc2FibGU6IG5vLWJpdHdpc2UgKi9cclxuICBwcml2YXRlIGhhc1Blcm1pc3NvbihydWxlcywgcGVybWlzc29uKSB7XHJcbiAgICByZXR1cm4gcnVsZXMgJiBwZXJtaXNzb247XHJcbiAgfVxyXG4gIC8qIHRzbGludDplbmFibGU6IG5vLWJpdHdpc2UgKi9cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFRyZWUoY29sdW1ucykge1xyXG4gICAgY29uc3QgZ3JvdXBQcmVmaXggPSAnX19HUk9VUF9fJztcclxuXHJcbiAgICBsZXQgY29sdW1uc01hcCA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2x1bW4uQ29sdW1ucyA9IFtdO1xyXG4gICAgICBjb2x1bW4uR3JvdXBGaWVsZCA9IGNvbHVtbi5Hcm91cEZpZWxkXHJcbiAgICAgICAgPyBgJHtncm91cFByZWZpeH0ke2NvbHVtbi5Hcm91cEZpZWxkfWBcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGFjY1tjb2x1bW4uTmFtZV0gPSBjb2x1bW47XHJcblxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwge30pO1xyXG5cclxuICAgIGNvbHVtbnNNYXAgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLkdyb3VwRmllbGQpXHJcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXHJcbiAgICAgIC5yZWR1Y2UoKGFjYywgZ3JvdXBGaWVsZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBncm91cEZpZWxkLnJlcGxhY2UoZ3JvdXBQcmVmaXgsICcnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB7XHJcbiAgICAgICAgICBOYW1lOiBncm91cEZpZWxkLFxyXG4gICAgICAgICAgTGFiZWw6IGNvbHVtbk5hbWUsXHJcbiAgICAgICAgICBDb2x1bW5zOiBbXSxcclxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOiBtYXgtbGluZS1sZW5ndGggKi9cclxuICAgICAgICAgIEdyb3VwRmllbGQ6IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0gJiYgY29sdW1uc01hcFtjb2x1bW5OYW1lXS5Hcm91cEZpZWxkICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAhPT0gZ3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA/IGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBhY2NbZ3JvdXBGaWVsZF0gPSBncm91cENvbHVtbjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwgY29sdW1uc01hcCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIGluIGNvbHVtbnNNYXApIHtcclxuICAgICAgaWYgKGNvbHVtbnNNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uTmFtZSkpIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uLkdyb3VwRmllbGQpIHtcclxuICAgICAgICAgIGNvbHVtbnNNYXBbY29sdW1uLkdyb3VwRmllbGRdLkNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRpc3BsYXlUeXBlKHNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncywgY29sdW1uOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sIHBlcm1pc3Npb25zOiBDb250cm9sUm9sZVBlcm1pc3Npb25zKSB7XHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgY29sdW1uLmNlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyhvcHRpb25zLnZhbHVlKTtcclxuICAgICAgICBjb25zdCBjZWxsU2V0dGluZ3MgPSBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IFN0cmluZyhpdGVtLnZhbHVlKSA9PT0gc3RyaW5nVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY2VsbFNldHRpbmdzKSB7XHJcbiAgICAgICAgICAkKCc8ZGl2PicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIGNlbGxTZXR0aW5ncy50aXRsZSlcclxuICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjZWxsU2V0dGluZ3MuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgLnRleHQob3B0aW9ucy52YWx1ZSlcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiAndGl0bGUnLFxyXG4gICAgICAgICAgaXRlbVRlbXBsYXRlOiAoZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmNzcyh7ICd0ZXh0LWFsaWduJzogJ2NlbnRlcicgfSlcclxuICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBkYXRhLnRpdGxlKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogZGF0YS5pbWFnZSB9KSlcclxuICAgICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgZmllbGRUZW1wbGF0ZTogKGRhdGEsIGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBwYXJzZUludChpdGVtLnZhbHVlKSA9PT0gY2VsbEluZm8udmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCAkaXRlbU5hbWUgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2l0ZW0tbmFtZScpO1xyXG4gICAgICAgICAgICBjb25zdCAkcmVzdWx0ID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgICAgLmFkZENsYXNzKCdhcHMtaWNvbi1lZGl0b3JfX2N1c3RvbS1pdGVtJylcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0uaW1hZ2UgOiAnJyB9KS5hdHRyKCd0aXRsZScsIGN1cnJlbnRJdGVtID8gY3VycmVudEl0ZW0udGl0bGUgOiAnJykpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkaXRlbU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgJGl0ZW1OYW1lXHJcbiAgICAgICAgICAgICAgLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZWwuYXBwZW5kKCRyZXN1bHQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSwgY29tcG9uZW50IH0pID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUocGFyc2VJbnQodmFsdWUudmFsdWUpKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogKGNlbGxJbmZvLnZhbHVlICE9PSBudWxsICYmIGNlbGxJbmZvICE9PSB2b2lkIDApICYmIGNlbGxJbmZvLnZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW06IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKVxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4uYWxsb3dTZWFyY2ggPSBmYWxzZTtcclxuICAgICAgY29sdW1uLmFsbG93RmlsdGVyaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0hlYWRlckZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMpIHtcclxuICAgICAgY29sdW1uLmVkaXRDZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBjZWxsSW5mbykgPT4ge1xyXG4gICAgICAgICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZXR0aW5ncy5kYXRhLm1hcCgoaSkgPT4gaS52YWx1ZSkuc29ydCgpLFxyXG4gICAgICAgICAgYWNjZXB0Q3VzdG9tVmFsdWU6IHRydWUsXHJcbiAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHZhbHVlIHx8ICcnKTtcclxuICAgICAgICAgICAgY29tcG9uZW50LmJsdXIoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhDaGVja0JveCh7XHJcbiAgICAgICAgICB2YWx1ZTogY2VsbEluZm8udmFsdWUgfHwgZmFsc2UsXHJcbiAgICAgICAgICByZWFkT25seTogIXRoaXMuaGFzUGVybWlzc29uKHBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSksXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcclxuICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNlbGxWYWx1ZShjZWxsSW5mby5yb3dJbmRleCwgY2VsbEluZm8uY29sdW1uLmRhdGFGaWVsZCwgZS52YWx1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbihjb2x1bW5Db25maWc6IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uIHtcclxuICAgIGNvbnN0IHRpdGxlID0gY29sdW1uQ29uZmlnLkxhYmVsIHx8IGNvbHVtbkNvbmZpZy5OYW1lO1xyXG4gICAgY29uc3QgdG9vbHRpcCA9IGNvbHVtbkNvbmZpZy5Ub29sVGlwIHx8IHRpdGxlO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uID0gIWNvbHVtbkNvbmZpZy5Db2x1bW5zLmxlbmd0aFxyXG4gICAgICA/IHtcclxuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbkNvbmZpZy5OYW1lLFxyXG4gICAgICAgIGRhdGFUeXBlOiBjb2x1bW5Db25maWcuVHlwZSxcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0aXRsZSwgdG9vbHRpcCksXHJcbiAgICAgICAgdmlzaWJsZTogY29sdW1uQ29uZmlnLklzRGVmYXVsdFZpZXdGaWVsZCxcclxuICAgICAgICB2aXNpYmxlSW5kZXg6IGNvbHVtbkNvbmZpZy5PcmRlcixcclxuICAgICAgICBhbGxvd0ZpeGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dFZGl0aW5nOiAhIXRoaXMuaGFzUGVybWlzc29uKGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgIHdpZHRoOiBjb2x1bW5Db25maWcuV2lkdGgsXHJcbiAgICAgICAgaGlkaW5nUHJpb3JpdHk6IGNvbHVtbkNvbmZpZy5IaWRpbmdPcmRlclxyXG4gICAgICB9IDoge1xyXG4gICAgICAgIGNhcHRpb246IHRpdGxlLFxyXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbkNvbmZpZy5Db2x1bW5zLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpXHJcbiAgICAgIH07XHJcblxyXG4gICAgaWYgKGNvbHVtbkNvbmZpZy5EaXNwbGF5VHlwZSkge1xyXG4gICAgICBjb25zdCBkaXNwbGF5U2V0dGluZ3M6IElEaXNwbGF5VHlwZVNldHRpbmdzID0gSlNPTi5wYXJzZShjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpO1xyXG5cclxuICAgICAgaWYgKGRpc3BsYXlTZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5JY29ucykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZGlzcGxheVNldHRpbmdzLmRhdGEubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgdGV4dDogaXRlbS50aXRsZSxcclxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICAgICAgdGV4dDogJ0JsYW5rJyxcclxuICAgICAgICAgIHZhbHVlOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5oZWFkZXJGaWx0ZXIgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBpdGVtc1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheVR5cGUoZGlzcGxheVNldHRpbmdzLCBjb2x1bW4sIGNvbHVtbkNvbmZpZy5QZXJtaXNzaW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1ucyhjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5maWx0ZXIoXHJcbiAgICAgIChjKSA9PiB0aGlzLmhhc1Blcm1pc3NvbihjLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlJlYWQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbmZpZ3VyYXRpb24gPSB0aGlzLmJ1aWxkVHJlZShjb25maWd1cmF0aW9uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb25maWd1cmF0aW9uLm1hcCgoYykgPT4gdGhpcy5jb25maWd1cmVDb2x1bW4oYykpO1xyXG5cclxuICAgIHJldHVybiBjb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVNYWluR3JpZChjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKSB7XHJcbiAgICBjb25zdCBoYXNLZXlzID0gY29uZmlndXJhdGlvbi5zb21lKChjKSA9PiBjLklzS2V5Q29sdW1uKTtcclxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgY29uc3QgY29sdW1uRm9yU3VtbWFyeSA9IGdldFN1bW1hcnlDb2x1bW4oY29sdW1ucyk7XHJcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoY29uZmlndXJhdGlvbiksXHJcbiAgICAgIGNvbHVtblJlc2l6aW5nTW9kZTogJ3dpZGdldCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiBoYXNLZXlzLFxyXG4gICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcclxuICAgICAgICBhbGxvd0RlbGV0aW5nOiBmYWxzZSxcclxuICAgICAgICBtb2RlOiAnYmF0Y2gnXHJcbiAgICAgIH0sXHJcbiAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAndmlydHVhbCcsIHByZWxvYWRFbmFibGVkOiB0cnVlIH0sXHJcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXHJcbiAgICAgIHBhZ2VyOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcbiAgICAgIGhlaWdodDogdGhpcy5pc1N0YW5kYWxvbmVQYWdlID8gdW5kZWZpbmVkIDogJzEwMCUnLFxyXG4gICAgICBjb2x1bW5DaG9vc2VyOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBtb2RlOiAnZHJhZ0FuZERyb3AnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkZpeGluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZmlsdGVyUGFuZWw6IHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHRleHRzOiB7XHJcbiAgICAgICAgICBjcmVhdGVGaWx0ZXI6ICdOb25lJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHN1bW1hcnk6IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbeyBzdW1tYXJ5VHlwZTogJ2NvdW50JywgY29sdW1uOiBjb2x1bW5Gb3JTdW1tYXJ5IH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIGNvbHVtbkhpZGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgY29sdW1ucyxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0cnVlLFxyXG4gICAgICBncm91cGluZzoge1xyXG4gICAgICAgIGNvbnRleHRNZW51RW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBtYXN0ZXJEZXRhaWw6ICFoYXNLZXlzID8gdW5kZWZpbmVkIDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdGVtcGxhdGU6IChjb250YWluZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleXMgPSB7fTtcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZmlsdGVyKChjKSA9PiBjLklzS2V5Q29sdW1uKS5mb3JFYWNoKChjKSA9PiBrZXlzW2MuTmFtZV0gPSBvcHRpb25zLmRhdGFbYy5OYW1lXSk7XHJcblxyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZToge1xyXG4gICAgICAgICAgICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICAgICAgICAgIGxvYWRVcmw6IGAke3RoaXMuY29udHJvbExvZ3NVcmx9P2tleT0ke0pTT04uc3RyaW5naWZ5KGtleXMpfWAsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogW3tcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXInLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMFxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ0NyZWF0ZWRBdCcsXHJcbiAgICAgICAgICAgICAgICBjYXB0aW9uOiAnRGF0ZScsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnc2hvcnREYXRlU2hvcnRUaW1lJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDaGFuZ2VzJyxcclxuICAgICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogKGMsIG8pID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IG8uZGF0YS5DaGFuZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2cnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fZmllbGQnPiR7aXRlbS5GaWVsZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19vbGQtdmFsdWUnPiR7aXRlbS5PbGRWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX25ldy12YWx1ZSc+JHtpdGVtLk5ld1ZhbHVlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9J2Fwcy1jb250cm9sLWxvZ3MnPiR7Y29udGVudH08L2Rpdj5gKS5hcHBlbmRUbyhjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ29udGVudFJlYWR5OiAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJlcGFyZUZpbHRlclBhbmVsKGUuY29tcG9uZW50KTtcclxuICAgICAgfSxcclxuICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgIGlmICghZmllbGRDb25maWcpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc2FibGVFZGl0aW5nID0gIXRoaXMuaGFzUGVybWlzc29uKGZpZWxkQ29uZmlnLlBlcm1pc3Npb25zLCBDb250cm9sUm9sZVBlcm1pc3Npb25zLlVwZGF0ZSk7XHJcblxyXG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucy5yZWFkT25seSA9IGRpc2FibGVFZGl0aW5nO1xyXG5cclxuICAgICAgICBpZiAoIWRpc2FibGVFZGl0aW5nICYmIGZpZWxkQ29uZmlnLlR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlU2V0VmFsdWUgPSBlLnNldFZhbHVlO1xyXG5cclxuICAgICAgICAgIChlIGFzIGFueSkuc2V0VmFsdWUgPSAobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBiYXNlU2V0VmFsdWUobmV3VmFsdWUudHJpbSgpKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcclxuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gY29uZmlndXJhdGlvbi5maW5kKChjKSA9PiBjLk5hbWUgPT09IGUuY29sdW1uLmRhdGFGaWVsZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnICYmICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpKSB7XHJcbiAgICAgICAgICAgICQoZS5jZWxsRWxlbWVudCkuYWRkQ2xhc3MoJ2Fwcy1ncmlkX19kaXNhYmxlZC1jZWxsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvblJvd0V4cGFuZGVkOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbFJvd0luZGV4ID0gZS5jb21wb25lbnQuZ2V0Um93SW5kZXhCeUtleShlLmtleSkgKyAxO1xyXG4gICAgICAgIGNvbnN0ICRkZXRhaWxDZWxsID0gZS5jb21wb25lbnQuZ2V0Q2VsbEVsZW1lbnQoZGV0YWlsUm93SW5kZXgsIDApLnBhcmVudCgpLmZpbmQoJy5keC1tYXN0ZXItZGV0YWlsLWNlbGwnKTtcclxuICAgICAgICBjb25zdCBkYXRhR3JpZCA9ICRkZXRhaWxDZWxsLmZpbmQoJy5keC1kYXRhZ3JpZCcpLmZpcnN0KCkucGFyZW50KCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcclxuXHJcbiAgICAgICAgZGF0YUdyaWQucmVmcmVzaCgpO1xyXG4gICAgICB9LFxyXG4gICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zO1xyXG5cclxuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXHJcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc1N0YW5kYWxvbmVQYWdlLFxyXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IHRydWUsXHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiB0aGlzLmV4cG9ydEZpbGVOYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXHJcbiAgICAgIGRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uOiB0cnVlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb246IElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uW10pOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RvcmU6IGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAga2V5OiBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikubWFwKChjKSA9PiBjLk5hbWUpLFxyXG4gICAgICAgIGxvYWRVcmw6IHRoaXMubG9hZERhdGFVcmwsXHJcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmxcclxuICAgICAgfSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQgPSAodmlld0lkOiBudW1iZXIpID0+IHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUZpbHRlclBhbmVsKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsRWxlbWVudCA9IGdyaWQuZWxlbWVudCgpXHJcbiAgICAgIC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsJyk7XHJcbiAgICBjb25zdCAkZmlsdGVySWNvbkZpbHRlciA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWljb24tZmlsdGVyJyk7XHJcbiAgICBjb25zdCAkZmlsdGVyUGFuZWxUZXh0ID0gJGZpbHRlclBhbmVsRWxlbWVudC5maW5kKCcuZHgtZGF0YWdyaWQtZmlsdGVyLXBhbmVsLXRleHQnKTtcclxuXHJcbiAgICAkZmlsdGVySWNvbkZpbHRlci5vZmYoJ2NsaWNrJyk7XHJcbiAgICAkZmlsdGVyUGFuZWxUZXh0Lm9mZignY2xpY2snKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFJvd3NDb3VudFN1bW1hcnkoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XHJcbiAgICBjb25zdCBmaXJzdFZpc2libGVEYXRhQ29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmQoKGMpID0+ICEhYy5kYXRhRmllbGQpO1xyXG4gICAgaWYgKCFmaXJzdFZpc2libGVEYXRhQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5TmFtZSA9ICdSb3dzQ291bnQnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHRvdGFsSXRlbXM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSA9IChncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXNbJ3N1bW1hcnknXVsndG90YWxJdGVtcyddICkgfHwgW107XHJcbiAgICBjb25zdCByb3dzQ291bnRTdW1tYXJ5SXRlbSA9IHRvdGFsSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtLm5hbWUgPT09IHJvd3NDb3VudFN1bW1hcnlOYW1lKTtcclxuICAgIGlmIChyb3dzQ291bnRTdW1tYXJ5SXRlbSAmJiByb3dzQ291bnRTdW1tYXJ5SXRlbS5jb2x1bW4gPT09IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0pIHtcclxuICAgICAgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID0gZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b3RhbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHJvd3NDb3VudFN1bW1hcnlOYW1lLFxyXG4gICAgICAgIGNvbHVtbjogZmlyc3RWaXNpYmxlRGF0YUNvbHVtbi5kYXRhRmllbGQsXHJcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCcsXHJcbiAgICAgICAgYWxpZ25tZW50OiAnbGVmdCcsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFpbkdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnLCB0b3RhbEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8vIE5PVEU6IFdvcmthcm91bmQuIFRoZSBncmlkIGNhbid0IGNsZWFyIHRoZSBmaWx0ZXIgcm93LCBzbyB3ZSBjbGVhciB0aGF0IG1hbnVhbGx5XHJcbiAgcHJpdmF0ZSBjbGVhckZpbHRlclJvd0FmdGVyVmlld1N3aXRjaGluZygpIHtcclxuICAgIGNvbnN0IGNsZWFySGVhZGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzOiB7IFt2aXNpYmxlSW5kZXg6IG51bWJlcl06IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB9ID0ge307XHJcblxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkVmlld3NUb29sYmFyQ29tcG9uZW50Lm9wdGlvbnMuZ3JpZFN0YXRlTWFuYWdlci5jdXJyZW50U2F2ZWRHcmlkU3RhdGUuY29sdW1uc1xyXG4gICAgICAgIHx8IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcclxuXHJcbiAgICAgIGNvbHVtbnNcclxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnZpc2libGVJbmRleCAmJiAoYy5maWx0ZXJWYWx1ZSB8fCBjLmZpbHRlclZhbHVlcykpXHJcbiAgICAgICAgLmZvckVhY2goKGMpID0+IGNvbHVtbnNXaXRoRmlsdGVyZWRWYWx1ZXNbYy52aXNpYmxlSW5kZXhdID0gYyk7XHJcblxyXG4gICAgICAkKCd0ZCBbYXJpYS1sYWJlbCo9XCJGaWx0ZXIgY2VsbFwiXScpXHJcbiAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+ICFjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2luZGV4XSlcclxuICAgICAgICAudmFsKCcnKTtcclxuICAgICAgdGhpcy5tYWluR3JpZC5vZmYoJ2NvbnRlbnRSZWFkeScsIGNsZWFySGVhZGVyKTtcclxuICAgIH07XHJcbiAgICB0aGlzLm1haW5HcmlkLm9uKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHREYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkLCBJR3JpZEFkZGl0aW9uYWxPcHRpb25zIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5cclxuaW50ZXJmYWNlIElBcHBVc2VyIHtcclxuICBJZDogc3RyaW5nO1xyXG4gIFVzZXJOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJRGlzcGxheSB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnQge1xyXG4gIERpc3BsYXlJZDogbnVtYmVyO1xyXG4gIFVzZXJJZDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdyaWRDb2x1bW4ge1xyXG4gIElkOiBzdHJpbmc7XHJcbiAgQ2FwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUFQU0NvbnRyb2xEaXNwbGF5QXNzaWdubWVudHNEYXRhIHtcclxuICBVc2VyczogSUFwcFVzZXJbXTtcclxuICBEaXNwbGF5czogSURpc3BsYXlbXTtcclxuICBBc3NpZ25tZW50czogSUNvbnRyb2xEaXNwbGF5c1VzZXJBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaXNwbGF5TWFuYWdlciB7XHJcbiAgcHVibGljIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xyXG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xyXG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICBsZXQgY29sdW1uczogSUdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGxvYWREYXRhUHJvbWlzZSA9IHNlbmRSZXF1ZXN0PElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YT4odGhpcy5sb2FkRGF0YVVybCwgJ2dldCcpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb2x1bW5zID0gcmVzLkRpc3BsYXlzLm1hcCgoZCkgPT4gKHsgSWQ6IGQuSWQudG9TdHJpbmcoKSwgQ2FwdGlvbjogZC5OYW1lIH0pKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcmVzLlVzZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0geyBVc2VyTmFtZTogdXNlci5Vc2VyTmFtZSwgVXNlcklkOiB1c2VyLklkIH07XHJcbiAgICAgICAgICBjb25zdCB1c2VyQXNzaWdubWVudHMgPSByZXMuQXNzaWdubWVudHMuZmlsdGVyKChhKSA9PiBhLlVzZXJJZCA9PT0gdXNlci5JZCk7XHJcblxyXG4gICAgICAgICAgdXNlckFzc2lnbm1lbnRzLmZvckVhY2goKGFzc2lnbm1lbnQpID0+IHtcclxuICAgICAgICAgICAgaXRlbVthc3NpZ25tZW50LkRpc3BsYXlJZF0gPSB0cnVlO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgZGF0YS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSBbXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJOYW1lJywgd2lkdGg6IDMwMCwgZml4ZWQ6IHRydWUsIGZpeGVkUG9zaXRpb246ICdsZWZ0JywgYWxsb3dFZGl0aW5nOiBmYWxzZSB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6ICdVc2VySWQnLCB2aXNpYmxlOiBmYWxzZSB9XHJcbiAgICAgICAgXSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICAgIGdyaWQub3B0aW9uKCdjb2x1bW5zJywgZ3JpZENvbHVtbnMuY29uY2F0KGNvbHVtbnMubWFwKChjb2wpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogY29sLklkLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiBjb2wuQ2FwdGlvbixcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgY2FsY3VsYXRlQ2VsbFZhbHVlOiAocm93RGF0YSkgPT4gISFyb3dEYXRhW2NvbC5JZF1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdhcHMtZGlzcGxheS1tYW5hZ2VyJ30sXHJcbiAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICBzdG9yZTogbmV3IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICBrZXk6ICdVc2VySWQnLFxyXG4gICAgICAgICAgbG9hZE1vZGU6ICdyYXcnLFxyXG4gICAgICAgICAgbG9hZDogKCkgPT4gbG9hZERhdGFQcm9taXNlLFxyXG4gICAgICAgICAgdXBkYXRlOiAoa2V5LCB2YWx1ZXM6IHsgW2Rpc3BsYXlJZDogbnVtYmVyXTogYm9vbGVhbiB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0b0FkZDogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdGhlcmVJc0N1cnJlbnRVcGRhdGluZyA9IHVwZGF0aW5nSXNJblByb2dyZXNzO1xyXG5cclxuICAgICAgICAgICAgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheUlkcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XHJcblxyXG4gICAgICAgICAgICBkaXNwbGF5SWRzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2gocGFyc2VJbnQoaWQpKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUucHVzaChwYXJzZUludChpZCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBOT1RFOiBub3RpZnkgYWJvdXQgc3VjY2Vzc2Z1bCByZXF1ZXN0IG9ubHkgZm9yIHRoZSBmaXJzdCByZXF1ZXN0IGluIHRoZSBxdWV1ZVxyXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7IH0sIDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMudXBkYXRlRGF0YVVybCwgJ3B1dCcsIHtcclxuICAgICAgICAgICAgICB1c2VySWQ6IGtleSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvUmVtb3ZlOiB0b1JlbW92ZSxcclxuICAgICAgICAgICAgICBkaXNwbGF5c1RvQWRkOiB0b0FkZFxyXG4gICAgICAgICAgICB9LCAhdGhlcmVJc0N1cnJlbnRVcGRhdGluZykucHJvbWlzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICBzZWxlY3Rpb246IHtcclxuICAgICAgICBtb2RlOiAnbm9uZSdcclxuICAgICAgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxyXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcclxuICAgICAgICByZWZyZXNoTW9kZTogJ3JlcGFpbnQnXHJcbiAgICAgIH1cclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXM7XHJcblxyXG4gICAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XHJcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiAnRGlzcGxheU1hbmFnZW1lbnQnLFxyXG4gICAgICBzdW1tYXJ5Q29sdW1uOiAnVXNlck5hbWUnXHJcbiAgICB9IGFzIElHcmlkQWRkaXRpb25hbE9wdGlvbnM7XHJcblxyXG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcclxuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcclxuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcclxuICAgICAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcclxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBpbmdSZXN1bHQge1xyXG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucyB7XHJcbiAgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xyXG4gIGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XHJcbiAgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBsb2dvdXRVcmw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RpZmllciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uRXhwaXJlVGltZU1zOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ291dFVybDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHdhdGluZ1RpbWVvdXRJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgY291bnRlckludGVydmFsSWQ6IG51bWJlcjtcclxuICBwcml2YXRlIHBpbmdJbnRlcnZhbElkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBleHBpcmF0aW9uVGltZTogRGF0ZTtcclxuICBwcml2YXRlICR0ZXh0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSBjb250aW51ZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XHJcbiAgcHJpdmF0ZSBva0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIGxvZ291dEJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuXHJcbiAgcHJpdmF0ZSBfcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcclxuICBwcml2YXRlIGdldCBwb3B1cCgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAge1xyXG4gICAgaWYgKCF0aGlzLl9wb3B1cCkge1xyXG4gICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fcG9wdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zID0gb3B0aW9ucy5zZXNzaW9uRXhwaXJlVGltZU1zO1xyXG4gICAgdGhpcy5kaXNwbGF5RHVyYXRpb25NcyA9IG9wdGlvbnMuZGlzcGxheUR1cmF0aW9uTXM7XHJcbiAgICB0aGlzLnNlc3Npb25QaW5nVXJsID0gb3B0aW9ucy5zZXNzaW9uUGluZ1VybDtcclxuICAgIHRoaXMubG9nb3V0VXJsID0gb3B0aW9ucy5sb2dvdXRVcmw7XHJcblxyXG4gICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUgPSB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZS5iaW5kKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy5wb3B1cD8uaGlkZSgpO1xyXG5cclxuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSB0aGlzLmdldEV4cGlyYXRpb25UaW1lKCk7XHJcblxyXG4gICAgdGhpcy53YXRpbmdUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbigpO1xyXG4gICAgfSwgTWF0aC5tYXgodGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zIC0gdGhpcy5kaXNwbGF5RHVyYXRpb25NcywgMCkpO1xyXG5cclxuICAgIHRoaXMucGluZ0ludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpO1xyXG4gICAgfSwgNjAgKiAxMDAwKTtcclxuXHJcbiAgICAkKGRvY3VtZW50KS5vbigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dOb3RpZmljYXRpb24oKSB7XHJcbiAgICB0aGlzLnBvcHVwPy5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5jbGVhclRpbWVvdXRzQW5kSW50ZXJ2YWxzKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcclxuICAgIHRoaXMuY291bnRlckludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvcHVwQ29udGVudCgpO1xyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKSB7XHJcbiAgICBpZiAodGhpcy53YXRpbmdUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2F0aW5nVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGVySW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG4gICAgfVxyXG5cclxuICAgICQoZG9jdW1lbnQpLm9mZigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXhwaXJhdGlvblRpbWUoKTogRGF0ZSB7XHJcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBleHBpcmF0aW9uVGltZS5zZXRNaWxsaXNlY29uZHMoZXhwaXJhdGlvblRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkgKyB0aGlzLnNlc3Npb25FeHBpcmVUaW1lTXMpO1xyXG5cclxuICAgIHJldHVybiBleHBpcmF0aW9uVGltZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcclxuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhQb3B1cCh7XHJcbiAgICAgIHRpdGxlOiAnU2Vzc2lvbiBFeHBpcmluZycsXHJcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICByZXNpemVFbmFibGVkOiBmYWxzZSxcclxuICAgICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSxcclxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBtYXhIZWlnaHQ6IDE5MCxcclxuICAgICAgbWF4V2lkdGg6IDM3MCxcclxuICAgICAgdmlzaWJsZTogZmFsc2UsXHJcbiAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIgPSAkKCc8c3BhbiAvPicpO1xyXG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XHJcbiAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5hcHBlbmQodGhpcy4kdGV4dENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHJldHVybiAkY29udGFpbmVyO1xyXG4gICAgICB9LFxyXG4gICAgICB0b29sYmFySXRlbXM6IFt7XHJcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxyXG4gICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICB0ZXh0OiAnQ29udGludWUgc2Vzc2lvbicsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5jb250aW51ZXJCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2Vzc2lvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXHJcbiAgICAgIH0sIHtcclxuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXHJcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHRleHQ6ICdSZWxvYWQgcGFnZScsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5va0J1dHRvbiA9IGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcclxuICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICB0ZXh0OiAnTG9nIE91dCcsXHJcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5sb2dvdXRCdXR0b24gPSBlLmNvbXBvbmVudCxcclxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dPdXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dLFxyXG4gICAgfSkuYXBwZW5kVG8oJChkb2N1bWVudC5ib2R5KSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q291bnRlclRleHQoKTogSlF1ZXJ5IHtcclxuICAgIGNvbnN0IHJlbWFpbmVkU2Vjb25kcyA9IE1hdGgubWF4KHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpLCAwKTtcclxuICAgIGlmIChyZW1haW5lZFNlY29uZHMgPT09IDApIHtcclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykudGV4dCgnWW91ciBzZXNzaW9uIGhhcyBiZWVuIGV4cGlyZWQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0ICRzdGFydFRleHQgPSAkKCc8c3BhbiAvPicpLnRleHQoJ1lvdXIgc2Vzc2lvbiB3aWxsIGV4cGlyZSBpbiAnKTtcclxuICAgICAgY29uc3QgJGNvdW50ZXIgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdzZXNzaW9uLW5vdGlmaWVyX19jb3VudGVyJykudGV4dChyZW1haW5lZFNlY29uZHMudG9GaXhlZCgwKSk7XHJcbiAgICAgIGNvbnN0ICRmaW5pc2hUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCcgc2Vjb25kcycpO1xyXG5cclxuICAgICAgcmV0dXJuICQoJzxzcGFuIC8+JykuYXBwZW5kKCRzdGFydFRleHQsICRjb3VudGVyLCAkZmluaXNoVGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlY29uZHNUb0V4cGlyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5leHBpcmF0aW9uVGltZS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgLyAxMDAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoU2Vzc2lvbigpIHtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwaW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUoKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZW5kUmVxdWVzdDxJUGluZ1Jlc3VsdD4odGhpcy5zZXNzaW9uUGluZ1VybCwgJ0dFVCcsIG51bGwsIGZhbHNlLCB7IG5vdGlmeUVycm9yOiBmYWxzZSB9KS50aGVuKChyZXMpID0+IHtcclxuICAgICAgaWYgKCFyZXMuaXNBdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRFeHBpcmVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBpcmVkKCkge1xyXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oKTtcclxuICAgIGlmICh0aGlzLnBpbmdJbnRlcnZhbElkKSB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvZ091dCgpIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5sb2dvdXRVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBvcHVwQ29udGVudCgpIHtcclxuICAgIGNvbnN0IGlzQWxyZWFkeUV4cGlyZWQgPSB0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSA8PSAwO1xyXG5cclxuICAgIHRoaXMuJHRleHRDb250YWluZXI/Lmh0bWwoJycpLmFwcGVuZCh0aGlzLmdldENvdW50ZXJUZXh0KCkpO1xyXG4gICAgdGhpcy5va0J1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCBpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMuY29udGludWVyQnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICAgIHRoaXMubG9nb3V0QnV0dG9uLm9wdGlvbigndmlzaWJsZScsICFpc0FscmVhZHlFeHBpcmVkKTtcclxuICB9XHJcbn1cclxuIiwgImNvbnN0IEdSSURfSU5ESUNBVE9SX1NUQVRFID0ge1xyXG4gIGVkaXQ6ICdlZGl0JyxcclxuICBzYXZpbmc6ICdzYXZpbmcnLFxyXG4gIHNhdmVkOiAnc2F2ZWQnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHUklEX0lORElDQVRPUl9TVEFURTtcclxuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkRGF0YUxheWVyIH0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XHJcbmltcG9ydCB7IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlLCBJR3JpZFN0YXRlLCBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9JbmRleCc7XHJcblxyXG5pbnRlcmZhY2UgSUxvYWRlZENvbHVtbnMgeyBbZGF0YUZpZWxkOiBzdHJpbmddOiBib29sZWFuOyB9XHJcbmludGVyZmFjZSBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TZXR0aW5ncyB7IFtkYXRhRmllbGQ6IHN0cmluZ106IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlOyB9XHJcbmludGVyZmFjZSBJQ29sdW1uV2lkdGhzIHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogbnVtYmVyIHwgc3RyaW5nOyB9XHJcblxyXG5pbnRlcmZhY2UgSUNvbHVtbkNhcHRpb24ge1xyXG4gIGRhdGFGaWVsZDogc3RyaW5nO1xyXG4gIGNhcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZFN0YXRlTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgcHVibGljIE9VVERBVEVfQ09MVU1OU19GT1VORF9FVkVOVCA9ICdvdXRkYXRlZC1jb2x1bW5zLWZvdW5kLWV2ZW50JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0ZUxvYWRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGVkQ29sdW1uczogSUxvYWRlZENvbHVtbnMgPSB7fTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzID0ge307XHJcblxyXG4gIHByaXZhdGUgbGFzdENvbHVtblNldHRpbmdzU3RyOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRJZDogbnVtYmVyLCBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcikge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICB0aGlzLmlkID0gZ3JpZElkO1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyID0gZ3JpZERhdGFMYXllcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkKGNoZWNrT3V0ZGF0ZWRDb2x1bW5zOiBib29sZWFuLCBvdXRkYXRlZENvbHVtbnNDYWxsYmFjazogKGNvbHVtbnMpID0+IHZvaWQpOiBKUXVlcnlQcm9taXNlPElHcmlkU3RhdGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIuZ2V0R3JpZFZpZXdTZXR0aW5ncyh0aGlzLmlkKVxyXG4gICAgICAudGhlbigoZGF0YTogSUdyaWRTdGF0ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25EYXRhTG9hZGVkKGRhdGEpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tPdXRkYXRlZENvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tDb2x1bW5zUmVsZXZhbmNlKGRhdGEuY29sdW1ucywgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoc3RhdGU6IElHcmlkU3RhdGUsIHNhdmluZ0NhbGxiYWNrPzogKCkgPT4gdm9pZCwgc2F2ZWRDYWxsYmFjaz86ICgpID0+IHZvaWQpOiBJQ29sdW1uV2lkdGhzIHtcclxuICAgIGNvbnN0IGNvbHVtbldpZHRoczogSUNvbHVtbldpZHRocyA9IHt9O1xyXG5cclxuICAgIGlmICghc3RhdGUuY29sdW1ucykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgYWRkU2V0dGluZ3MgPSB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbY29sdW1uLmRhdGFGaWVsZF07XHJcblxyXG4gICAgICBpZiAoYWRkU2V0dGluZ3MpIHtcclxuICAgICAgICBjb2x1bW4uY2FwdGlvbiA9IGFkZFNldHRpbmdzLmNhcHRpb247XHJcbiAgICAgICAgY29sdW1uLnRvb2x0aXAgPSBhZGRTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL05PVEU6IGlmIERCIHRhYmxlIGhhcyBubyBkYXRhIGluIGEgY29sdW1uLCBkYXRhIGdyaWQgY2FuJ3QgaW5mZXIgZGF0YSB0eXBlIGFuZCBkb2Vzbid0IHNldCB0aGUgZGF0YVR5cGUgZmllbGRcclxuICAgICAgaWYgKCFjb2x1bW4uZGF0YVR5cGUpIHtcclxuICAgICAgICBjb2x1bW4uZGF0YVR5cGUgPSBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghIWNvbHVtbi53aWR0aCAmJiBjb2x1bW4udmlzaWJsZSkge1xyXG4gICAgICAgIGNvbHVtbldpZHRoc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9IGNvbHVtbi53aWR0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuc3RhdGVMb2FkZWQgfHwgY29sdW1uU2V0dGluZ3NTdHIgPT09IHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gY29sdW1uU2V0dGluZ3NTdHI7XHJcblxyXG4gICAgaWYgKHNhdmluZ0NhbGxiYWNrKSB7XHJcbiAgICAgIHNhdmluZ0NhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZCwgc3RhdGUpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoc2F2ZWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgc2F2ZWRDYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbldpZHRocztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja05ld0NvbHVtbnMoc3RhdGU6IElHcmlkU3RhdGUpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBuZXdDb2x1bW5GaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKHN0YXRlLmNvbHVtbnMpIHtcclxuICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHN0YXRlLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+ICF0aGlzLmxvYWRlZENvbHVtbnNbY29sdW1uLmRhdGFGaWVsZF0gJiYgY29sdW1uLnZpc2libGUpO1xyXG5cclxuICAgICAgaWYgKG5ld0NvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIG5ld0NvbHVtbkZpZWxkcy5wdXNoKGNvbHVtbi5kYXRhRmllbGQpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdDb2x1bW5GaWVsZHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sdW1uQ2FwdGlvbnMoKTogSUNvbHVtbkNhcHRpb25bXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzKS5tYXAoKGRhdGFGaWVsZCkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGFGaWVsZCxcclxuICAgICAgICBjYXB0aW9uOiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXS5jYXB0aW9uXHJcbiAgICAgIH0gYXMgSUNvbHVtbkNhcHRpb247XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZDogc3RyaW5nLCBjYXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0pIHtcclxuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0gPSB7IGNhcHRpb246ICcnLCB0b29sdGlwOiAnJyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdLmNhcHRpb24gPSBjYXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENvbHVtbkFkZGl0aW9uYWxTZXR0aW5ncyhkYXRhRmllbGQ6IHN0cmluZyk6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcclxuICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja0NvbHVtbnNSZWxldmFuY2UoY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW10sIGNhbGxiYWNrOiAob3V0ZGF0ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLmdldENvbHVtbnNCeVJlcG9ydElkKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsQ29sdW1ucyA9IHt9O1xyXG5cclxuICAgICAgICBkYXRhLmZvckVhY2goKGMpID0+IGFjdHVhbENvbHVtbnNbYy5OYW1lXSA9IHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBvdXRkYXRlZENvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gIWFjdHVhbENvbHVtbnNbYy5kYXRhRmllbGRdKS5tYXAoKGMpID0+IGMuZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgaWYgKG91dGRhdGVkQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oYEdyaWQgc2V0dGluZ3MgY29udGFpbiBzb21lIGNvbHVubXMgd2hpY2ggZG9uJ3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFueW1vcmU6XHJcblxyXG4gICAgICAgICAgJyR7b3V0ZGF0ZWRDb2x1bW5zLmpvaW4oJywgJyl9Jy5cclxuXHJcbiAgICAgICAgICBEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlc2UgY29sdW1ucyBmcm9tIGdyaWQgc2V0dGluZ3M/XHJcbiAgICAgICAgICBgLCAnUmVtb3ZlIHJlZHVuZGFudCBjb2x1bW5zPycpXHJcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2FsbGJhY2sob3V0ZGF0ZWRDb2x1bW5zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldFNldHRpbmdzKCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5yZXNldFNldHRpbmdzKHRoaXMuaWQpXHJcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25EYXRhTG9hZGVkKGRhdGE6IElHcmlkU3RhdGUpIHtcclxuICAgIGNvbnN0IGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMgPSBkYXRhICYmIGRhdGEuY29sdW1ucztcclxuICAgIGxldCB2aXNpYmxlSW5kZXhDb3VudGVyID0gMDtcclxuXHJcbiAgICB0aGlzLnN0YXRlTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobG9hZGVkR3JpZFN0YXRlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLmxvYWRlZENvbHVtbnMgPSB7fTtcclxuXHJcbiAgICAgIGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zW2NvbHVtbi5kYXRhRmllbGRdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gTk9URTogc2V0IHZpc2libGUgaW5kZXhlcyBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0LiBJdCdzIHJlcXVpcmVkIGZvciBwcm9wZXIgZHhEYXRhR3JpZCBhcHBlYXJhbmNlLlxyXG4gICAgICAgIGlmIChjb2x1bW4udmlzaWJsZSAmJiBjb2x1bW4udmlzaWJsZUluZGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgICBjb2x1bW4udmlzaWJsZUluZGV4ID0gdmlzaWJsZUluZGV4Q291bnRlcisrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTk9URTogcmVtb3ZlIGVtcHR5IHZhbHVlcyBiZWNhdXNlIHRoZXkgbGVhZCB0byB3cm9uZyBkeERhdGFHcmlkIGJlaGF2aW9yXHJcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW5ba2V5XSA9PT0gbnVsbCB8fCBjb2x1bW5ba2V5XSA9PT0gdm9pZCAwIHx8IGNvbHVtbltrZXldID09PSAnJykge1xyXG4gICAgICAgICAgICBkZWxldGUgY29sdW1uW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcclxuXHJcbiAgICAgICAgaWYgKCFhZGRpdGlvbmFsU2V0dGluZ3MpIHtcclxuICAgICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHtcclxuICAgICAgICAgICAgY2FwdGlvbjogY29sdW1uLmNhcHRpb24sXHJcbiAgICAgICAgICAgIHRvb2x0aXA6IGNvbHVtbi50b29sdGlwXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbiA9IGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBjb2x1bW5zIHdoaWNoIGR4RGF0YUdyaWQgZG9lc24ndCBleHBlY3QuXHJcbiAgICAgICAgZGVsZXRlIGNvbHVtbi5jYXB0aW9uO1xyXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4udG9vbHRpcDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhLmNvbHVtbnMpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGZW51bSBHcmlkTW9kZSB7XHJcbiAgVmlldyA9IDEsXHJcbiAgRWRpdCA9IDJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR3JpZE1vZGU7XHJcbiIsICJcdUZFRkZpbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi4vUGFnZXMvR3JpZC9Nb2RlJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcyB9IGZyb20gJy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi4vQ29sdW1uTWV0YURhdGEnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL0RhdGEvRXhjZXB0aW9uVHlwZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRGF0YUxheWVyIHtcclxuICBnZXRDb2x1bW5zQnlSZXBvcnRJZChyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUNvbHVtbk1ldGFEYXRhW10+O1xyXG4gIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdDogYm9vbGVhbik6IERldkV4cHJlc3MuZGF0YS5DdXN0b21TdG9yZTxhbnksIGFueT47XHJcbiAgcmVzZXRTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbiAgdXBkYXRlR3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSk6IEpRdWVyeURlZmVycmVkPGFueT47XHJcbiAgZ2V0R3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUdyaWRTdGF0ZT47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVHcmlkRGF0YUxheWVyOiAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4gSUdyaWREYXRhTGF5ZXIgPSAoZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHVybHMgPSB7XHJcbiAgICBncmlkUmVzdWx0OiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR3JpZFZpZXdSZXN1bHRgLFxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXREYlRhYmxlRmllbGRzYCxcclxuICAgIHJlc2V0R3JpZFNldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vUmVzZXRHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHcmlkVmlld1NldHRpbmdzYCxcclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHcmlkVmlld1NldHRpbmdzYFxyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQpIHtcclxuICAgICAgcmV0dXJuIGNyZWF0ZUR4RGF0YVNvdXJjZSh7XHJcbiAgICAgICAgbG9hZFBhcmFtczoge1xyXG4gICAgICAgICAgaWQ6IHJlcG9ydFBhcmFtcy5SZXBvcnRJZCxcclxuICAgICAgICAgIGFwcE5hbWU6IHJlcG9ydFBhcmFtcy5BcHBOYW1lLFxyXG4gICAgICAgICAgZ3JpZE1vZGUsXHJcbiAgICAgICAgICByb3dzTGltaXQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0ICYmICFzaG93QWxsRGF0YUluRWRpdCA/IDE1IDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbG9hZFVybDogdXJscy5ncmlkUmVzdWx0LFxyXG4gICAgICAgIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZVxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldENvbHVtbnNCeVJlcG9ydElkLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XHJcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVzZXRTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMucmVzZXRHcmlkU2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHsgZGF0YVR5cGU6ICdqc29uJyB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlR3JpZFZpZXdTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIsIHN0YXRlOiBJR3JpZFN0YXRlKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3MsICdwb3N0Jywge1xyXG4gICAgICAgIGlkOiByZXBvcnRJZCwgY29sdW1uc1NldHRpbmdzOiBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKVxyXG4gICAgICB9LCBmYWxzZSwge1xyXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLmdldEdyaWRWaWV3U2V0dGluZ3MsICdwb3N0JywgeyBpZDogcmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbn07XHJcblxyXG5jb25zdCBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPSAoZXhjZXB0aW9uVHlwZTogRXhjZXB0aW9uVHlwZSk6IHN0cmluZyA9PiB7XHJcbiAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7XHJcbiAgICBjYXNlIEV4Y2VwdGlvblR5cGUuU3FsRXhjZXB0aW9uOlxyXG4gICAgICByZXR1cm4gJ1dlIGF0dGVtcHRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHF1ZXJ5IGhvd2V2ZXIgaXQgYXBwZWFycyB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZGF0YSBzb3VyY2UuIFBsZWFzZSBjb250YWN0IHRoZSByZXBvcnQgYXV0aG9yIHRvIGNvbmZpcm0gdGhlIGRhdGEgcmVxdWlyZW1lbnRzLic7XHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufTtcclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hPcHRpb25zIHtcclxuICBjYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmNvbnN0IHVwZGF0ZVRpbWVvdXQgPSAxMDA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoVGltZXIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbGFwc2VkQ2FsbGJhY2s6ICh0aW1lOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSBhY3RpdmVUaW1lcklkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgY3VycmVudEludGVydmFsOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgbGFzdFN0YXRlQ2hlY2tlZDogRGF0ZTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlZnJlc2hPcHRpb25zKSB7XHJcbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayA9IG9wdGlvbnMuZWxhcHNlZENhbGxiYWNrO1xyXG4gICAgdGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnQoaW50ZXJ2YWw6IG51bWJlcikge1xyXG4gICAgaWYgKGludGVydmFsIDw9IDApIHtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGFzdFN0YXRlQ2hlY2tlZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRJbnRlcnZhbCA9IGludGVydmFsO1xyXG5cclxuICAgIGNvbnN0IHRpbWVySWQgPSB0aGlzLmFjdGl2ZVRpbWVySWQgPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEludGVydmFsIDwgMCkge1xyXG4gICAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aGlzLmN1cnJlbnRJbnRlcnZhbCk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50aWNrVGltZXJGdW5jdGlvbih0aW1lcklkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmlnZ2VyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGlja1RpbWVyRnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGltZXJJZCAhPT0gdGhpcy5hY3RpdmVUaW1lcklkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBsZXQgdGltZVRvVXBkYXRlOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCAtIChuZXcgRGF0ZSgpIC0gdGhpcy5sYXN0U3RhdGVDaGVja2VkKTtcclxuICAgIGlmICh0aW1lVG9VcGRhdGUgPD0gMCkge1xyXG4gICAgICB0aW1lVG9VcGRhdGUgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCArIDk5OTtcclxuICAgICAgdGhpcy5jYWxsYmFjaygpO1xyXG4gICAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrKHRpbWVUb1VwZGF0ZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpLCB1cGRhdGVUaW1lb3V0KTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCBSZWZyZXNoQ29tcG9uZW50IGZyb20gJy4vSW5kZXgnO1xyXG5cclxuY29uc3QgZGVmYXVsdFJlZnJlc2hFbnRyaWVzOiBJUmVmcmVzaEVudHJ5W10gPSBbe1xyXG4gIHRpbWVvdXQ6IDAsXHJcbiAgdGV4dDogJ3JlZnJlc2ggbm93JyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICcnLFxyXG59LCB7XHJcbiAgdGltZW91dDogMTUgKiAxMDAwLFxyXG4gIHRleHQ6ICcxNSBzZWMnLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAzMCAqIDEwMDAsXHJcbiAgdGV4dDogJzMwIHNlYycsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDYwICogMTAwMCxcclxuICB0ZXh0OiAnMSBtaW4nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXHJcbn0sIHtcclxuICB0aW1lb3V0OiAxODAgKiAxMDAwLFxyXG4gIHRleHQ6ICczIG1pbicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcclxufSwge1xyXG4gIHRpbWVvdXQ6IDMwMCAqIDEwMDAsXHJcbiAgdGV4dDogJzUgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogNjAwICogMTAwMCxcclxuICB0ZXh0OiAnMTAgbWluJyxcclxuICByZWZyZXNoVGVtcGxhdGU6ICdBdXRvIFVwZGF0ZSAoJSknLFxyXG59LCB7XHJcbiAgdGltZW91dDogLTEsXHJcbiAgdGV4dDogJ29mZicsXHJcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGU6IG9mZicsXHJcbiAgaXNEZWZhdWx0OiB0cnVlXHJcbn1dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaEVudHJ5IHtcclxuICB0aW1lb3V0OiBudW1iZXIsXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIHJlZnJlc2hUZW1wbGF0ZTogc3RyaW5nLFxyXG4gIGlzRGVmYXVsdD86IGJvb2xlYW5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmcmVzaEJ1dHRvbiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wRG93bkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRNZW51OiBEZXZFeHByZXNzLnVpLmR4Q29udGV4dE1lbnU7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ29tcG9uZW50OiBSZWZyZXNoQ29tcG9uZW50O1xyXG4gIHByaXZhdGUgbWVudUlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZEVudHJ5OiBJUmVmcmVzaEVudHJ5O1xyXG5cclxuICBjb25zdHJ1Y3RvcigkdGFyZ2V0OiBKUXVlcnksIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdIHwgbnVsbCA9IGRlZmF1bHRSZWZyZXNoRW50cmllcykge1xyXG4gICAgdGhpcy5yZWZyZXNoQ29tcG9uZW50ID0gbmV3IFJlZnJlc2hDb21wb25lbnQoeyBjYWxsYmFjaywgZWxhcHNlZENhbGxiYWNrOiAoZSkgPT4gdGhpcy5lbGFwc2VkQ2FsbGJhY2soZSkgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSByZWZyZXNoRW50cmllcy5maW5kKChlKSA9PiBlLmlzRGVmYXVsdCkgfHwgcmVmcmVzaEVudHJpZXMuZmlsdGVyKChlKSA9PiAhIWUudGltZW91dClbMF07XHJcblxyXG4gICAgdGhpcy5jb250ZXh0TWVudSA9ICQoJzxkaXYgLz4nKS5keENvbnRleHRNZW51KHtcclxuICAgICAgZGF0YVNvdXJjZTogcmVmcmVzaEVudHJpZXMsXHJcbiAgICAgIHRhcmdldDogJHRhcmdldCxcclxuICAgICAgcG9zaXRpb246IHsgbXk6ICdyaWdodCB0b3AnLCBhdDogJ3JpZ2h0IGJvdHRvbScgfSxcclxuICAgICAgb25JdGVtQ2xpY2s6IChlKSA9PiB7XHJcbiAgICAgICAgaWYoIShlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCkge1xyXG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IGUuaXRlbURhdGEgYXMgSVJlZnJlc2hFbnRyeTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQoKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uSGlkZGVuOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25TaG93bjogKGUpID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgKGUuY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIoKVswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzem9sZWEtdGhlbWUnKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAoZW50cnkpID0+IGVudHJ5LnRleHQsXHJcblxyXG4gICAgICBjc3NDbGFzczogJ2lzem9sZWEtdGhlbWUnXHJcbiAgICB9KS5hcHBlbmRUbygnYm9keScpLmR4Q29udGV4dE1lbnUoJ2luc3RhbmNlJyk7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XHJcblxyXG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbiA9ICR0YXJnZXQuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLnNlbGVjdGVkRW50cnkudGV4dCxcclxuICAgICAgdGVtcGxhdGU6IChidXR0b25EYXRhLCBjb250ZW50KSA9PiB7XHJcbiAgICAgICAgJCgnPGkgLz4nKS5hZGRDbGFzcygnZHgtaWNvbiBkeC1pY29uLXJlZnJlc2gnKS5hcHBlbmRUbyhjb250ZW50KTtcclxuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLXRleHQnKS50ZXh0KGJ1dHRvbkRhdGEudGV4dCkuYXBwZW5kVG8oY29udGVudCk7XHJcbiAgICAgICAgJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ2J1dHRvbi13aXRoLWV4cGFuZC1pY29uIGlzb3otaWNvbi0xNiBpc296LWljb24tYXJyb3ctZG93bi0xNicpLmFwcGVuZFRvKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgZWxlbWVudEF0dHI6IHtcclxuICAgICAgICBjbGFzczogJ2lzem9sZWEtbWQgYnV0dG9uLXdpdGgtZXhwYW5kJ1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25DbGljazogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmVsZW1lbnQoKS53aWR0aCgkdGFyZ2V0Lm91dGVyV2lkdGgoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWVudUlzT3BlbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuXHJcbiAgICAodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQgPiAwKSAmJiB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQodGhpcy5zZWxlY3RlZEVudHJ5LnRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQudHJpZ2dlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbGFwc2VkQ2FsbGJhY2sodGltZVRvVXBkYXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcERvd25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5zZWxlY3RlZEVudHJ5LnJlZnJlc2hUZW1wbGF0ZS5yZXBsYWNlKCclJywgTWF0aC5mbG9vcih0aW1lVG9VcGRhdGUgLyAxMDAwKS50b1N0cmluZygpKSk7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4uLy4uL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XHJcbmltcG9ydCB7aW5pdFBvcG92ZXJ9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xyXG5pbXBvcnQge0lHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IEdSSURfSU5ESUNBVE9SX1NUQVRFIGZyb20gJy4vR3JpZEluZGljYXRvclN0YXRlJztcclxuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCBHcmlkU3RhdGVNYW5hZ2VyIGZyb20gJy4vR3JpZFN0YXRlTWFuYWdlcic7XHJcbmltcG9ydCBHcmlkTW9kZSBmcm9tICcuL01vZGUnO1xyXG5pbXBvcnQge2NyZWF0ZUdyaWREYXRhTGF5ZXIsIElHcmlkRGF0YUxheWVyfSBmcm9tICcuLi8uLi9EYXRhL0luZGV4JztcclxuaW1wb3J0IHtHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZX0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvQnV0dG9uJztcclxuXHJcbmNvbnN0IFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUID0gMzAwMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRPcHRpb25zIHtcclxuICBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElHcmlkUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xyXG4gIGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgc2hvd0hlYWRlcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWQgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50R3JpZE1vZGU6IEdyaWRNb2RlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaG93QWxsRGF0YUluRWRpdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9hZGluZ1RpbWVvdXQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBncmlkU3RhdGVNYW5hZ2VyOiBHcmlkU3RhdGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFN0YXRlSW5kaWNhdG9yOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlICRncmlkRXJyb3JQbGFjZWhvbGRlcjogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSAkZ3JpZFRhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkYXRhTGF5ZXI6IElHcmlkRGF0YUxheWVyO1xyXG4gIHByaXZhdGUgZWRpdFdpZHRoRWRpdEJveGVzOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveFtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZ3JpZFJlcGFpbnRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGNvbHVtbk5hbWVzVXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5ncmlkUG9zaXRpb25NYXJrZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY3VycmVudEdyaWRNb2RlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEdyaWRNb2RlID0gR3JpZE1vZGUuVmlldztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuZ3JpZCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBudWxsO1xyXG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0SW50ZXJuYWwoKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcclxuICAgIHRoaXMuZGF0YUxheWVyID0gY3JlYXRlR3JpZERhdGFMYXllcih0aGlzLmdyaWRSZXBvcnRDb250cm9sbGVyVXJsKTtcclxuXHJcbiAgICBpZiAodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQgPSAkKCc8ZGl2IC8+JykuaW5zZXJ0QWZ0ZXIodGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG5cclxuICAgIHRoaXMuZ3JpZFN0YXRlTWFuYWdlciA9IG5ldyBHcmlkU3RhdGVNYW5hZ2VyKHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLCB0aGlzLmRhdGFMYXllcik7XHJcblxyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIgPSAkKCc8ZGl2IC8+JykudGV4dCgnRGF0YSBsb2FkaW5nIGZhaWxlZC4nKS5hZGRDbGFzcygnZHgtZGF0YWdyaWQtbm9kYXRhJykuY3NzKHsgekluZGV4OiAxIH0pO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuYXBwZW5kVG8odGhpcy5ncmlkUG9zaXRpb25NYXJrZXIpO1xyXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIC8vIFRPRE86IGVsZW1lbnQgc2VsZWN0b3IgYXMgYSBwYXJhbVxyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlcyA9IFtdO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpLFxyXG4gICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgPyAnZWRpdC1tb2RlJyA6ICd2aWV3LW1vZGUnIH0sXHJcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcclxuICAgICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ICYmIHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKVswXTtcclxuICAgICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsSW5kZXggPSBpdGVtcy5pbmRleE9mKHNlYXJjaFBhbmVsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb0VkaXRCdG4gPSB7XHJcbiAgICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnU3dpdGNoIHRvIEVkaXQgTW9kZScsXHJcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuRWRpdCksXHJcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by1lZGl0LW1vZGUnLFxyXG4gICAgICAgICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ31cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKHNlYXJjaFBhbmVsSW5kZXgsIDEpO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb0VkaXRCdG4pO1xyXG4gICAgICAgICAgaXRlbXMucHVzaChzZWFyY2hQYW5lbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkNob29zZXJCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2NvbHVtbkNob29zZXJCdXR0b24nKVswXTtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbnRDaG9vc2VyQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHNob3dEYXRhSXRlbSA9IHtcclxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCAjZTBlMGUwIHNvbGlkJyxcclxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzNweCA2cHgnLFxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxzcGFuIC8+JylcclxuICAgICAgICAgICAgICAgIC5jc3MoeyBtYXJnaW46ICcwIDVweCAwIDAnLCB3aWR0aDogJzU0cHgnIH0pXHJcbiAgICAgICAgICAgICAgICAuZHhTd2l0Y2goe1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zaG93QWxsRGF0YUluRWRpdCxcclxuICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGxEYXRhSW5FZGl0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpLnRleHQoJ1Nob3cgYWxsIGRhdGEgJykuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0ICRoaW50VGFyZ2V0ID0gJCgnPGEgLz4nKVxyXG4gICAgICAgICAgICAgICAgLmNzcyh7IHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJywgY29sb3I6ICdibHVlJyB9KVxyXG4gICAgICAgICAgICAgICAgLnRleHQoJyg/KScpXHJcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgICAgLnRleHQoYElmIHRoZSB0YWJsZSBjb250YWlucyBhIGxvdCBvZiBjb2x1bW5zIHNob3dpbmcgYWxsIGRhdGEgY2FuIGxlYWQgdG8gc2xvdyBwYWdlIHBlcmZvcm1hbmNlIHdoZW4geW91J3JlIGVkaXRpbmcgdGhlIGdyaWQuXHJcbkJ5IGRlZmF1bHQgZ3JpZCBzaG93cyBvbmx5IGZpcnN0IDEwIHJvd3MgaW4gdGhlIEVkaXQgbW9kZS5gKVxyXG4gICAgICAgICAgICAgICAgLmR4UG9wb3Zlcih7XHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogJGhpbnRUYXJnZXQsXHJcbiAgICAgICAgICAgICAgICAgIHNob3dFdmVudDogJ21vdXNlZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICBoaWRlRXZlbnQ6ICdtb3VzZWxlYXZlJyxcclxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICB3aWR0aDogNTAwXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9WaWV3QnRuID0ge1xyXG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBWaWV3IE1vZGUnLFxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMuc3dpdGNoVG9Nb2RlKEdyaWRNb2RlLlZpZXcpLFxyXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tdmlldy1tb2RlJyxcclxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG5cclxuICAgICAgICAgIGl0ZW1zLnNwbGljZShjb2x1bW50Q2hvb3NlckJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG4gPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ2V4cG9ydEJ1dHRvbicpWzBdO1xyXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGV4cG9ydEJ0bik7XHJcblxyXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGV4cG9ydEJ0bkluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHNob3dEYXRhSXRlbSk7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKHN3aXRjaFRvVmlld0J0bik7XHJcbiAgICAgICAgICBpdGVtcy5wdXNoKGNvbHVtbkNob29zZXJCdG4pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGVkaXRTdGF0dXMgPSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZWRpdC1ncmlkLXN0YXRlJyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLmVkaXQpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcclxuXHJcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KGVkaXRTdGF0dXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAncmVmcmVzaCcpWzBdO1xyXG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihyZWZyZXNoQnRuKTtcclxuXHJcbiAgICAgICAgICBpdGVtc1tyZWZyZXNoQnRuSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCRjb250YWluZXIsICgpID0+IHRoaXMucmVmcmVzaCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25DZWxsUHJlcGFyZWQ6ICh7IHJvd1R5cGUsIGNvbHVtbiwgY2VsbEVsZW1lbnQgfSkgPT4ge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgaWYgKHJvd1R5cGUgPT09ICdoZWFkZXInICYmICFjb2x1bW4uY29tbWFuZCkge1xyXG4gICAgICAgICAgY29uc3QgZGF0YUZpZWxkID0gY29sdW1uLmRhdGFGaWVsZDtcclxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbChjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0R3JpZEhlYWRlckNlbGxFZGl0UGFuZWwoY29sdW1uLCBjZWxsRWxlbWVudCwgYWRkaXRpb25hbFNldHRpbmdzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBjdXJyZW50R3JpZCA9IGUuY29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZTogSUdyaWRTdGF0ZSA9IGN1cnJlbnRHcmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtaW5nKGN1cnJlbnRTdGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIE5PVEU6IGNvbHVtbiBuYW1lIHVwZGF0aW5nIHRyaWdnZXJzIG9uQ29udGVudFJlYWR5IGV2ZW50IHJhaXNpbmcgYWdhaW4uXHJcbiAgICAgICAgICAvLyBXZSBuZWVkIG5vdCB0byBleGV1Y3V0ZSB0aGUgc2FtZSBvbmUgbW9yZSB0aW1lLlxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gY3VycmVudEdyaWQuZW5kQ3VzdG9tTG9hZGluZygpKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdDb2x1bW5zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmNoZWNrTmV3Q29sdW1ucyhjdXJyZW50U3RhdGUpO1xyXG5cclxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbk5hbWUpID0+IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihjb2x1bW5OYW1lLCAndmlzaWJsZScsIGZhbHNlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbHVtbkNhcHRpb25zID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmdldENvbHVtbkNhcHRpb25zKCk7XHJcblxyXG4gICAgICAgIGNvbHVtbkNhcHRpb25zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGlmIChjLmNhcHRpb24gJiYgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicpICE9PSBjLmNhcHRpb24pIHtcclxuICAgICAgICAgICAgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicsIGMuY2FwdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlU3RvcmluZzoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXHJcbiAgICAgICAgY3VzdG9tTG9hZDogKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5sb2FkKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0LCAob3V0ZGF0ZWRDb2x1bW5zKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkLnN0YXRlKCk7XHJcblxyXG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW5zID0gKHN0YXRlLmNvbHVtbnMgYXMgYW55W10pLmZpbHRlcigoY29sdW1uKSA9PiBvdXRkYXRlZENvbHVtbnMuaW5kZXhPZihjb2x1bW4uZGF0YUZpZWxkKSA8IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ncmlkLnN0YXRlKHN0YXRlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY3VzdG9tU2F2ZTogKHN0YXRlKSA9PiB0aGlzLnNhdmVHcmlkU3RhdGUoc3RhdGUpXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcsIGFwcGx5RmlsdGVyOiAnb25DbGljaycgfSxcclxuICAgICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXHJcbiAgICAgIGVycm9yUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgIHNvcnRpbmc6IHsgbW9kZTogJ211bHRpcGxlJyB9LFxyXG4gICAgICBncm91cFBhbmVsOiB7IHZpc2libGU6IHRydWUgfSxcclxuICAgICAgZ3JvdXBpbmc6IHsgYXV0b0V4cGFuZEFsbDogZmFsc2UgfSxcclxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCxcclxuICAgICAgY29sdW1uQ2hvb3NlcjogeyBlbmFibGVkOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCB9LFxyXG4gICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxyXG5cclxuICAgICAgc2hvd0JvcmRlcnM6IHRydWUsXHJcbiAgICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAsIGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogdHJ1ZSxcclxuXHJcbiAgICAgIHN1bW1hcnk6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbiA/IHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiBbe1xyXG4gICAgICAgICAgY29sdW1uOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW4sXHJcbiAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xyXG4gICAgICAgIH1dXHJcbiAgICAgIH0gOiB1bmRlZmluZWQsXHJcblxyXG4gICAgICBvbkVkaXRvclByZXBhcmluZyhlKSB7XHJcbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ2ZpbHRlclJvdycpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5ID0gKCkgPT4gZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseTtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgPT09ICdzZWFyY2hQYW5lbCcpIHtcclxuICAgICAgICAgIGNvbnN0IGFwcGx5U2VhcmNoOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xyXG4gICAgICAgICAgICBlLmNvbXBvbmVudC5zZWFyY2hCeVRleHQoYXJncy5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpKTtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseVNlYXJjaDtcclxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHlTZWFyY2g7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ3JpZCA9IGRlZmF1bHRHcmlkKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMuc2hvd0hlYWRlciA/IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUgOiBudWxsLFxyXG4gICAgICBoZWFkZXJEZXNjcmlwdGlvbjogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyA6IG51bGxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCkge1xyXG4gICAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50ID0gJCgnPHNwYW4gLz4nKVxyXG4gICAgICAgIC5jc3Moe1xyXG4gICAgICAgICAgZmxvYXQ6ICdyaWdodCcsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcclxuICAgICAgICAgIGJvdHRvbTogJzhweCdcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hZGRDbGFzcygnaXN6b2xlYS1tZCcpXHJcbiAgICAgICAgLmR4QnV0dG9uKHtcclxuICAgICAgICAgIHRleHQ6ICdSZXNldCBzZXR0aW5ncycsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnJlc2V0U2V0dGluZ3MoKSxcclxuICAgICAgICAgIGljb246ICdyZXNldC1ncmlkLXNldHRpbmdzJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFwcGVuZFRvKCdmb290ZXInKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ncmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3Ioc3RhdGU6IHN0cmluZykge1xyXG4gICAgT2JqZWN0LmtleXMoR1JJRF9JTkRJQ0FUT1JfU1RBVEUpLmZvckVhY2goKHMpID0+IHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5yZW1vdmVDbGFzcyhHUklEX0lORElDQVRPUl9TVEFURVtzXSkpO1xyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hZGRDbGFzcyhzdGF0ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkge1xyXG4gICAgICB0aGlzLmdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdCk7XHJcbiAgICAgIH0sIFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGl0bGUgPSAnJztcclxuXHJcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdDpcclxuICAgICAgICB0aXRsZSA9ICdFZGl0IG1vZGUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZDpcclxuICAgICAgICB0aXRsZSA9ICdTYXZlZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZzpcclxuICAgICAgICB0aXRsZSA9ICdTYXZpbmcnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hdHRyKCd0aXRsZScsIHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uTmFtaW5nKHN0YXRlOiBJR3JpZFN0YXRlKSB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIC8vIEhBQ0s6IERldkV4dHJlbWUgZ3JpZCBkb2Vzbid0IHNob3cgY29sdW1ucyBkYXRhIGlmIGEgZGF0YUZpZWxkIGhhcyBzcGVjaWFsIHN5bWJvbHMuXHJcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cuZGV2ZXhwcmVzcy5jb20vU3VwcG9ydC9DZW50ZXIvUXVlc3Rpb24vRGV0YWlscy9UNjIxODM4L2R4ZGF0YWdyaWQtYS1jb2x1bW4taXMtZW1wdHktaWYtZGF0YWZpZWxkLWNvbnRhaW5zLXNwZWNpYWwtY2hhcmFjdGVyc1xyXG4gICAgLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XHJcbiAgICAgIHN0YXRlLmNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIGlmICgvW15hLXpBLVowLTlfXS8udGVzdChjLmRhdGFGaWVsZCkpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYWxjdWxhdGVDZWxsVmFsdWUnLCAocm93RGF0YSkgPT4gcm93RGF0YVtjLmRhdGFGaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZTogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmRhdGFMYXllci5nZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlLCBncmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXREYXRhU291cmNlKTtcclxuICAgIGNvbnN0IGRzID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcclxuICAgICAgc3RvcmUsXHJcbiAgICAgIG9uQ2hhbmdlZDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgPyB2b2lkIDAgOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1VwZGF0ZWQgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgb25Mb2FkRXJyb3I6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkcy5pc0xvYWRlZCgpKSB7XHJcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkxvYWRpbmdDaGFuZ2VkOiAoaXNMb2FkaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BsZWFzZSB3YWl0LCBkYXRhIGxvYWRpbmcgaW4gcHJvZ3Jlc3MuJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDEwMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubG9hZGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZ3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0U2V0dGluZ3MoKSB7XHJcbiAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKCdSZXNldCBncmlkIHNldHRpbmdzIHRvIGRlZmF1bHQgdmFsdWVzPycsICdSZXNldCB0byBkZWZhdWx0PycpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcbiAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXJcclxuICAgICAgICAgICAgLnJlc2V0U2V0dGluZ3MoKVxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShkYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaFRvTW9kZShtb2RlOiBHcmlkTW9kZSkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBtb2RlIHx8IG1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG1vZGU7XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0aGlzLmdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXNbMF0uY29sdW1uJykgYXMgc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0IG5ld1JlcG9ydFBhcmFtcyA9IHtcclxuICAgICAgLi4udGhpcy5yZXBvcnRQYXJhbXMsXHJcbiAgICAgIFRvdGFsU3VtbWFyeUNvbHVtbjogY3VycmVudFN1bW1hcnlDb2x1bW4gPyBjdXJyZW50U3VtbWFyeUNvbHVtbiA6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG5ld1JlcG9ydFBhcmFtcztcclxuXHJcbiAgICB0aGlzLmdyaWQuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmdyaWQgPSB0aGlzLmluaXRJbnRlcm5hbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlR3JpZFN0YXRlKHN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1uTmFtZXNVcGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoc3RhdGUsXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmluZyksXHJcbiAgICAgICgpID0+IHRoaXMudXBkYXRlR3JpZFN0YXRlSW5kaWNhdG9yKEdSSURfSU5ESUNBVE9SX1NUQVRFLnNhdmVkKSk7XHJcblxyXG4gICAgaWYgKHdpZHRocykge1xyXG4gICAgICBPYmplY3Qua2V5cyh3aWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVkaXRXaWR0aEJveCA9IHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2tleV07XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gd2lkdGhzW2tleV0gPT09ICdpbmhlcml0JyA/ICcnIDogd2lkdGhzW2tleV07XHJcblxyXG4gICAgICAgIGlmIChlZGl0V2lkdGhCb3ggJiYgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnKSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChcclxuICAgIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLFxyXG4gICAgJGNlbGw6IEpRdWVyeSxcclxuICAgIGFkZGl0aW9uYWxTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGVcclxuICApIHtcclxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGNvbHVtbi5kYXRhRmllbGQ7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xyXG4gICAgY29uc3QgJGVkaXRvckFyZWEgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdjb2x1bW4tZWRpdG9yLWFyZWEnKS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcclxuXHJcbiAgICAkY29sdW1uQ2FwdGlvbkVsLmNzcygnbWF4V2lkdGgnLCAnNTUlJyk7XHJcblxyXG4gICAgY29uc3QgJGVkaXRUeXBlUGFuZWwgPSAkKCc8ZGl2IC8+JylcclxuICAgICAgLmFkZENsYXNzKCdlZGl0LXR5cGUtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0V2lkdGhQYW5lbCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtd2lkdGgtcGFuZWwnKVxyXG4gICAgICAud2lkdGgoJzEwMCUnKVxyXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xyXG5cclxuICAgICRlZGl0VHlwZVBhbmVsWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgY29uc3Qgc2VsZWN0Qm94ID0gJGVkaXRUeXBlQm94LmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdEJveC5vcHRpb24oJ29wZW5lZCcpKSB7XHJcbiAgICAgICAgc2VsZWN0Qm94LmNsb3NlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0Qm94Lm9wZW4oKTtcclxuICAgICAgfVxyXG4gICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgbGV0IGxhc3RDYXB0aW9uVmFsdWUgPSBjb2x1bW4uY2FwdGlvbjtcclxuXHJcbiAgICBjb25zdCAkZWRpdENhcHRpb25CdG4gPSAkKCc8c3BhbiAvPicpLmR4QnV0dG9uKHtcclxuICAgICAgaGludDogJ0VkaXQgY29sdW1uIGNhcHRpb24nLFxyXG4gICAgICB0ZW1wbGF0ZTogKGRhdGEsICRjb250ZW50KSA9PiAkY29udGVudC5hcHBlbmQoJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZWRpdC1jYXB0aW9uLWJ0bicpKSxcclxuICAgICAgb25DbGljazogKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xyXG4gICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRUb29sdGlwQnRuLmhpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgJGVkaXQgPSAkKCc8c3BhbiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgICAgICB2YWx1ZTogbGFzdENhcHRpb25WYWx1ZSxcclxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiAnY2FwdGlvbi1lZGl0b3InIH0sXHJcbiAgICAgICAgICBvbkVudGVyS2V5OiAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Gb2N1c091dDogKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgICAgICAgICRlZGl0LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQobmV3VmFsdWUpLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRDYXB0aW9uQnRuLnNob3coKTtcclxuICAgICAgICAgICAgJGVkaXRUb29sdGlwQnRuLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgIGxhc3RDYXB0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNldENvbHVtbkNhcHRpb24oZGF0YUZpZWxkLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxyXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmluc2VydEFmdGVyKCRjb2x1bW5DYXB0aW9uRWwpO1xyXG5cclxuICAgIGNvbnN0ICRlZGl0VG9vbHRpcEJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xyXG4gICAgICBoaW50OiAnRWRpdCBjb2x1bW4gdG9vbHRpcCcsXHJcbiAgICAgIHRlbXBsYXRlOiAoZGF0YSwgJGNvbnRlbnQpID0+ICRjb250ZW50LmFwcGVuZCgkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdlZGl0LXRvb2x0aXAtYnRuJykpLFxyXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5oaWRlKCk7XHJcbiAgICAgICAgJGVkaXRDYXB0aW9uQnRuLmhpZGUoKTtcclxuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkZWRpdCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgICAgIHZhbHVlOiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICB0ZXh0OiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIGNvbHVtbiB0b29sdGlwLi4uJyxcclxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xyXG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcclxuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdEJ0bi5vcHRpb24oJ3ZhbHVlJyk7XHJcblxyXG4gICAgICAgICAgICAkZWRpdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgJGNvbHVtbkNhcHRpb25FbC5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XHJcbiAgICAgICAgICAgICRlZGl0VG9vbHRpcEJ0bi5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAkY2VsbC5hdHRyKCd0aXRsZScsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zYXZlR3JpZFN0YXRlKHRoaXMuZ3JpZC5zdGF0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgICAgICAuYXBwZW5kVG8oJGVkaXRvckFyZWEpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRCdG4gPSAkZWRpdC5keFRleHRCb3goJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGVkaXRDYXB0aW9uQnRuKTtcclxuXHJcbiAgICBjb25zdCAkZWRpdFR5cGVCb3ggPSAkKCc8c3BhbiAvPicpLmR4U2VsZWN0Qm94KHtcclxuICAgICAgZGF0YVNvdXJjZTogZ3JpZENvbHVtblR5cGVzLFxyXG4gICAgICB2YWx1ZTogY29sdW1uLmRhdGFUeXBlIHx8IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUuRGVmYXVsdCxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgY29sdW1uIHR5cGUuLi4nLFxyXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oZGF0YUZpZWxkLCAnZGF0YVR5cGUnLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJykuYXBwZW5kVG8oJGVkaXRUeXBlUGFuZWwpO1xyXG5cclxuICAgIGxldCBwcmV2VmFsdWUgPSAhIWNvbHVtbi53aWR0aCA/IGNvbHVtbi53aWR0aC50b1N0cmluZygpIDogJyc7XHJcblxyXG4gICAgY29uc3Qgb25XaWR0aFZhbHVlQ2hhbmdlZCA9IChlKSA9PiB7XHJcbiAgICAgIGxldCBuZXdWYWx1ZSA9IGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKTtcclxuXHJcbiAgICAgIGlmICghbmV3VmFsdWUgfHwgbmV3VmFsdWUgPT09ICdpbmhlcml0Jykge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghcHJldlZhbHVlIHx8IHByZXZWYWx1ZSA9PT0gJ2luaGVyaXQnKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XHJcbiAgICAgICAgcHJldlZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtbk9wdGlvbihkYXRhRmllbGQsICd3aWR0aCcsIG5ld1ZhbHVlIHx8ICdpbmhlcml0Jyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5ncmlkUmVwYWludFF1ZXVlZCkge1xyXG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdyaWQucmVwYWludCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdyaWRSZXBhaW50UXVldWVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgJGVkaXRXaWR0aEJveCA9ICQoJzxzcGFuIC8+JykuZHhUZXh0Qm94KHtcclxuICAgICAgdGV4dDogcHJldlZhbHVlID09PSAnaW5oZXJpdCcgPyAnJyA6IHByZXZWYWx1ZSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdTZXQgd2lkdGguLi4nLFxyXG4gICAgICBvbkVudGVyS2V5OiAoKSA9PiAkZWRpdFdpZHRoQm94LmR4VGV4dEJveCgnaW5zdGFuY2UnKS5ibHVyKCksXHJcbiAgICAgIG9uRm9jdXNPdXQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWQsXHJcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiBvbldpZHRoVmFsdWVDaGFuZ2VkXHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXHJcbiAgICAgIC5hcHBlbmRUbygkZWRpdFdpZHRoUGFuZWwpXHJcbiAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGwoJGNlbGxFbDogSlF1ZXJ5LCBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlKSB7XHJcbiAgICBjb25zdCAkY29sdW1uQ2FwdGlvbkVsID0gJGNlbGxFbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XHJcbiAgICBjb25zdCB0b29sdGlwID0gYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwO1xyXG4gICAgY29uc3QgY2FwdGlvbiA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbjtcclxuXHJcbiAgICAkY2VsbEVsLmF0dHIoJ3RpdGxlJywgdG9vbHRpcCB8fCB2b2lkIDApO1xyXG5cclxuICAgIGlmIChjYXB0aW9uKSB7XHJcbiAgICAgICRjb2x1bW5DYXB0aW9uRWwudGV4dChjYXB0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmludGVyZmFjZSBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcclxuICBzdWJ2YWx1ZXM6IElTdWJ2YWx1ZU9wdGlvbnNbXTtcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElTdWJ2YWx1ZU9wdGlvbnMge1xyXG4gIGtleTogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpc0JvdW5kOiBib29sZWFuO1xyXG4gIG1lYXN1cmVJZDogc3RyaW5nO1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgc3VidmFsdWVzOiBbXSxcclxuICB0eXBlOiAndHJpYW5nbGVNYXJrZXInLFxyXG4gIGNvbG9yOiAnIzg3OThhNScsXHJcbiAgc2Vjb25kQ29sb3I6ICcjZTE4ZTkyJyxcclxuICB3aWR0aDogMTAsXHJcbiAgaXNDdXN0b21QYWxldHRlOiBmYWxzZSxcclxuICBwYWxldHRlOiBudWxsLFxyXG4gIGN1c3RvbVBhbGV0dGU6IFsnIzYxYTU5NScsICdHcmV5JywgJ3JnYigxNTMsIDEwMiwgMjU1KScsICdOYXZ5J11cclxufSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xyXG5cclxuY29uc3QgQ1NTX0NMQVNTID0gJ2lzb3otc3VidmFsdWVFZGl0b3JGb3JtR3JvdXAnO1xyXG5jb25zdCBOQU1FX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbmFtZWA7XHJcbmNvbnN0IElTX0JPVU5EX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9faXMtYm91bmRgO1xyXG5jb25zdCBWQUxVRV9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX3ZhbHVlYDtcclxuY29uc3QgTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX21lYXN1cmUtaWRgO1xyXG5jb25zdCBDT0xPUl9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2NvbG9yYDtcclxuXHJcbmNvbnN0IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlTmVlZGxlJywgJ3RyaWFuZ2xlTmVlZGxlJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xyXG5jb25zdCBMSU5FQVJfSU5ESUNBVE9SX1RZUEVTID0gWydyZWN0YW5nbGUnLCAnY2lyY2xlJywgJ3Job21idXMnLCAncmFuZ2VCYXInLCAndHJpYW5nbGVNYXJrZXInLCAndGV4dENsb3VkJ107XHJcblxyXG5jb25zdCBDSVJDVUxBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0NpcmN1bGFyRnVsbCcsICdDaXJjdWxhckhhbGYnLCAnQ2lyY3VsYXJRdWFydGVyTGVmdCcsICdDaXJjdWxhclF1YXJ0ZXJSaWdodCcsICdDaXJjdWxhclRocmVlRm91cnRoJ107XHJcbmNvbnN0IExJTkVBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0xpbmVhckhvcml6b250YWwnLCAnTGluZWFyVmVydGljYWwnXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfUEFMRVRURSA9IFsnIzFkYjJmNScsICcjZjU1NjRhJywgJyM5N2M5NWMnLCAnI2ZmYzcyMCcsICcjZWIzNTczJywgJyNhNjNkYjgnLCAnIzY1OTNiYycsICcjZmFhMzM1JywgJyNmZjg4N2MnXTtcclxuXHJcbmNvbnN0IFBSRURFRklORURfUEFMRVRURVMgPSBbJ0JyaWdodCcsICdIYXJtb255IExpZ2h0JywgJ09jZWFuJywgJ1Bhc3RlbCcsICdTb2Z0JywgJ1NvZnQgUGFzdGVsJywgJ1ZpbnRhZ2UnLFxyXG4gICdWaW9sZXQnLCAnQ2FybWluZScsICdEYXJrIE1vb24nLCAnRGFyayBWaW9sZXQnLCAnR3JlZW4gTWlzdCcsICdTb2Z0IEJsdWUnLCAnTWF0ZXJpYWwnLCAnT2ZmaWNlJ107XHJcblxyXG4vLyAxLiBNb2RlbFxyXG5jb25zdCBwcm9wZXJ0eSA9IHtcclxuICBvd25lclR5cGU6IERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSxcclxuICBwcm9wZXJ0eU5hbWU6ICdHYXVnZVN1YnZhbHVlc1NldHRpbmdzJyxcclxuICBkZWZhdWx0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRPcHRpb25zKSxcclxuICB2YWx1ZVR5cGU6ICdzdHJpbmcnXHJcbn0gYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuQ3VzdG9tUHJvcGVydHlNZXRhZGF0YTtcclxuXHJcbkRldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LnJlZ2lzdGVyQ3VzdG9tUHJvcGVydHkocHJvcGVydHkpO1xyXG5cclxuLy8gMi4gVmlld2VyXHJcbmZ1bmN0aW9uIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZChhcmdzOiBEZXZFeHByZXNzLkRhc2hib2FyZC5JdGVtV2lkZ2V0T3B0aW9uRXZlbnRBcmdzKSB7XHJcbiAgaWYgKGFyZ3MuZGFzaGJvYXJkSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xyXG4gICAgY29uc3Qgc3RvcmVkT3B0aW9ucyA9IGdldE9wdGlvbnMoYXJncy5kYXNoYm9hcmRJdGVtKTtcclxuXHJcbiAgICBjb25zdCBnYXVnZU9wdGlvbnMgPSBhcmdzLm9wdGlvbnMgYXMgRGV2RXhwcmVzcy52aXouZHhMaW5lYXJHYXVnZU9wdGlvbnMgfCBEZXZFeHByZXNzLnZpei5keENpcmN1bGFyR2F1Z2VPcHRpb25zO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgfHwgW107XHJcbiAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgPSBnYXVnZU9wdGlvbnMuc3VidmFsdWVJbmRpY2F0b3IgfHwge307XHJcblxyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnR5cGUgPSBzdG9yZWRPcHRpb25zLnR5cGUgYXMgYW55O1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLndpZHRoID0gc3RvcmVkT3B0aW9ucy53aWR0aDtcclxuXHJcbiAgICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhYXJncy5kYXNoYm9hcmRJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xyXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnBhbGV0dGUgPSBzdG9yZWRPcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHMpID0+IGhhc1RhcmdldFZhbHVlIHx8IHMua2V5ID4gLTEpLm1hcCgocykgPT4gcy5jb2xvcik7XHJcblxyXG4gICAgc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZm9yRWFjaCgoc3VidmFsdWUpID0+IHtcclxuICAgICAgaWYgKHN1YnZhbHVlLmtleSA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VidmFsdWUuaXNCb3VuZCA/IGFyZ3MuaXRlbURhdGEuZ2V0TWVhc3VyZVZhbHVlKHN1YnZhbHVlLm1lYXN1cmVJZCkuZ2V0VmFsdWUoKSA6IHN1YnZhbHVlLnZhbHVlO1xyXG4gICAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAzLiBEZXNpZ25lclxyXG5mdW5jdGlvbiBvbkN1c3RvbWl6ZVNlY3Rpb25zKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLkN1c3RvbWl6ZVNlY3Rpb25zRXZlbnRBcmdzKSB7XHJcbiAgY29uc3QgZ2F1Z2VJdGVtID0gYXJncy5kYXNoYm9hcmRJdGVtO1xyXG4gIGlmIChnYXVnZUl0ZW0gaW5zdGFuY2VvZiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0pIHtcclxuICAgIGFyZ3MuYWRkU2VjdGlvbih7XHJcbiAgICAgIHRpdGxlOiAnU3VidmFsdWVzJyxcclxuICAgICAgaXRlbXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IHByb3BlcnR5LnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgIHRlbXBsYXRlKGEsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIG5ldyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdFZGl0IGluIFdpemFyZCcsXHJcbiAgICAgICAgICAgICAgb25DbGljaygpIHtcclxuICAgICAgICAgICAgICAgIHNob3dQb3B1cChnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uQ29udGFpbmVyO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93UG9wdXAoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pIHtcclxuICBjb25zdCBwb3B1cENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gIGNvbnN0IHBvcHVwT3B0aW9ucyA9IHtcclxuICAgIHdpZHRoOiAnODAwcHgnLFxyXG4gICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICBtYXhIZWlnaHQ6ICcxMDAlJyxcclxuICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgY29udGVudFRlbXBsYXRlKHRoaXM6IGFueSwgY29udGVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zdCBzdWJ2YWx1ZXNGb3JtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IHN1YnZhbHVlc2Zvcm1PcHRpb25zID0gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9zdWJ2YWx1ZXNGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIHN1YnZhbHVlc2Zvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGluZGljYXRvckZvcm1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3QgaW5kaWNhdG9yZm9ybU9wdGlvbnMgPSBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICB0aGlzLl9pbmRpY2F0b3JGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKGluZGljYXRvckZvcm1Db250YWluZXIsIGluZGljYXRvcmZvcm1PcHRpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIGluZGljYXRvckZvcm1Db250YWluZXIpO1xyXG5cclxuICAgICAgY29uc3Qgc2Nyb2xsVmlldyA9ICQoJzxkaXYgLz4nKTtcclxuICAgICAgc2Nyb2xsVmlldy5hcHBlbmQoY29udGVudCk7XHJcbiAgICAgIHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIGhlaWdodDogJzEwMCUnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHNjcm9sbFZpZXc7XHJcbiAgICB9LFxyXG4gICAgb25IaWRkZW4oKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXBDb250YWluZXIpO1xyXG4gICAgfSxcclxuICAgIHRpdGxlOiAnU3VidmFsdWVzIFdpemFyZCcsXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcztcclxuICBjb25zdCBwb3B1cCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4UG9wdXAocG9wdXBDb250YWluZXIsIHBvcHVwT3B0aW9ucyk7XHJcbiAgcG9wdXAuc2hvdygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRPcHRpb25zKGdhZ3VlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucyB7XHJcbiAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZ2FndWVJdGVtLmN1c3RvbVByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lKSBhcyBzdHJpbmcpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgY29uc3QgaGFzVGFyZ2V0VmFsdWUgPSAhIWdhZ3VlSXRlbS5nYXVnZXMoKVswXT8udGFyZ2V0VmFsdWUoKTtcclxuXHJcbiAgaWYgKGhhc1RhcmdldFZhbHVlICYmICghZGF0YS5zdWJ2YWx1ZXMgfHwgIWRhdGEuc3VidmFsdWVzLnNvbWUoKHMpID0+IHMua2V5ID09PSAtMSkpKSB7XHJcbiAgICBkYXRhLnN1YnZhbHVlcy5zcGxpY2UoMCwgMCwge1xyXG4gICAgICBrZXk6IC0xLFxyXG4gICAgICBuYW1lOiAnVGFyZ2V0IFZhbHVlJyxcclxuICAgICAgaXNCb3VuZDogZmFsc2UsXHJcbiAgICAgIG1lYXN1cmVJZDogJycsXHJcbiAgICAgIHZhbHVlOiAwLFxyXG4gICAgICBjb2xvcjogREVGQVVMVF9QQUxFVFRFWyhkYXRhLnN1YnZhbHVlcz8ubGVuZ3RoIHx8IDApICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkYXRhO1xyXG59XHJcbmZ1bmN0aW9uIHNldE9wdGlvbnMoZ2F1Z2VJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0sIHZhbHVlOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zKSB7XHJcbiAgcmV0dXJuIGdhdWdlSXRlbS5jdXN0b21Qcm9wZXJ0aWVzLnNldFZhbHVlKHByb3BlcnR5LnByb3BlcnR5TmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuZnVuY3Rpb24gY3JlYXRlTGlzdEFuZFRvb2xiYXIoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0sIGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogW0pRdWVyeSwgRGV2RXhwcmVzcy51aS5keExpc3QsIERldkV4cHJlc3MudWkuZHhUb29sYmFyXSB7XHJcbiAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgY29uc3QgJHRvb2xiYXJDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCR0b29sYmFyQ29udGFpbmVyKTtcclxuICBjb25zdCBlZGl0QnV0dG9uID0gbnVsbDtcclxuICBsZXQgbGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgPSBudWxsO1xyXG5cclxuICBjb25zdCB0b29sYmFyT3B0aW9ucyA9IHtcclxuICAgIGl0ZW1zOiBbe1xyXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXHJcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGljb246ICdhZGQnLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljayhlKSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5zdWJ2YWx1ZXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyA8IGl0ZW0ua2V5ID8gaXRlbS5rZXkgOiBhY2MsIDApICsgMTtcclxuICAgICAgICAgIGNvbnN0IG5ld1N1YnZhbHVlOiBJU3VidmFsdWVPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIG5hbWU6IGBTdWJ2YWx1ZSAke2tleX1gLFxyXG4gICAgICAgICAgICBpc0JvdW5kOiBmYWxzZSxcclxuICAgICAgICAgICAgbWVhc3VyZUlkOiAnJyxcclxuICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbG9yOiBERUZBVUxUX1BBTEVUVEVbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoICUgKERFRkFVTFRfUEFMRVRURS5sZW5ndGggLSAxKV0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJywgbmV3U3VidmFsdWUpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGl0ZW1JbkRhdGFTb3VyY2UgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBuZXdTdWJ2YWx1ZS5rZXkpWzBdO1xyXG4gICAgICAgICAgaWYgKCFpdGVtSW5EYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnB1c2gobmV3U3VidmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKGl0ZW1JbkRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICBvcHRpb25zW2luZGV4XSA9IG5ld1N1YnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuICAgICAgICAgIGxpc3QucmVsb2FkKCk7XHJcbiAgICAgICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH1cclxuICAgIH1dXHJcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhck9wdGlvbnM7XHJcblxyXG4gIGNvbnN0IHVwZGF0ZVRvb2xiYXJTdGF0ZSA9IChoYXNTZWxlY3RlZEl0ZW06IGJvb2xlYW4pID0+IHtcclxuICAgIGVkaXRCdXR0b24gJiYgZWRpdEJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIWhhc1NlbGVjdGVkSXRlbSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdG9vbGJhciA9IG5ldyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhcigkdG9vbGJhckNvbnRhaW5lciwgdG9vbGJhck9wdGlvbnMpO1xyXG4gIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICBjb25zdCBsaXN0T3B0aW9ucyA9IHtcclxuICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XHJcbiAgICAgIGxvYWQ6ICgpID0+IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKS5zdWJ2YWx1ZXMsXHJcbiAgICAgIHJlbW92ZTogKCkgPT4geyB9XHJcbiAgICB9IGFzIGFueSksXHJcbiAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxyXG4gICAgaGVpZ2h0OiAnMjAwcHgnLFxyXG4gICAga2V5RXhwcjogJ2tleScsXHJcbiAgICBub0RhdGFUZXh0OiAnQWRkIGEgU3VidmFsdWUnLFxyXG4gICAgYWxsb3dJdGVtRGVsZXRpbmc6IHRydWUsXHJcbiAgICBpdGVtRGVsZXRlTW9kZTogJ3N0YXRpYycsXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7IH0sXHJcbiAgICBvbkl0ZW1SZW5kZXJlZChlKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZS5pdGVtRGF0YSBhcyBJU3VidmFsdWVPcHRpb25zO1xyXG4gICAgICBpZiAoaXRlbURhdGEua2V5ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnQgPSBlLml0ZW1FbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R4LWxpc3Qtc3RhdGljLWRlbGV0ZS1idXR0b24tY29udGFpbmVyJylbMF0gYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAgICAgZGVsZXRlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25TZWxlY3Rpb25DaGFuZ2VkKGUpIHtcclxuICAgICAgdXBkYXRlVG9vbGJhclN0YXRlKCEhZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEl0ZW0nKSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJyk7XHJcbiAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIHNlbGVjdGVkSXRlbSk7XHJcbiAgICAgIGNvbnN0IHdhc2Zvcm1WaXNpYmxlID0gZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScpID09PSAnYmxvY2snO1xyXG4gICAgICBjb25zdCBzaG91bGRGb3JtQmVWaXNpYmxlID0gISFzZWxlY3RlZEl0ZW07XHJcbiAgICAgIGlmICghd2FzZm9ybVZpc2libGUgJiYgc2hvdWxkRm9ybUJlVmlzaWJsZSB8fCB3YXNmb3JtVmlzaWJsZSAmJiAhc2hvdWxkRm9ybUJlVmlzaWJsZSkge1xyXG4gICAgICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCBzaG91bGRGb3JtQmVWaXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkl0ZW1EZWxldGVkOiAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xyXG4gICAgICBjb25zdCBrZXkgPSBlLml0ZW1EYXRhLmtleTtcclxuICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLnN1YnZhbHVlcy5pbmRleE9mKG9wdGlvbnMuc3VidmFsdWVzLmZpbHRlcigoc3VidmFsdWUpID0+IHN1YnZhbHVlLmtleSA9PT0ga2V5KVswXSk7XHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgbGlzdC5yZWxvYWQoKTtcclxuICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcclxuICAgIH1cclxuICB9IGFzIERldkV4cHJlc3MudWkuZHhMaXN0T3B0aW9ucztcclxuXHJcbiAgY29uc3QgJGxpc3RDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcbiAgJGVsZW1lbnQuYXBwZW5kKCRsaXN0Q29udGFpbmVyKTtcclxuXHJcbiAgbGlzdCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4TGlzdCgkbGlzdENvbnRhaW5lciwgbGlzdE9wdGlvbnMpO1xyXG5cclxuICByZXR1cm4gWyRlbGVtZW50LCBsaXN0LCB0b29sYmFyXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U3VidmFsdWVGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XHJcbiAgbGV0IGl0ZW1zTGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgfCBudWxsID0gbnVsbDtcclxuICBjb25zdCB1cGRhdGVGb3JtU3RhdGUgPSAoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0pID0+IHtcclxuICAgIGNvbnN0IHZhbHVlRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ3ZhbHVlJyk7XHJcbiAgICBjb25zdCBtZWFzdXJlSWRFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbWVhc3VyZUlkJyk7XHJcbiAgICBjb25zdCBuYW1lRWRpdG9yID0gZm9ybS5nZXRFZGl0b3IoJ25hbWUnKTtcclxuICAgIGNvbnN0IGlzQm91bmQgPSBmb3JtLm9wdGlvbignZm9ybURhdGEnKS5pc0JvdW5kO1xyXG4gICAgY29uc3QgaXNUYXJnZXRWYWx1ZSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmtleSA9PT0gLTE7XHJcblxyXG4gICAgdmFsdWVFZGl0b3IgJiYgdmFsdWVFZGl0b3Iub3B0aW9uKCdkaXNhYmxlZCcsIGlzQm91bmQpO1xyXG4gICAgbWVhc3VyZUlkRWRpdG9yICYmIG1lYXN1cmVJZEVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgIWlzQm91bmQpO1xyXG5cclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0lTX0JPVU5EX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke1ZBTFVFX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcclxuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke01FQVNVUkVfSURfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xyXG5cclxuICAgIG5hbWVFZGl0b3IgJiYgbmFtZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNUYXJnZXRWYWx1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZvcm1EYXRhOiBudWxsLFxyXG4gICAgY29sQ291bnQ6IDIsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXHJcbiAgICAgICAgY2FwdGlvbjogJ1N1YnZhbHVlcyBpdGVtcycsXHJcbiAgICAgICAgdGVtcGxhdGU6IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbJGNvbnRhaW5lciwgbGlzdF0gPSBjcmVhdGVMaXN0QW5kVG9vbGJhcihhcmdzLmNvbXBvbmVudCwgZ2F1Z2VJdGVtKTtcclxuICAgICAgICAgIGl0ZW1zTGlzdCA9IGxpc3Q7XHJcblxyXG4gICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdzdWJ2YWx1ZUVkaXRvcicsXHJcbiAgICAgICAgY3NzQ2xhc3M6IENTU19DTEFTUyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBjYXB0aW9uOiAnSXRlbSBvcHRpb25zJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IE5BTUVfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFRleHRCb3gnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VFdmVudDogJ2tleXVwJ1xyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzQm91bmQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFJhZGlvR3JvdXAnLFxyXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgICAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXHJcbiAgICAgICAgICAgICAgaXRlbXM6IFt7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVW5ib3VuZCcsIHZhbHVlOiBmYWxzZVxyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6ICdCb3VuZCcsIHZhbHVlOiB0cnVlXHJcbiAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UmFkaW9Hcm91cC5Qcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdUeXBlJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IFZBTFVFX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxyXG4gICAgICAgICAgICBsYWJlbDoge1xyXG4gICAgICAgICAgICAgIHRleHQ6ICdWYWx1ZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdtZWFzdXJlSWQnLFxyXG4gICAgICAgICAgICBjc3NDbGFzczogTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnSGlkZGVuIG1lYXN1cmVzJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgIGl0ZW1zOiBnYXVnZUl0ZW0uaGlkZGVuTWVhc3VyZXMoKS5tYXAoKG1lYXN1cmUpID0+ICh7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBnZXRNZWFzdXJlRGlzYXBsYXlUZXh0KG1lYXN1cmUpLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmUudW5pcXVlTmFtZSgpXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllc1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2NvbG9yJyxcclxuICAgICAgICAgICAgY3NzQ2xhc3M6IENPTE9SX0lURU1fQ1NTX0NMQVNTLFxyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeENvbG9yQm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnQ29sb3InLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uQ29udGVudFJlYWR5KGUpIHsgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTsgfSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcbiAgICAgIGNvbnN0IGVkaXRlZFN1YnZhbHVlID0gb3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBmb3JtRGF0YS5rZXkpWzBdO1xyXG5cclxuICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihlZGl0ZWRTdWJ2YWx1ZSldID0gZm9ybURhdGE7XHJcbiAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIGlmIChlZGl0ZWRTdWJ2YWx1ZSAmJiBlZGl0ZWRTdWJ2YWx1ZS5uYW1lICE9PSBmb3JtRGF0YS5uYW1lICYmIGl0ZW1zTGlzdCkge1xyXG4gICAgICAgIGl0ZW1zTGlzdC5yZXBhaW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgdXBkYXRlRm9ybVN0YXRlKGUuY29tcG9uZW50KTtcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5NZWFzdXJlKTogc3RyaW5nIHtcclxuICBpZiAobWVhc3VyZS5uYW1lKCkpIHtcclxuICAgIHJldHVybiBtZWFzdXJlLm5hbWUoKTtcclxuICB9XHJcblxyXG4gIGxldCByZXN1bHQgPSBtZWFzdXJlLmRhdGFNZW1iZXIoKTtcclxuICBpZiAobWVhc3VyZS5zdW1tYXJ5VHlwZSAmJiBtZWFzdXJlLnN1bW1hcnlUeXBlKCkpIHtcclxuICAgIHJlc3VsdCArPSBgICgke21lYXN1cmUuc3VtbWFyeVR5cGUoKX0pYDtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEluZGljYXRvckZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcclxuICBjb25zdCBjdXJyZW50Vmlld1R5cGUgPSBnYXVnZUl0ZW0udmlld1R5cGUoKTtcclxuICBjb25zdCBpbmRpY2F0b3JUeXBlcyA9IExJTkVBUl9WSUVXX1RZUEVTLnNvbWUoKHQpID0+IHQgPT09IGN1cnJlbnRWaWV3VHlwZSlcclxuICAgID8gTElORUFSX0lORElDQVRPUl9UWVBFU1xyXG4gICAgOiBDSVJDTFVBUl9JTkRJQ0FUT1JfVFlQRVM7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBmb3JtRGF0YTogZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pIHx8IG51bGwsXHJcbiAgICBpdGVtczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgY2FwdGlvbjogJ0luZGljYXRvciBvcHRpb25zJyxcclxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd0eXBlJyxcclxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcclxuICAgICAgICAgICAgbGFiZWw6IHtcclxuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxyXG4gICAgICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpdGVtczogaW5kaWNhdG9yVHlwZXMubWFwKCh0KSA9PiAoeyB0ZXh0OiB0LCB2YWx1ZTogdCB9KSksXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd3aWR0aCcsXHJcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeE51bWJlckJveCcsXHJcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keE51bWJlckJveE9wdGlvbnMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgICAgdGV4dDogJ1dpZHRoJyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKGdhdWdlSXRlbSk7XHJcblxyXG4gICAgICBvcHRpb25zLndpZHRoID0gZm9ybURhdGEud2lkdGg7XHJcbiAgICAgIG9wdGlvbnMudHlwZSA9IGZvcm1EYXRhLnR5cGU7XHJcblxyXG4gICAgICBzZXRPcHRpb25zKGdhdWdlSXRlbSwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLy8gNC4gRXZlbnQgU3Vic2NyaXB0aW9uXHJcbmV4cG9ydCBmdW5jdGlvbiBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbih0aGlzOiBhbnksIGRhc2hib2FyZENvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICB0aGlzLm5hbWUgPSAnR2F1Z2VTdWJ2YWx1ZXMnO1xyXG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XHJcbiAgICBpZiAodmlld2VyQXBpRXh0ZW5zaW9uKSB7XHJcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vbignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zUGFuZWxFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ2l0ZW0tb3B0aW9ucy1wYW5lbCcpIGFzIGFueTtcclxuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcclxuICAgICAgb3B0aW9uc1BhbmVsRXh0ZW5zaW9uLm9uKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgdGhpcy5zdG9wID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xyXG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xyXG4gICAgICB2aWV3ZXJBcGlFeHRlbnNpb24ub2ZmKCdpdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkJywgb25JdGVtV2lkZ2V0T3B0aW9uc1ByZXBhcmVkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xyXG4gICAgaWYgKG9wdGlvbnNQYW5lbEV4dGVuc2lvbikge1xyXG4gICAgICBvcHRpb25zUGFuZWxFeHRlbnNpb24ub2ZmKCdjdXN0b21pemVTZWN0aW9ucycsIG9uQ3VzdG9taXplU2VjdGlvbnMpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElEYXNoYm9hcmRQZXJtaXNzaW9ucywgSURhc2hib2FyZFVybHMsIElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHsgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24gfSBmcm9tICcuL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24nO1xyXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xyXG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5cclxuY29uc3QgREFTSEJPQVJEX01PREVfS0VZID0gJ0RBU0hCT0FSRF9NT0RFX0tFWSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEYXNoYm9hcmRPcHRpb25zIHtcclxuICAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHBlcm1pc3Npb25zOiBJRGFzaGJvYXJkUGVybWlzc2lvbnM7XHJcbiAgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uczogSURhc2hib2FyZFBlcm1pc3Npb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsczogSURhc2hib2FyZFVybHM7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgZGFzaGJvYXJkOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEYXNoYm9hcmRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRkYXNoYm9hcmRDb250YWluZXIgPSBvcHRpb25zLiRkYXNoYm9hcmRDb250YWluZXI7XHJcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5yZXBvcnRJZCA9IG9wdGlvbnMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XHJcbiAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCByZXBvcnRJZFN0ciA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkICYmIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgRGV2RXhwcmVzcy5EYXNoYm9hcmQuUmVzb3VyY2VNYW5hZ2VyLmVtYmVkQnVuZGxlZFJlc291cmNlcygpO1xyXG5cclxuICAgIGxldCBtb2RlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSA9IHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nXHJcbiAgICAgID8gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLldvcmtpbmdNb2RlIHx8ICdWaWV3ZXInXHJcbiAgICAgIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTk9URTogRGFzaGJvYXJkIDE4LjEgZG9lc24ndCBzdXBwb3J0IGV4cG9ydC4gV2UgaGlkZSB0aGUgZXhwb3J0IGJ1dHRvbiB2aWEgc3R5bGVzXHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKHRoaXMuJGRhc2hib2FyZENvbnRhaW5lclswXSwge1xyXG4gICAgICB3b3JraW5nTW9kZTogbW9kZSxcclxuICAgICAgaW5pdGlhbERhc2hib2FyZElkOiByZXBvcnRJZFN0cixcclxuICAgICAgZW5kcG9pbnQ6IHRoaXMudXJscy5FbmRQb2ludCxcclxuICAgICAgYWpheFJlbW90ZVNlcnZpY2U6IHtcclxuICAgICAgICBoZWFkZXJzOiAhdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW4gPyB1bmRlZmluZWQgOiB7XHJcbiAgICAgICAgICB0b2tlbjogdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRGFzaGJvYXJkSW5pdGlhbGl6aW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGUuY29tcG9uZW50LnJlZ2lzdGVyRXh0ZW5zaW9uKG5ldyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbihlLmNvbXBvbmVudCkpO1xyXG5cclxuICAgICAgICBpZiAocmVwb3J0SWRTdHIgIT09IGUuZGFzaGJvYXJkSWQpIHtcclxuICAgICAgICAgIHJlcG9ydElkU3RyID0gZS5kYXNoYm9hcmRJZDtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZW5jb2RlVVJJKHRoaXMudXJscy5QcmV2aWV3VXJsICsgZS5kYXNoYm9hcmRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkJlZm9yZVJlbmRlcjogKGUpID0+IHtcclxuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVGV4dEJveEl0ZW1FZGl0b3JFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcclxuICAgICAgfSxcclxuICAgICAgZXh0ZW5zaW9uczoge1xyXG4gICAgICAgICdkYXRhLXNvdXJjZS13aXphcmQnOiB7XHJcbiAgICAgICAgICBlbmFibGVDdXN0b21TcWw6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgICdkYXNoYm9hcmQtZXhwb3J0Jzoge1xyXG4gICAgICAgICAgYWxsb3dFeHBvcnREYXNoYm9hcmRJdGVtczogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2RhdGEtaW5zcGVjdG9yJzoge1xyXG4gICAgICAgICAgYWxsb3dJbnNwZWN0QWdncmVnYXRlZERhdGE6IHRydWUsXHJcbiAgICAgICAgICBhbGxvd0luc3BlY3RSYXdEYXRhOiB0cnVlLFxyXG4gICAgICAgICAgb25HcmlkSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBlLmNvbXBvbmVudCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XHJcbiAgICAgICAgICAgIGdyaWQub3B0aW9uKCdleHBvcnQuZW5hYmxlZCcsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVuZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gJ1ZpZXdlcicgPyAnU3dpdGNoIHRvIERlc2lnbmVyJyA6ICdTd2l0Y2ggdG8gVmlld2VyJyxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gJ1ZpZXdlcicgPyAnRGVzaWduZXInIDogJ1ZpZXdlcic7XHJcblxyXG4gICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCksIG1vZGUpO1xyXG5cclxuICAgICAgICAgIGlmIChtb2RlID09PSAnVmlld2VyJykge1xyXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZC5zd2l0Y2hUb1ZpZXdlcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBEZXNpZ25lcicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9EZXNpZ25lcigpO1xyXG4gICAgICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgJ1N3aXRjaCB0byBWaWV3ZXInKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICByZW1vdmVSZWR1bmRhbnRUb29sYm94SXRlbXModGhpcy5kYXNoYm9hcmQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiAmJiAodGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhc2hib2FyZD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBudWxsO1xyXG5cclxuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIERBU0hCT0FSRF9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXNoYm9hcmQucmVmcmVzaCgpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKGNvbnRyb2w6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wpIHtcclxuICBjb25zdCBpdGVtc1RvUmVtb3ZlID0gWydjcmVhdGUtZGFzaGJvYXJkJywgJ29wZW4tZGFzaGJvYXJkJ107XHJcbiAgY29uc3QgdG9vbGJveCA9IGNvbnRyb2wuZmluZEV4dGVuc2lvbigndG9vbGJveCcpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRvb2xib3hFeHRlbnNpb247XHJcbiAgaXRlbXNUb1JlbW92ZS5mb3JFYWNoKChpdGVtSWQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0b29sYm94Lm1lbnVJdGVtcygpLmZpbHRlcigoaSkgPT4gaS5pZCA9PT0gaXRlbUlkKVswXTtcclxuXHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICB0b29sYm94LnJlbW92ZU1lbnVJdGVtKGl0ZW1JZCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcclxuXHJcbmNvbnN0IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBEZXNpZ25lcic7XHJcbmNvbnN0IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuY29uc3QgU0VTU0lPTl9TVE9SQUdFX01PREVfS0VZID0gJ3JlcG9ydE1vZGUnO1xyXG5jb25zdCBDVVJSRU5UX1VSTF9LRVkgPSAnY3VzdG9tQ3VycmVudFVybCc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IGR4UmVwb3J0RGVzaWduZXI6IGFueTtcclxuY29uc3Qga28gPSAod2luZG93IGFzIGFueSkua287XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvcnRPcHRpb25zIHtcclxuICAkcmVwb3J0Q29udGFpbmVyOiBKUXVlcnk7XHJcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZXBvcnRPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRyZXBvcnRDb250YWluZXIgPSBvcHRpb25zLiRyZXBvcnRDb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuZGVzaWduZXJNb2RlbFVybCA9IG9wdGlvbnMuZGVzaWduZXJNb2RlbFVybDtcclxuICAgIHRoaXMucmVwb3J0SWQgPSBvcHRpb25zLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICB9XHJcblxyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gICAgbGV0IGJ1dHRvbiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpIHtcclxuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RlID0gbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XHJcbiAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgbW9kZSk7XHJcbiAgICAgICAgICB0aGlzLnN3aXRjaE1vZGUobW9kZSwgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVSZXBvcnREZXNpZ25lcih0aGlzLiRyZXBvcnRDb250YWluZXIsIHRoaXMuZGVzaWduZXJNb2RlbFVybCwgJ2R4UmVwb3J0RGVzaWduZXInLCB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZC50b1N0cmluZygpLCAocykgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN3aXRjaE1vZGVCdXR0b24obW9kZSwgYnV0dG9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCBtb2RlID09PSBNb2RlLlZpZXdlcik7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlzTm90U2F2ZWRSZXBvcnQgPSBkeFJlcG9ydERlc2lnbmVyICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpLmlzRGlydHk7XHJcblxyXG4gICAgICBpZiAoaXNOb3RTYXZlZFJlcG9ydCkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSByZXBvcnQgZG9jdW1lbnQgaXMgbm90IHNhdmVkLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhlIHBhZ2U/JztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIpIHtcclxuICAgIGNvbnN0IHJlcG9ydFByZXZpZXcgPSBkZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3O1xyXG4gICAgY29uc3QgUmVwb3J0UHJldmlld1NlcnZpY2UgPSAoRGV2RXhwcmVzcyBhcyBhbnkpLlJlcG9ydGluZy5EZXNpZ25lci5JbnRlcm5hbC5SZXBvcnRQcmV2aWV3U2VydmljZTtcclxuXHJcbiAgICByZXBvcnRQcmV2aWV3LmluaXRpYWxpemUoUmVwb3J0UHJldmlld1NlcnZpY2UuaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIuZGVzaWduZXJNb2RlbC5tb2RlbCgpKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN3aXRjaE1vZGUobW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XHJcbiAgICBpZiAobW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcclxuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhkeFJlcG9ydERlc2lnbmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGR4UmVwb3J0RGVzaWduZXIuZGVzaWduZXJNb2RlbC5yZXBvcnRQcmV2aWV3TW9kZWwucmVwb3J0UHJldmlldy5wcmV2aWV3VmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcuZGVhY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG4gICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgbW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IFNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlcG9ydERlc2lnbmVyKFxyXG4gICAgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5LFxyXG4gICAgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nLFxyXG4gICAgZ2xvYmFsTmFtZTogc3RyaW5nLFxyXG4gICAgcmVwb3J0SWRTdHI6IHN0cmluZyxcclxuICAgIG9uSW5pdEhhbmRsZXI6IChzZW5kZXI6IGFueSkgPT4gdm9pZCxcclxuICAgIGlzUHJldmlld01vZGU6IGJvb2xlYW5cclxuICApOiBKUXVlcnk8SFRNTEVsZW1lbnQ+IHtcclxuICAgIGNvbnN0IGRlc2lnbmVyID0gJHJlcG9ydENvbnRhaW5lclxyXG4gICAgICAuYXR0cignZGF0YS1iaW5kJywgJ2R4UmVwb3J0RGVzaWduZXI6IGRlc2lnbmVyT3B0aW9ucycpXHJcbiAgICAgIC5hZGRDbGFzcygncmVwb3J0LWRlc2lnbmVyJyk7XHJcblxyXG4gICAgY29uc3QgZGVzaWduZXJPcHRpb25zID0ge1xyXG4gICAgICByZXBvcnRVcmw6IHJlcG9ydElkU3RyLFxyXG4gICAgICByZXF1ZXN0T3B0aW9uczoge1xyXG4gICAgICAgIGdldERlc2lnbmVyTW9kZWxBY3Rpb246IGRlc2lnbmVyTW9kZWxVcmxcclxuICAgICAgfSxcclxuICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgQmVmb3JlUmVuZGVyOiAocykgPT4ge1xyXG4gICAgICAgICAgKHdpbmRvdyBhcyBhbnkpW2dsb2JhbE5hbWVdID0gcztcclxuXHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICBzLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlIDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBvbkluaXRIYW5kbGVyKHMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuQ3VzdG9taXplTWVudUFjdGlvbnMsXHJcbiAgICAgICAgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zOiB0aGlzLlByZXZpZXdDdXN0b21pemVNZW51QWN0aW9ucyxcclxuICAgICAgICBSZXBvcnRPcGVuZWQ6IChzLCBlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcmV2aWV3KHMpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuUmVwb3J0T3BlbmVkKHMsIGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUmVwb3J0VGFiQ2xvc2VkOiB0aGlzLlJlcG9ydFRhYkNsb3NlZFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGtvLmFwcGx5QmluZGluZ3MoeyBkZXNpZ25lck9wdGlvbnMgfSwgZGVzaWduZXJbMF0pO1xyXG5cclxuICAgIHJldHVybiBkZXNpZ25lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IHNob3dEZXNpZ25lckl0ZW0gPSBlLkdldEJ5SWQoKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuVmlld2VyLkFjdGlvbklkLkRlc2lnbik7XHJcblxyXG4gICAgaWYgKHNob3dEZXNpZ25lckl0ZW0pIHtcclxuICAgICAgc2hvd0Rlc2lnbmVySXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEN1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcclxuICAgIGNvbnN0IEFjdGlvbklkID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZDtcclxuICAgIGNvbnN0IGFjdGlvbklkc1RvTW92ZUluVG9vbGJhcjogc3RyaW5nW10gPSBbQWN0aW9uSWQuU2F2ZV07XHJcbiAgICBjb25zdCBhY3Rpb25JZHNUb0hpZGU6IHN0cmluZ1tdID0gW0FjdGlvbklkLk5ld1JlcG9ydCwgQWN0aW9uSWQuTmV3UmVwb3J0VmlhV2l6YXJkLCBBY3Rpb25JZC5PcGVuUmVwb3J0LFxyXG4gICAgICBBY3Rpb25JZC5QcmV2aWV3LCBBY3Rpb25JZC5TYXZlQXMsIEFjdGlvbklkLkV4aXRdO1xyXG5cclxuICAgIGFjdGlvbklkc1RvTW92ZUluVG9vbGJhci5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcclxuXHJcbiAgICAgIGlmIChpdGVtICYmIChpdGVtLmNvbnRhaW5lciA9PT0gJ21lbnUnKSkge1xyXG4gICAgICAgIGl0ZW0uY29udGFpbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhY3Rpb25JZHNUb0hpZGUuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IGUuR2V0QnlJZChpZCk7XHJcblxyXG4gICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzYXZlQWN0aW9uID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQuU2F2ZSk7XHJcbiAgICBjb25zdCBvcmlnQ2xpY2tBY3Rpb24gPSBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uO1xyXG4gICAgc2F2ZUFjdGlvbi5jbGlja0FjdGlvbiA9ICgpID0+IHtcclxuICAgICAgY29uc3QgdGFiID0gcy5HZXRDdXJyZW50VGFiKCk7XHJcbiAgICAgIHRhYi51cmwoa28udW53cmFwKHNbQ1VSUkVOVF9VUkxfS0VZXSkpO1xyXG4gICAgICBvcmlnQ2xpY2tBY3Rpb24oKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFJlcG9ydE9wZW5lZChzLCBlKSB7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0gPSBzW0NVUlJFTlRfVVJMX0tFWV0gfHwga28ub2JzZXJ2YWJsZSgpO1xyXG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKGUuVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgUmVwb3J0VGFiQ2xvc2VkKHMsIGUpIHtcclxuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XHJcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0obnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTRVNTSU9OX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcclxuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XHJcbmltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEaWFncmFtUGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhZ3JhbVBhZ2UgaW1wbGVtZW50cyBJUmVwb3J0Q29tcG9uZW50IHtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBWaWV3ZXInO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgRElBR1JBTV9TVE9SQUdFX01PREVfS0VZID0gJ0RJQUdSQU1fU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhZ3JhbUNvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGRpYWdyYW06IERldkV4cHJlc3MudWkuZHhEaWFncmFtO1xyXG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlhZ3JhbVBhZ2VPcHRpb25zKSB7XHJcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwgPSBvcHRpb25zLmRpYWdyYW1Db250cm9sbGVyVXJsO1xyXG5cclxuICAgIHRoaXMubW9kZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBNb2RlIHx8IE1vZGUuVmlld2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURpYWdyYW1Db250cm9sKCk7XHJcbiAgICB0aGlzLmluaXREaWFncmFtKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xyXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLmRpYWdyYW0tZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmRpYWdyYW1Db250cm9sbGVyVXJsfT9pZD0ke3RoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkfWAsICdnZXQnKS50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIGZhbHNlKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaWFncmFtQ29udHJvbCgpIHtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IHRoaXMuJGNvbnRhaW5lci5keERpYWdyYW0oe1xyXG4gICAgICBoaXN0b3J5VG9vbGJhcjoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgY29tbWFuZHM6IFsnc2VwYXJhdG9yJywgJ3VuZG8nLCAncmVkbycsICdzZXBhcmF0b3InLCB7IG5hbWU6ICdzYXZlJywgdGV4dDogJ1NhdmUnLCBpY29uOiAnc2F2ZScgfV0gYXMgYW55XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ3VzdG9tQ29tbWFuZDogKGUpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGUubmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAnc2F2ZSc6XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZVJlcG9ydChlLmNvbXBvbmVudC5leHBvcnQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZnVsbFNjcmVlbjogZmFsc2UsXHJcbiAgICAgIHJlYWRPbmx5OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyXHJcbiAgICB9KS5keERpYWdyYW0oJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREaWFncmFtKCkge1xyXG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmRpYWdyYW0uaW1wb3J0KEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJykpIHtcclxuICAgICAgICBlLnJldHVyblZhbHVlID0gJ1RoZSBkb2N1bWVudCBpcyBub3Qgc2F2ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZSB0aGUgcGFnZT8nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdyZWFkT25seScsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpO1xyXG4gICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcclxuICAgICAgfVxyXG4gICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVJlcG9ydChzb3VyY2U6IHN0cmluZykge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcclxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwsICdwb3N0JywgeyBpZCwgc291cmNlIH0sIHRydWUpO1xyXG4gICAgdGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRElBR1JBTV9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xyXG5pbXBvcnQge01lbnVJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vQnVzaW5lc3MnO1xyXG5pbXBvcnQge0lDZG1SZXBvcnRQYXJhbXMsIElHcmlkUmVwb3J0UGFyYW1zLCBJUmVwb3J0UGFyYW1zfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcclxuaW1wb3J0IFJlZnJlc2hUaW1lciBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9JbmRleCc7XHJcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4uL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuLi9HcmlkL0luZGV4JztcclxuaW1wb3J0IENETVJlcG9ydFBhZ2UgZnJvbSAnLi4vQ0RNL0luZGV4JztcclxuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuLi9SZXBvcnQvSW5kZXgnO1xyXG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi4vRGlhZ3JhbS9JbmRleCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElOZXN0ZWRSZXBvcnQgZXh0ZW5kcyBJUmVwb3J0UGFyYW1zIHtcclxuICBUeXBlOiBNZW51SXRlbVR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhcmFtcyBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xyXG4gIFJlcG9ydHM6IElOZXN0ZWRSZXBvcnRbXTtcclxuICBEZWxheVNlYzogbnVtYmVyO1xyXG4gIFJlZnJlc2hTZWM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMge1xyXG4gICRjb250YWluZXI6IEpRdWVyeTtcclxuICByZXBvcnRQYXJhbXM6IElTbGlkZXNob3dSZXBvcnRQYXJhbXM7XHJcbiAgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXNob3dSZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFyYW1zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3RFbGVtZW50OiBKUXVlcnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRzOiBJUmVwb3J0Q29tcG9uZW50W10gPSBbXTtcclxuICBwcml2YXRlIGR4R2FsbGVyeTogRGV2RXhwcmVzcy51aS5keEdhbGxlcnk7XHJcbiAgcHJpdmF0ZSByZWZyZXNoVGltZW91dDogUmVmcmVzaFRpbWVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xyXG4gICAgdGhpcy4kcm9vdEVsZW1lbnQgPSBvcHRpb25zLiRjb250YWluZXI7XHJcbiAgICB0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5ncyA9IG9wdGlvbnMuZGVmYXVsdFJlcG9ydFNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xyXG4gICAgICByZXBvcnQuZGlzcG9zZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcclxuICAgICAgcmVwb3J0LnJlZnJlc2goKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50KCkge1xyXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XHJcbiAgICBsZXQgY3VycmVudFRpbWVvdXQgPSBudWxsO1xyXG4gICAgY29uc3QgbWF4SW5kZXggPSB0aGlzLm9wdGlvbnMuUmVwb3J0cy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3Qgc2V0dXBOZXh0SXRlbVNlbGVjdCA9ICgpID0+IHtcclxuICAgICAgY3VycmVudFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XHJcblxyXG4gICAgICAgIGlmKG5leHRJbmRleCA+PSBtYXhJbmRleCkge1xyXG4gICAgICAgICAgbmV4dEluZGV4ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZHhHYWxsZXJ5LmdvVG9JdGVtKG5leHRJbmRleCwgdHJ1ZSk7XHJcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5EZWxheVNlYyAqIDEwMDApO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0JyB9KS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XHJcbiAgICBjb25zdCAkZ2FsbGVyeSA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ2FsbGVyeScgfSkuZHhHYWxsZXJ5KHtcclxuICAgICAgbG9vcDogZmFsc2UsXHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMub3B0aW9ucy5SZXBvcnRzLFxyXG4gICAgICBzbGlkZXNob3dEZWxheTogMCxcclxuICAgICAgc2hvd05hdkJ1dHRvbnM6IGZhbHNlLFxyXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxyXG4gICAgICBzdHJldGNoSW1hZ2VzOiB0cnVlLFxyXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcclxuICAgICAgb25Jbml0aWFsaXplZDogKCkgPT4gc2V0dXBOZXh0SXRlbVNlbGVjdCgpLFxyXG4gICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgY3VycmVudEluZGV4ID0gZS5jb21wb25lbnQub3B0aW9uKCdzZWxlY3RlZEluZGV4Jyk7XHJcblxyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoY3VycmVudFRpbWVvdXQpO1xyXG4gICAgICAgIHNldHVwTmV4dEl0ZW1TZWxlY3QoKTtcclxuICAgICAgfSxcclxuICAgICAgaXRlbVRlbXBsYXRlOiAocmVwb3J0UGFyYW1zOiBJTmVzdGVkUmVwb3J0LCBpbmRleCwgaXRlbUVsZW1lbnQpID0+IHtcclxuICAgICAgICBpdGVtRWxlbWVudC5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19nYWxsZXJ5LWl0ZW0nIH0pLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgICAgICBjb25zdCAkc2xpZGVFbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0X19zbGlkZS1jb250ZW50JyB9KS5oZWlnaHQoJzEwMCUnKTtcclxuICAgICAgICBsZXQgcmVwb3J0U2xpZGU6IElSZXBvcnRDb21wb25lbnQ7XHJcblxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAocmVwb3J0UGFyYW1zLlR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGFzaGJvYXJkOlxyXG4gICAgICAgICAgICAgIGNvbnN0ICRkYXNoYm9hcmRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3JlcG9ydC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRGFzaGJvYXJkUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRhc2hib2FyZF0gfHwge30pLFxyXG4gICAgICAgICAgICAgICAgJGRhc2hib2FyZENvbnRhaW5lcjogJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHJlcG9ydFBhcmFtczogcmVwb3J0UGFyYW1zIGFzIElSZXBvcnRQYXJhbXNcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCdkYXNoYm9hcmQtdGl0bGUnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5maW5kKCcuZHgtZGFzaGJvYXJkLWxheW91dC1jb250YWluZXInKS5jc3MoeyB0b3A6IDAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HcmlkVmlldzpcclxuICAgICAgICAgICAgICBjb25zdCAkZ3JpZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XHJcbiAgICAgICAgICAgICAgJHNsaWRlRWxlbWVudC5hZGRDbGFzcygnaXN6b2xlYS10aGVtZScpLmFkZENsYXNzKCdwYW5lbC1ib2R5Jyk7XHJcblxyXG4gICAgICAgICAgICAgICRncmlkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdyaWRSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR3JpZFZpZXddIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgIGdyaWRQb3NpdGlvbk1hcmtlcjogJGdyaWRQb3NpdGlvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkNETTpcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBDRE1SZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuQ0RNXSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkc2xpZGVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElDZG1SZXBvcnRQYXJhbXMsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlJlcG9ydDpcclxuICAgICAgICAgICAgICBjb25zdCAkcmVwb3J0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xyXG4gICAgICAgICAgICAgICRyZXBvcnRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgcmVwb3J0U2xpZGUgPSBuZXcgRFhSZXBvcnRQYWdlKHtcclxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuUmVwb3J0XSB8fCB7fSksXHJcbiAgICAgICAgICAgICAgICAkcmVwb3J0Q29udGFpbmVyOiAkcmVwb3J0UG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGlhZ3JhbTpcclxuICAgICAgICAgICAgICBjb25zdCAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcclxuICAgICAgICAgICAgICAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudC5hcHBlbmRUbygkc2xpZGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEaWFncmFtUmVwb3J0UGFnZSh7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRpYWdyYW1dIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICRjb250YWluZXI6ICRkaWFncmFtUG9zaXRpb25FbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgSVJlcG9ydFBhcmFtcyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuTWVudU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLlNsaWRlc2hvdzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVwb3J0U2xpZGUpIHtcclxuICAgICAgICAgICAgcmVwb3J0U2xpZGUuaW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydHMucHVzaChyZXBvcnRTbGlkZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcbiAgICAgICAgJHNsaWRlRWxlbWVudC5hcHBlbmRUbyhpdGVtRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZHhHYWxsZXJ5ID0gJGdhbGxlcnkuZHhHYWxsZXJ5KCdpbnN0YW5jZScpO1xyXG5cclxuICAgICRnYWxsZXJ5LmFwcGVuZFRvKCR2aWV3KTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hUaW1lb3V0ID0gbmV3IFJlZnJlc2hUaW1lcih7Y2FsbGJhY2s6ICgpID0+IHRoaXMucmVmcmVzaCgpLCBlbGFwc2VkQ2FsbGJhY2s6IChlKSA9PiB7fX0pO1xyXG4gICAgdGhpcy5yZWZyZXNoVGltZW91dC5zdGFydCh0aGlzLm9wdGlvbnMuUmVmcmVzaFNlYyAqIDEwMDApO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xyXG5pbXBvcnQgeyBJUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XHJcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcclxuaW1wb3J0IHsgR3JpZERhdGFDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uLy4uL1dpZGdldHMvSUdyaWRTdGF0ZSc7XHJcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElHYW50dENoYXJ0T3B0aW9ucyB7XHJcbiAgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcbiAgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcclxuICBzaG93SGVhZGVyOiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSUdhbnR0VGFzayB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBQYXJlbnRJZDogbnVtYmVyO1xyXG4gIFRpdGxlOiBzdHJpbmc7XHJcbiAgU3RhcnQ6IERhdGU7XHJcbiAgRW5kOiBEYXRlO1xyXG4gIFByb2dyZXNzOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHREZXBlbmRlbmN5XHJcbntcclxuICBJZDogbnVtYmVyO1xyXG4gIFByZWRlY2Vzc29ySWQ6IG51bWJlcjtcclxuICBTdWNjZXNzb3JJZDogbnVtYmVyO1xyXG4gIFR5cGU6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlIHtcclxuICBJZDogbnVtYmVyO1xyXG4gIFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlQXNzaWdubWVudCB7XHJcbiAgSWQ6IG51bWJlcjtcclxuICBUYXNrSWQ6IG51bWJlcjtcclxuICBSZXNvdXJjZUlkOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDaGFydERhdGFNb2RlbCB7XHJcbiAgVGFza3M6IElHYW50dFRhc2tbXTtcclxuICBEZXBlbmRlbmNpZXM6IElHYW50dERlcGVuZGVuY3lbXTtcclxuICBSZXNvdXJjZXM6IElHYW50dFJlc291cmNlW107XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50czogSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50W107XHJcbn1cclxuXHJcbmludGVyZmFjZSBJR2FudHRDb2x1bW5TdGF0ZSB7XHJcbiAgZGF0YUZpZWxkPzogc3RyaW5nO1xyXG4gIGRhdGFUeXBlPzogR3JpZERhdGFDb2x1bW5EYXRhVHlwZTtcclxuICB3aWR0aD86IHN0cmluZztcclxuICBzb3J0SW5kZXg/OiBudW1iZXI7XHJcbiAgc29ydE9yZGVyPzogc3RyaW5nO1xyXG4gIGNhcHRpb24/OiBzdHJpbmc7XHJcbiAgdmlzaWJsZT86IGJvb2xlYW47XHJcbiAgdmlzaWJsZUluZGV4PzogbnVtYmVyO1xyXG4gIHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElHYW50dFNldHRpbmdzIHtcclxuICBUYXNrQ29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSxcclxuICBEYkNvbm5lY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzVGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgUmVzb3VyY2VzS2V5RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZXNUZXh0RmllbGQ6IHN0cmluZyxcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWU6IHN0cmluZztcclxuICBSZXNvdXJjZUFzc2lnbm1lbnRLZXlGaWVsZDogc3RyaW5nO1xyXG4gIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiBzdHJpbmc7XHJcbiAgUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmVudW0gR2FudHRUYXNrc0NvbHVtblR5cGVcclxue1xyXG4gIEtleSA9IDEsXHJcbiAgVGl0bGUgPSAyLFxyXG4gIFN0YXJ0ID0gMyxcclxuICBFbmQgPSA0LFxyXG4gIFBhcmVudElkID0gNSxcclxuICBQcm9ncmVzcyA9IDZcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FubnRDaGFydCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcclxuICBwcml2YXRlIHJlYWRvbmx5IENIQVJUX1NUT1JBR0VfTU9ERV9LRVkgPSAnQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdhbnR0UmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbW9kZTogTW9kZTtcclxuICBwcml2YXRlIGhhc0Zvcm0gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjaGFydDogRGV2RXhwcmVzcy51aS5keEdhbnR0IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHYW50dENoYXJ0T3B0aW9ucykge1xyXG4gICAgdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyID0gb3B0aW9ucy5jaGFydFBvc2l0aW9uTWFya2VyO1xyXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcclxuICAgIHRoaXMuYWRkUmVmcmVzaEJ1dHRvbiA9IG9wdGlvbnMuYWRkUmVmcmVzaEJ1dHRvbjtcclxuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XHJcbiAgICB0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsO1xyXG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xyXG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncyA9IHtcclxuICAgICAgRGJDb25uZWN0aW9uTmFtZTogJycsIFRhYmxlTmFtZTogJycsIFRhc2tDb2x1bW5zOiBbXSxcclxuICAgICAgUmVzb3VyY2VzVGFibGVOYW1lOiAnJywgUmVzb3VyY2VzVGV4dEZpZWxkOiAnJywgUmVzb3VyY2VzS2V5RmllbGQ6ICcnLFxyXG4gICAgICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiAnJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdID0gW107XHJcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IElHYW50dFNldHRpbmdzKSA9PiB7XHJcbiAgICAgICAgZ2FudHRTZXR0aW5ncyA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmKCFnYW50dFNldHRpbmdzLkRiQ29ubmVjdGlvbk5hbWUgfHwgIWdhbnR0U2V0dGluZ3MuVGFibGVOYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zIHx8ICFnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IFtdO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gPSAwOyBpdGVtIDwgNjsgaXRlbSsrKSB7XHJcbiAgICAgICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMucHVzaCh7IHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZVtHYW50dFRhc2tzQ29sdW1uVHlwZVtpdGVtKzFdXSB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhLlRhc2tDb2x1bW5zLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgIGNvbHVtbnNbYy50YXNrQ29sdW1uVHlwZS0xXSA9IGM7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdhbnR0U2V0dGluZ3MuVGFza0NvbHVtbnMgPSBjb2x1bW5zO1xyXG5cclxuICAgICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0RGF0YWAsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHtcclxuICAgICAgICAgIGRhdGFUeXBlOiAnanNvbidcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGE6IHsgRGF0YTogSUdhbnR0Q2hhcnREYXRhTW9kZWwgfSkgPT4ge1xyXG4gICAgICAgIGlmKCFpc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLm1vZGUgPT09IE1vZGUuRGVzaWduZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsICFpc0luaXRpYWxpemVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBDaGFydChkYXRhLkRhdGEsIGNvbHVtbnMsIGdhbnR0U2V0dGluZ3MpO1xyXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcclxuICAgICAgdGhpcy5pbml0U3dpdGNoTW9kZUJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlciA9IGluaXRQb3BvdmVyKCcuZGlhZ3JhbS1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XHJcbiAgICBjb25zdCBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xyXG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxyXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IE1vZGUuRGVzaWduZXIgOiBNb2RlLlZpZXdlcjtcclxuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcclxuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZvcm0oZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MsIGluaXRpYWxTZXR1cDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oYXNGb3JtID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtSXRlbXM6IERldkV4cHJlc3MudWkuZHhGb3JtLkl0ZW1bXSA9IFtcclxuICAgICAgeyBkYXRhRmllbGQ6ICdEYkNvbm5lY3Rpb25OYW1lJywgY2FwdGlvbjogJ0Nvbm5lY3Rpb24gTmFtZScgfSxcclxuICAgICAgeyBkYXRhRmllbGQ6ICdUYWJsZU5hbWUnLCBjYXB0aW9uOiAnVGFibGUnIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAobGV0IGl0ZW0gPSAxOyBpdGVtIDwgNzsgaXRlbSsrKSB7XHJcbiAgICAgIGZvcm1JdGVtcy5wdXNoKHsgaXRlbVR5cGU6ICdncm91cCcsIGNvbENvdW50OiA4LCBpdGVtczogW1xyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnRhc2tDb2x1bW5UeXBlYCwgdmlzaWJsZTogZmFsc2UgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhRmllbGRgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6IGAke0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW1dfSBEYXRhIEZpZWxkYCB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uY2FwdGlvbmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0NhcHRpb24nIH0gfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5kYXRhVHlwZWAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0RhdGFUeXBlJyB9IH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0ud2lkdGhgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdXaWR0aCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRJbmRleCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxyXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRPcmRlcmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRPcmRlcicgfSwgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JywgZWRpdG9yT3B0aW9uczogeyBpdGVtczogWydhc2MnLCAnZGVzYyddLCBzaG93Q2xlYXJCdXR0b246IHRydWUgfSBhcyBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94LlByb3BlcnRpZXMgfSxcclxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS52aXNpYmxlYCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZScgfSwgZWRpdG9yVHlwZTogJ2R4Q2hlY2tCb3gnIH0sXHJcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZUluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZUluZGV4JyB9IH0sXHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtSXRlbXMucHVzaCh7XHJcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxyXG4gICAgICBjYXB0aW9uOiAnUmVzb3VyY2VzJyxcclxuICAgICAgY29sQ291bnQ6IDQsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcgLHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzS2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RleHRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RleHQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcclxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlIEFzc2lnbm1lbnRzJyxcclxuICAgICAgY29sQ291bnQ6IDUsXHJcbiAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdLZXkgRmllbGQnIH0gfSxcclxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVGFzayBJZCBGaWVsZCcgfSB9LFxyXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUmVzb3VyY2UgSWQgRmllbGQnIH0gfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9ybUl0ZW1zLnB1c2goe1xyXG4gICAgICBpdGVtVHlwZTogJ2J1dHRvbicsXHJcbiAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcclxuICAgICAgICB0ZXh0OiAnU2F2ZScsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYW50dFNldHRpbmdzO1xyXG5cclxuICAgICAgICAgIGlmKGRhdGEuVGFza0NvbHVtbnMpIHtcclxuICAgICAgICAgICAgZGF0YS5UYXNrQ29sdW1ucyA9IGRhdGEuVGFza0NvbHVtbnMuZmlsdGVyKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCwgc2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpKSB9LCB0cnVlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2IC8+JykuY3NzKCdwYWRkaW5nJywgMjApLmluc2VydEFmdGVyKHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlcikuZHhGb3JtKHtcclxuICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgaGVpZ2h0OiBpbml0aWFsU2V0dXAgPyAnY2FsYygxMDAlIC0gNTBweCknIDogJ2NhbGMoNTAlIC0gNTBweCknLFxyXG4gICAgICBmb3JtRGF0YTogZ2FudHRTZXR0aW5ncyxcclxuICAgICAgc2Nyb2xsaW5nRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgaXRlbXM6IGZvcm1JdGVtc1xyXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cENoYXJ0IChkYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCwgY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSwgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MpIHtcclxuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcclxuICAgIGxldCB1c2VBdXRvV2lkdGggPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5zTWFwcGluZyA9IHt9O1xyXG5cclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICBpZiAoYy50YXNrQ29sdW1uVHlwZSkge1xyXG4gICAgICAgIGNvbHVtbnNNYXBwaW5nW2MudGFza0NvbHVtblR5cGVdID0gYy5kYXRhRmllbGQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLmZvckVhY2goKGMpID0+IHtcclxuICAgICAgY29uc3QgdyA9IHBhcnNlSW50KGMud2lkdGgpO1xyXG5cclxuICAgICAgaWYoIWlzTmFOKHcpKSB7XHJcbiAgICAgICAgdG90YWxXaWR0aCArPSB3O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVzZUF1dG9XaWR0aCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIuZHhHYW50dCh7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogdGhpcy5oYXNGb3JtID8gJzUwJScgOiAnY2FsYygxMDAlIC0gNjBweCknLFxyXG4gICAgICBmaXJzdERheU9mV2VlazogNixcclxuICAgICAgdGFza0xpc3RXaWR0aDogKCF1c2VBdXRvV2lkdGggJiYgdG90YWxXaWR0aCA+IDApID8gdG90YWxXaWR0aCA6IHZvaWQgMCxcclxuICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgIGl0ZW1zOiBbJ3pvb21JbicsICd6b29tT3V0JywgJ3NlcGFyYXRvcicsICd0YXNrRGV0YWlscyddXHJcbiAgICAgIH0sXHJcbiAgICAgIGVkaXRpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBkYXRhRmllbGQ6IGMuZGF0YUZpZWxkLFxyXG4gICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXHJcbiAgICAgICAgICB3aWR0aDogYy53aWR0aCxcclxuICAgICAgICAgIHZpc2libGVJbmRleDogYy52aXNpYmxlSW5kZXgsXHJcbiAgICAgICAgICBzb3J0SW5kZXg6IGMuc29ydEluZGV4LFxyXG4gICAgICAgICAgc29ydE9yZGVyOiBjLnNvcnRPcmRlciAmJiAoYy5zb3J0T3JkZXIgPT09ICdhc2MnID8gJ2FzYycgOiAnZGVzYycpLFxyXG4gICAgICAgICAgY2FwdGlvbjogYy5jYXB0aW9uIHx8IHZvaWQgMFxyXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0Q29sdW1uXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXNrczoge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuVGFza3MsXHJcbiAgICAgICAga2V5RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuS2V5XSxcclxuICAgICAgICBzdGFydEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlN0YXJ0XSxcclxuICAgICAgICBlbmRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5FbmRdLFxyXG4gICAgICAgIHBhcmVudElkRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUGFyZW50SWRdLFxyXG4gICAgICAgIHByb2dyZXNzRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuUHJvZ3Jlc3NdLFxyXG4gICAgICAgIHRpdGxlRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuVGl0bGVdXHJcbiAgICAgIH0sXHJcbiAgICAgIGRlcGVuZGVuY2llczoge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuRGVwZW5kZW5jaWVzLFxyXG4gICAgICAgIGtleUV4cHI6ICdJZCcsXHJcbiAgICAgICAgcHJlZGVjZXNzb3JJZEV4cHI6ICdQcmVkZWNlc3NvcklkJyxcclxuICAgICAgICBzdWNjZXNzb3JJZEV4cHI6ICdTdWNjZXNzb3JJZCcsXHJcbiAgICAgICAgdHlwZUV4cHI6ICdUeXBlJ1xyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZXM6IHtcclxuICAgICAgICBkYXRhU291cmNlOiBkYXRhLlJlc291cmNlcyxcclxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc0tleUZpZWxkLFxyXG4gICAgICAgIHRleHRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc1RleHRGaWVsZFxyXG4gICAgICB9LFxyXG4gICAgICByZXNvdXJjZUFzc2lnbm1lbnRzOiB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZGF0YS5SZXNvdXJjZUFzc2lnbm1lbnRzLFxyXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50S2V5RmllbGQsXHJcbiAgICAgICAgcmVzb3VyY2VJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkLFxyXG4gICAgICAgIHRhc2tJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGRcclxuICAgICAgfSxcclxuICAgIH0pLmR4R2FudHQoJ2luc3RhbmNlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhcnQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2hhcnQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5DSEFSVF9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XHJcbiAgfVxyXG59XHJcbiIsICJcdUZFRkYvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVmVuZG9yL0RldkV4dHJlbWUvZHguYWxsLmQudHNcIiAvPlxyXG5cclxuZXhwb3J0IHsgSUxpY2VuY2UsIE1lbnVJdGVtVHlwZSwgTGljZW5jZVN0YXR1cyB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5leHBvcnQgeyBJQXBpUmVzcG9uc2UsIElEeERhdGFTb3VyY2VPcHRpb25zLCBJRXJyb3JJbmZvLCBJTG9nb1NldHRpbmdzLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuL0RhdGEnO1xyXG5leHBvcnQge1xyXG4gIEhlYWRlciwgTmF2aWdhdGlvbk1lbnUsIFVzZXJNZW51LCBNZW51U3dpdGNoZXIsXHJcbiAgSGVhZGVyVGhlbWVzLCBJSGVhZGVyT3B0aW9ucywgSUFwcE1lbnVNb2RlbCwgSU1lbnVTZXR0aW5ncywgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsLFxyXG4gIElVc2VyTWVudUl0ZW0sIElVc2VyTWVudUl0ZW1Nb2RlbCxcclxufSBmcm9tICcuL0hlYWRlcic7XHJcbmV4cG9ydCB7IElIaWVyYXJjaGljYWwsIElSZXBvcnRCYXNlLCBJQXBwTWVudUl0ZW1CYXNlTW9kZWwsIGdyaWRDb2x1bW5UeXBlcyB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcbmV4cG9ydCB7XHJcbiAgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLCBJR3JpZFN0YXRlLFxyXG4gIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXHJcbn0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5leHBvcnQgeyBJR3JpZERhdGEsIElWMkdyaWRDb2x1bW5TdGF0ZSB9IGZyb20gJy4vUmVwb3J0cy9QYWdlcy9HcmlkL0lHcmlkRGF0YSc7XHJcbmV4cG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4vUmVwb3J0cy9Db2x1bW5NZXRhRGF0YSc7XHJcbmV4cG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzJztcclxuXHJcbmltcG9ydCB7IHNob3cgYXMgYmFja2dyb3VuZEltYWdlVmlld2VyIH0gZnJvbSAnLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XHJcbmltcG9ydCB7IExpY2VuY2VTdGF0dXMsIE1lbnVJdGVtVHlwZSB9IGZyb20gJy4vQnVzaW5lc3MnO1xyXG5pbXBvcnQgeyBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xyXG5pbXBvcnQgZGF0YSBmcm9tICcuL0RhdGEnO1xyXG5pbXBvcnQgRm9vdGVyLCB7IEZvb3RlckluZGljYXRvclN0YXR1cyB9IGZyb20gJy4vRm9vdGVyL0luZGV4JztcclxuaW1wb3J0IHtcclxuICBIZWFkZXIsXHJcbiAgTmF2aWdhdGlvbk1lbnUsXHJcbiAgVXNlck1lbnUsXHJcbiAgTWVudVN3aXRjaGVyXHJcbn0gZnJvbSAnLi9IZWFkZXInO1xyXG5cclxuZXhwb3J0IHtcclxuICBGb290ZXIsXHJcbn07XHJcblxyXG5pbXBvcnQgbm90aWZ5IGZyb20gJy4vV2lkZ2V0cy9Ob3RpZnknO1xyXG5pbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuL1dpZGdldHMvRnVsbFNjcmVlbic7XHJcbmltcG9ydCBkZWZhdWx0VG9vbGJhciBmcm9tICcuL1dpZGdldHMvRGVmYXVsdFRvb2xiYXInO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWRPYnNvbGV0ZSBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZE9ic29sZXRlJztcclxuaW1wb3J0IGRlZmF1bHRUcmVlTGlzdCBmcm9tICcuL1dpZGdldHMvR3JpZC9EZWZhdWx0VHJlZUxpc3QnO1xyXG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xyXG5pbXBvcnQgKiBhcyBpbWFnZUNyb3BEaWFsb2cgZnJvbSAnLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZyc7XHJcbmltcG9ydCB7IEFjY291bnRTZXR0aW5nc1BhZ2UgfSBmcm9tICcuL1BhZ2VzL0FjY291bnRTZXR0aW5ncyc7XHJcbmltcG9ydCAqIGFzIHN0eWxpbmcgZnJvbSAnLi9TdHlsaW5nL0luZGV4JztcclxuaW1wb3J0ICogYXMgcG9wdXAgZnJvbSAnLi9XaWRnZXRzL1BvcHVwJztcclxuaW1wb3J0ICogYXMgY29uZmlybSBmcm9tICcuL1dpZGdldHMvQ29uZmlybSc7XHJcbmltcG9ydCAqIGFzIGxhbmRpbmcgZnJvbSAnLi9XaWRnZXRzL0xhbmRpbmcnO1xyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vSGVscGVycy9JbmRleCc7XHJcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vVXRpbHMvSW5kZXgnO1xyXG5pbXBvcnQgKiBhcyBhY2Nlc3NEZW5pZWQgZnJvbSAnLi9XaWRnZXRzL0FjY2Vzc0RlbmllZFRvUmVwb3J0JztcclxuaW1wb3J0IGdyaWRDb2x1bW5UeXBlcyBmcm9tICcuL1JlcG9ydHMvQnVzaW5lc3MvR3JpZENvbHVtblR5cGVzJztcclxuaW1wb3J0ICogYXMgQ0RNIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgeyBTZXNzaW9uTm90aWZpZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyJztcclxuaW1wb3J0IHsgRmlsZUltcG9ydGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleCc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlVXBsb2FkZXIvSW5kZXgnO1xyXG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XHJcblxyXG5pbXBvcnQgR3JpZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSW5kZXgnO1xyXG5pbXBvcnQgU2xpZGVzaG93UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4JztcclxuaW1wb3J0IERhc2hib2FyZFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0Rhc2hib2FyZC9JbmRleCc7XHJcbmltcG9ydCBEWFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL1JlcG9ydC9JbmRleCc7XHJcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleCc7XHJcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgnO1xyXG5pbXBvcnQgR2FudHRDaGFydFJlcG9ydFBhZ2UgZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dhbm50Q2hhcnQvSW5kZXgnO1xyXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL0NvbmZpZy9JbmRleCc7XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcclxuY29uc3QgSXN6b2xlYVVJID0ge1xyXG4gIGNvbmZpZyxcclxuXHJcbiAgSGVhZGVyLFxyXG4gIEZvb3RlcixcclxuICBOYXZpZ2F0aW9uTWVudSxcclxuICBVc2VyTWVudSxcclxuICBNZW51U3dpdGNoZXIsXHJcblxyXG4gIGRhdGEsXHJcblxyXG4gIHdpZGdldHM6IHtcclxuICAgIG5vdGlmeSxcclxuICAgIGZ1bGxTY3JlZW4sXHJcbiAgICBwb3B1cCxcclxuICAgIGNvbmZpcm0sXHJcbiAgICBsYW5kaW5nLFxyXG4gICAgYWNjZXNzRGVuaWVkLFxyXG4gICAgZGVmYXVsdEdyaWRPYnNvbGV0ZSxcclxuICAgIGRlZmF1bHRUcmVlTGlzdCxcclxuICAgIGRlZmF1bHRHcmlkLFxyXG4gICAgZGVmYXVsdFRvb2xiYXIsXHJcbiAgICBiYWNrZ3JvdW5kSW1hZ2VWaWV3ZXIsXHJcbiAgICBpbWFnZUNyb3BEaWFsb2dcclxuICB9LFxyXG4gIHBhZ2VzOiB7XHJcbiAgICBBY2NvdW50U2V0dGluZ3NQYWdlXHJcbiAgfSxcclxuICBjb21wb25lbnRzOiB7XHJcbiAgICBDRE0sXHJcbiAgICBTZXNzaW9uTm90aWZpZXIsXHJcbiAgICBGaWxlSW1wb3J0ZXIsXHJcbiAgICBGaWxlVXBsb2FkZXIsXHJcbiAgfSxcclxuXHJcbiAgc3R5bGluZyxcclxuICBoZWxwZXJzLFxyXG4gIHV0aWxzLFxyXG5cclxuICByZXBvcnRzOiB7XHJcbiAgICBDRE1SZXBvcnRQYWdlLFxyXG4gICAgRGlhZ3JhbVJlcG9ydFBhZ2UsXHJcbiAgICBHcmlkUmVwb3J0UGFnZSxcclxuICAgIERhc2hib2FyZFJlcG9ydFBhZ2UsXHJcbiAgICBEWFJlcG9ydFBhZ2UsXHJcbiAgICBTbGlkZXNob3dSZXBvcnRQYWdlLFxyXG4gICAgR2FudHRDaGFydFJlcG9ydFBhZ2UsXHJcbiAgICBncmlkQ29sdW1uVHlwZXMsXHJcbiAgfSxcclxuICBidXNpbmVzczoge1xyXG4gICAgTGljZW5jZVN0YXR1cyxcclxuICAgIE1lbnVJdGVtVHlwZSxcclxuICAgIENkbUltcG9ydEZpbGVNb2RlLFxyXG4gICAgRm9vdGVySW5kaWNhdG9yU3RhdHVzLFxyXG4gICAgR3JpZERhdGFDb2x1bW5EYXRhVHlwZVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IElzem9sZWFVSTtcclxuXHJcbih3aW5kb3cgYXMgYW55KS5Jc3pvbGVhVUkgPSBJc3pvbGVhVUk7XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsbUJBQWMsSUFBTSxJQUFNO0FBQUEsaUJBQ0osQUFBaEIsT0FBTyxNQUFTLGNBQWEsS0FBTyxFQUFFLFNBQU8sVUFDeEIsQUFBaEIsT0FBTyxNQUFTLFlBQ3ZCLFNBQVEsS0FBSyx1REFDYixLQUFPLEVBQUUsU0FBUyxDQUFDLE9BS2pCLEdBQUssV0FBVyw2RUFBNkUsS0FBSyxHQUFLLFFBQ2xHLElBQUksS0FBSyxDQUFBLFVBQThCLEtBQU8sRUFBRSxNQUFNLEdBQUssVUFFN0Q7O0FBR1QsbUJBQW1CLElBQUssSUFBTSxJQUFNO0FBQ2xDLGNBQUksS0FBTSxJQUFJO0FBQ2QsYUFBSSxLQUFLLE9BQU8sS0FDaEIsR0FBSSxlQUFlLFFBQ25CLEdBQUksU0FBUyxXQUFZO0FBQ3ZCLGNBQU8sR0FBSSxVQUFVLElBQU07YUFFN0IsR0FBSSxVQUFVLFdBQVk7QUFDeEIsb0JBQVEsTUFBTTthQUVoQixHQUFJOztBQUdOLG1CQUFzQixJQUFLO0FBQ3pCLGNBQUksS0FBTSxJQUFJO0FBRWQsYUFBSSxLQUFLLFFBQVEsSUFBakI7QUFDQSxjQUFJO0FBQ0YsZUFBSTttQkFDRyxJQUFQOztBQUNGLGlCQUFxQixPQUFkLEdBQUksVUFBK0IsT0FBZCxHQUFJOztBQUlsQyxtQkFBZ0IsSUFBTTtBQUNwQixjQUFJO0FBQ0YsZUFBSyxjQUFjLElB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
|
|
10296
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvc3JjL0ZpbGVTYXZlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY3JvcHByL2Rpc3QvY3JvcHByLmpzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0J1c2luZXNzL0xpY2VuY2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQnVzaW5lc3MvTWVudUl0ZW1UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvTm90aWZ5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvQXBpUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0U3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9Qb3B1cC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9TdHlsaW5nL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRXJyb3JJbmZvUG9wdXAudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9FeGNlcHRpb25UeXBlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9SZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvRHhEYXRhU291cmNlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0RhdGEvTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvRGF0YS9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0NvcmUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVscGVycy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbmZpZy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWFkZXIvVXNlck1lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L01lbnUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvQ29tcG9uZW50cy9NZW51L0Jvb3RzdHJhcENvbGxhcHNpbmdNZW51LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9OYXZpZ2F0aW9uTWVudS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db25zdGFudHMvQ2FjaGVLZXlzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9Mb2dvLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlYWRlci9NZW51U3dpdGNoZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL1NlYXJjaC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9VdGlscy9FdmVudEVtaXR0ZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvSGVhZGVyL0hlYWRlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcy50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL0J1c2luZXNzL2NkbUltcG9ydEZpbGVNb2RlLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvSUdyaWRTdGF0ZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Gb290ZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9BdXRvUmVzaXplLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvRnVsbFNjcmVlbi50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9IZWxwZXJzL1RoZW1lLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0hlbHBlcnMvVG9vbGJhci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0RlZmF1bHRUb29sYmFyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvUGFuZWxIZWlnaHQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0NyZWF0ZUZ1bGxTY3JlZW5HcmlkLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL0dyaWRFeHBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkQmFzZS50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkT2Jzb2xldGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZy9IZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1BhZ2VzL0FjY291bnRTZXR0aW5ncy9pbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9XaWRnZXRzL0NvbmZpcm0udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvV2lkZ2V0cy9MYW5kaW5nLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1dpZGdldHMvQWNjZXNzRGVuaWVkVG9SZXBvcnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9DcmVhdGVEZWZhdWx0R3JpZC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9Db250cm9sQ29uZmlndXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1V0aWxzL01lbW9pemUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZFZpZXdzTWFuYWdlci50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkU3RhdGVNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vR3JpZEZpbHRlcnNNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9Db21wb25lbnRzL0ZpbGVJbXBvcnRlci9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL0NETS9HcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWREaXNwbGF5c01hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9DRE0vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0dyaWRTdW1tYXJ5SGVscGVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0NvbnRyb2xEaXNwbGF5LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvQ0RNL0Rpc3BsYXlNYW5hZ2VyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyLnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvR3JpZC9HcmlkSW5kaWNhdG9yU3RhdGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0dyaWRTdGF0ZU1hbmFnZXIudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL01vZGUudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9EYXRhL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvQ29tcG9uZW50cy9SZWZyZXNoVGltZXIvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HcmlkL0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGFzaGJvYXJkL0V4dGVuc2lvbnMvR2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24udHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgudHMiLCAiLi4vLi4vc3JjL1NjcmlwdHMvUmVwb3J0cy9QYWdlcy9HYW5udENoYXJ0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4LnRzIiwgIi4uLy4uL3NyYy9TY3JpcHRzL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9SZXBvcnRzL1BhZ2VzL1NsaWRlc2hvdy9JbmRleC50cyIsICIuLi8uLi9zcmMvU2NyaXB0cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLypcbiogRmlsZVNhdmVyLmpzXG4qIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuKlxuKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4qXG4qIExpY2Vuc2UgOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAoTUlUKVxuKiBzb3VyY2UgIDogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qc1xuKi9cblxuLy8gVGhlIG9uZSBhbmQgb25seSB3YXkgb2YgZ2V0dGluZyBnbG9iYWwgc2NvcGUgaW4gYWxsIGVudmlyb25tZW50c1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzMyNzcxODIvMTAwODk5OVxudmFyIF9nbG9iYWwgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3dcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmXG4gID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbFxuICA/IGdsb2JhbFxuICA6IHRoaXNcblxuZnVuY3Rpb24gYm9tIChibG9iLCBvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3VuZGVmaW5lZCcpIG9wdHMgPSB7IGF1dG9Cb206IGZhbHNlIH1cbiAgZWxzZSBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc29sZS53YXJuKCdEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCcpXG4gICAgb3B0cyA9IHsgYXV0b0JvbTogIW9wdHMgfVxuICB9XG5cbiAgLy8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcbiAgLy8gbm90ZTogeW91ciBicm93c2VyIHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IFVURi0xNiBVK0ZFRkYgdG8gRUYgQkIgQkZcbiAgaWYgKG9wdHMuYXV0b0JvbSAmJiAvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkVGRiksIGJsb2JdLCB7IHR5cGU6IGJsb2IudHlwZSB9KVxuICB9XG4gIHJldHVybiBibG9iXG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkICh1cmwsIG5hbWUsIG9wdHMpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzYXZlQXMoeGhyLnJlc3BvbnNlLCBuYW1lLCBvcHRzKVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2NvdWxkIG5vdCBkb3dubG9hZCBmaWxlJylcbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIGNvcnNFbmFibGVkICh1cmwpIHtcbiAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIC8vIHVzZSBzeW5jIHRvIGF2b2lkIHBvcHVwIGJsb2NrZXJcbiAgeGhyLm9wZW4oJ0hFQUQnLCB1cmwsIGZhbHNlKVxuICB0cnkge1xuICAgIHhoci5zZW5kKClcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5XG59XG5cbi8vIGBhLmNsaWNrKClgIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGJyb3dzZXJzICgjNDY1KVxuZnVuY3Rpb24gY2xpY2sgKG5vZGUpIHtcbiAgdHJ5IHtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJylcbiAgICBldnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKVxuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldnQpXG4gIH1cbn1cblxuLy8gRGV0ZWN0IFdlYlZpZXcgaW5zaWRlIGEgbmF0aXZlIG1hY09TIGFwcCBieSBydWxpbmcgb3V0IGFsbCBicm93c2Vyc1xuLy8gV2UganVzdCBuZWVkIHRvIGNoZWNrIGZvciAnU2FmYXJpJyBiZWNhdXNlIGFsbCBvdGhlciBicm93c2VycyAoYmVzaWRlcyBGaXJlZm94KSBpbmNsdWRlIHRoYXQgdG9vXG4vLyBodHRwczovL3d3dy53aGF0aXNteWJyb3dzZXIuY29tL2d1aWRlcy90aGUtbGF0ZXN0LXVzZXItYWdlbnQvbWFjb3NcbnZhciBpc01hY09TV2ViVmlldyA9IF9nbG9iYWwubmF2aWdhdG9yICYmIC9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbnZhciBzYXZlQXMgPSBfZ2xvYmFsLnNhdmVBcyB8fCAoXG4gIC8vIHByb2JhYmx5IGluIHNvbWUgd2ViIHdvcmtlclxuICAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcgfHwgd2luZG93ICE9PSBfZ2xvYmFsKVxuICAgID8gZnVuY3Rpb24gc2F2ZUFzICgpIHsgLyogbm9vcCAqLyB9XG5cbiAgLy8gVXNlIGRvd25sb2FkIGF0dHJpYnV0ZSBmaXJzdCBpZiBwb3NzaWJsZSAoIzE5MyBMdW1pYSBtb2JpbGUpIHVubGVzcyB0aGlzIGlzIGEgbWFjT1MgV2ViVmlld1xuICA6ICgnZG93bmxvYWQnIGluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSAmJiAhaXNNYWNPU1dlYlZpZXcpXG4gID8gZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzKSB7XG4gICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgYS5kb3dubG9hZCA9IG5hbWVcbiAgICBhLnJlbCA9ICdub29wZW5lcicgLy8gdGFibmFiYmluZ1xuXG4gICAgLy8gVE9ETzogZGV0ZWN0IGNocm9tZSBleHRlbnNpb25zICYgcGFja2FnZWQgYXBwc1xuICAgIC8vIGEudGFyZ2V0ID0gJ19ibGFuaydcblxuICAgIGlmICh0eXBlb2YgYmxvYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFN1cHBvcnQgcmVndWxhciBsaW5rc1xuICAgICAgYS5ocmVmID0gYmxvYlxuICAgICAgaWYgKGEub3JpZ2luICE9PSBsb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgY29yc0VuYWJsZWQoYS5ocmVmKVxuICAgICAgICAgID8gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcbiAgICAgICAgICA6IGNsaWNrKGEsIGEudGFyZ2V0ID0gJ19ibGFuaycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGljayhhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXBwb3J0IGJsb2JzXG4gICAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpIH0sIDRFNCkgLy8gNDBzXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2xpY2soYSkgfSwgMClcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgbXNTYXZlT3JPcGVuQmxvYiBhcyBhIHNlY29uZCBhcHByb2FjaFxuICA6ICdtc1NhdmVPck9wZW5CbG9iJyBpbiBuYXZpZ2F0b3JcbiAgPyBmdW5jdGlvbiBzYXZlQXMgKGJsb2IsIG5hbWUsIG9wdHMpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBibG9iLm5hbWUgfHwgJ2Rvd25sb2FkJ1xuXG4gICAgaWYgKHR5cGVvZiBibG9iID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNvcnNFbmFibGVkKGJsb2IpKSB7XG4gICAgICAgIGRvd25sb2FkKGJsb2IsIG5hbWUsIG9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICBhLmhyZWYgPSBibG9iXG4gICAgICAgIGEudGFyZ2V0ID0gJ19ibGFuaydcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNsaWNrKGEpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJvbShibG9iLCBvcHRzKSwgbmFtZSlcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byB1c2luZyBGaWxlUmVhZGVyIGFuZCBhIHBvcHVwXG4gIDogZnVuY3Rpb24gc2F2ZUFzIChibG9iLCBuYW1lLCBvcHRzLCBwb3B1cCkge1xuICAgIC8vIE9wZW4gYSBwb3B1cCBpbW1lZGlhdGVseSBkbyBnbyBhcm91bmQgcG9wdXAgYmxvY2tlclxuICAgIC8vIE1vc3RseSBvbmx5IGF2YWlsYWJsZSBvbiB1c2VyIGludGVyYWN0aW9uIGFuZCB0aGUgZmlsZVJlYWRlciBpcyBhc3luYyBzby4uLlxuICAgIHBvcHVwID0gcG9wdXAgfHwgb3BlbignJywgJ19ibGFuaycpXG4gICAgaWYgKHBvcHVwKSB7XG4gICAgICBwb3B1cC5kb2N1bWVudC50aXRsZSA9XG4gICAgICBwb3B1cC5kb2N1bWVudC5ib2R5LmlubmVyVGV4dCA9ICdkb3dubG9hZGluZy4uLidcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJsb2IgPT09ICdzdHJpbmcnKSByZXR1cm4gZG93bmxvYWQoYmxvYiwgbmFtZSwgb3B0cylcblxuICAgIHZhciBmb3JjZSA9IGJsb2IudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICB2YXIgaXNTYWZhcmkgPSAvY29uc3RydWN0b3IvaS50ZXN0KF9nbG9iYWwuSFRNTEVsZW1lbnQpIHx8IF9nbG9iYWwuc2FmYXJpXG4gICAgdmFyIGlzQ2hyb21lSU9TID0gL0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbiAgICBpZiAoKGlzQ2hyb21lSU9TIHx8IChmb3JjZSAmJiBpc1NhZmFyaSkgfHwgaXNNYWNPU1dlYlZpZXcpICYmIHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgYWxsb3cgZG93bmxvYWRpbmcgb2YgYmxvYiBVUkxzXG4gICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVybCA9IHJlYWRlci5yZXN1bHRcbiAgICAgICAgdXJsID0gaXNDaHJvbWVJT1MgPyB1cmwgOiB1cmwucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpXG4gICAgICAgIGlmIChwb3B1cCkgcG9wdXAubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgICBlbHNlIGxvY2F0aW9uID0gdXJsXG4gICAgICAgIHBvcHVwID0gbnVsbCAvLyByZXZlcnNlLXRhYm5hYmJpbmcgIzQ2MFxuICAgICAgfVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFVSTCA9IF9nbG9iYWwuVVJMIHx8IF9nbG9iYWwud2Via2l0VVJMXG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgaWYgKHBvcHVwKSBwb3B1cC5sb2NhdGlvbiA9IHVybFxuICAgICAgZWxzZSBsb2NhdGlvbi5ocmVmID0gdXJsXG4gICAgICBwb3B1cCA9IG51bGwgLy8gcmV2ZXJzZS10YWJuYWJiaW5nICM0NjBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkgfSwgNEU0KSAvLyA0MHNcbiAgICB9XG4gIH1cbilcblxuX2dsb2JhbC5zYXZlQXMgPSBzYXZlQXMuc2F2ZUFzID0gc2F2ZUFzXG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn1cbiIsICIvKipcbiAqIENyb3Bwci5qc1xuICogaHR0cHM6Ly9naXRodWIuY29tL2phbWVzc3Nvb2kvQ3JvcHByLmpzXG4gKiBcbiAqIEEgSmF2YVNjcmlwdCBpbWFnZSBjcm9wcGVyIHRoYXQncyBsaWdodHdlaWdodCwgYXdlc29tZSwgYW5kIGhhc1xuICogemVybyBkZXBlbmRlbmNpZXMuXG4gKiBcbiAqIChDKSAyMDE3IEphbWVzIE9vaS4gUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5Dcm9wcHIgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXN0VGltZSA9IDA7XG4gIHZhciB2ZW5kb3JzID0gWydtcycsICdtb3onLCAnd2Via2l0JywgJ28nXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG4gIH1cbiAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcbiAgICB9LCB0aW1lVG9DYWxsKTtcbiAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG4gIGlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBjbGVhclRpbWVvdXQoaWQpO1xuICB9O1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBmYWxzZTtcbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICByZXR1cm4gZXZ0O1xuICB9XG4gIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbihmdW5jdGlvbiAod2luZG93KSB7XG4gIHRyeSB7XG4gICAgbmV3IEN1c3RvbUV2ZW50KCd0ZXN0Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlKSB7fVxuICBmdW5jdGlvbiBNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlIH07XG4gICAgdmFyIG1vdXNlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIG1vdXNlRXZlbnQuaW5pdE1vdXNlRXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgIHJldHVybiBtb3VzZUV2ZW50O1xuICB9XG4gIE1vdXNlRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlO1xuICB3aW5kb3cuTW91c2VFdmVudCA9IE1vdXNlRXZlbnQ7XG59KSh3aW5kb3cpO1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cblxuXG52YXIgZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gIGlmIChkZXNjID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHtcbiAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7XG5cbiAgICBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTtcbiAgfVxufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG52YXIgc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9hcnI7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxudmFyIEhhbmRsZSA9XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSGFuZGxlIGluc3RhbmNlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBwb3NpdGlvbiBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlXG4gKiAgICAgIHdpdGhpbiB0aGUgY3JvcCByZWdpb24uIEFjY2VwdHMgYSB2YWx1ZSBiZXR3ZWVuIDAgdG8gMSBpbiB0aGUgb3JkZXJcbiAqICAgICAgb2YgW1gsIFldLlxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludHMgRGVmaW5lIHRoZSBzaWRlIG9mIHRoZSBjcm9wIHJlZ2lvbiB0aGF0XG4gKiAgICAgIGlzIHRvIGJlIGFmZmVjdGVkIGJ5IHRoaXMgaGFuZGxlLiBBY2NlcHRzIGEgdmFsdWUgb2YgMCBvciAxIGluIHRoZVxuICogICAgICBvcmRlciBvZiBbVE9QLCBSSUdIVCwgQk9UVE9NLCBMRUZUXS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjdXJzb3IgVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGV2ZW50QnVzIFRoZSBlbGVtZW50IHRvIGRpc3BhdGNoIGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gSGFuZGxlKHBvc2l0aW9uLCBjb25zdHJhaW50cywgY3Vyc29yLCBldmVudEJ1cykge1xuICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIYW5kbGUpO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1oYW5kbGUnO1xuICB0aGlzLmVsLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVzdGFydCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYgfVxuICAgIH0pKTtcbiAgfVxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZWxmLmV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoYW5kbGVtb3ZlJywge1xuICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgfSkpO1xuICB9XG59O1xuXG52YXIgQm94ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCb3ggaW5zdGFuY2UuXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGZ1bmN0aW9uIEJveCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge051bWJlcn0geDFcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkxXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4MlxuICAgKiBAcGFyYW0ge051bWJlcn0geTJcbiAgICovXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQkJDEoKSB7XG4gICAgICB2YXIgeDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeTEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICB2YXIgeDIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgeTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB0aGlzLngxID0geDEgPT0gbnVsbCA/IHRoaXMueDEgOiB4MTtcbiAgICAgIHRoaXMueTEgPSB5MSA9PSBudWxsID8gdGhpcy55MSA6IHkxO1xuICAgICAgdGhpcy54MiA9IHgyID09IG51bGwgPyB0aGlzLngyIDogeDI7XG4gICAgICB0aGlzLnkyID0geTIgPT0gbnVsbCA/IHRoaXMueTIgOiB5MjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgYm94LlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICd3aWR0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdpZHRoKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueDIgLSB0aGlzLngxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBib3guXG4gICAgICogQHJldHVybnMge051bWJlcn1cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2hlaWdodCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnkyIC0gdGhpcy55MSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIGJveCB0byBhIG5ldyBzaXplLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBuZXdIZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3JpZ2luXSBUaGUgb3JpZ2luIHBvaW50IHRvIHJlc2l6ZSBmcm9tLlxuICAgICAqICAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogWzAsIDBdO1xuICAgICAgdmFyIGZyb21YID0gdGhpcy54MSArIHRoaXMud2lkdGgoKSAqIG9yaWdpblswXTtcbiAgICAgIHZhciBmcm9tWSA9IHRoaXMueTEgKyB0aGlzLmhlaWdodCgpICogb3JpZ2luWzFdO1xuICAgICAgdGhpcy54MSA9IGZyb21YIC0gbmV3V2lkdGggKiBvcmlnaW5bMF07XG4gICAgICB0aGlzLnkxID0gZnJvbVkgLSBuZXdIZWlnaHQgKiBvcmlnaW5bMV07XG4gICAgICB0aGlzLngyID0gdGhpcy54MSArIG5ld1dpZHRoO1xuICAgICAgdGhpcy55MiA9IHRoaXMueTEgKyBuZXdIZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGJveCBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY2FsZShmYWN0b3IpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFswLCAwXTtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHRoaXMud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodCgpICogZmFjdG9yO1xuICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuICAgICAgdmFyIHggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgeCA9IHggPT09IG51bGwgPyB0aGlzLngxIDogeDtcbiAgICAgIHkgPSB5ID09PSBudWxsID8gdGhpcy55MSA6IHk7XG4gICAgICB0aGlzLngxID0geDtcbiAgICAgIHRoaXMueTEgPSB5O1xuICAgICAgdGhpcy54MiA9IHggKyB3aWR0aDtcbiAgICAgIHRoaXMueTIgPSB5ICsgaGVpZ2h0O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGl2ZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIGEgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3guXG4gICAgICogQHBhcmFtIHtBcnJheX0gcG9pbnQgVGhlIHggYW5kIHkgcmF0aW8gcG9zaXRpb24gd2l0aGluIHRoZSBib3guXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgeCBhbmQgeSBjb29yZGluYXRlcyBbeCwgeV0uXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZWxhdGl2ZVBvaW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb2ludCgpIHtcbiAgICAgIHZhciBwb2ludCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogWzAsIDBdO1xuICAgICAgdmFyIHggPSB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQoKSAqIHBvaW50WzFdO1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFic29sdXRlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgYSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludCBUaGUgeCBhbmQgeSByYXRpbyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJveC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIFt4LCB5XS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ2dldEFic29sdXRlUG9pbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBYnNvbHV0ZVBvaW50KCkge1xuICAgICAgdmFyIHBvaW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbMCwgMF07XG4gICAgICB2YXIgeCA9IHRoaXMueDEgKyB0aGlzLndpZHRoKCkgKiBwb2ludFswXTtcbiAgICAgIHZhciB5ID0gdGhpcy55MSArIHRoaXMuaGVpZ2h0KCkgKiBwb2ludFsxXTtcbiAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgZml4ZWQgcmF0aW8uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29yaWdpbl0gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gWzAsIDBdICh0b3AgbGVmdCkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtncm93XSBUaGUgYXhpcyB0byBncm93IHRvIG1haW50YWluIHRoZSByYXRpby5cbiAgICAgKiAgICAgRGVmYXVsdHMgdG8gJ2hlaWdodCcuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdjb25zdHJhaW5Ub1JhdGlvJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9SYXRpbyhyYXRpbykge1xuICAgICAgdmFyIG9yaWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWzAsIDBdO1xuICAgICAgdmFyIGdyb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdoZWlnaHQnO1xuICAgICAgaWYgKHJhdGlvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgICAgc3dpdGNoIChncm93KSB7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICAgIHRoaXMucmVzaXplKHRoaXMuaGVpZ2h0KCkgKiAxIC8gcmF0aW8sIHRoaXMuaGVpZ2h0KCksIG9yaWdpbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCgpLCB0aGlzLndpZHRoKCkgKiByYXRpbywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJhaW4gdGhlIGJveCB3aXRoaW4gYSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYm91bmRhcnlXaWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBib3VuZGFyeUhlaWdodFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9Cb3VuZGFyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnN0cmFpblRvQm91bmRhcnkoYm91bmRhcnlXaWR0aCwgYm91bmRhcnlIZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFswLCAwXTtcbiAgICAgIHZhciBfZ2V0QWJzb2x1dGVQb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVQb2ludChvcmlnaW4pLFxuICAgICAgICAgIF9nZXRBYnNvbHV0ZVBvaW50MiA9IHNsaWNlZFRvQXJyYXkoX2dldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfZ2V0QWJzb2x1dGVQb2ludDJbMF0sXG4gICAgICAgICAgb3JpZ2luWSA9IF9nZXRBYnNvbHV0ZVBvaW50MlsxXTtcbiAgICAgIHZhciBtYXhJZkxlZnQgPSBvcmlnaW5YO1xuICAgICAgdmFyIG1heElmVG9wID0gb3JpZ2luWTtcbiAgICAgIHZhciBtYXhJZlJpZ2h0ID0gYm91bmRhcnlXaWR0aCAtIG9yaWdpblg7XG4gICAgICB2YXIgbWF4SWZCb3R0b20gPSBib3VuZGFyeUhlaWdodCAtIG9yaWdpblk7XG4gICAgICB2YXIgZGlyZWN0aW9uWCA9IC0yICogb3JpZ2luWzBdICsgMTtcbiAgICAgIHZhciBkaXJlY3Rpb25ZID0gLTIgKiBvcmlnaW5bMV0gKyAxO1xuICAgICAgdmFyIG1heFdpZHRoID0gbnVsbCxcbiAgICAgICAgICBtYXhIZWlnaHQgPSBudWxsO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb25YKSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgbWF4V2lkdGggPSBtYXhJZkxlZnQ7YnJlYWs7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWluKG1heElmTGVmdCwgbWF4SWZSaWdodCkgKiAyO2JyZWFrO1xuICAgICAgICBjYXNlICsxOlxuICAgICAgICAgIG1heFdpZHRoID0gbWF4SWZSaWdodDticmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGlyZWN0aW9uWSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIG1heEhlaWdodCA9IG1heElmVG9wO2JyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5taW4obWF4SWZUb3AsIG1heElmQm90dG9tKSAqIDI7YnJlYWs7XG4gICAgICAgIGNhc2UgKzE6XG4gICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SWZCb3R0b207YnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy53aWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgICAgdmFyIGZhY3RvciA9IG1heFdpZHRoIC8gdGhpcy53aWR0aCgpO1xuICAgICAgICB0aGlzLnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhlaWdodCgpID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIHZhciBfZmFjdG9yID0gbWF4SGVpZ2h0IC8gdGhpcy5oZWlnaHQoKTtcbiAgICAgICAgdGhpcy5zY2FsZShfZmFjdG9yLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cmFpbiB0aGUgYm94IHRvIGEgbWF4aW11bS9taW5pbXVtIHNpemUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhXaWR0aF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heEhlaWdodF1cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21pbldpZHRoXVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbWluSGVpZ2h0XVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtvcmlnaW5dIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgIERlZmF1bHRzIHRvIFswLCAwXSAodG9wIGxlZnQpLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbcmF0aW9dIFJhdGlvIHRvIG1haW50YWluLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnY29uc3RyYWluVG9TaXplJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uc3RyYWluVG9TaXplKCkge1xuICAgICAgdmFyIG1heFdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdmFyIG1heEhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHZhciBtaW5XaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBtaW5IZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbMCwgMF07XG4gICAgICB2YXIgcmF0aW8gPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IG51bGw7XG4gICAgICBpZiAocmF0aW8pIHtcbiAgICAgICAgaWYgKHJhdGlvID4gMSkge1xuICAgICAgICAgIG1heFdpZHRoID0gbWF4SGVpZ2h0ICogMSAvIHJhdGlvO1xuICAgICAgICAgIG1pbkhlaWdodCA9IG1pbkhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgIG1heEhlaWdodCA9IG1heFdpZHRoICogcmF0aW87XG4gICAgICAgICAgbWluV2lkdGggPSBtaW5IZWlnaHQgKiAxIC8gcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aCAmJiB0aGlzLndpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBtYXhXaWR0aCxcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IHJhdGlvID09PSBudWxsID8gdGhpcy5oZWlnaHQoKSA6IG1heEhlaWdodDtcbiAgICAgICAgdGhpcy5yZXNpemUobmV3V2lkdGgsIG5ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhIZWlnaHQgJiYgdGhpcy5oZWlnaHQoKSA+IG1heEhlaWdodCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtYXhXaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aCwgX25ld0hlaWdodCwgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIGlmIChtaW5XaWR0aCAmJiB0aGlzLndpZHRoKCkgPCBtaW5XaWR0aCkge1xuICAgICAgICB2YXIgX25ld1dpZHRoMiA9IG1pbldpZHRoLFxuICAgICAgICAgICAgX25ld0hlaWdodDIgPSByYXRpbyA9PT0gbnVsbCA/IHRoaXMuaGVpZ2h0KCkgOiBtaW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucmVzaXplKF9uZXdXaWR0aDIsIF9uZXdIZWlnaHQyLCBvcmlnaW4pO1xuICAgICAgfVxuICAgICAgaWYgKG1pbkhlaWdodCAmJiB0aGlzLmhlaWdodCgpIDwgbWluSGVpZ2h0KSB7XG4gICAgICAgIHZhciBfbmV3V2lkdGgzID0gcmF0aW8gPT09IG51bGwgPyB0aGlzLndpZHRoKCkgOiBtaW5XaWR0aCxcbiAgICAgICAgICAgIF9uZXdIZWlnaHQzID0gbWluSGVpZ2h0O1xuICAgICAgICB0aGlzLnJlc2l6ZShfbmV3V2lkdGgzLCBfbmV3SGVpZ2h0Mywgb3JpZ2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQm94O1xufSgpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGVsZW1lbnQncyB0b3VjaCBldmVudHMgdG8gYmUgc2ltdWxhdGVkIGFzIG1vdXNlIGV2ZW50cy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBlbmFibGVUb3VjaChlbGVtZW50KSB7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNpbXVsYXRlTW91c2VFdmVudCk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBzaW11bGF0ZU1vdXNlRXZlbnQpO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNpbXVsYXRlTW91c2VFdmVudCk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0b3VjaCBldmVudCB0byBhIG1vdXNlIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZVxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHZhciBldmVudE1hcCA9IHtcbiAgICAndG91Y2hzdGFydCc6ICdtb3VzZWRvd24nLFxuICAgICd0b3VjaG1vdmUnOiAnbW91c2Vtb3ZlJyxcbiAgICAndG91Y2hlbmQnOiAnbW91c2V1cCdcbiAgfTtcbiAgdG91Y2gudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoZXZlbnRNYXBbZS50eXBlXSwge1xuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICB2aWV3OiB3aW5kb3csXG4gICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWVxuICB9KSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbGlzdCBvZiBoYW5kbGVzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5fSBwb3NpdGlvbiAtIFRoZSB4IGFuZCB5IHJhdGlvIHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUgd2l0aGluXG4gKiAgICAgIHRoZSBjcm9wIHJlZ2lvbi4gQWNjZXB0cyBhIHZhbHVlIGJldHdlZW4gMCB0byAxIGluIHRoZSBvcmRlciBvZiBbWCwgWV0uXG4gKiBAcHJvcGVydHkge0FycmF5fSBjb25zdHJhaW50cyAtIERlZmluZSB0aGUgc2lkZSBvZiB0aGUgY3JvcCByZWdpb24gdGhhdCBpcyB0b1xuICogICAgICBiZSBhZmZlY3RlZCBieSB0aGlzIGhhbmRsZS4gQWNjZXB0cyBhIHZhbHVlIG9mIDAgb3IgMSBpbiB0aGUgb3JkZXIgb2ZcbiAqICAgICAgW1RPUCwgUklHSFQsIEJPVFRPTSwgTEVGVF0uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gY3Vyc29yIC0gVGhlIENTUyBjdXJzb3Igb2YgdGhpcyBoYW5kbGUuXG4gKi9cbnZhciBIQU5ETEVTID0gW3sgcG9zaXRpb246IFswLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMCwgMCwgMV0sIGN1cnNvcjogJ253LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMC4wXSwgY29uc3RyYWludHM6IFsxLCAwLCAwLCAwXSwgY3Vyc29yOiAnbi1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDAuMF0sIGNvbnN0cmFpbnRzOiBbMSwgMSwgMCwgMF0sIGN1cnNvcjogJ25lLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzEuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAxLCAwLCAwXSwgY3Vyc29yOiAnZS1yZXNpemUnIH0sIHsgcG9zaXRpb246IFsxLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMSwgMSwgMF0sIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuNSwgMS4wXSwgY29uc3RyYWludHM6IFswLCAwLCAxLCAwXSwgY3Vyc29yOiAncy1yZXNpemUnIH0sIHsgcG9zaXRpb246IFswLjAsIDEuMF0sIGNvbnN0cmFpbnRzOiBbMCwgMCwgMSwgMV0sIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSwgeyBwb3NpdGlvbjogWzAuMCwgMC41XSwgY29uc3RyYWludHM6IFswLCAwLCAwLCAxXSwgY3Vyc29yOiAndy1yZXNpemUnIH1dO1xudmFyIENyb3BwckNvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENyb3BwckNvcmUoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIGRlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHJDb3JlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBDcm9wcHJDb3JlLnBhcnNlT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgICBpZiAoIWVsZW1lbnQubm9kZU5hbWUpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgdGhyb3cgJ0ltYWdlIHNyYyBub3QgcHJvdmlkZWQuJztcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXN0b3JlID0ge1xuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50XG4gICAgfTtcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICBpZiAoZWxlbWVudC53aWR0aCA9PT0gMCB8fCBlbGVtZW50LmhlaWdodCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjcmVhdGVDbGFzcyhDcm9wcHJDb3JlLCBbe1xuICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuY3JlYXRlRE9NKGVsZW1lbnQpO1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnRUb1BpeGVscyh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJFdmVudHMoKTtcbiAgICAgIHRoaXMuYXR0YWNoUmVnaW9uRXZlbnRzKCk7XG4gICAgICB0aGlzLmF0dGFjaE92ZXJsYXlFdmVudHMoKTtcbiAgICAgIHRoaXMuYm94ID0gdGhpcy5pbml0aWFsaXplQm94KHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkluaXRpYWxpemUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uSW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjcmVhdGVET00nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVET00odGFyZ2V0RWwpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1jb250YWluZXInO1xuICAgICAgdGhpcy5ldmVudEJ1cyA9IHRoaXMuY29udGFpbmVyRWw7XG4gICAgICBlbmFibGVUb3VjaCh0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5jbGFzc05hbWUgPSAnY3JvcHByJztcbiAgICAgIHRoaXMuaW1hZ2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgdGhpcy5pbWFnZUVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKCdzcmMnKSk7XG4gICAgICB0aGlzLmltYWdlRWwuc2V0QXR0cmlidXRlKCdhbHQnLCB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpKTtcbiAgICAgIHRoaXMuaW1hZ2VFbC5jbGFzc05hbWUgPSAnY3JvcHByLWltYWdlJztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwgPSB0aGlzLmltYWdlRWwuY2xvbmVOb2RlKCk7XG4gICAgICB0aGlzLmltYWdlQ2xpcHBlZEVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaW1hZ2VDbGlwcGVkJztcbiAgICAgIHRoaXMucmVnaW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMucmVnaW9uRWwuY2xhc3NOYW1lID0gJ2Nyb3Bwci1yZWdpb24nO1xuICAgICAgdGhpcy5vdmVybGF5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMub3ZlcmxheUVsLmNsYXNzTmFtZSA9ICdjcm9wcHItb3ZlcmxheSc7XG4gICAgICB2YXIgaGFuZGxlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhhbmRsZUNvbnRhaW5lckVsLmNsYXNzTmFtZSA9ICdjcm9wcHItaGFuZGxlQ29udGFpbmVyJztcbiAgICAgIHRoaXMuaGFuZGxlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBIQU5ETEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKEhBTkRMRVNbaV0ucG9zaXRpb24sIEhBTkRMRVNbaV0uY29uc3RyYWludHMsIEhBTkRMRVNbaV0uY3Vyc29yLCB0aGlzLmV2ZW50QnVzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVzLnB1c2goaGFuZGxlKTtcbiAgICAgICAgaGFuZGxlQ29udGFpbmVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlLmVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbCk7XG4gICAgICB0aGlzLmNyb3BwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmltYWdlQ2xpcHBlZEVsKTtcbiAgICAgIHRoaXMuY3JvcHBlckVsLmFwcGVuZENoaWxkKHRoaXMucmVnaW9uRWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5RWwpO1xuICAgICAgdGhpcy5jcm9wcGVyRWwuYXBwZW5kQ2hpbGQoaGFuZGxlQ29udGFpbmVyRWwpO1xuICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmNyb3BwZXJFbCk7XG4gICAgICB0YXJnZXRFbC5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLmNvbnRhaW5lckVsLCB0YXJnZXRFbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB0aGlzLmltYWdlRWwub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuYm94ID0gX3RoaXMyLmluaXRpYWxpemVCb3goX3RoaXMyLm9wdGlvbnMpO1xuICAgICAgICBfdGhpczIucmVkcmF3KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5pbWFnZUVsLnNyYyA9IHNyYztcbiAgICAgIHRoaXMuaW1hZ2VDbGlwcGVkRWwuc3JjID0gc3JjO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVzdHJveScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlLnBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcy5fcmVzdG9yZS5lbGVtZW50LCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJveCByZWdpb24gd2l0aCBhIHNldCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtCb3h9XG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdpbml0aWFsaXplQm94JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUJveChvcHRzKSB7XG4gICAgICB2YXIgd2lkdGggPSBvcHRzLnN0YXJ0U2l6ZS53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSBvcHRzLnN0YXJ0U2l6ZS5oZWlnaHQ7XG4gICAgICB2YXIgYm94ID0gbmV3IEJveCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGJveC5jb25zdHJhaW5Ub1JhdGlvKG9wdHMuYXNwZWN0UmF0aW8sIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIG1pbiA9IG9wdHMubWluU2l6ZTtcbiAgICAgIHZhciBtYXggPSBvcHRzLm1heFNpemU7XG4gICAgICBib3guY29uc3RyYWluVG9TaXplKG1heC53aWR0aCwgbWF4LmhlaWdodCwgbWluLndpZHRoLCBtaW4uaGVpZ2h0LCBbMC41LCAwLjVdLCBvcHRzLmFzcGVjdFJhdGlvKTtcbiAgICAgIHZhciBwYXJlbnRXaWR0aCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldFdpZHRoO1xuICAgICAgdmFyIHBhcmVudEhlaWdodCA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodDtcbiAgICAgIGJveC5jb25zdHJhaW5Ub0JvdW5kYXJ5KHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQsIFswLjUsIDAuNV0pO1xuICAgICAgdmFyIHggPSB0aGlzLmNyb3BwZXJFbC5vZmZzZXRXaWR0aCAvIDIgLSBib3gud2lkdGgoKSAvIDI7XG4gICAgICB2YXIgeSA9IHRoaXMuY3JvcHBlckVsLm9mZnNldEhlaWdodCAvIDIgLSBib3guaGVpZ2h0KCkgLyAyO1xuICAgICAgYm94Lm1vdmUoeCwgeSk7XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlZHJhdycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJveC53aWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKSxcbiAgICAgICAgICB4MSA9IE1hdGgucm91bmQodGhpcy5ib3gueDEpLFxuICAgICAgICAgIHkxID0gTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgeDIgPSBNYXRoLnJvdW5kKHRoaXMuYm94LngyKSxcbiAgICAgICAgICB5MiA9IE1hdGgucm91bmQodGhpcy5ib3gueTIpO1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4MSArICdweCwgJyArIHkxICsgJ3B4KSc7XG4gICAgICAgIF90aGlzMy5yZWdpb25FbC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgX3RoaXMzLnJlZ2lvbkVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgICAgIF90aGlzMy5pbWFnZUNsaXBwZWRFbC5zdHlsZS5jbGlwID0gJ3JlY3QoJyArIHkxICsgJ3B4LCAnICsgeDIgKyAncHgsICcgKyB5MiArICdweCwgJyArIHgxICsgJ3B4KSc7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfdGhpczMuYm94LmdldEFic29sdXRlUG9pbnQoWy41LCAuNV0pO1xuICAgICAgICB2YXIgeFNpZ24gPSBjZW50ZXJbMF0gLSBfdGhpczMuY3JvcHBlckVsLm9mZnNldFdpZHRoIC8gMiA+PiAzMTtcbiAgICAgICAgdmFyIHlTaWduID0gY2VudGVyWzFdIC0gX3RoaXMzLmNyb3BwZXJFbC5vZmZzZXRIZWlnaHQgLyAyID4+IDMxO1xuICAgICAgICB2YXIgcXVhZHJhbnQgPSAoeFNpZ24gXiB5U2lnbikgKyB5U2lnbiArIHlTaWduICsgNDtcbiAgICAgICAgdmFyIGZvcmVncm91bmRIYW5kbGVJbmRleCA9IC0yICogcXVhZHJhbnQgKyA4O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzMy5oYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGhhbmRsZSA9IF90aGlzMy5oYW5kbGVzW2ldO1xuICAgICAgICAgIHZhciBoYW5kbGVXaWR0aCA9IGhhbmRsZS5lbC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB2YXIgaGFuZGxlSGVpZ2h0ID0gaGFuZGxlLmVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB2YXIgbGVmdCA9IHgxICsgd2lkdGggKiBoYW5kbGUucG9zaXRpb25bMF0gLSBoYW5kbGVXaWR0aCAvIDI7XG4gICAgICAgICAgdmFyIHRvcCA9IHkxICsgaGVpZ2h0ICogaGFuZGxlLnBvc2l0aW9uWzFdIC0gaGFuZGxlSGVpZ2h0IC8gMjtcbiAgICAgICAgICBoYW5kbGUuZWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgTWF0aC5yb3VuZChsZWZ0KSArICdweCwgJyArIE1hdGgucm91bmQodG9wKSArICdweCknO1xuICAgICAgICAgIGhhbmRsZS5lbC5zdHlsZS56SW5kZXggPSBmb3JlZ3JvdW5kSGFuZGxlSW5kZXggPT0gaSA/IDUgOiA0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hIYW5kbGVyRXZlbnRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoSGFuZGxlckV2ZW50cygpIHtcbiAgICAgIHZhciBldmVudEJ1cyA9IHRoaXMuZXZlbnRCdXM7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVzdGFydCcsIHRoaXMub25IYW5kbGVNb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVtb3ZlJywgdGhpcy5vbkhhbmRsZU1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdoYW5kbGVlbmQnLCB0aGlzLm9uSGFuZGxlTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhdHRhY2hSZWdpb25FdmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hSZWdpb25FdmVudHMoKSB7XG4gICAgICB2YXIgZXZlbnRCdXMgPSB0aGlzLmV2ZW50QnVzO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy5yZWdpb25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25zdGFydCcsIHRoaXMub25SZWdpb25Nb3ZlU3RhcnQuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25tb3ZlJywgdGhpcy5vblJlZ2lvbk1vdmVNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgICBldmVudEJ1cy5hZGRFdmVudExpc3RlbmVyKCdyZWdpb25lbmQnLCB0aGlzLm9uUmVnaW9uTW92ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZ2lvbnN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50QnVzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWdpb25tb3ZlJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBldmVudEJ1cy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVnaW9uZW5kJywge1xuICAgICAgICAgIGRldGFpbDogeyBtb3VzZVg6IGUuY2xpZW50WCwgbW91c2VZOiBlLmNsaWVudFkgfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXR0YWNoT3ZlcmxheUV2ZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaE92ZXJsYXlFdmVudHMoKSB7XG4gICAgICB2YXIgU09VVEhFQVNUX0hBTkRMRV9JRFggPSA0O1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRtcEJveCA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBzZWxmLmNyb3BwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIG1vdXNlWCA9IGUuY2xpZW50WCAtIGNvbnRhaW5lci5sZWZ0O1xuICAgICAgICB2YXIgbW91c2VZID0gZS5jbGllbnRZIC0gY29udGFpbmVyLnRvcDtcbiAgICAgICAgdG1wQm94ID0gc2VsZi5ib3g7XG4gICAgICAgIHNlbGYuYm94ID0gbmV3IEJveChtb3VzZVgsIG1vdXNlWSwgbW91c2VYICsgMSwgbW91c2VZICsgMSk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZXN0YXJ0Jywge1xuICAgICAgICAgIGRldGFpbDogeyBoYW5kbGU6IHNlbGYuaGFuZGxlc1tTT1VUSEVBU1RfSEFORExFX0lEWF0gfVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZW1vdmUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IG1vdXNlWDogZS5jbGllbnRYLCBtb3VzZVk6IGUuY2xpZW50WSB9XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGlmIChzZWxmLmJveC53aWR0aCgpID09PSAxICYmIHNlbGYuYm94LmhlaWdodCgpID09PSAxKSB7XG4gICAgICAgICAgc2VsZi5ib3ggPSB0bXBCb3g7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZXZlbnRCdXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hhbmRsZWVuZCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHsgbW91c2VYOiBlLmNsaWVudFgsIG1vdXNlWTogZS5jbGllbnRZIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZVN0YXJ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlU3RhcnQoZSkge1xuICAgICAgdmFyIGhhbmRsZSA9IGUuZGV0YWlsLmhhbmRsZTtcbiAgICAgIHZhciBvcmlnaW5Qb2ludCA9IFsxIC0gaGFuZGxlLnBvc2l0aW9uWzBdLCAxIC0gaGFuZGxlLnBvc2l0aW9uWzFdXTtcbiAgICAgIHZhciBfYm94JGdldEFic29sdXRlUG9pbnQgPSB0aGlzLmJveC5nZXRBYnNvbHV0ZVBvaW50KG9yaWdpblBvaW50KSxcbiAgICAgICAgICBfYm94JGdldEFic29sdXRlUG9pbnQyID0gc2xpY2VkVG9BcnJheShfYm94JGdldEFic29sdXRlUG9pbnQsIDIpLFxuICAgICAgICAgIG9yaWdpblggPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzBdLFxuICAgICAgICAgIG9yaWdpblkgPSBfYm94JGdldEFic29sdXRlUG9pbnQyWzFdO1xuICAgICAgdGhpcy5hY3RpdmVIYW5kbGUgPSB7IGhhbmRsZTogaGFuZGxlLCBvcmlnaW5Qb2ludDogb3JpZ2luUG9pbnQsIG9yaWdpblg6IG9yaWdpblgsIG9yaWdpblk6IG9yaWdpblkgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcFN0YXJ0KHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25IYW5kbGVNb3ZlTW92aW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25IYW5kbGVNb3ZlTW92aW5nKGUpIHtcbiAgICAgIHZhciBfZSRkZXRhaWwgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbC5tb3VzZVk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICBpZiAobW91c2VYIDwgMCkge1xuICAgICAgICBtb3VzZVggPSAwO1xuICAgICAgfSBlbHNlIGlmIChtb3VzZVggPiBjb250YWluZXIud2lkdGgpIHtcbiAgICAgICAgbW91c2VYID0gY29udGFpbmVyLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1vdXNlWSA8IDApIHtcbiAgICAgICAgbW91c2VZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAobW91c2VZID4gY29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICBtb3VzZVkgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblBvaW50LnNsaWNlKCk7XG4gICAgICB2YXIgb3JpZ2luWCA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblg7XG4gICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuYWN0aXZlSGFuZGxlLm9yaWdpblk7XG4gICAgICB2YXIgaGFuZGxlID0gdGhpcy5hY3RpdmVIYW5kbGUuaGFuZGxlO1xuICAgICAgdmFyIFRPUF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzBdID09PSAxO1xuICAgICAgdmFyIFJJR0hUX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMV0gPT09IDE7XG4gICAgICB2YXIgQk9UVE9NX01PVkFCTEUgPSBoYW5kbGUuY29uc3RyYWludHNbMl0gPT09IDE7XG4gICAgICB2YXIgTEVGVF9NT1ZBQkxFID0gaGFuZGxlLmNvbnN0cmFpbnRzWzNdID09PSAxO1xuICAgICAgdmFyIE1VTFRJX0FYSVMgPSAoTEVGVF9NT1ZBQkxFIHx8IFJJR0hUX01PVkFCTEUpICYmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSk7XG4gICAgICB2YXIgeDEgPSBMRUZUX01PVkFCTEUgfHwgUklHSFRfTU9WQUJMRSA/IG9yaWdpblggOiB0aGlzLmJveC54MTtcbiAgICAgIHZhciB4MiA9IExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFID8gb3JpZ2luWCA6IHRoaXMuYm94LngyO1xuICAgICAgdmFyIHkxID0gVE9QX01PVkFCTEUgfHwgQk9UVE9NX01PVkFCTEUgPyBvcmlnaW5ZIDogdGhpcy5ib3gueTE7XG4gICAgICB2YXIgeTIgPSBUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSA/IG9yaWdpblkgOiB0aGlzLmJveC55MjtcbiAgICAgIHgxID0gTEVGVF9NT1ZBQkxFID8gbW91c2VYIDogeDE7XG4gICAgICB4MiA9IFJJR0hUX01PVkFCTEUgPyBtb3VzZVggOiB4MjtcbiAgICAgIHkxID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgOiB5MTtcbiAgICAgIHkyID0gQk9UVE9NX01PVkFCTEUgPyBtb3VzZVkgOiB5MjtcbiAgICAgIHZhciBpc0ZsaXBwZWRYID0gZmFsc2UsXG4gICAgICAgICAgaXNGbGlwcGVkWSA9IGZhbHNlO1xuICAgICAgaWYgKExFRlRfTU9WQUJMRSB8fCBSSUdIVF9NT1ZBQkxFKSB7XG4gICAgICAgIGlzRmxpcHBlZFggPSBMRUZUX01PVkFCTEUgPyBtb3VzZVggPiBvcmlnaW5YIDogbW91c2VYIDwgb3JpZ2luWDtcbiAgICAgIH1cbiAgICAgIGlmIChUT1BfTU9WQUJMRSB8fCBCT1RUT01fTU9WQUJMRSkge1xuICAgICAgICBpc0ZsaXBwZWRZID0gVE9QX01PVkFCTEUgPyBtb3VzZVkgPiBvcmlnaW5ZIDogbW91c2VZIDwgb3JpZ2luWTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0ZsaXBwZWRYKSB7XG4gICAgICAgIHZhciB0bXAgPSB4MTt4MSA9IHgyO3gyID0gdG1wO1xuICAgICAgICBvcmlnaW5bMF0gPSAxIC0gb3JpZ2luWzBdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRmxpcHBlZFkpIHtcbiAgICAgICAgdmFyIF90bXAgPSB5MTt5MSA9IHkyO3kyID0gX3RtcDtcbiAgICAgICAgb3JpZ2luWzFdID0gMSAtIG9yaWdpblsxXTtcbiAgICAgIH1cbiAgICAgIHZhciBib3ggPSBuZXcgQm94KHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChNVUxUSV9BWElTKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gbW91c2VZID4gYm94LnkxICsgcmF0aW8gKiBib3gud2lkdGgoKSB8fCBtb3VzZVkgPCBib3gueTIgLSByYXRpbyAqIGJveC53aWR0aCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFRPUF9NT1ZBQkxFIHx8IEJPVFRPTV9NT1ZBQkxFKSB7XG4gICAgICAgICAgaXNWZXJ0aWNhbE1vdmVtZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmF0aW9Nb2RlID0gaXNWZXJ0aWNhbE1vdmVtZW50ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBib3guY29uc3RyYWluVG9SYXRpbyhyYXRpbywgb3JpZ2luLCByYXRpb01vZGUpO1xuICAgICAgfVxuICAgICAgdmFyIG1pbiA9IHRoaXMub3B0aW9ucy5taW5TaXplO1xuICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICAgICAgYm94LmNvbnN0cmFpblRvU2l6ZShtYXgud2lkdGgsIG1heC5oZWlnaHQsIG1pbi53aWR0aCwgbWluLmhlaWdodCwgb3JpZ2luLCB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0V2lkdGg7XG4gICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gdGhpcy5jcm9wcGVyRWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgYm94LmNvbnN0cmFpblRvQm91bmRhcnkocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCwgb3JpZ2luKTtcbiAgICAgIHRoaXMuYm94ID0gYm94O1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wTW92ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSGFuZGxlTW92ZUVuZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGFuZGxlTW92ZUVuZChlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25SZWdpb25Nb3ZlU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVTdGFydChlKSB7XG4gICAgICB2YXIgX2UkZGV0YWlsMiA9IGUuZGV0YWlsLFxuICAgICAgICAgIG1vdXNlWCA9IF9lJGRldGFpbDIubW91c2VYLFxuICAgICAgICAgIG1vdXNlWSA9IF9lJGRldGFpbDIubW91c2VZO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY3JvcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgbW91c2VYID0gbW91c2VYIC0gY29udGFpbmVyLmxlZnQ7XG4gICAgICBtb3VzZVkgPSBtb3VzZVkgLSBjb250YWluZXIudG9wO1xuICAgICAgdGhpcy5jdXJyZW50TW92ZSA9IHtcbiAgICAgICAgb2Zmc2V0WDogbW91c2VYIC0gdGhpcy5ib3gueDEsXG4gICAgICAgIG9mZnNldFk6IG1vdXNlWSAtIHRoaXMuYm94LnkxXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BTdGFydCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wU3RhcnQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVNb3ZpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVNb3ZpbmcoZSkge1xuICAgICAgdmFyIF9lJGRldGFpbDMgPSBlLmRldGFpbCxcbiAgICAgICAgICBtb3VzZVggPSBfZSRkZXRhaWwzLm1vdXNlWCxcbiAgICAgICAgICBtb3VzZVkgPSBfZSRkZXRhaWwzLm1vdXNlWTtcbiAgICAgIHZhciBfY3VycmVudE1vdmUgPSB0aGlzLmN1cnJlbnRNb3ZlLFxuICAgICAgICAgIG9mZnNldFggPSBfY3VycmVudE1vdmUub2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZID0gX2N1cnJlbnRNb3ZlLm9mZnNldFk7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jcm9wcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtb3VzZVggPSBtb3VzZVggLSBjb250YWluZXIubGVmdDtcbiAgICAgIG1vdXNlWSA9IG1vdXNlWSAtIGNvbnRhaW5lci50b3A7XG4gICAgICB0aGlzLmJveC5tb3ZlKG1vdXNlWCAtIG9mZnNldFgsIG1vdXNlWSAtIG9mZnNldFkpO1xuICAgICAgaWYgKHRoaXMuYm94LngxIDwgMCkge1xuICAgICAgICB0aGlzLmJveC5tb3ZlKDAsIG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm94LngyID4gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUoY29udGFpbmVyLndpZHRoIC0gdGhpcy5ib3gud2lkdGgoKSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTEgPCAwKSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3gueTIgPiBjb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYm94Lm1vdmUobnVsbCwgY29udGFpbmVyLmhlaWdodCAtIHRoaXMuYm94LmhlaWdodCgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcE1vdmUodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblJlZ2lvbk1vdmVFbmQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblJlZ2lvbk1vdmVFbmQoZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICB2YXIgbW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIGlmIChtb2RlID09PSBudWxsKSB7XG4gICAgICAgIG1vZGUgPSB0aGlzLm9wdGlvbnMucmV0dXJuTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlID09ICdyZWFsJykge1xuICAgICAgICB2YXIgYWN0dWFsV2lkdGggPSB0aGlzLmltYWdlRWwubmF0dXJhbFdpZHRoO1xuICAgICAgICB2YXIgYWN0dWFsSGVpZ2h0ID0gdGhpcy5pbWFnZUVsLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHZhciBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MgPSB0aGlzLmltYWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgICAgICBlbGVtZW50SGVpZ2h0ID0gX2ltYWdlRWwkZ2V0Qm91bmRpbmdDLmhlaWdodDtcbiAgICAgICAgdmFyIGZhY3RvclggPSBhY3R1YWxXaWR0aCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgdmFyIGZhY3RvclkgPSBhY3R1YWxIZWlnaHQgLyBlbGVtZW50SGVpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQodGhpcy5ib3gueDEgKiBmYWN0b3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYm94LnkxICogZmFjdG9yWSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSAqIGZhY3RvclgpLFxuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAqIGZhY3RvclkpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ3JhdGlvJykge1xuICAgICAgICB2YXIgX2ltYWdlRWwkZ2V0Qm91bmRpbmdDMiA9IHRoaXMuaW1hZ2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIF9lbGVtZW50V2lkdGggPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLndpZHRoLFxuICAgICAgICAgICAgX2VsZW1lbnRIZWlnaHQgPSBfaW1hZ2VFbCRnZXRCb3VuZGluZ0MyLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiByb3VuZCh0aGlzLmJveC54MSAvIF9lbGVtZW50V2lkdGgsIDMpLFxuICAgICAgICAgIHk6IHJvdW5kKHRoaXMuYm94LnkxIC8gX2VsZW1lbnRIZWlnaHQsIDMpLFxuICAgICAgICAgIHdpZHRoOiByb3VuZCh0aGlzLmJveC53aWR0aCgpIC8gX2VsZW1lbnRXaWR0aCwgMyksXG4gICAgICAgICAgaGVpZ2h0OiByb3VuZCh0aGlzLmJveC5oZWlnaHQoKSAvIF9lbGVtZW50SGVpZ2h0LCAzKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdyYXcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogTWF0aC5yb3VuZCh0aGlzLmJveC54MSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZCh0aGlzLmJveC55MSksXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5ib3gud2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuYm94LmhlaWdodCgpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiAncGFyc2VPcHRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICAgIHZhciBkZWZhdWx0cyQkMSA9IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IG51bGwsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCB9LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSxcbiAgICAgICAgc3RhcnRTaXplOiB7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB1bml0OiAnJScgfSxcbiAgICAgICAgcmV0dXJuTW9kZTogJ3JlYWwnLFxuICAgICAgICBvbkluaXRpYWxpemU6IG51bGwsXG4gICAgICAgIG9uQ3JvcFN0YXJ0OiBudWxsLFxuICAgICAgICBvbkNyb3BNb3ZlOiBudWxsLFxuICAgICAgICBvbkNyb3BFbmQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgYXNwZWN0UmF0aW8gPSBudWxsO1xuICAgICAgaWYgKG9wdHMuYXNwZWN0UmF0aW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMuYXNwZWN0UmF0aW8gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYXNwZWN0UmF0aW8gPSBvcHRzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdHMuYXNwZWN0UmF0aW8gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGFzcGVjdFJhdGlvID0gb3B0cy5hc3BlY3RSYXRpb1sxXSAvIG9wdHMuYXNwZWN0UmF0aW9bMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBtYXhTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgbWF4U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5tYXhTaXplWzBdIHx8IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBvcHRzLm1heFNpemVbMV0gfHwgbnVsbCxcbiAgICAgICAgICB1bml0OiBvcHRzLm1heFNpemVbMl0gfHwgJ3B4J1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIG1pblNpemUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMubWluU2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICBtaW5TaXplID0ge1xuICAgICAgICAgIHdpZHRoOiBvcHRzLm1pblNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMubWluU2l6ZVsxXSB8fCBudWxsLFxuICAgICAgICAgIHVuaXQ6IG9wdHMubWluU2l6ZVsyXSB8fCAncHgnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgc3RhcnRTaXplID0gbnVsbDtcbiAgICAgIGlmIChvcHRzLnN0YXJ0U2l6ZSAhPT0gdW5kZWZpbmVkICYmIG9wdHMuc3RhcnRTaXplICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0U2l6ZSA9IHtcbiAgICAgICAgICB3aWR0aDogb3B0cy5zdGFydFNpemVbMF0gfHwgbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG9wdHMuc3RhcnRTaXplWzFdIHx8IG51bGwsXG4gICAgICAgICAgdW5pdDogb3B0cy5zdGFydFNpemVbMl0gfHwgJyUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgb25Jbml0aWFsaXplID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbkluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb25Jbml0aWFsaXplID0gb3B0cy5vbkluaXRpYWxpemU7XG4gICAgICB9XG4gICAgICB2YXIgb25Dcm9wU3RhcnQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uQ3JvcFN0YXJ0ID0gb3B0cy5vbkNyb3BTdGFydDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BFbmQgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uQ3JvcEVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BFbmQgPSBvcHRzLm9uQ3JvcEVuZDtcbiAgICAgIH1cbiAgICAgIHZhciBvbkNyb3BNb3ZlID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vblVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nyb3Bwci5qczogYG9uVXBkYXRlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSBgb25Dcm9wTW92ZWAgb3IgYG9uQ3JvcEVuZGAgaW5zdGVhZC4nKTtcbiAgICAgICAgb25Dcm9wTW92ZSA9IG9wdHMub25VcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25Dcm9wTW92ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkNyb3BNb3ZlID0gb3B0cy5vbkNyb3BNb3ZlO1xuICAgICAgfVxuICAgICAgdmFyIHJldHVybk1vZGUgPSBudWxsO1xuICAgICAgaWYgKG9wdHMucmV0dXJuTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBzID0gb3B0cy5yZXR1cm5Nb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChbJ3JlYWwnLCAncmF0aW8nLCAncmF3J10uaW5kZXhPZihzKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBcIkludmFsaWQgcmV0dXJuIG1vZGUuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuTW9kZSA9IHM7XG4gICAgICB9XG4gICAgICB2YXIgY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24gY29udmVydFRvUGl4ZWxzKGNvbnRhaW5lcikge1xuICAgICAgICB2YXIgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB2YXIgc2l6ZUtleXMgPSBbJ21heFNpemUnLCAnbWluU2l6ZScsICdzdGFydFNpemUnXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBrZXkgPSBzaXplS2V5c1tpXTtcbiAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpc1trZXldLnVuaXQgPT0gJyUnKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzW2tleV0ud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ud2lkdGggPSB0aGlzW2tleV0ud2lkdGggLyAxMDAgKiB3aWR0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpc1trZXldLmhlaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XS5oZWlnaHQgPSB0aGlzW2tleV0uaGVpZ2h0IC8gMTAwICogaGVpZ2h0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpc1trZXldLnVuaXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZSh2LCBkKSB7XG4gICAgICAgIHJldHVybiB2ICE9PSBudWxsID8gdiA6IGQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXNwZWN0UmF0aW86IGRlZmF1bHRWYWx1ZShhc3BlY3RSYXRpbywgZGVmYXVsdHMkJDEuYXNwZWN0UmF0aW8pLFxuICAgICAgICBtYXhTaXplOiBkZWZhdWx0VmFsdWUobWF4U2l6ZSwgZGVmYXVsdHMkJDEubWF4U2l6ZSksXG4gICAgICAgIG1pblNpemU6IGRlZmF1bHRWYWx1ZShtaW5TaXplLCBkZWZhdWx0cyQkMS5taW5TaXplKSxcbiAgICAgICAgc3RhcnRTaXplOiBkZWZhdWx0VmFsdWUoc3RhcnRTaXplLCBkZWZhdWx0cyQkMS5zdGFydFNpemUpLFxuICAgICAgICByZXR1cm5Nb2RlOiBkZWZhdWx0VmFsdWUocmV0dXJuTW9kZSwgZGVmYXVsdHMkJDEucmV0dXJuTW9kZSksXG4gICAgICAgIG9uSW5pdGlhbGl6ZTogZGVmYXVsdFZhbHVlKG9uSW5pdGlhbGl6ZSwgZGVmYXVsdHMkJDEub25Jbml0aWFsaXplKSxcbiAgICAgICAgb25Dcm9wU3RhcnQ6IGRlZmF1bHRWYWx1ZShvbkNyb3BTdGFydCwgZGVmYXVsdHMkJDEub25Dcm9wU3RhcnQpLFxuICAgICAgICBvbkNyb3BNb3ZlOiBkZWZhdWx0VmFsdWUob25Dcm9wTW92ZSwgZGVmYXVsdHMkJDEub25Dcm9wTW92ZSksXG4gICAgICAgIG9uQ3JvcEVuZDogZGVmYXVsdFZhbHVlKG9uQ3JvcEVuZCwgZGVmYXVsdHMkJDEub25Dcm9wRW5kKSxcbiAgICAgICAgY29udmVydFRvUGl4ZWxzOiBjb252ZXJ0VG9QaXhlbHNcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBDcm9wcHJDb3JlO1xufSgpO1xuZnVuY3Rpb24gcm91bmQodmFsdWUsIGRlY2ltYWxzKSB7XG4gIHJldHVybiBOdW1iZXIoTWF0aC5yb3VuZCh2YWx1ZSArICdlJyArIGRlY2ltYWxzKSArICdlLScgKyBkZWNpbWFscyk7XG59XG5cbnZhciBDcm9wcHIkMSA9IGZ1bmN0aW9uIChfQ3JvcHByQ29yZSkge1xuICBpbmhlcml0cyhDcm9wcHIsIF9Dcm9wcHJDb3JlKTtcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBDYWxscyB0aGUgQ3JvcHByQ29yZSdzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgZnVuY3Rpb24gQ3JvcHByKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2RlZmVycmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDcm9wcHIpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDcm9wcHIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihDcm9wcHIpKS5jYWxsKHRoaXMsIGVsZW1lbnQsIG9wdGlvbnMsIF9kZWZlcnJlZCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY3JvcCByZWdpb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbW9kZV0gV2hpY2ggbW9kZSBvZiBjYWxjdWxhdGlvbiB0byB1c2U6ICdyZWFsJywgJ3JhdGlvJyBvclxuICAgKiAgICAgICdyYXcnLlxuICAgKi9cbiAgY3JlYXRlQ2xhc3MoQ3JvcHByLCBbe1xuICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUobW9kZSkge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdnZXRWYWx1ZScsIHRoaXMpLmNhbGwodGhpcywgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGltYWdlIHNyYy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdzZXRJbWFnZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEltYWdlKHNyYykge1xuICAgICAgcmV0dXJuIGdldChDcm9wcHIucHJvdG90eXBlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ3JvcHByLnByb3RvdHlwZSksICdzZXRJbWFnZScsIHRoaXMpLmNhbGwodGhpcywgc3JjKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXN0cm95JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHJldHVybiBnZXQoQ3JvcHByLnByb3RvdHlwZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKENyb3Bwci5wcm90b3R5cGUpLCAnZGVzdHJveScsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCBjb29yZGluYXRlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogJ21vdmVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICB0aGlzLmJveC5tb3ZlKHgsIHkpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25Dcm9wRW5kICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkNyb3BFbmQodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBjcm9wIHJlZ2lvbiB0byBhIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvcmlnaW4gVGhlIG9yaWdpbiBwb2ludCB0byByZXNpemUgZnJvbS5cbiAgICAgKiAgICAgIERlZmF1bHRzIHRvIFswLjUsIDAuNV0gKGNlbnRlcikuXG4gICAgICovXG4gIH0sIHtcbiAgICBrZXk6ICdyZXNpemVUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZVRvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBvcmlnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFsuNSwgLjVdO1xuICAgICAgdGhpcy5ib3gucmVzaXplKHdpZHRoLCBoZWlnaHQsIG9yaWdpbik7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyb3BFbmQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm9uQ3JvcEVuZCh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjcm9wIHJlZ2lvbiBieSBhIGZhY3Rvci5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZmFjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3JpZ2luIFRoZSBvcmlnaW4gcG9pbnQgdG8gcmVzaXplIGZyb20uXG4gICAgICogICAgICBEZWZhdWx0cyB0byBbMC41LCAwLjVdIChjZW50ZXIpLlxuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiAnc2NhbGVCeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlQnkoZmFjdG9yKSB7XG4gICAgICB2YXIgb3JpZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbLjUsIC41XTtcbiAgICAgIHRoaXMuYm94LnNjYWxlKGZhY3Rvciwgb3JpZ2luKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZXNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5ib3ggPSB0aGlzLmluaXRpYWxpemVCb3godGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3JvcEVuZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Dcm9wRW5kKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIENyb3Bwcjtcbn0oQ3JvcHByQ29yZSk7XG5cbnJldHVybiBDcm9wcHIkMTtcblxufSkpKTtcbiIsICJleHBvcnQgZW51bSBMaWNlbmNlU3RhdHVzIHtcbiAgSW52YWxpZCxcbiAgVmFsaWQsXG4gIEV4cGlyZVNvb24sXG4gIEV4cGlyZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGljZW5jZSB7XG4gIHJlYWRvbmx5IFN0YXR1cz86IExpY2VuY2VTdGF0dXM7XG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgT3duZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgRXhwaXJhdGlvbkRhdGU6IERhdGUgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IEFwcGxpY2F0aW9uczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICByZWFkb25seSBTb3VyY2VDb250ZW50OiBzdHJpbmc7XG59XG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gTWVudUl0ZW1UeXBlIHtcbiAgR3JpZFZpZXcgPSAwLFxuICBEYXNoYm9hcmQgPSAxLFxuICBNZW51Tm9kZSA9IDIsXG4gIFJlcG9ydCA9IDMsXG4gIERpYWdyYW0gPSA0LFxuICBDRE0gPSA1LFxuICBTbGlkZXNob3cgPSA2LFxuICBHYW50dENoYXJ0ID0gN1xufVxuIiwgIlx1RkVGRmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vdGlmeShtc2c6IHN0cmluZywgc3VjY2VlZDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZCA/ICdzdWNjZXNzJyA6ICdlcnJvcic7XG4gIGNvbnN0IGRpc3BsYXlUaW1lID0gc3VjY2VlZCA/IDIwMDAgOiA0MDAwO1xuXG4gIERldkV4cHJlc3MudWkubm90aWZ5KHtcbiAgICBtZXNzYWdlOiBtc2csXG4gICAgdHlwZTogc3RhdHVzLFxuICAgIG9uU2hvd2luZzogKGUpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gZS5lbGVtZW50LmZpbmQoJy5keC10b2FzdC1tZXNzYWdlJyk7XG4gICAgICBtZXNzYWdlRWxlbWVudC5odG1sKChtZXNzYWdlRWxlbWVudC5odG1sKCkgfHwgJycpLnJlcGxhY2UoJ1xcXFxuJywgJzxiciAvPicpKTtcbiAgICB9XG4gIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvYXN0T3B0aW9ucywgc3RhdHVzLCBkaXNwbGF5VGltZSk7XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xuXG5leHBvcnQgY29uc3QgaXNFcnJvckluZm8gPSAoXG4gIHJlc3BvbnNlRGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IElFcnJvckluZm8gfCBJRXJyb3JJbmZvW10gfCB1bmRlZmluZWQgfCBudWxsXG4pOiByZXNwb25zZURhdGEgaXMgSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSA9PiB7XG4gIGlmICghcmVzcG9uc2VEYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzcG9uc2VEYXRhKVxuICAgID8gKHJlc3BvbnNlRGF0YVswXS5TdGFja1RyYWNlICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2VEYXRhWzBdLkVycm9yICE9PSB1bmRlZmluZWQpXG4gICAgOiAocmVzcG9uc2VEYXRhLkVycm9yICE9PSB1bmRlZmluZWQpO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJRXJyb3JJbmZvIHtcbiAgRXJyb3I6IHN0cmluZztcbiAgU3RhY2tUcmFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcGlSZXNwb25zZTxUPiB7XG4gIERhdGE6IFQgfCBJRXJyb3JJbmZvIHwgSUVycm9ySW5mb1tdIHwgdW5kZWZpbmVkO1xuICBNZXNzYWdlOiBzdHJpbmc7XG4gIFJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xuICBTdGF0dXNDb2RlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvb2t1cER0bzxUPiB7XG4gIFZhbHVlOiBUO1xuICBUZXh0OiBzdHJpbmc7XG59XG4iLCAiXHVGRUZGZXhwb3J0IGVudW0gUmVxdWVzdFN0YXRlIHtcbiAgQ29tcGxldGVkID0gMSxcbiAgRXJyb3JlZCA9IDJcbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uL1N0eWxpbmcvSW5kZXgnO1xuXG5jb25zdCBQT1BVUF9DT05URU5UX0NMQVNTID0gJ3BvcHVwLWNvbnRlbnQnO1xuY29uc3QgUE9QVVBfRk9PVEVSX0NMQVNTID0gJ3BvcHVwLWZvb3Rlcic7XG5jb25zdCBCVVRUT05TX0NMQVNTID0gJ2J1dHRvbnMnO1xuY29uc3QgT0tfQlROX0NMQVNTID0gJ29rLWJ0bic7XG5jb25zdCBDQU5DRUxfQlROX0NMQVNTID0gJ2NhbmNlbC1idG4nO1xuXG5pbnRlcmZhY2UgSVBvcHVwIHtcbiAgc2hvdzogKCkgPT4gdm9pZDtcbiAgaGlkZTogKCkgPT4gdm9pZDtcbiAgcmVtb3ZlOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cEJ1dHRvbk9wdGlvbnMge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgb25DbGljazogKGNsb3NlUG9wdXApID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dCgkY29udGFpbmVyLCBjb250ZW50Q2xhc3NOYW1lPykge1xuICByZXR1cm4ge1xuICAgICRjb250ZW50OiAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoUE9QVVBfQ09OVEVOVF9DTEFTUykuYWRkQ2xhc3MoY29udGVudENsYXNzTmFtZSkuYXBwZW5kVG8oJGNvbnRhaW5lciksXG4gICAgJGZvb3RlcjogJCgnPGRpdiAvPicpLmFkZENsYXNzKFBPUFVQX0ZPT1RFUl9DTEFTUykuYXBwZW5kVG8oJGNvbnRhaW5lcilcbiAgfTtcbn1cblxuY29uc3Qgc2hvd25Qb3B1cHMgPSBbXTtcblxuZnVuY3Rpb24gY3JlYXRlUG9wdXAoJGVsOiBKUXVlcnksIGR4UG9wdXBPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcywgdXNlS2V5UHJlc3NCZWhhdmlvcjogYm9vbGVhbiA9IGZhbHNlKTogSVBvcHVwIHtcbiAgY29uc3Qgc2F2ZWRPblNob3dpbmcgPSBkeFBvcHVwT3B0aW9ucy5vblNob3dpbmc7XG5cbiAgZHhQb3B1cE9wdGlvbnMub25TaG93biA9IChlKSA9PiB7XG4gICAgaWYgKHNhdmVkT25TaG93aW5nKSB7XG4gICAgICBzYXZlZE9uU2hvd2luZyhlKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxJbnB1dHMgPSBwb3B1cC5jb250ZW50KCkuZmluZCgnaW5wdXRbdHlwZT10ZXh0XScpO1xuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBhbGxJbnB1dHMuZXEoMCk7XG5cbiAgICBmaXJzdElucHV0LmZvY3VzKCk7XG5cbiAgICBjb25zdCBrZXlIYW5kbGVycyA9IHtcbiAgICAgIGtleWRvd246IChldjogYW55KSA9PiB7XG4gICAgICAgIGlmIChzaG93blBvcHVwc1tzaG93blBvcHVwcy5sZW5ndGggLSAxXSAhPT0gcG9wdXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXYua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAkKGV2LmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25LZXlEb3duKGV2KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHVzZUtleVByZXNzQmVoYXZpb3IpIHtcbiAgICAgIGFsbElucHV0cy5vbihrZXlIYW5kbGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpcnN0SW5wdXQub24oa2V5SGFuZGxlcnMpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICBwb3B1cC5jb250ZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTRVMuZHhCdXR0b259LiR7T0tfQlROX0NMQVNTfWApLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgIHBvcHVwLmNvbnRlbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1NFUy5keEJ1dHRvbn0uJHtDQU5DRUxfQlROX0NMQVNTfWApLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcG9wdXAgPSAkZWxcbiAgICAuZHhQb3B1cChkeFBvcHVwT3B0aW9ucylcbiAgICAuZHhQb3B1cCgnaW5zdGFuY2UnKTtcblxuICByZXR1cm4ge1xuICAgIHNob3c6ICgpID0+IHtcbiAgICAgIHBvcHVwLnNob3coKTtcbiAgICAgICQoZG9jdW1lbnQpLm9uKHsga2V5ZG93bjogb25LZXlEb3duIH0pO1xuICAgICAgc2hvd25Qb3B1cHMucHVzaChwb3B1cCk7XG4gICAgfSxcbiAgICBoaWRlOiAoKSA9PiB7XG4gICAgICAkKGRvY3VtZW50KS5vZmYoeyBrZXlkb3duOiBvbktleURvd24gfSk7XG4gICAgICBwb3B1cC5oaWRlKCk7XG4gICAgICBzaG93blBvcHVwcy5wb3AoKTtcbiAgICB9LFxuICAgIHJlbW92ZTogKCkgPT4gJGVsLnJlbW92ZSgpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdXR0b25zKFxuICBva09wdGlvbnM6IERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zLFxuICBjYW5jZWxPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuKSB7XG4gIGNvbnN0ICR0YWJsZSA9ICQoJzx0YWJsZSAvPicpLmFkZENsYXNzKEJVVFRPTlNfQ0xBU1MpO1xuICBjb25zdCAkdHIgPSAkKCc8dHI+JykuYXBwZW5kVG8oJHRhYmxlKTtcblxuICBpZiAob2tPcHRpb25zKSB7XG4gICAgJCgnPHRkIC8+JylcbiAgICAgIC5hdHRyKCd3aWR0aCcsICc1MCUnKVxuICAgICAgLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoQ1NTX0NMQVNTRVMuZHhCdXR0b24pLmFkZENsYXNzKE9LX0JUTl9DTEFTUykuZHhCdXR0b24ob2tPcHRpb25zKSlcbiAgICAgIC5hcHBlbmRUbygkdHIpO1xuICB9XG5cbiAgaWYgKGNhbmNlbE9wdGlvbnMpIHtcbiAgICAkKCc8dGQgLz4nKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzUwJScpXG4gICAgICAuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcyhDU1NfQ0xBU1NFUy5keEJ1dHRvbikuYWRkQ2xhc3MoQ0FOQ0VMX0JUTl9DTEFTUykuZHhCdXR0b24oY2FuY2VsT3B0aW9ucykpXG4gICAgICAuYXBwZW5kVG8oJHRyKTtcbiAgfVxuXG4gIHJldHVybiAkdGFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtKGxhYmVsOiBzdHJpbmcsICR2YWx1ZTogSlF1ZXJ5KSB7XG4gIHJldHVybiAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2l0ZW0nKVxuICAgIC5hcHBlbmQoXG4gICAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ2Zvcm0tbGFiZWwnKS50ZXh0KGxhYmVsKSxcbiAgICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygndmFsdWUnKS5hcHBlbmQoJHZhbHVlKVxuICAgICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvcHVwT3B0aW9ucyB7XG4gIHVzZUtleVByZXNzQmVoYXZpb3I6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWFsb2coXG4gIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Qcm9wZXJ0aWVzLFxuICAkcG9wdXBDb250ZW50OiBKUXVlcnksXG4gIG9rQnRuT3B0aW9ucz86IElQb3B1cEJ1dHRvbk9wdGlvbnMsXG4gIGNhbmNlbEJ0bk9wdGlvbnM/OiBJUG9wdXBCdXR0b25PcHRpb25zLFxuICBhZGRpdGlvbmFsT3B0aW9ucz86IElQb3B1cE9wdGlvbnNcbikge1xuICBjb25zdCAkZWwgPSAkKCc8ZGl2PicpLmFwcGVuZFRvKCdib2R5Jyk7XG4gIGxldCAkYnV0dG9uczogSlF1ZXJ5ID0gbnVsbDtcblxuICBsZXQgcG9wdXA6IElQb3B1cCA9IG51bGw7XG5cbiAgY29uc3QgdXNlS2V5UHJlc3NCZWhhdmlvciA9IGFkZGl0aW9uYWxPcHRpb25zID8gYWRkaXRpb25hbE9wdGlvbnMudXNlS2V5UHJlc3NCZWhhdmlvciA6IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGNsb3NlUG9wdXAoKSB7XG4gICAgcG9wdXAuaGlkZSgpO1xuICAgIHBvcHVwLnJlbW92ZSgpO1xuICB9XG5cbiAgY29uc3QgZHhQb3B1cE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Qcm9wZXJ0aWVzID0ge1xuICAgIGNvbnRlbnRUZW1wbGF0ZTogKCRwb3B1cENvbnRhaW5lcikgPT4ge1xuICAgICAgY29uc3QgeyAkY29udGVudCwgJGZvb3RlciB9ID0gY3JlYXRlTGF5b3V0KCRwb3B1cENvbnRhaW5lcik7XG5cbiAgICAgICRjb250ZW50LmFwcGVuZCgkcG9wdXBDb250ZW50KTtcblxuICAgICAgaWYgKG9rQnRuT3B0aW9ucyAmJiBjYW5jZWxCdG5PcHRpb25zKSB7XG4gICAgICAgICRidXR0b25zID0gY3JlYXRlQnV0dG9ucyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiBva0J0bk9wdGlvbnMudGV4dCxcbiAgICAgICAgICAgIGljb246IG9rQnRuT3B0aW9ucy5pY29uLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IG9rQnRuT3B0aW9ucy5kaXNhYmxlZCxcbiAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiBva0J0bk9wdGlvbnMub25DbGljayhjbG9zZVBvcHVwKVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogY2FuY2VsQnRuT3B0aW9ucy50ZXh0LFxuICAgICAgICAgICAgaWNvbjogY2FuY2VsQnRuT3B0aW9ucy5pY29uLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGNhbmNlbEJ0bk9wdGlvbnMuZGlzYWJsZWQsXG4gICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gY2FuY2VsQnRuT3B0aW9ucy5vbkNsaWNrKGNsb3NlUG9wdXApXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgICRmb290ZXIuYXBwZW5kKCRidXR0b25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRmb290ZXIucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbGVtZW50QXR0cjogeyBjbGFzczogJ2lzem9sZWEtZHgtcG9wdXAnIH1cbiAgfTtcblxuICBjb25zdCBwb3B1cE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Qcm9wZXJ0aWVzID0ge307XG5cbiAgJC5leHRlbmQodHJ1ZSwgcG9wdXBPcHRpb25zLCBvcHRpb25zLCBkeFBvcHVwT3B0aW9ucyk7XG5cbiAgcG9wdXAgPSBjcmVhdGVQb3B1cCgkZWwsIHBvcHVwT3B0aW9ucywgdXNlS2V5UHJlc3NCZWhhdmlvcik7XG5cbiAgcG9wdXAuc2hvdygpO1xuXG4gIHJldHVybiB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBwcmVmZXItdGVtcGxhdGVcbiAgICBva0J0bjogJGJ1dHRvbnMgPyAkYnV0dG9ucy5maW5kKGAuJHsgIE9LX0JUTl9DTEFTU31gKS5keEJ1dHRvbignaW5zdGFuY2UnKSA6IG51bGwsXG4gICAgY2xvc2U6ICgpID0+IGNsb3NlUG9wdXAoKVxuICB9O1xufVxuIiwgIlx1RkVGRmV4cG9ydCBjb25zdCBDU1NfQ0xBU1NFUyA9IHtcbiAgZHhEYXRhR3JpZDogJ2lzem9sZWEtZHgtZGF0YWdyaWQnLFxuICBkeEJ1dHRvbjogJ2lzem9sZWEtZHgtYnV0dG9uJyxcbiAgZHhQb3B1cDogJ2lzem9sZWEtZHgtcG9wdXAnXG59O1xuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZURpYWxvZyB9IGZyb20gJy4vUG9wdXAnO1xuaW1wb3J0IHsgSUVycm9ySW5mbyB9IGZyb20gJy4uL0RhdGEvQXBpUmVzcG9uc2UnO1xuXG5jb25zdCBNQUlOX0VMRU1FTlRfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cCc7XG5jb25zdCBQT1BVUF9DT05URU5UX0NMQVNTID0gJ2lzem9sZWEtZXJyb3ItZHgtcG9wdXBfX2NvbnRlbnQnO1xuY29uc3QgRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUyA9ICdpc3pvbGVhLWVycm9yLWR4LXBvcHVwX19lcnJvci1tZXNzYWdlJztcbmNvbnN0IEVSUk9SX1BPUFVQX0RFVEFJTFNfQ0xBU1MgPSAnaXN6b2xlYS1lcnJvci1keC1wb3B1cF9fZXJyb3ItZGV0YWlscyc7XG5cbmNvbnN0IFNIT1dfREVUQUlMU19URVhUID0gJ1Nob3cgZGV0YWlscyc7XG5jb25zdCBISURFX0RFVEFJTFNfVEVYVCA9ICdIaWRlIGRldGFpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXJyb3JJbmZvUG9wdXAodGl0bGVNZXNzYWdlOiBzdHJpbmcsIGVycm9ySW5mbzogSUVycm9ySW5mbyB8IElFcnJvckluZm9bXSk6IHZvaWQge1xuICBsZXQgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcbiAgY29uc3QgaW5mb0FycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pID8gZXJyb3JJbmZvIDogW2Vycm9ySW5mb107XG5cbiAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcyhQT1BVUF9DT05URU5UX0NMQVNTKTtcblxuICBpbmZvQXJyYXkuZm9yRWFjaCgoaSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCAkZXJyb3JNZXNzYWdlRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfTUVTU0FHRV9DTEFTUykudGV4dChpLkVycm9yKTtcbiAgICBjb25zdCAkZXJyb3JEZXRhaWxzRWxlbWVudCA9ICQoJzxwIC8+JykuYWRkQ2xhc3MoRVJST1JfUE9QVVBfREVUQUlMU19DTEFTUykudGV4dChpLlN0YWNrVHJhY2UpO1xuICAgICRwb3B1cENvbnRlbnQuYXBwZW5kKCRlcnJvck1lc3NhZ2VFbGVtZW50LCAkZXJyb3JEZXRhaWxzRWxlbWVudCkuaGlkZSgpO1xuXG4gICAgaWYgKGluZGV4IDwgaW5mb0FycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICRwb3B1cENvbnRlbnQuYXBwZW5kKCQoJzxociAvPicpKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHBvcHVwSW5mbyA9IGNyZWF0ZURpYWxvZyhcbiAgICB7XG4gICAgICB0aXRsZTogdGl0bGVNZXNzYWdlLFxuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBhbmltYXRpb246IHtcbiAgICAgICAgc2hvdzogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVJbicgfSxcbiAgICAgICAgaGlkZTogeyBkaXJlY3Rpb246ICdib3R0b20nLCB0eXBlOiAnc2xpZGVPdXQnIH1cbiAgICAgIH0sXG4gICAgICBwb3NpdGlvbjogeyBteTogJ2JvdHRvbScsIGF0OiAnYm90dG9tJywgb2Zmc2V0OiB7IHk6IC01MCB9IH0sXG4gICAgICBzaGFkaW5nOiBmYWxzZSxcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XG4gICAgICAgIHBvcHVwID0gZS5jb21wb25lbnQ7XG4gICAgICAgIGUuZWxlbWVudC5hZGRDbGFzcyhNQUlOX0VMRU1FTlRfQ0xBU1MpO1xuICAgICAgfVxuICAgIH0sXG4gICAgJHBvcHVwQ29udGVudCxcbiAgICB7XG4gICAgICB0ZXh0OiBTSE9XX0RFVEFJTFNfVEVYVCxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaXNGdWxsU2NyZWVuUmVxdWlyZWQ6IGJvb2xlYW4gPSAhcG9wdXAub3B0aW9uKCdmdWxsU2NyZWVuJyk7XG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW4oaXNGdWxsU2NyZWVuUmVxdWlyZWQpO1xuICAgICAgICBwb3B1cEluZm8ub2tCdG4ub3B0aW9uKCd0ZXh0JywgaXNGdWxsU2NyZWVuUmVxdWlyZWQgPyBISURFX0RFVEFJTFNfVEVYVCA6IFNIT1dfREVUQUlMU19URVhUKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6ICdDbG9zZScsXG4gICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXG4gICAgfSk7XG5cbiAgY29uc3QgdG9nZ2xlRnVsbFNjcmVlbiA9IChpc0Z1bGxTY3JlZW5SZXF1aXJlZDogYm9vbGVhbikgPT4ge1xuICAgICRwb3B1cENvbnRlbnQudG9nZ2xlKGlzRnVsbFNjcmVlblJlcXVpcmVkKTtcbiAgICBwb3B1cC5vcHRpb24oJ2Z1bGxTY3JlZW4nLCBpc0Z1bGxTY3JlZW5SZXF1aXJlZCk7XG4gICAgcG9wdXAucmVwYWludCgpO1xuICB9O1xufVxuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIEV4Y2VwdGlvblR5cGUge1xuICBVbmV4cGVjdGVkRXhjZXB0aW9uID0gMCxcbiAgU3FsRXhjZXB0aW9uID0gMSxcbiAgSXN6b2xlYUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gPSAyXG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4uL0RhdGEvRXhjZXB0aW9uVHlwZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRHZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlID0gKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHtcbiAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7XG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcbiAgICAgIHJldHVybiAnV2UgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgdGhlIGRhdGEgcXVlcnkgaG93ZXZlciBpdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkYXRhIHNvdXJjZS4nO1xuXG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLklzem9sZWFDb25maWd1cmF0aW9uRXhjZXB0aW9uOlxuICAgICAgcmV0dXJuICdTb21ldGhpbmcgd3Jvbmcgd2l0aCBpc3pvbGVhIGNvbmZpZ3VyYXRpb24uIENoZWNrIENsaWVudElkL0NsaWVudFNlY3JldCBmaWVsZHMgaW4gdGhlIGFwcHNldHRpbmdzLmpzb24gZmlsZS4nO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufTtcbiIsICJcdUZFRkZpbXBvcnQgbm90aWZ5IGZyb20gJy4uL1dpZGdldHMvTm90aWZ5JztcbmltcG9ydCB7IElBcGlSZXNwb25zZSwgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcbmltcG9ydCB7IGNyZWF0ZUVycm9ySW5mb1BvcHVwIH0gZnJvbSAnLi4vV2lkZ2V0cy9FcnJvckluZm9Qb3B1cCc7XG5pbXBvcnQgeyBFeGNlcHRpb25UeXBlIH0gZnJvbSAnLi9FeGNlcHRpb25UeXBlJztcbmltcG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9VdGlscy9HZW5lcmFsVXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlJztcblxuY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFID0gJ1VuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjb250YWN0IHRvIGRldmVsb3BlcnMuJztcbmNvbnN0IE5PVF9FU1NFTlRJQUxfU1RBVFVTRVMgPSBbNTA0XTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRFcnJvck1lc3NhZ2UgPSAoKSA9PiBERUZBVUxUX0VSUk9SX01FU1NBR0U7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTdWNjZXNzKHJlczogSUFwaVJlc3BvbnNlPGFueT4sIG5vdGlmeVN1Y2Nlc3MgPSBmYWxzZSkge1xuICBpZiAobm90aWZ5U3VjY2Vzcykge1xuICAgIG5vdGlmeShyZXMuTWVzc2FnZSk7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzLkRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3I8VD4oXG4gIHJlczogSUFwaVJlc3BvbnNlPFQ+LFxuICBub3RpZnlFcnJvcjogYm9vbGVhbixcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZ1xuKTogeyBtZXNzYWdlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSByZXMuTWVzc2FnZTtcblxuICBjb25zdCByZXN1bHQgPSB7IG1lc3NhZ2UgfTtcblxuICBsZXQgbWVzc2FnZVRvU2hvdztcbiAgY29uc3QgZXhjZXB0aW9uVHlwZSA9IHBhcnNlRXhjZXB0aW9uVHlwZShtZXNzYWdlKTtcbiAgaWYgKGV4Y2VwdGlvblR5cGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBjdXN0b21FcnJvck1lc3NhZ2UgPSBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgPyBnZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UoZXhjZXB0aW9uVHlwZSkgOiAnJztcbiAgICBtZXNzYWdlVG9TaG93ID0gY3VzdG9tRXJyb3JNZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRTtcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlVG9TaG93ID0gbWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0U7XG4gIH1cblxuICBpZiAobm90aWZ5RXJyb3IpIHtcbiAgICBjb25zdCBlcnJvckluZm8gPSByZXMuRGF0YTtcbiAgICBpZiAoaXNFcnJvckluZm8oZXJyb3JJbmZvKSkge1xuICAgICAgY29uc3QgaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5ID0gQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIGVycm9ySW5mby5sZW5ndGg7XG4gICAgICBjb25zdCBpc0Vycm9ySW5mb0hhc0RhdGEgPSAhQXJyYXkuaXNBcnJheShlcnJvckluZm8pICYmIChlcnJvckluZm8uU3RhY2tUcmFjZSB8fCBlcnJvckluZm8uRXJyb3IpO1xuXG4gICAgICBpZiAoaXNFcnJvckluZm9Ob3RFbXB0eUFycmF5IHx8IGlzRXJyb3JJbmZvSGFzRGF0YSkge1xuICAgICAgICBjcmVhdGVFcnJvckluZm9Qb3B1cChtZXNzYWdlVG9TaG93LCBlcnJvckluZm8pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm90aWZ5KG1lc3NhZ2VUb1Nob3csIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhjZXB0aW9uVHlwZShtZXNzYWdlOiBzdHJpbmcpOiBFeGNlcHRpb25UeXBlIHwgbnVsbCB7XG4gIHJldHVybiAoIWlzTmFOKG1lc3NhZ2UgYXMgYW55KSkgJiYgRXhjZXB0aW9uVHlwZVsrbWVzc2FnZV0gPyArbWVzc2FnZSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVVcGxvYWQoZTogeyByZXF1ZXN0OiB7IHJlc3BvbnNlOiBzdHJpbmc7IH0gfSkge1xuICBjb25zdCByZXNwb25zZTogSUFwaVJlc3BvbnNlPGFueT4gPSBlLnJlcXVlc3QucmVzcG9uc2UgPyBKU09OLnBhcnNlKGUucmVxdWVzdC5yZXNwb25zZSkgOiB7fTtcblxuICBpZiAocmVzcG9uc2UuUmVxdWVzdFN0YXRlID09PSBSZXF1ZXN0U3RhdGUuQ29tcGxldGVkKSB7XG4gICAgaGFuZGxlU3VjY2VzcyhyZXNwb25zZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKHJlc3BvbnNlLCB0cnVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCB0eXBlIElTZW5kUmVxdWVzdFNldHRpbmdzID0gSlF1ZXJ5QWpheFNldHRpbmdzICYge1xuICBub3RpZnlFcnJvcj86IGJvb2xlYW47XG4gIGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZT86IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKSA9PiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VuZFJlcXVlc3Q8VCA9IGFueT4oXG4gIHVybDogc3RyaW5nLFxuICB0eXBlOiBzdHJpbmcgPSAnR0VUJyxcbiAgZGF0YSA9IG51bGwsXG4gIG5vdGlmeVN1Y2Nlc3M/OiBib29sZWFuLFxuICBzZXR0aW5ncz86IElTZW5kUmVxdWVzdFNldHRpbmdzLFxuKTogSlF1ZXJ5LkRlZmVycmVkPFQ+IHtcbiAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgY29uc3Qgbm90aWZ5RXJyb3IgPSBzZXR0aW5ncz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBzZXR0aW5ncy5ub3RpZnlFcnJvcjtcblxuICBjb25zdCBtYW5kYXRvcnlPcHRpb25zID0ge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFqYXhTZXR0aW5ncyA9ICQuZXh0ZW5kKHsgdHlwZSwgdXJsLCBkYXRhIH0sIHNldHRpbmdzLCBtYW5kYXRvcnlPcHRpb25zKTtcblxuICAkLmFqYXgoYWpheFNldHRpbmdzKVxuICAgIC5kb25lKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBJQXBpUmVzcG9uc2U8YW55PiA9IHJlcztcblxuICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xuICAgICAgICBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlLCBub3RpZnlTdWNjZXNzKTtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZS5EYXRhKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gaGFuZGxlRXJyb3IocmVzcG9uc2UsIG5vdGlmeUVycm9yLCBzZXR0aW5ncz8uZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlIHx8IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xuXG4gICAgICBkZWZlcnJlZC5yZWplY3QobWVzc2FnZSk7XG4gICAgfSlcbiAgICAuZmFpbCgoanFYSFIsIHRleHRTdGF0dXMpID0+IHtcbiAgICAgIGlmICghTk9UX0VTU0VOVElBTF9TVEFUVVNFUy5pbmNsdWRlcyhqcVhIUi5zdGF0dXMpICYmIG5vdGlmeUVycm9yKSB7XG4gICAgICAgIG5vdGlmeShnZXREZWZhdWx0RXJyb3JNZXNzYWdlKCksIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgZGVmZXJyZWQucmVqZWN0KHRleHRTdGF0dXMpO1xuICAgIH0pO1xuXG4gIHJldHVybiBkZWZlcnJlZDtcbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBJQXBpUmVzcG9uc2UgfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcbmltcG9ydCB7IGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBnZXREZWZhdWx0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9SZXF1ZXN0JztcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4vUmVxdWVzdFN0YXRlJztcbmltcG9ydCB7IEV4Y2VwdGlvblR5cGUgfSBmcm9tICcuL0V4Y2VwdGlvblR5cGUnO1xuXG5leHBvcnQgdHlwZSBJRHhEYXRhU291cmNlT3B0aW9ucyA9IERldkV4cHJlc3MuZGF0YS5Bc3BOZXQuT3B0aW9ucyAmIHtcbiAgbm90aWZ5U3VjY2Vzcz86IGJvb2xlYW47XG4gIG5vdGlmeUVycm9yPzogYm9vbGVhbjtcbiAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlPzogKGV4Y2VwdGlvblR5cGU6IEV4Y2VwdGlvblR5cGUpID0+IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEeERhdGFTb3VyY2Uob3B0aW9uczogSUR4RGF0YVNvdXJjZU9wdGlvbnMpIHtcbiAgY29uc3Qgc3RvcmUgPSBEZXZFeHByZXNzLmRhdGEuQXNwTmV0LmNyZWF0ZVN0b3JlKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG9uQmVmb3JlU2VuZDogKGpxWGhyLCBzZXR0aW5ncykgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMub25CZWZvcmVTZW5kKSB7XG4gICAgICAgIG9wdGlvbnMub25CZWZvcmVTZW5kKGpxWGhyLCBzZXR0aW5ncyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdGlmeUVycm9yID0gb3B0aW9ucz8ubm90aWZ5RXJyb3IgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm5vdGlmeUVycm9yO1xuXG4gICAgICBzZXR0aW5ncy5kYXRhRmlsdGVyID0gKHJhd1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHJhd1Jlc3BvbnNlKTtcblxuICAgICAgICBpZiAocmVzLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVTdWNjZXNzKHJlcywgb3B0aW9ucy5ub3RpZnlTdWNjZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpKTtcbiAgICAgIH07XG5cbiAgICAgIHNldHRpbmdzLmVycm9yID0gKHhocjogSlF1ZXJ5WEhSKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlczogSUFwaVJlc3BvbnNlPGFueT4gPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQgfHwgJ3t9Jyk7XG5cbiAgICAgICAgLy8gTk9URTogZm9yIHVuaGFuZGxlZCBlcnJvcnMgb24gdGhlIHNlcnZlclxuICAgICAgICBpZiAoIXJlcy5SZXF1ZXN0U3RhdGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihyZXMsIG5vdGlmeUVycm9yLCBvcHRpb25zPy5nZXRVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgKHN0b3JlIGFzIGFueSkuX2Vycm9ySGFuZGxlciA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgaWYgKGVycm9yICYmICFlcnJvci5tZXNzYWdlKSB7XG4gICAgICBlcnJvci5tZXNzYWdlID0gZ2V0RGVmYXVsdEVycm9yTWVzc2FnZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc3RvcmU7XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuL1JlcXVlc3QnO1xuXG5jb25zdCBsb2FkUHJvbWlzZXM6IHsgW3VybDogc3RyaW5nXTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB9ID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPFQ+KHVybDogc3RyaW5nKSB7XG4gIGlmIChsb2FkUHJvbWlzZXNbdXJsXSkge1xuICAgIHJldHVybiBhd2FpdCBsb2FkUHJvbWlzZXNbdXJsXTtcbiAgfVxuXG4gIGxvYWRQcm9taXNlc1t1cmxdID0gc2VuZFJlcXVlc3Q8VD4odXJsKTtcbiAgbG9hZFByb21pc2VzW3VybF0uY2F0Y2goKGVycikgPT4ge1xuICAgIGxvYWRQcm9taXNlc1t1cmxdID0gbnVsbDtcblxuICAgIHRocm93IGVycjtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0OiBUID0gYXdhaXQgbG9hZFByb21pc2VzW3VybF07XG5cbiAgbG9hZFByb21pc2VzW3VybF0gPSBudWxsO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QsIGhhbmRsZUVycm9yLCBoYW5kbGVTdWNjZXNzLCBoYW5kbGVVcGxvYWQgfSBmcm9tICcuL1JlcXVlc3QnO1xuaW1wb3J0IHsgaXNFcnJvckluZm8gfSBmcm9tICcuL0FwaVJlc3BvbnNlJztcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcbmltcG9ydCAqIGFzIGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uIGZyb20gJy4vTG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24nO1xuXG4vLyBUT0RPOiBleHBvcnQgdHlwZVxuZXhwb3J0IHsgSUFwaVJlc3BvbnNlLCBJRXJyb3JJbmZvIH0gZnJvbSAnLi9BcGlSZXNwb25zZSc7XG5leHBvcnQgeyBJRHhEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4vRHhEYXRhU291cmNlJztcbmV4cG9ydCB7IElMb2dvU2V0dGluZ3MgfSBmcm9tICcuL0lMb2dvU2V0dGluZ3MnO1xuZXhwb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi9SZXF1ZXN0U3RhdGUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNlbmRSZXF1ZXN0LFxuICBoYW5kbGVFcnJvcixcbiAgaGFuZGxlU3VjY2VzcyxcbiAgaGFuZGxlVXBsb2FkLFxuICBjcmVhdGVEeERhdGFTb3VyY2UsXG4gIGlzRXJyb3JJbmZvLFxuICBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvblxufTtcbiIsICJleHBvcnQgaW50ZXJmYWNlIElSZW5kZXJlZCB7XG4gIHJlbmRlcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXN0cm95YWJsZSB7XG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGlzRGVzdHJveWFibGUgPSAob2JqOiBhbnkpOiBvYmogaXMgSURlc3Ryb3lhYmxlID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBvYmouZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmV4cG9ydCBjb25zdCB0aHJvd1JlbmRlckVycm9yID0gKGVsZW1lbnROYW1lPzogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHByZWZlci10ZW1wbGF0ZVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1aXJlZCAke2VsZW1lbnROYW1lID8gKGAke2VsZW1lbnROYW1lICB9IGApIDogJyd9IGlzbid0IGNyZWF0ZWRgKTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZXBSZWFkb25seTxUPiA9IHtcbiAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IChcbiAgICBUW1BdIGV4dGVuZHMgQXJyYXk8aW5mZXIgVTE+ID8gUmVhZG9ubHlBcnJheTxEZWVwUmVhZG9ubHk8VTE+PiA6IChcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gUmVhZG9ubHlNYXA8SywgRGVlcFJlYWRvbmx5PFUyPj4gOiAoXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gUmVhZG9ubHlTZXQ8RGVlcFJlYWRvbmx5PFUzPj4gOiAoXG4gICAgICAgICAgVFtQXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtQXSA6IChcbiAgICAgICAgICAgIERlZXBSZWFkb25seTxUW1BdPlxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZXBQYXJ0aWFsPFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXT86IChcbiAgICBUW1BdIGV4dGVuZHMgQXJyYXk8aW5mZXIgVTE+ID8gQXJyYXk8RGVlcFBhcnRpYWw8VTE+PiA6IChcbiAgICAgIFRbUF0gZXh0ZW5kcyBNYXA8aW5mZXIgSywgaW5mZXIgVTI+ID8gTWFwPEssIERlZXBQYXJ0aWFsPFUyPj4gOiAoXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBQYXJ0aWFsPFUzPj4gOiAoXG4gICAgICAgICAgVFtQXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtQXSA6IChcbiAgICAgICAgICAgIERlZXBQYXJ0aWFsPFRbUF0+XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgRGVlcFJlcXVpcmVkPFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXS0/OiAoXG4gICAgVFtQXSBleHRlbmRzIEFycmF5PGluZmVyIFUxPiA/IEFycmF5PERlZXBSZXF1aXJlZDxVMT4+IDogKFxuICAgICAgVFtQXSBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBVMj4gPyBNYXA8SywgRGVlcFJlcXVpcmVkPFUyPj4gOiAoXG4gICAgICAgIFRbUF0gZXh0ZW5kcyBTZXQ8aW5mZXIgVTM+ID8gU2V0PERlZXBSZXF1aXJlZDxVMz4+IDogKFxuICAgICAgICAgIFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiAoXG4gICAgICAgICAgICBEZWVwUmVxdWlyZWQ8VFtQXT5cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBNdXRhYmxlPFQ+ID0ge1xuICAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF07XG59O1xuIiwgIlx1RkVGRmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuLi9IZWFkZXIvSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybEJ5TWVudUl0ZW1EYXRhKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCBEZWVwUmVhZG9ubHk8SU5hdmlnYXRpb25NZW51SXRlbU1vZGVsPikge1xuICBjb25zdCB7IEFyZWEsIENvbnRyb2xsZXIsIEFjdGlvbiwgSXNDbGlja2FibGUgfSA9IGl0ZW1EYXRhO1xuXG4gIGlmIChJc0NsaWNrYWJsZSAmJiBDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIEFyZWEgPyBlbmNvZGVVUkkoYC8ke0FyZWF9LyR7Q29udHJvbGxlcn0vJHtBY3Rpb259YCkgOiBlbmNvZGVVUkkoYC8ke0NvbnRyb2xsZXJ9LyR7QWN0aW9ufWApO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzIH0gZnJvbSAnLi9XaW5kb3dSZXNpemVMaXN0ZW5lcic7XG5leHBvcnQgeyBJTGF5b3V0QnJlYWtwb2ludCwgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB9IGZyb20gJy4vV2luZG93UmVzaXplTGlzdGVuZXInO1xuIiwgImltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxheW91dEJyZWFrcG9pbnQge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1pbldpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heFdpZHRoOiBudW1iZXI7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCB7XG4gIHJlYWRvbmx5IHByZXZpb3VzQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XG4gIHJlYWRvbmx5IGN1cnJlbnRCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcbn1cblxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzID0ge1xuICB4czoge1xuICAgIG5hbWU6ICd4cycsXG4gICAgbWluV2lkdGg6IDAsXG4gICAgbWF4V2lkdGg6IDU3NVxuICB9LFxuICBzbToge1xuICAgIG5hbWU6ICdzbScsXG4gICAgbWluV2lkdGg6IDU3NixcbiAgICBtYXhXaWR0aDogNzY3XG4gIH0sXG4gIG1kOiB7XG4gICAgbmFtZTogJ21kJyxcbiAgICBtaW5XaWR0aDogNzY4LFxuICAgIG1heFdpZHRoOiA5OTFcbiAgfSxcbiAgbGc6IHtcbiAgICBuYW1lOiAnbGcnLFxuICAgIG1pbldpZHRoOiA5OTIsXG4gICAgbWF4V2lkdGg6IDExOTlcbiAgfSxcbiAgeGw6IHtcbiAgICBuYW1lOiAneGwnLFxuICAgIG1pbldpZHRoOiAxMjAwLFxuICAgIG1heFdpZHRoOiBJbmZpbml0eVxuICB9XG59IGFzIGNvbnN0O1xuXG5jb25zdCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c0xpc3Q6IHJlYWRvbmx5IElMYXlvdXRCcmVha3BvaW50W10gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhib290c3RyYXBMYXlvdXRCcmVha3BvaW50cylcbiAgLm1hcCgoYnJlYWtwb2ludE5hbWUpID0+IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzW2JyZWFrcG9pbnROYW1lXSk7XG5cbmV4cG9ydCBjbGFzcyBXaW5kb3dSZXNpemVMaXN0ZW5lciBpbXBsZW1lbnRzIElEZXN0cm95YWJsZSB7XG4gIHB1YmxpYyBjdXJyZW50TGF5b3V0QnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uV2luZG93UmVzaXplTGlzdGVuZXIgPSB0aGlzLm9uV2luZG93UmVzaXplLmJpbmQodGhpcyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxheW91dEJyZWFrcG9pbnRzOiByZWFkb25seSBJTGF5b3V0QnJlYWtwb2ludFtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzaXplRGVsYXk6IG51bWJlcjtcbiAgLy8gVE9ETzogdXNlIG11bHRpcGxlIGV2ZW50IGxpc3RlbmVyXG4gIHByb3RlY3RlZCByZWFkb25seSBvblJlc2l6ZTogKChlOiBVSUV2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQ6ICgoZTogTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBsYXN0V2luZG93UmVzaXplVGltZW91dElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb25SZXNpemU/OiAoZTogVUlFdmVudCkgPT4gdm9pZCxcbiAgICBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkPzogKGU6IExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQpID0+IHZvaWQsXG4gICAgcmVzaXplRGVsYXkgPSAxMDAsXG4gICAgbGF5b3V0QnJlYWtwb2ludHM6IHJlYWRvbmx5IElMYXlvdXRCcmVha3BvaW50W10gPSBib290c3RyYXBMYXlvdXRCcmVha3BvaW50c0xpc3RcbiAgKSB7XG4gICAgdGhpcy5vblJlc2l6ZSA9IG9uUmVzaXplO1xuICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZCA9IG9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQ7XG4gICAgdGhpcy5yZXNpemVEZWxheSA9IHJlc2l6ZURlbGF5O1xuICAgIHRoaXMubGF5b3V0QnJlYWtwb2ludHMgPSBsYXlvdXRCcmVha3BvaW50cztcblxuICAgIHRoaXMuY3VycmVudExheW91dEJyZWFrcG9pbnQgPSB0aGlzLmdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvdy5pbm5lcldpZHRoKTtcbiAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hFdmVudHMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhdHRhY2hFdmVudHMoKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemVMaXN0ZW5lcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGV0YWNoRXZlbnRzKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uV2luZG93UmVzaXplTGlzdGVuZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldExheW91dEJyZWFrcG9pbnRCeVdpbmRvd1dpZHRoKHdpbmRvd1dpZHRoOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRCcmVha3BvaW50cy5maW5kKChsYXlvdXRCcmVha3BvaW50KSA9PiB7XG4gICAgICByZXR1cm4gbGF5b3V0QnJlYWtwb2ludC5taW5XaWR0aCA8PSB3aW5kb3dXaWR0aCAmJiAoIWxheW91dEJyZWFrcG9pbnQubWF4V2lkdGggfHwgbGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA+PSB3aW5kb3dXaWR0aCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemUoZTogVUlFdmVudCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxhc3RXaW5kb3dSZXNpemVUaW1lb3V0SWQpO1xuICAgIHRoaXMubGFzdFdpbmRvd1Jlc2l6ZVRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMub25XaW5kb3dSZXNpemVJbnRlcm5hbChlKSwgdGhpcy5yZXNpemVEZWxheSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemVJbnRlcm5hbChlOiBVSUV2ZW50KSB7XG4gICAgY29uc3QgbGF5b3V0QnJlYWtwb2ludCA9IHRoaXMuZ2V0TGF5b3V0QnJlYWtwb2ludEJ5V2luZG93V2lkdGgod2luZG93LmlubmVyV2lkdGgpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50ICE9PSBsYXlvdXRCcmVha3BvaW50KSB7XG4gICAgICBjb25zdCBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQgPSB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50O1xuICAgICAgdGhpcy5jdXJyZW50TGF5b3V0QnJlYWtwb2ludCA9IGxheW91dEJyZWFrcG9pbnQ7XG5cbiAgICAgIHRoaXMuZW1pdEJyZWFrcG9pbnRDaGFuZ2VkKHtcbiAgICAgICAgcHJldmlvdXNCcmVha3BvaW50OiBwcmV2aW91c0xheW91dEJyZWFrcG9pbnQsXG4gICAgICAgIGN1cnJlbnRCcmVha3BvaW50OiB0aGlzLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRSZXNpemVFdmVudChlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0UmVzaXplRXZlbnQoZTogVUlFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uUmVzaXplPy4oZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCcmVha3BvaW50Q2hhbmdlZChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZD8uKGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpZyB7XG4gIGlzTGVnYWN5UmVuZGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmZpZzogSUNvbmZpZyA9IHtcbiAgaXNMZWdhY3lSZW5kZXI6IGZhbHNlXG59O1xuIiwgIlx1RkVGRmltcG9ydCB7IElVc2VyTWVudUl0ZW1Nb2RlbCwgSUJhZGdlTW9kZWwgfSBmcm9tICcuL0lVc2VyTWVudUl0ZW0nO1xuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9Db3JlJztcbmltcG9ydCB7IElMYXlvdXRCcmVha3BvaW50LCBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMsIExheW91dEJyZWFrcG9pbnRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9IZWxwZXJzL0luZGV4JztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL0NvbmZpZy9JbmRleCc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1lbnVJdGVtQ2xpY2tFdmVudCB7XG4gIHJlYWRvbmx5IGl0ZW06IERlZXBSZWFkb25seTxJVXNlck1lbnVJdGVtTW9kZWw+O1xuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xuICBjYW5jZWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyTWVudU9wdGlvbnMge1xuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICB1c2VyTmFtZTogc3RyaW5nO1xuICB1c2VyQXZhdGFyOiBzdHJpbmc7XG4gIGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXTtcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XG4gIGdldERpc3BsYXllZFVzZXJJbmZvPzogKHVzZXJOYW1lOiBzdHJpbmcpID0+IHN0cmluZztcbiAgb25JdGVtQ2xpY2s/OiAoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJNZW51IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBkZWZhdWx0R2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgPSAodXNlck5hbWUpID0+IGBXZWxjb21lICR7dXNlck5hbWV9YDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlck5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQXZhdGFyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0RGlzcGxheWVkVXNlckluZm86ICh1c2VyTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGFwc2VCcmVha3BvaW50OiBJTGF5b3V0QnJlYWtwb2ludDtcbiAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dSZXNpemVMaXN0ZW5lcjogV2luZG93UmVzaXplTGlzdGVuZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5vbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25JdGVtQ2xpY2s6ICgoZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdO1xuICAvLyBFbGVtZW50c1xuICBwcml2YXRlIF9yb290OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBtb2JpbGVDb250ZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZXNrdG9wUm9vdERyb3Bkb3duOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZXNrdG9wQ29udGVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVza3RvcENvbnRlbnRUcmlnZ2VyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB1c2VySW5mb0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlckluZm9EaXZpZGVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGdldCByb290KCkge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVVzZXJNZW51T3B0aW9ucykge1xuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgdGhpcy51c2VyQXZhdGFyID0gb3B0aW9ucy51c2VyQXZhdGFyO1xuICAgIHRoaXMudXNlck5hbWUgPSBvcHRpb25zLnVzZXJOYW1lO1xuICAgIHRoaXMuaXRlbXMgPSBvcHRpb25zLml0ZW1zO1xuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XG4gICAgdGhpcy5nZXREaXNwbGF5ZWRVc2VySW5mbyA9IG9wdGlvbnMuZ2V0RGlzcGxheWVkVXNlckluZm8gfHwgVXNlck1lbnUuZGVmYXVsdEdldERpc3BsYXllZFVzZXJJbmZvO1xuICAgIHRoaXMub25JdGVtQ2xpY2sgPSBvcHRpb25zLm9uSXRlbUNsaWNrO1xuXG4gICAgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lciA9IG5ldyBXaW5kb3dSZXNpemVMaXN0ZW5lcih1bmRlZmluZWQsIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX3Jvb3QpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyTWFpbkVsZW1lbnRzKCk7XG4gICAgdGhpcy5yZW5kZXJVc2VySW5mbygpO1xuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcblxuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XG4gIH1cblxuICBwdWJsaWMgYWRkSXRlbXMoaXRlbXM6IElVc2VyTWVudUl0ZW1Nb2RlbFtdKSB7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuY29uY2F0KGl0ZW1zKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcHVibGljIGluc2VydEl0ZW1zKGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSwgcG9zaXRpb246IG51bWJlcikge1xuICAgIHRoaXMuaXRlbXMuc3BsaWNlKHBvc2l0aW9uLCAwLCAuLi5pdGVtcyk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSVVzZXJNZW51SXRlbU1vZGVsW10pIHtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVudUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICB9XG5cbiAgcHVibGljIGdldEJhZGdlKGl0ZW1OYW1lOiBzdHJpbmcpOiBJQmFkZ2VNb2RlbCB8IG51bGwge1xuICAgIGNvbnN0IG1lbnVJdGVtID0gdGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLlRleHQ/LnRvTG93ZXJDYXNlKCkgPT09IGl0ZW1OYW1lKTtcblxuICAgIHJldHVybiBtZW51SXRlbT8uQmFkZ2UgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCYWRnZShpdGVtTmFtZTogc3RyaW5nLCBiYWRnZTogSUJhZGdlTW9kZWwpIHtcbiAgICBjb25zdCBtZW51SXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5UZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpdGVtTmFtZSk7XG5cbiAgICBpZiAobWVudUl0ZW0pIHtcbiAgICAgIG1lbnVJdGVtLkJhZGdlID0gYmFkZ2U7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXNNb2JpbGVWaWV3KCkge1xuICAgIHJldHVybiB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1heFdpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyTWFpbkVsZW1lbnRzKCkge1xuICAgIHRoaXMuX3Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9yb290LmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudScpO1xuXG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoLyonbmF2YmFyLW5hdicsICovYGQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfS1ub25lYCk7XG5cbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24nLCAnZC1ub25lJywgYGQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfS1ibG9ja2ApO1xuXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudFRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uJywgJ2J0bicsICdidG4tb3V0bGluZS1saWdodCcpO1xuICAgIHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtdG9nZ2xlJywgJ2Ryb3Bkb3duJyk7XG5cbiAgICBsZXQgYXZhdGFyO1xuICAgIGlmIChjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJBdmF0YXIpIHtcbiAgICAgICAgYXZhdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgIGF2YXRhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnaGVhZGVyX19pY29uLWJ1dHRvbi1hdmF0YXInKTtcbiAgICAgICAgYXZhdGFyLnNyYyA9IHRoaXMudXNlckF2YXRhcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF2YXRhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTtcbiAgICAgICAgYXZhdGFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9faWNvbi1idXR0b24taWNvbicsICdmYXMnLCAnZmEtdXNlcicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdmF0YXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgICBhdmF0YXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbi1pY29uJywgJ2lzb3otaWNvbi11c2VyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZGVza3RvcENvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tbWVudScsICdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XG5cbiAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChhdmF0YXIpO1xuXG4gICAgaWYgKHRoaXMuaXRlbXMuc29tZSgoaXRlbSkgPT4gISFpdGVtLkJhZGdlKSkge1xuICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCd1c2VyLW1lbnVfX2JhZGdlJyk7XG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50VHJpZ2dlci5hcHBlbmRDaGlsZChiYWRnZSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZXNrdG9wUm9vdERyb3Bkb3duLmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcENvbnRlbnRUcmlnZ2VyKTtcbiAgICB0aGlzLmRlc2t0b3BSb290RHJvcGRvd24uYXBwZW5kQ2hpbGQodGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lcik7XG5cbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VzZXItbWVudV9faXRlbXMnKTtcblxuICAgIGlmIChjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoNicpO1xuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm8nLCAnaDYnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIHRoaXMudXNlckluZm9Db250YWluZXIuY2xhc3NMaXN0LmFkZCgndXNlci1pbmZvJywgJ2Ryb3Bkb3duLWl0ZW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJJbmZvRGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMudXNlckluZm9EaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInLCAnZC1ub25lJywgYGQtJHt0aGlzLmNvbGxhcHNlQnJlYWtwb2ludC5uYW1lfS1ibG9ja2ApO1xuXG4gICAgaWYgKHRoaXMuaXNNb2JpbGVWaWV3KSB7XG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0NvbnRhaW5lcik7XG4gICAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy51c2VySW5mb0RpdmlkZXIpO1xuICAgICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuaXRlbXNDb250YWluZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudXNlckluZm9Db250YWluZXIpO1xuICAgICAgdGhpcy5kZXNrdG9wQ29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnVzZXJJbmZvRGl2aWRlcik7XG4gICAgICB0aGlzLmRlc2t0b3BDb250ZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuaXRlbXNDb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvb3QuYXBwZW5kQ2hpbGQodGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyKTtcbiAgICB0aGlzLl9yb290LmFwcGVuZENoaWxkKHRoaXMuZGVza3RvcFJvb3REcm9wZG93bik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyVXNlckluZm8oKSB7XG4gICAgaWYgKCF0aGlzLnVzZXJJbmZvQ29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigndXNlckluZm9Db250YWluZXInKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XG4gICAgICBjb25zdCB1c2VySW5mb0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgdXNlckluZm9Db250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd1c2VyLWluZm9fX2NvbnRlbnQnKTtcbiAgICAgIHVzZXJJbmZvQ29udGVudEVsZW1lbnQuaW5uZXJUZXh0ID0gdGhpcy5nZXREaXNwbGF5ZWRVc2VySW5mbyh0aGlzLnVzZXJOYW1lKTtcblxuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2VySW5mb0NvbnRlbnRFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VySW5mb0NvbnRhaW5lci5pbm5lclRleHQgPSB0aGlzLmdldERpc3BsYXllZFVzZXJJbmZvKHRoaXMudXNlck5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJJdGVtcygpIHtcbiAgICBpZiAoIXRoaXMuaXRlbXNDb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdpdGVtc0NvbnRhaW5lcicpO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXJJdGVtc0NvbnRhaW5lcigpO1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgaXRlbUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1FbGVtZW50KGl0ZW0sIHRoaXMuaXNNb2JpbGVWaWV3KTtcbiAgICAgIHRoaXMuaXRlbXNDb250YWluZXIhLmFwcGVuZENoaWxkKGl0ZW1FbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtRWxlbWVudChpdGVtOiBJVXNlck1lbnVJdGVtTW9kZWwsIGlzTW9iaWxlOiBib29sZWFuKSB7XG4gICAgY29uc3QgaXRlbUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUl0ZW1FbGVtZW50QmFzZShpdGVtKTtcblxuICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGxpbmtFbGVtZW50LmNsYXNzTGlzdC5hZGQoaXNNb2JpbGUgPyAnbmF2LWxpbmsnIDogJ2Ryb3Bkb3duLWl0ZW0nKTtcbiAgICBsaW5rRWxlbWVudC5ocmVmID0gaXRlbS5VcmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XG4gICAgbGlua0VsZW1lbnQudGV4dCA9IGl0ZW0uVGV4dDtcbiAgICBpZihpdGVtLk9wZW5Jbk5ld1BhZ2UpIHtcbiAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIH1cblxuICAgIHRoaXMuYXR0YWNoRXZlbnRzVG9JdGVtKGxpbmtFbGVtZW50LCBpdGVtKTtcbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICBpZiAoaXRlbS5CYWRnZSkge1xuICAgICAgY29uc3QgYmFkZ2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlJyk7XG4gICAgICBiYWRnZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc296LWJhZGdlLS1jaXJjbGUnKTtcbiAgICAgIGJhZGdlbGVtZW50LmNsYXNzTGlzdC5hZGQoYGlzb3otYmFkZ2UtLSR7aXRlbS5CYWRnZS5UeXBlIHx8ICdpbmZvcm1hdGlvbid9YCk7XG4gICAgICBiYWRnZWxlbWVudC5pbm5lckhUTUwgPSBpdGVtLkJhZGdlLlRleHQ7XG5cbiAgICAgIGxpbmtFbGVtZW50LmFwcGVuZENoaWxkKGJhZGdlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSXRlbUVsZW1lbnRCYXNlKGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCkge1xuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xuXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElVc2VyTWVudUl0ZW1Nb2RlbCkge1xuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMub25NZW51SXRlbUNsaWNrKHtcbiAgICAgIGl0ZW0sXG4gICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN3aXRjaFZpZXcoaXNNb2JpbGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNNb2JpbGUpIHtcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9yVXNlckluZm8oKTtcbiAgICAgIHRoaXMuYXBwbHlNb2JpbGVWaWV3Rm9ySXRlbXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcHBseURlc2t0b3BWaWV3Rm9yVXNlckluZm8oKTtcbiAgICAgIHRoaXMuYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFwcGx5TW9iaWxlVmlld0ZvclVzZXJJbmZvKCkge1xuICAgIHRoaXMubW9iaWxlQ29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy51c2VySW5mb0NvbnRhaW5lciwgbnVsbCk7XG4gICAgdGhpcy5tb2JpbGVDb250ZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLnVzZXJJbmZvRGl2aWRlciwgbnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0ZvclVzZXJJbmZvKCkge1xuICAgIHRoaXMuZGVza3RvcENvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9Db250YWluZXIsIG51bGwpO1xuICAgIHRoaXMuZGVza3RvcENvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMudXNlckluZm9EaXZpZGVyLCBudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseU1vYmlsZVZpZXdGb3JJdGVtcygpIHtcbiAgICB0aGlzLm1vYmlsZUNvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtRWxlbWVudCBvZiB0aGlzLml0ZW1zQ29udGFpbmVyLmNoaWxkcmVuKSB7XG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ2Ryb3Bkb3duLWl0ZW0nLCAnbmF2LWxpbmsnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlEZXNrdG9wVmlld0Zvckl0ZW1zKCkge1xuICAgIHRoaXMuZGVza3RvcENvbnRlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuaXRlbXNDb250YWluZXIsIG51bGwpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtRWxlbWVudCBvZiB0aGlzLml0ZW1zQ29udGFpbmVyLmNoaWxkcmVuKSB7XG4gICAgICBpdGVtRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LnJlcGxhY2UoJ25hdi1saW5rJywgJ2Ryb3Bkb3duLWl0ZW0nKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJJdGVtc0NvbnRhaW5lcigpIHtcbiAgICB3aGlsZSAodGhpcy5pdGVtc0NvbnRhaW5lci5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLml0ZW1zQ29udGFpbmVyLmZpcnN0Q2hpbGQucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRJdGVtQ2xpY2soZTogVXNlck1lbnVJdGVtQ2xpY2tFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uSXRlbUNsaWNrPy4oZSk7XG4gICAgICBlLml0ZW0uT25DbGljaz8uKGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZChlOiBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50KSB7XG4gICAgdGhpcy5zd2l0Y2hWaWV3KHRoaXMuaXNNb2JpbGVWaWV3KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25NZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcbiAgICB0aGlzLmVtaXRJdGVtQ2xpY2soZSk7XG5cbiAgICBpZiAoZS5jYW5jZWwpIHtcbiAgICAgIGUub3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufVxuIiwgIlx1RkVGRmltcG9ydCB7IElSZW5kZXJlZCB9IGZyb20gJy4uL0NvcmUnO1xuaW1wb3J0IHsgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vSGVhZGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJTWVudUl0ZW0ge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIGl0ZW1zPzogSU1lbnVJdGVtW107XG4gIHVybD86IHN0cmluZztcbiAgaGlkZGVuPzogYm9vbGVhbjtcbiAgYWN0aXZlPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0aXRsZT86IHN0cmluZztcbiAgbWVudUl0ZW1FbD86IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBvcmlnaW5hbE1vZGVsOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWw7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogaW50ZXJmYWNlLW5hbWVcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW1DbGlja0V2ZW50IHtcbiAgcmVhZG9ubHkgaXRlbTogSU1lbnVJdGVtO1xuICByZWFkb25seSBvcmlnaW5hbEV2ZW50OiBVSUV2ZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZW51T3B0aW9ucyB7XG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1zOiBJTWVudUl0ZW1bXTtcbiAgb25JdGVtQ2xpY2s/OiAoZTogTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVudSBpbXBsZW1lbnRzIElSZW5kZXJlZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcm90ZWN0ZWQgaXRlbXM6IElNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25JdGVtQ2xpY2s6ICgoZTogTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgLy8gZWxlbWVudHNcbiAgcHJvdGVjdGVkIHJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElNZW51T3B0aW9ucykge1xuICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgdGhpcy5pdGVtcyA9IG9wdGlvbnMuaXRlbXM7XG4gICAgdGhpcy5vbkl0ZW1DbGljayA9IG9wdGlvbnMub25JdGVtQ2xpY2s7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcmVuZGVyKCk6IHZvaWQ7XG4gIHB1YmxpYyB1cGRhdGVJdGVtcyhpdGVtczogSU1lbnVJdGVtW10pIHtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEl0ZW1DbGljayhlOiBNZW51SXRlbUNsaWNrRXZlbnQpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkl0ZW1DbGljaz8uKGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwgIlx1RkVGRmltcG9ydCB7IE1lbnUsIElNZW51T3B0aW9ucywgSU1lbnVJdGVtIH0gZnJvbSAnLi9NZW51JztcbmltcG9ydCB7IHRocm93UmVuZGVyRXJyb3IgfSBmcm9tICcuLi9Db3JlJztcbmltcG9ydCB7IElMYXlvdXRCcmVha3BvaW50LCBXaW5kb3dSZXNpemVMaXN0ZW5lciwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMgfSBmcm9tICcuLi8uLi9IZWxwZXJzL0luZGV4JztcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCwgaXNJdGVtQWN0aXZlIH0gZnJvbSAnLi4vLi4vSGVhZGVyJztcblxuZXhwb3J0IGVudW0gQ29sbGFwc2luZ01vZGUge1xuICBEaXNhYmxlZCxcbiAgQ29sbGFwc2VkLFxuICBFeHBhbmRlZCxcbiAgQWRhcHRpdmVDb2xsYXBzaW5nXG59XG5cbnR5cGUgSXRlbUFjdGlvbk1vZGUgPSAnaG92ZXInIHwgJ2NsaWNrJztcbmV4cG9ydCBpbnRlcmZhY2UgSUJvb3RzdHJhcENvbGxhcHNpbmdNZW51T3B0aW9ucyBleHRlbmRzIElNZW51T3B0aW9ucyB7XG4gIGl0ZW1BY3Rpb24/OiBJdGVtQWN0aW9uTW9kZTtcbiAgY29sbGFwc2luZ01vZGU/OiBDb2xsYXBzaW5nTW9kZTtcbiAgY29sbGFwc2VCcmVha3BvaW50PzogSUxheW91dEJyZWFrcG9pbnQ7XG4gIGNvbGxhcHNlSWNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEJvb3RzdHJhcENvbGxhcHNpbmdNZW51IGV4dGVuZHMgTWVudSB7XG4gIHByb3RlY3RlZCBzdGF0aWMgSE9WRVJfTU9ERV9DU1NfQ0xBU1MgPSAnbmF2YmFyLW5hdl9ob3Zlci1hY3Rpb24nO1xuICBwcm90ZWN0ZWQgc3RhdGljIGFkYXB0aXZpdHlDb2xsYXBzaW5nRGVsYXkgPSA1MDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGl0ZW1BY3Rpb25Nb2RlOiBJdGVtQWN0aW9uTW9kZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNpbmdNb2RlOiBDb2xsYXBzaW5nTW9kZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlSWNvbk5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxhcHNlQnJlYWtwb2ludDogSUxheW91dEJyZWFrcG9pbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSB3aW5kb3dSZXNpemVMaXN0ZW5lcjogV2luZG93UmVzaXplTGlzdGVuZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBvbldpbmRvd1Jlc2l6ZUV2ZW50SGFuZGxlciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIgPSB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljay5iaW5kKHRoaXMpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Ub2dnbGVEcm9wZG93bkJ1dHRvbk1vdXNlRW50ZXJIYW5kbGVyID0gdGhpcy5vblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlci5iaW5kKHRoaXMpO1xuICAvLyBlbGVtZW50c1xuICBwcm90ZWN0ZWQgY29sbGFwc2VSb290OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGNvbGxhcHNlQnV0dG9uOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGNvbGxhcHNlRHJvcGRvd246IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgY3VycmVudE9wZW5pbmdTdWJNZW51OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJQm9vdHN0cmFwQ29sbGFwc2luZ01lbnVPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLml0ZW1BY3Rpb25Nb2RlID0gb3B0aW9ucy5pdGVtQWN0aW9uIHx8ICdob3Zlcic7XG4gICAgdGhpcy5jb2xsYXBzaW5nTW9kZSA9IG9wdGlvbnMuY29sbGFwc2luZ01vZGUgPz8gQ29sbGFwc2luZ01vZGUuQWRhcHRpdmVDb2xsYXBzaW5nO1xuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5jb2xsYXBzZUJyZWFrcG9pbnQgfHwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMubWQ7XG4gICAgdGhpcy5jb2xsYXBzZUljb25OYW1lID0gb3B0aW9ucy5jb2xsYXBzZUljb24gfHwgJ2ZhLWVsbGlwc2lzLXYnO1xuXG4gICAgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lciA9IG5ldyBXaW5kb3dSZXNpemVMaXN0ZW5lcihcbiAgICAgIHRoaXMuY29sbGFwc2luZ01vZGUgPT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZyA/IHRoaXMub25XaW5kb3dSZXNpemVFdmVudEhhbmRsZXIgOiB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBCb290c3RyYXBDb2xsYXBzaW5nTWVudS5hZGFwdGl2aXR5Q29sbGFwc2luZ0RlbGF5XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyUm9vdCgpO1xuICAgIHRoaXMucmVuZGVySXRlbXMoKTtcblxuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gdGhyb3dSZW5kZXJFcnJvcigncm9vdCcpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnJvb3QpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1zKGl0ZW1zOiBJTWVudUl0ZW1bXSkge1xuICAgIHN1cGVyLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcblxuICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgaXNuXFwndCByZW5kZXJlZCcpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnJvb3QuZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5yb290LmZpcnN0Q2hpbGQucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJJdGVtcygpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKSB7XG4gICAgaWYgKHRoaXMuY29sbGFwc2luZ01vZGUgIT09IENvbGxhcHNpbmdNb2RlLkFkYXB0aXZlQ29sbGFwc2luZ1xuICAgICAgfHwgIXRoaXMucm9vdCB8fCAhdGhpcy5pdGVtcy5sZW5ndGggfHwgIXRoaXMuY29sbGFwc2VSb290IHx8ICF0aGlzLmNvbGxhcHNlRHJvcGRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05lZWRDb2xsYXBzZSgpKSB7XG4gICAgICB0aGlzLmNvbGxhcHNlUm9vdC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcblxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBsYXN0SXRlbUVsZW1lbnQgPSB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5yb290LmNoaWxkcmVuLmxlbmd0aCAtIDJdO1xuICAgICAgICBpZiAoIWxhc3RJdGVtRWxlbWVudCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XG4gICAgICB9IHdoaWxlICh0aGlzLmlzTmVlZENvbGxhcHNlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAodGhpcy5jb2xsYXBzZURyb3Bkb3duLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICB0aGlzLm1vdmVSb290SXRlbXNUb1Jvb3QodGhpcy5jb2xsYXBzZURyb3Bkb3duLmZpcnN0RWxlbWVudENoaWxkKTtcblxuICAgICAgICBpZiAodGhpcy5pc05lZWRDb2xsYXBzZSgpKSB7XG4gICAgICAgICAgY29uc3QgbGFzdEl0ZW1FbGVtZW50ID0gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAyXTtcbiAgICAgICAgICBsYXN0SXRlbUVsZW1lbnQgJiYgdGhpcy5tb3ZlUm9vdEl0ZW1zVG9Db2xsYXBzZURyb3Bkb3duKGxhc3RJdGVtRWxlbWVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlRHJvcGRvd24uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCkge1xuICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHRoaXMuaXRlbXMsIChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBvbGRBY3RpdmVWYWx1ZSA9IGl0ZW0uYWN0aXZlO1xuICAgICAgaXRlbS5hY3RpdmUgPSBpc0l0ZW1BY3RpdmUoaXRlbS5vcmlnaW5hbE1vZGVsKTtcblxuICAgICAgaWYgKGl0ZW0uYWN0aXZlICE9PSBvbGRBY3RpdmVWYWx1ZSkge1xuICAgICAgICB0aGlzLmFwcGx5U3RhdGVzVG9JdGVtRWxlbWVudChpdGVtLm1lbnVJdGVtRWwuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsIGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlT3BlbmVkRHJvcGRvd24odGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5pdGVtQWN0aW9uTW9kZSA9PT0gJ2hvdmVyJykge1xuICAgICAgLy9OT1RFOiBGb3IgY2xvc2luZyBvcGVuZWQgZHJvcGRvd25cbiAgICAgIHRoaXMucm9vdC5jbGFzc0xpc3QucmVtb3ZlKEJvb3RzdHJhcENvbGxhcHNpbmdNZW51LkhPVkVSX01PREVfQ1NTX0NMQVNTKTtcbiAgICAgICQodGFyZ2V0RWxlbWVudCkub25lKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChCb290c3RyYXBDb2xsYXBzaW5nTWVudS5IT1ZFUl9NT0RFX0NTU19DTEFTUyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKHJvb3RJdGVtczogSU1lbnVJdGVtW10sIGFjdGlvbjogKGl0ZW06IElNZW51SXRlbSkgPT4gdm9pZCkge1xuICAgIHJvb3RJdGVtcy5mb3JFYWNoKChpKSA9PiB7XG4gICAgICBhY3Rpb24oaSk7XG4gICAgICBpZiAodGhpcy5pc05lc3RlZEl0ZW1zT3duZXJJdGVtKGkpKSB7XG4gICAgICAgIHRoaXMuZm9yRWFjaE1lbnVJdGVtUmVjdXJzaXZlKGkuaXRlbXMsIGFjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyUm9vdCgpIHtcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCduYXZiYXItbmF2JywgJ21yLWF1dG8nKTtcbiAgICBpZiAodGhpcy5pdGVtQWN0aW9uTW9kZSA9PT0gJ2hvdmVyJykge1xuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUuSE9WRVJfTU9ERV9DU1NfQ0xBU1MpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJJdGVtcygpIHtcbiAgICB0aGlzLnJlbmRlclJvb3RJdGVtcygpO1xuXG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoICYmIHRoaXMuY29sbGFwc2luZ01vZGUgIT09IENvbGxhcHNpbmdNb2RlLkRpc2FibGVkKSB7XG4gICAgICBpZiAoIXRoaXMucm9vdCkge1xuICAgICAgICB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLnJlbmRlckNvbGxhcHNlRWxlbWVudHMoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKTtcbiAgICAgICAgdGhpcy5yb290LnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgIH0sIDEwKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURlZmF1bHREcm9wZG93bkJlaGF2aW9yRm9yTmVzdGVkRHJvcGRvd24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGFuZ2VEZWZhdWx0RHJvcGRvd25CZWhhdmlvckZvck5lc3RlZERyb3Bkb3duKCkge1xuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bicpKS5vbignaGlkZS5icy5kcm9wZG93bicsIChlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBlLnRhcmdldCAhPT0gdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgJiYgZS50YXJnZXQuY29udGFpbnModGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUpO1xuXG4gICAgICByZXR1cm4gIXJlc3VsdDtcbiAgICB9KTtcblxuICAgICQodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wZG93bi1zdWJtZW51JykpLm9uKCdzaG93LmJzLmRyb3Bkb3duJywgKGUpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudE9wZW5pbmdTdWJNZW51ID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckNvbGxhcHNlRWxlbWVudHMoKSB7XG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2xsYXBzZVJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIHRoaXMuY29sbGFwc2VSb290LmNsYXNzTGlzdC5hZGQoJ25hdi1pdGVtJywgJ2Ryb3Bkb3duJywgJ2NvbGxhcHNpbmctbWVudV9fY29sbGFwc2Utcm9vdCcpO1xuXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHRoaXMuY29sbGFwc2VCdXR0b24uY2xhc3NMaXN0LmFkZCgnaGVhZGVyX19pY29uLWJ1dHRvbicsICdidG4nLCAnYnRuLW91dGxpbmUtbGlnaHQnKTtcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcbiAgICB0aGlzLmNvbGxhcHNlQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnZHJvcGRvd24nKTtcblxuICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgaWNvbi5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX2ljb24tYnV0dG9uLWljb24nLCAnZmFzJywgdGhpcy5jb2xsYXBzZUljb25OYW1lKTtcblxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLW1lbnUnLCAnZHJvcGRvd24tbWVudS1yaWdodCcpO1xuXG4gICAgdGhpcy5jb2xsYXBzZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNvbGxhcHNlQnV0dG9uKTtcbiAgICB0aGlzLmNvbGxhcHNlUm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNvbGxhcHNlRHJvcGRvd24pO1xuXG4gICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuY29sbGFwc2VSb290KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJSb290SXRlbXMoKSB7XG4gICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdyb290Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBsZXQgY29udGVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0aGlzLmlzTmVzdGVkSXRlbXNPd25lckl0ZW0oaXRlbSkpIHtcbiAgICAgICAgY29udGVudCA9IHRoaXMuY3JlYXRlUm9vdEl0ZW1XaXRoTmVzdGVkSXRlbXMoaXRlbSBhcyBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb290IS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSb290SXRlbVdpdGhOZXN0ZWRJdGVtcyhpdGVtOiBJTWVudUl0ZW0gJiB7IGl0ZW1zOiBJTWVudUl0ZW1bXSB9KSB7XG4gICAgY29uc3QgaXRlbUVsZW1lbnQgPSB0aGlzLmNyZWF0ZVJvb3RJdGVtRWxlbWVudChpdGVtKTtcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bicpO1xuXG4gICAgY29uc3QgaXRlbUNvbnRlbnQgPSBpdGVtRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmF2LWxpbmsnKTtcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XG5cbiAgICBjb25zdCBkcm9wZG93bk1lbnVFbGVtZW50ID0gdGhpcy5jcmVhdGVEcm9wZG93bk1lbnUoaXRlbSk7XG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XG5cbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUm9vdEl0ZW1FbGVtZW50KGl0ZW06IElNZW51SXRlbSkge1xuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCduYXYtaXRlbScpO1xuICAgIGl0ZW0udGl0bGUgJiYgaXRlbUVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIGl0ZW0udGl0bGUpO1xuXG4gICAgY29uc3QgaXRlbUNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgaXRlbUNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnbmF2LWxpbmsnKTtcbiAgICBpdGVtQ29udGVudC5ocmVmID0gaXRlbS51cmwgfHwgJ2phdmFzY3JpcHQ6dm9pZCgwKSc7XG4gICAgaXRlbUNvbnRlbnQudGV4dCA9IGl0ZW0udGV4dDtcblxuICAgIGNvbnN0IGljb25FbGVtZW50ID0gdGhpcy5jcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbSk7XG4gICAgaWNvbkVsZW1lbnQgJiYgaXRlbUNvbnRlbnQuaW5zZXJ0QmVmb3JlKGljb25FbGVtZW50LCBpdGVtQ29udGVudC5maXJzdENoaWxkKTtcblxuICAgIHRoaXMuYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1Db250ZW50LCBpdGVtKTtcbiAgICB0aGlzLmF0dGFjaEV2ZW50c1RvSXRlbShpdGVtQ29udGVudCwgaXRlbSk7XG5cbiAgICBpdGVtRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtQ29udGVudCk7XG5cbiAgICBpdGVtLm1lbnVJdGVtRWwgPSBpdGVtRWxlbWVudDtcblxuICAgIHJldHVybiBpdGVtRWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVOZXN0ZWRTdWJNZW51SXRlbUVsZW1lbnQoaXRlbTogSU1lbnVJdGVtICYgeyBpdGVtczogSU1lbnVJdGVtW10gfSkge1xuICAgIGNvbnN0IGl0ZW1FbGVtZW50ID0gdGhpcy5jcmVhdGVOZXN0ZWRJdGVtKGl0ZW0pO1xuICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duJywgJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcblxuICAgIGNvbnN0IGl0ZW1Db250ZW50ID0gaXRlbUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRyb3Bkb3duLWl0ZW0nKTtcbiAgICBpdGVtQ29udGVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRoaXMuc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudCk7XG5cbiAgICBjb25zdCBkcm9wZG93bk1lbnVFbGVtZW50ID0gdGhpcy5jcmVhdGVEcm9wZG93bk1lbnUoaXRlbSk7XG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25NZW51RWxlbWVudCk7XG5cbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlTmVzdGVkSXRlbShpdGVtOiBJTWVudUl0ZW0pIHtcbiAgICBjb25zdCBpdGVtRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgaXRlbS50aXRsZSAmJiBpdGVtRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgaXRlbS50aXRsZSk7XG5cbiAgICBjb25zdCBpdGVtQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBpdGVtQ29udGVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi1pdGVtJyk7XG4gICAgaXRlbUNvbnRlbnQuaHJlZiA9IGl0ZW0udXJsIHx8ICdqYXZhc2NyaXB0OnZvaWQoMCknO1xuICAgIGl0ZW1Db250ZW50LnRleHQgPSBpdGVtLnRleHQ7XG5cbiAgICBjb25zdCBpY29uRWxlbWVudCA9IHRoaXMuY3JlYXRlSXRlbUljb25FbGVtZW50KGl0ZW0pO1xuICAgIGljb25FbGVtZW50ICYmIGl0ZW1Db250ZW50Lmluc2VydEJlZm9yZShpY29uRWxlbWVudCwgaXRlbUNvbnRlbnQuZmlyc3RDaGlsZCk7XG5cbiAgICB0aGlzLmFwcGx5U3RhdGVzVG9JdGVtRWxlbWVudChpdGVtQ29udGVudCwgaXRlbSk7XG4gICAgdGhpcy5hdHRhY2hFdmVudHNUb0l0ZW0oaXRlbUNvbnRlbnQsIGl0ZW0pO1xuXG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbUNvbnRlbnQpO1xuXG4gICAgaXRlbS5tZW51SXRlbUVsID0gaXRlbUVsZW1lbnQ7XG5cbiAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRHJvcGRvd25NZW51KGl0ZW06IElNZW51SXRlbSAmIHsgaXRlbXM6IElNZW51SXRlbVtdIH0pIHtcbiAgICBjb25zdCBkcm9wZG93bk1lbnVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICBkcm9wZG93bk1lbnVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLW1lbnUnKTtcblxuICAgIGl0ZW0uaXRlbXMuZm9yRWFjaCgobmVzdGVkSXRlbSkgPT4ge1xuICAgICAgbGV0IGNvbnRlbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5pc05lc3RlZEl0ZW1zT3duZXJJdGVtKG5lc3RlZEl0ZW0pKSB7XG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZU5lc3RlZFN1Yk1lbnVJdGVtRWxlbWVudChuZXN0ZWRJdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmNyZWF0ZU5lc3RlZEl0ZW0obmVzdGVkSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGRyb3Bkb3duTWVudUVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZHJvcGRvd25NZW51RWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtSWNvbkVsZW1lbnQoaXRlbTogSU1lbnVJdGVtKSB7XG4gICAgaWYgKCFpdGVtLmljb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuICAgIGl0ZW1JY29uLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoJHtpdGVtLmljb259KWA7XG5cbiAgICByZXR1cm4gaXRlbUljb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SXRlbUNvbnRlbnRBc0Ryb3Bkb3duVG9nZ2xlcihpdGVtQ29udGVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpdGVtQ29udGVudC5jbGFzc0xpc3QuYWRkKCdkcm9wZG93bi10b2dnbGUnKTtcbiAgICBpdGVtQ29udGVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdG9nZ2xlJywgJ2Ryb3Bkb3duJyk7XG4gICAgaXRlbUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGlja0hhbmRsZXIpO1xuICAgIGl0ZW1Db250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLm9uVG9nZ2xlRHJvcGRvd25CdXR0b25Nb3VzZUVudGVySGFuZGxlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlTdGF0ZXNUb0l0ZW1FbGVtZW50KGl0ZW1FbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbTogSU1lbnVJdGVtKSB7XG4gICAgaWYgKGl0ZW0uYWN0aXZlKSB7XG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uaGlkZGVuKSB7XG4gICAgICBpdGVtRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1FbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGF0dGFjaEV2ZW50c1RvSXRlbShpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW06IElNZW51SXRlbSkge1xuICAgIGl0ZW1FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuZW1pdEl0ZW1DbGljayh7XG4gICAgICBpdGVtLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc05lc3RlZEl0ZW1zT3duZXJJdGVtKGl0ZW06IElNZW51SXRlbSk6IGl0ZW0gaXMgSU1lbnVJdGVtICYgeyBpdGVtczogSU1lbnVJdGVtW10gfSB7XG4gICAgcmV0dXJuIGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGggJiYgaXRlbS5pdGVtcy5zb21lKChpKSA9PiAhaS5oaWRkZW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb0NvbGxhcHNlRHJvcGRvd24ocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGhpcy5hcHBseUNvbGxhcHNpbmdWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW1Pckl0ZW1zKTtcbiAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93bi5pbnNlcnRCZWZvcmUocm9vdEl0ZW1Pckl0ZW1zLCB0aGlzLmNvbGxhcHNlRHJvcGRvd24uZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wSXRlbUVsZW1lbnRzU3RvcmUgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm9vdEl0ZW0gb2Ygcm9vdEl0ZW1Pckl0ZW1zKSB7XG4gICAgICAgIHRlbXBJdGVtRWxlbWVudHNTdG9yZS5pbnNlcnRCZWZvcmUocm9vdEl0ZW0sIHRlbXBJdGVtRWxlbWVudHNTdG9yZS5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgIHRoaXMuYXBwbHlDb2xsYXBzaW5nVmlld0ZvclJvb3RJdGVtKHJvb3RJdGVtKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duLmFwcGVuZENoaWxkKHRlbXBJdGVtRWxlbWVudHNTdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1vdmVSb290SXRlbXNUb1Jvb3Qocm9vdEl0ZW1Pckl0ZW1zOiBFbGVtZW50IHwgSXRlcmFibGU8RWxlbWVudD4pOiB2b2lkIHtcbiAgICBpZiAocm9vdEl0ZW1Pckl0ZW1zIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGhpcy5hcHBseUV4cGFuZGVkVmlld0ZvclJvb3RJdGVtKHJvb3RJdGVtT3JJdGVtcyk7XG4gICAgICB0aGlzLnJvb3QuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtT3JJdGVtcywgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucm9vdC5jaGlsZHJlbi5sZW5ndGggLSAxXSB8fCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcEl0ZW1FbGVtZW50c1N0b3JlID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvb3RJdGVtIG9mIHJvb3RJdGVtT3JJdGVtcykge1xuICAgICAgICB0ZW1wSXRlbUVsZW1lbnRzU3RvcmUuaW5zZXJ0QmVmb3JlKHJvb3RJdGVtLCB0ZW1wSXRlbUVsZW1lbnRzU3RvcmUuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICB0aGlzLmFwcGx5RXhwYW5kZWRWaWV3Rm9yUm9vdEl0ZW0ocm9vdEl0ZW0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGVtcEl0ZW1FbGVtZW50c1N0b3JlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlDb2xsYXBzaW5nVmlld0ZvclJvb3RJdGVtKHJvb3RJdGVtOiBFbGVtZW50KSB7XG4gICAgcm9vdEl0ZW0uY2xhc3NMaXN0LmFkZCgnZHJvcGRvd24tc3VibWVudScpO1xuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiByb290SXRlbS5jaGlsZHJlbikge1xuICAgICAgY2hpbGQuY2xhc3NMaXN0LnJlcGxhY2UoJ25hdi1saW5rJywgJ2Ryb3Bkb3duLWl0ZW0nKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlFeHBhbmRlZFZpZXdGb3JSb290SXRlbShyb290SXRlbTogRWxlbWVudCkge1xuICAgIHJvb3RJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Bkb3duLXN1Ym1lbnUnKTtcblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdEl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLmNsYXNzTGlzdC5yZXBsYWNlKCdkcm9wZG93bi1pdGVtJywgJ25hdi1saW5rJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGlzTmVlZENvbGxhcHNlKCkge1xuICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyLmN1cnJlbnRMYXlvdXRCcmVha3BvaW50Lm1pbldpZHRoIDwgdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWluV2lkdGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3Quc3R5bGUubWF4V2lkdGggPSAnbm9uZSc7XG4gICAgY29uc3QgY3VycmVudFJvb3RSZWN0ID0gdGhpcy5yb290LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzaW5nLW1lbnVfbm9ybWFsLXdoaXRlLXNwYWNlJyk7XG5cbiAgICBjb25zdCBub3JtYWxSb290UmVjdCA9IHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2luZy1tZW51X25vcm1hbC13aGl0ZS1zcGFjZScpO1xuICAgIHRoaXMucm9vdC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuXG4gICAgcmV0dXJuIGN1cnJlbnRSb290UmVjdC53aWR0aCA+IG5vcm1hbFJvb3RSZWN0LndpZHRoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRHJvcGRvd25SZWN0c0ludGVyc2VjdChkcm9wZG93blJlY3QxOiBDbGllbnRSZWN0LCBkcm9wZG93blJlY3QyOiBDbGllbnRSZWN0LCBkZWx0YSA9IDIpIHtcbiAgICByZXR1cm4gZHJvcGRvd25SZWN0MS5sZWZ0IDwgKGRyb3Bkb3duUmVjdDIucmlnaHQgLSBkZWx0YSkgJiYgKGRyb3Bkb3duUmVjdDIubGVmdCArIGRlbHRhKSA8IGRyb3Bkb3duUmVjdDEucmlnaHRcbiAgICAgICYmIGRyb3Bkb3duUmVjdDEudG9wIDwgKGRyb3Bkb3duUmVjdDIuYm90dG9tIC0gZGVsdGEpICYmIChkcm9wZG93blJlY3QyLnRvcCArIGRlbHRhKSA8IGRyb3Bkb3duUmVjdDEuYm90dG9tO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwcGx5U2hhZG93c0Zvck92ZXJsYXBpbmdEcm9wZG93bklmTmVlZGVkKG9wZW5lZERyb3Bkb3duRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBSZXNldCB0aGUgc3R5bGUgYmVmb3JlIHRoZSByZWN0IGdldHRpbmcgdG8gZ2V0IHJlYWwgdmFsdWVzXG4gICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LnN0eWxlLmxlZnQgPSAnJztcbiAgICBvcGVuZWREcm9wZG93bkVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcGRvd24tbWVudS1sZWZ0LXNoYWRvd2VkJyk7XG4gICAgbGV0IHJlY3QgPSBvcGVuZWREcm9wZG93bkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKHJlY3QucmlnaHQgPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LnN0eWxlLmxlZnQgPSBgLSR7cmVjdC53aWR0aH1weGA7XG4gICAgfVxuXG4gICAgcmVjdCA9IG9wZW5lZERyb3Bkb3duRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3Bkb3duLW1lbnUnKTtcblxuICAgIGZvciAoY29uc3QgZHJvcGRvd25FbGVtZW50IG9mIGRyb3Bkb3duRWxlbWVudHMpIHtcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgPT09IG9wZW5lZERyb3Bkb3duRWxlbWVudCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blJlY3RzSW50ZXJzZWN0KGRyb3Bkb3duRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgcmVjdCkpIHtcbiAgICAgICAgb3BlbmVkRHJvcGRvd25FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLW1lbnUtbGVmdC1zaGFkb3dlZCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25XaW5kb3dSZXNpemUoZTogVUlFdmVudCkge1xuICAgIHRoaXMuYXBwbHlBZGFwdGl2aXR5Q29sbGFwc2luZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRHJvcGRvd25CdXR0b25DbGljayhlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZS50YXJnZXQucGFyZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5jdXJyZW50T3BlbmluZ1N1Yk1lbnUgPSBlLnRhcmdldC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvZ2dsZURyb3Bkb3duQnV0dG9uTW91c2VFbnRlcihlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIuY3VycmVudExheW91dEJyZWFrcG9pbnQubWF4V2lkdGggPj0gdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubWF4V2lkdGggJiZcbiAgICAgIGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZS50YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSkge1xuICAgICAgdGhpcy5hcHBseVNoYWRvd3NGb3JPdmVybGFwaW5nRHJvcGRvd25JZk5lZWRlZChlLnRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgIH1cbiAgfVxufVxuIiwgIlx1RkVGRmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcbmltcG9ydCB7IGdldFVybEJ5TWVudUl0ZW1EYXRhLCBJTGF5b3V0QnJlYWtwb2ludCB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xuaW1wb3J0IHsgQm9vdHN0cmFwQ29sbGFwc2luZ01lbnUgfSBmcm9tICcuLi9Db21wb25lbnRzL01lbnUnO1xuaW1wb3J0IHsgSU1lbnVJdGVtLCBNZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuLi9Db21wb25lbnRzL01lbnUvTWVudSc7XG5pbXBvcnQgeyBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vU2VhcmNoJztcblxuY29uc3QgZmluZEl0ZW1CeU5hbWVSZWN1cnNpdmVseSA9IChpdGVtczogcmVhZG9ubHkgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGl0ZW1OYW1lOiBzdHJpbmcpOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoaXRlbS5OYW1lID09PSBpdGVtTmFtZSkge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSBlbHNlIGlmIChpdGVtLkl0ZW1zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5lc3RlZEl0ZW0gPSBmaW5kSXRlbUJ5TmFtZVJlY3Vyc2l2ZWx5KGl0ZW0uSXRlbXMsIGl0ZW1OYW1lKTtcblxuICAgICAgaWYgKG5lc3RlZEl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIG5lc3RlZEl0ZW07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBnZXRJdGVtVXJsc1JlY3Vyc2l2ZWx5ID0gKGl0ZW1EYXRhOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGl0ZW1zID0gaXRlbURhdGEuSXRlbXM7XG5cbiAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgY29uc3Qgb3duVXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEoaXRlbURhdGEpO1xuXG4gICAgcmV0dXJuIG93blVybCA/IFtvd25VcmxdIDogW107XG4gIH1cblxuICBsZXQgdXJsczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGl0ZW1zKSB7XG4gICAgdXJscyA9IHVybHMuY29uY2F0KGdldEl0ZW1VcmxzUmVjdXJzaXZlbHkoY2hpbGQpKTtcbiAgfVxuXG4gIHJldHVybiB1cmxzO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSXRlbUFjdGl2ZSA9IChpdGVtRGF0YTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRMb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7XG4gIGNvbnN0IGl0ZW1VcmxzID0gZ2V0SXRlbVVybHNSZWN1cnNpdmVseShpdGVtRGF0YSk7XG5cbiAgZm9yIChjb25zdCB1cmwgb2YgaXRlbVVybHMpIHtcbiAgICBjb25zdCB1cmxSZSA9IG5ldyBSZWdFeHAoYF4uKiR7dXJsLnJlcGxhY2UoJz8nLCAnXFxcXD8nKX0kYCk7XG5cbiAgICBpZiAodXJsUmUudGVzdChjdXJyZW50TG9jYXRpb24pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGludGVyZmFjZS1uYW1lXG5leHBvcnQgaW50ZXJmYWNlIE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQge1xuICByZWFkb25seSBpdGVtOiBJRXh0ZW5kZWROYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbDtcbiAgcmVhZG9ubHkgb3JpZ2luYWxFdmVudDogVUlFdmVudDtcbiAgY2FuY2VsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25NZW51IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s6ICgoZTogTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1lbnVJdGVtQ2xpY2suYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW51OiBCb290c3RyYXBDb2xsYXBzaW5nTWVudTtcbiAgcHJpdmF0ZSBpc0dsb2JhbE1lbnU6IGJvb2xlYW47XG4gIHByaXZhdGUgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgaXRlbXM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdLFxuICAgIGlzR2xvYmFsTWVudTogYm9vbGVhbixcbiAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50LFxuICAgIG9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2s6IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkXG4gICkge1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuaXNHbG9iYWxNZW51ID0gaXNHbG9iYWxNZW51LFxuICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcbiAgICB0aGlzLm9uTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2sgPSBvbk5hdmlnYXRpb25NZW51SXRlbUNsaWNrO1xuICAgIHRoaXMubWVudSA9IG5ldyBCb290c3RyYXBDb2xsYXBzaW5nTWVudSh7XG4gICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgaXRlbXM6IHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyhpdGVtcyksXG4gICAgICBjb2xsYXBzZUJyZWFrcG9pbnQsXG4gICAgICBvbkl0ZW1DbGljazogdGhpcy5vbk1lbnVJdGVtQ2xpY2tIYW5kbGVyXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlRGF0YShpdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10sIGlzR2xvYmFsTWVudTogYm9vbGVhbikge1xuICAgIC8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zOiBvZmYgKi9cbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5pc0dsb2JhbE1lbnUgPSBpc0dsb2JhbE1lbnU7XG4gICAgdGhpcy5tZW51LnVwZGF0ZUl0ZW1zKHRoaXMubWFwTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxUb01lbnVJdGVtcyh0aGlzLml0ZW1zKSk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIHRoaXMubWVudS5yZW5kZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCkge1xuICAgIHRoaXMubWVudS5hcHBseUFkYXB0aXZpdHlDb2xsYXBzaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpIHtcbiAgICB0aGlzLm1lbnUudXBkYXRlQWN0aXZlSXRlbXNTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvbk1lbnVJdGVtQ2xpY2soZTogTWVudUl0ZW1DbGlja0V2ZW50KSB7XG4gICAgY29uc3QgZXZlbnRBcmdzID0gdGhpcy5tYXBNZW51SXRlbUNsaWNrRXZlbnRBcmdzVG9OYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50QXJncyhlKTtcbiAgICBpZiAoZXZlbnRBcmdzKSB7XG4gICAgICB0aGlzLmVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhldmVudEFyZ3MpO1xuXG4gICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICBlLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB0YXJnZXRFbCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRoaXMubWVudS5jbG9zZU9wZW5lZERyb3Bkb3duKHRhcmdldEVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXROYXZpZ2F0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljaz8uKGUpO1xuICAgICAgZS5pdGVtLk9uQ2xpY2s/LihlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hcE5hdmlnYXRpb25NZW51SXRlbU1vZGVsVG9NZW51SXRlbXMobWVudUl0ZW1Nb2RlbHM6IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFtdKSB7XG4gICAgcmV0dXJuIG1lbnVJdGVtTW9kZWxzLm1hcDxJTWVudUl0ZW0+KChtZW51SXRlbU1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBtZW51SXRlbSA9IHtcbiAgICAgICAgdGV4dDogbWVudUl0ZW1Nb2RlbC5OYW1lLFxuICAgICAgICBpY29uOiBtZW51SXRlbU1vZGVsLkljb24sXG4gICAgICAgIGl0ZW1zOiBtZW51SXRlbU1vZGVsLkl0ZW1zID8gdGhpcy5tYXBOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbFRvTWVudUl0ZW1zKG1lbnVJdGVtTW9kZWwuSXRlbXMpIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IGdldFVybEJ5TWVudUl0ZW1EYXRhKG1lbnVJdGVtTW9kZWwpLFxuICAgICAgICBoaWRkZW46IG1lbnVJdGVtTW9kZWwuVmlzaWJsZSA9PT0gZmFsc2UsXG4gICAgICAgIGFjdGl2ZTogaXNJdGVtQWN0aXZlKG1lbnVJdGVtTW9kZWwpLFxuICAgICAgICBkaXNhYmxlZDogbWVudUl0ZW1Nb2RlbC5EaXNhYmxlZCxcbiAgICAgICAgdGl0bGU6IG1lbnVJdGVtTW9kZWwuRGVzY3JpcHRpb24sXG4gICAgICAgIG9yaWdpbmFsTW9kZWw6IG1lbnVJdGVtTW9kZWxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBtZW51SXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwTWVudUl0ZW1DbGlja0V2ZW50QXJnc1RvTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudEFyZ3MoZTogTWVudUl0ZW1DbGlja0V2ZW50KTogTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB8IG51bGwge1xuICAgIGNvbnN0IGl0ZW0gPSBmaW5kSXRlbUJ5TmFtZVJlY3Vyc2l2ZWx5KHRoaXMuaXRlbXMsIGUuaXRlbS50ZXh0KTtcblxuICAgIHJldHVybiAhaXRlbSA/IG51bGwgOiB7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLm9yaWdpbmFsRXZlbnQsXG4gICAgICBjYW5jZWw6IGZhbHNlLFxuICAgICAgaXRlbTogeyAuLi5pdGVtLCBpc0dsb2JhbDogdGhpcy5pc0dsb2JhbE1lbnUgfVxuICAgIH07XG4gIH1cbn1cbiIsICJcdUZFRkZleHBvcnQgY29uc3QgTE9HT19TRVRUSU5HU19DQUNIRV9LRVkgPSAnaXN6b2xlYS11aXxsb2dvLXNldHRpbmdzJztcbiIsICJcdUZFRkZpbXBvcnQgeyBJTG9nb1NldHRpbmdzIH0gZnJvbSAnLi4vRGF0YSc7XG5pbXBvcnQgeyBMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSB9IGZyb20gJy4uL0NvbnN0YW50cy9DYWNoZUtleXMnO1xuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xuXG5leHBvcnQgY2xhc3MgTG9nbyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSAkaW1hZ2VFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlICR0aXRsZUNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZykge1xuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0V2lkZ2V0KCk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9pbml0V2lkZ2V0KHRoaXMuZGF0YVNvdXJjZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlRGF0YSgpOiBKUXVlcnlEZWZlcnJlZDxhbnk+IHtcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSk7XG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50LnJlbW92ZSgpO1xuICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLnJlbW92ZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2luaXRXaWRnZXQodGhpcy5kYXRhU291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRXaWRnZXQoZGF0YVNvdXJjZTogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyk6IEpRdWVyeURlZmVycmVkPGFueT4ge1xuICAgIGNvbnN0IGNhY2hlZFNldHRpbmdzUmF3ID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xuXG4gICAgaWYgKGNhY2hlZFNldHRpbmdzUmF3KSB7XG4gICAgICB0aGlzLl9jcmVhdGVMb2dvKEpTT04ucGFyc2UoY2FjaGVkU2V0dGluZ3NSYXcpIGFzIElMb2dvU2V0dGluZ3MpO1xuXG4gICAgICByZXR1cm4gJC5EZWZlcnJlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVMb2dvKGRhdGFTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlTG9nbyhkYXRhU291cmNlOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8YW55PiB7XG4gICAgaWYgKHR5cGVvZiBkYXRhU291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgbG9nb1NldHRpbmdzID0gZGF0YVNvdXJjZSBhcyBJTG9nb1NldHRpbmdzO1xuXG4gICAgICB0aGlzLl9jcmVhdGVMb2dvTWFya3VwKGxvZ29TZXR0aW5ncyk7XG5cbiAgICAgIHJldHVybiAkLkRlZmVycmVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHRoaXMuZGF0YVNvdXJjZSBhcyBzdHJpbmcsICdwb3N0JykuZG9uZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzID0ge307XG4gICAgICBsb2dvU2V0dGluZ3MuYXBwbGljYXRpb25OYW1lID0gZGF0YS5BcHBsaWNhdGlvbk5hbWU7XG4gICAgICBsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lID0gZGF0YS5CdXNpbmVzc05hbWU7XG4gICAgICBsb2dvU2V0dGluZ3MubG9nb0ltYWdlID0gZGF0YS5Mb2dvSW1hZ2U7XG4gICAgICBsb2dvU2V0dGluZ3MubGFuZGluZ1BhZ2VMb2dvID0gZGF0YS5MYW5kaW5nUGFnZUxvZ287XG4gICAgICBsb2dvU2V0dGluZ3MuZGVzY3JpcHRpb24gPSBkYXRhLkRlc2NyaXB0aW9uO1xuXG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShMT0dPX1NFVFRJTkdTX0NBQ0hFX0tFWSwgSlNPTi5zdHJpbmdpZnkobG9nb1NldHRpbmdzKSk7XG5cbiAgICAgIHRoaXMuX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUxvZ29NYXJrdXAobG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzKSB7XG4gICAgdGhpcy4kaW1hZ2VFbGVtZW50ID0gJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sb2dvSW1hZ2UpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XG5cbiAgICB0aGlzLiR0aXRsZUNvbnRhaW5lciA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3RpdGxlLWNvbnRhaW5lcicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XG5cbiAgICB0aGlzLiR0aXRsZUNvbnRhaW5lci5hcHBlbmQoJCgnPGRpdiAvPicpLmFkZENsYXNzKCdidXNpbmVzcy1uYW1lJykudGV4dChsb2dvU2V0dGluZ3MuYnVzaW5lc3NOYW1lKSk7XG4gICAgdGhpcy4kdGl0bGVDb250YWluZXIuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcygnYXBwLW5hbWUnKS50ZXh0KGxvZ29TZXR0aW5ncy5hcHBsaWNhdGlvbk5hbWUudG9VcHBlckNhc2UoKSkpO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgSURlc3Ryb3lhYmxlLCBJUmVuZGVyZWQgfSBmcm9tICcuLi9Db21wb25lbnRzL0NvcmUnO1xuaW1wb3J0IHsgV2luZG93UmVzaXplTGlzdGVuZXIsIElMYXlvdXRCcmVha3BvaW50LCBMYXlvdXRCcmVha3BvaW50Q2hhbmdlZEV2ZW50LCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cyB9IGZyb20gJy4uL0hlbHBlcnMvSW5kZXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZW51U3dpdGNoZXJPcHRpb25zIHtcbiAgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIG1vYmlsZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIGNvbGxhcHNlQnJlYWtwb2ludD86IElMYXlvdXRCcmVha3BvaW50O1xuICBzdGFydFZhbHVlPzogYm9vbGVhbjtcbiAgb25Td2l0Y2g/OiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNZW51U3dpdGNoZXIgaW1wbGVtZW50cyBJUmVuZGVyZWQsIElEZXN0cm95YWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVza3RvcENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9iaWxlQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IG9uU3dpdGNoOiAoKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkxheW91dEJyZWFrcG9pbnRDaGFuZ2VkTGlzdGVuZXIgPSB0aGlzLm9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3dSZXNpemVMaXN0ZW5lcjogV2luZG93UmVzaXplTGlzdGVuZXI7XG4gIHByaXZhdGUgX3ZhbHVlOiBib29sZWFuO1xuICBwcml2YXRlIG1lbnVTd2l0Y2hlcjogRGV2RXhwcmVzcy51aS5keFN3aXRjaCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvblZhbHVlQ2hhbmdlZDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSU1lbnVTd2l0Y2hlck9wdGlvbnMpIHtcbiAgICB0aGlzLmRlc2t0b3BDb250YWluZXIgPSBvcHRpb25zLmRlc2t0b3BDb250YWluZXI7XG4gICAgdGhpcy5tb2JpbGVDb250YWluZXIgPSBvcHRpb25zLm1vYmlsZUNvbnRhaW5lcjtcbiAgICB0aGlzLmNvbGxhcHNlQnJlYWtwb2ludCA9IG9wdGlvbnMuY29sbGFwc2VCcmVha3BvaW50IHx8IGJvb3RzdHJhcExheW91dEJyZWFrcG9pbnRzLm1kO1xuICAgIHRoaXMub25Td2l0Y2ggPSBvcHRpb25zLm9uU3dpdGNoO1xuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9ucy5zdGFydFZhbHVlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0YXJ0VmFsdWUgOiB0cnVlO1xuXG4gICAgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lciA9IG5ldyBXaW5kb3dSZXNpemVMaXN0ZW5lcih1bmRlZmluZWQsIHRoaXMub25MYXlvdXRCcmVha3BvaW50Q2hhbmdlZExpc3RlbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZVZpZXcgPyB0aGlzLm1vYmlsZUNvbnRhaW5lciA6IHRoaXMuZGVza3RvcENvbnRhaW5lcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlVmlldygpIHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lci5jdXJyZW50TGF5b3V0QnJlYWtwb2ludC5tYXhXaWR0aCA8IHRoaXMuY29sbGFwc2VCcmVha3BvaW50Lm1heFdpZHRoO1xuICB9XG5cbiAgcHVibGljIHNldFZpc2libGUoaXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5tZW51U3dpdGNoZXI/Lm9wdGlvbigndmlzaWJsZScsIGlzVmlzaWJsZSk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIHRoaXMucmVuZGVyU3dpdGNoKCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5tZW51U3dpdGNoZXIuZWxlbWVudCgpO1xuICAgIHRoaXMubWVudVN3aXRjaGVyPy5kaXNwb3NlKCk7XG5cbiAgICByb290Py5yZW1vdmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMubWVudVN3aXRjaGVyLm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlVmFsdWVDaGFuZ2VkKG9uVmFsdWVDaGFuZ2VkOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkID0gb25WYWx1ZUNoYW5nZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclN3aXRjaCgpIHtcbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9ICQoJzxkaXY+JykuZHhTd2l0Y2goe1xuICAgICAgc3dpdGNoZWRPZmZUZXh0OiAnUGVyc29uYWwnLFxuICAgICAgc3dpdGNoZWRPblRleHQ6ICdHbG9iYWwnLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm9uU3dpdGNoKSB7XG4gICAgICAgICAgdGhpcy5vblN3aXRjaCh0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSkuZHhTd2l0Y2goJ2luc3RhbmNlJyk7XG5cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lbnVTd2l0Y2hlci5lbGVtZW50KClbMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzd2l0Y2hWaWV3KCkge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIG9uTGF5b3V0QnJlYWtwb2ludENoYW5nZWQoZTogTGF5b3V0QnJlYWtwb2ludENoYW5nZWRFdmVudCkge1xuICAgIHRoaXMuc3dpdGNoVmlldygpO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4nO1xuaW1wb3J0IHsgTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi4vQnVzaW5lc3MnO1xuaW1wb3J0IHsgZ2V0VXJsQnlNZW51SXRlbURhdGEgfSBmcm9tICcuLi9IZWxwZXJzL0luZGV4JztcbmltcG9ydCB7IElOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCB9IGZyb20gJy4vSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBJU2VhcmNoT3B0aW9ucyB7XG4gICRjb250YWluZXI6IEpRdWVyeTtcbiAgZ2V0TWVudURhdGFTb3VyY2U6ICgpID0+IElTZWFyY2hEYXRhU291cmNlO1xuICBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcbiAgb25EaW1lbnNpb25zQ2hhbmdlZD86ICgpID0+IHZvaWQ7XG4gIG9uTWVudUl0ZW1DbGljaz86IChlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSA9PiB2b2lkO1xuICBvbk1lbnVJdGVtT3BlbmVkPzogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWFyY2hEYXRhU291cmNlIHtcbiAgZ2xvYWJhbEl0ZW1zOiBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXTtcbiAgcGVyc29uYWxJdGVtczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9wZW5SZXBvcnRFdmVudEFyZ3Mge1xuICBtZW51SXRlbTogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWw7XG59XG5cbmV4cG9ydCB0eXBlIElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsID0gSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsICYge1xuICBpc0dsb2JhbDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IGdldE1lbnVEYXRhU291cmNlOiAoKSA9PiBJU2VhcmNoRGF0YVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRJc0dsb2JhbE1lbnVTaG93bjogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkRpbWVuc2lvbnNDaGFuZ2VkOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uTWVudUl0ZW1DbGljazogKGU6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQpID0+IHZvaWQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25NZW51SXRlbU9wZW5lZDogKGU6IElPcGVuUmVwb3J0RXZlbnRBcmdzKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgc2VhcmNoRHJvcERvd246IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRzVHJlZUxpc3Q6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2VhcmNoT3B0aW9ucykge1xuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcbiAgICB0aGlzLmdldE1lbnVEYXRhU291cmNlID0gb3B0aW9ucy5nZXRNZW51RGF0YVNvdXJjZTtcbiAgICB0aGlzLmdldElzR2xvYmFsTWVudVNob3duID0gb3B0aW9ucy5nZXRJc0dsb2JhbE1lbnVTaG93bjtcbiAgICB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQgPSBvcHRpb25zLm9uRGltZW5zaW9uc0NoYW5nZWQ7XG4gICAgdGhpcy5vbk1lbnVJdGVtT3BlbmVkID0gb3B0aW9ucy5vbk1lbnVJdGVtT3BlbmVkO1xuICAgIHRoaXMub25NZW51SXRlbUNsaWNrID0gb3B0aW9ucy5vbk1lbnVJdGVtQ2xpY2s7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJsZShpc1Zpc2libGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xuICAgIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCAmJiB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWFyY2hUZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wdGlvbigndmFsdWUnLCB0ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWRNZW51SXRlbXMoKSB7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Q/Lm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuZ2V0RGF0YVNvdXJjZUZvclNlYXJjaCh0aGlzLmdldE1lbnVEYXRhU291cmNlKCkpKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3QgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG4gICAgZm9ybUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9ybS1pbmxpbmUnKTtcblxuICAgIGNvbnN0ICRpbnB1dCA9ICQoJzxkaXYgLz4nKS5keERyb3BEb3duQm94KHtcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VhcmNoJyxcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgc2hvd0Ryb3BEb3duQnV0dG9uOiBmYWxzZSxcbiAgICAgIGFwcGx5VmFsdWVNb2RlOiAnaW5zdGFudGx5JyxcbiAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxuICAgICAgb3Blbk9uRmllbGRDbGljazogZmFsc2UsXG4gICAgICBtb2RlOiAnc2VhcmNoJyxcbiAgICAgIGVsZW1lbnRBdHRyOiB7XG4gICAgICAgICd0eXBlJzogJ3NlYXJjaCcsXG4gICAgICAgICdhcmlhLWxhYmVsJzogJ1NlYXJjaCdcbiAgICAgIH0sXG4gICAgICBjb250ZW50VGVtcGxhdGU6IChlLCAkZWwpID0+IHtcbiAgICAgICAgJGVsLmFkZENsYXNzKCdoZWFkZXItc2VhcmNoLXJlc3VsdHMtdHJlZS1saXN0Jyk7XG4gICAgICAgIGNvbnN0ICR0cmVlTGlzdCA9ICQoJzxkaXY+JykuZHhUcmVlTGlzdCh7XG4gICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5nZXREYXRhU291cmNlRm9yU2VhcmNoKHRoaXMuZ2V0TWVudURhdGFTb3VyY2UoKSksXG4gICAgICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZWRpdGluZzoge1xuICAgICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd0RlbGV0aW5nOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5vRGF0YVRleHQ6ICdObyByZXN1bHRzIGZvdW5kJyxcbiAgICAgICAgICBkYXRhU3RydWN0dXJlOiAndHJlZScsXG4gICAgICAgICAga2V5RXhwcjogJ0lkJyxcbiAgICAgICAgICBpdGVtc0V4cHI6ICdJdGVtcycsXG4gICAgICAgICAgZmlsdGVyTW9kZTogJ2Z1bGxCcmFuY2gnLFxuICAgICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiBmYWxzZSxcbiAgICAgICAgICBjb2x1bW5zOiBbe1xuICAgICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXG4gICAgICAgICAgICBkYXRhVHlwZTogJ3N0cmluZydcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBvbkNlbGxDbGljazogKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9NZW51SXRlbShkYXRhKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uS2V5RG93bjogKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gYXJncy5ldmVudCBhcyBhbnk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRSb3dLZXkgPSB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5vcHRpb24oJ2ZvY3VzZWRSb3dLZXknKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2VkUm93S2V5ICE9PSBudWxsICYmIGZvY3VzZWRSb3dLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5nZXROb2RlQnlLZXkoZm9jdXNlZFJvd0tleSkuZGF0YTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb01lbnVJdGVtKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmV4cGFuZFJvdyhmb2N1c2VkUm93S2V5KTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0LmNvbGxhcHNlUm93KGZvY3VzZWRSb3dLZXkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlYXJjaERyb3BEb3duLmZvY3VzKCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0c1RyZWVMaXN0ID0gJHRyZWVMaXN0LmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XG5cbiAgICAgICAgcmV0dXJuICR0cmVlTGlzdDtcbiAgICAgIH0sXG4gICAgICBkcm9wRG93bk9wdGlvbnM6IHtcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBvZjogJy5zZWFyY2gtZHJvcGRvd24nLFxuICAgICAgICAgIG15OiAndG9wJyxcbiAgICAgICAgICBhdDogJ2JvdHRvbScsXG4gICAgICAgICAgb2Zmc2V0OiB7IHg6IDE0OSwgeTogNCB9XG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiA1MTgsXG4gICAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICAgIHNob3c6IHsgZHVyYXRpb246IDAgfSxcbiAgICAgICAgICBoaWRlOiB7IGR1cmF0aW9uOiAwIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG9uU2hvd246IChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hEcm9wRG93bi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Gb2N1c0luOiAoZSkgPT4ge1xuICAgICAgICBlLmNvbXBvbmVudC5lbGVtZW50KCkuYWRkQ2xhc3MoJ2ZvY3VzZWQnKTtcbiAgICAgICAgdGhpcy5vbkRpbWVuc2lvbnNDaGFuZ2VkICYmIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCgpO1xuICAgICAgICB0aGlzLmNoZWNrU2VhcmNoUmVzdXRQb3B1cFZpc2liaWxpdHkoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoJ2lucHV0LmR4LXRleHRlZGl0b3ItaW5wdXQnKS52YWwoKSBhcyBzdHJpbmcpO1xuICAgICAgfSxcbiAgICAgIG9uRm9jdXNPdXQ6IChlKSA9PiB7XG4gICAgICAgIGlmICghZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoJ2lucHV0LmR4LXRleHRlZGl0b3ItaW5wdXQnKS52YWwoKSkge1xuICAgICAgICAgIGUuY29tcG9uZW50LmVsZW1lbnQoKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICAgIHRoaXMub25EaW1lbnNpb25zQ2hhbmdlZCAmJiB0aGlzLm9uRGltZW5zaW9uc0NoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uS2V5VXA6IChlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV2ZW50OiBLZXlib2FyZEV2ZW50ID0gZS5ldmVudCBhcyBhbnk7XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUuY29tcG9uZW50LmVsZW1lbnQoKS5maW5kKCdpbnB1dC5keC10ZXh0ZWRpdG9yLWlucHV0JykudmFsKCkgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgdGhpcy5jaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlKTtcbiAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5zZWFyY2hCeVRleHQodmFsdWUpO1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJlZEZvY3VzQnV0dG9ucyA9IFsnVGFiJywgJ0VudGVyJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ107XG4gICAgICAgICAgaWYgKHRyaWdnZXJlZEZvY3VzQnV0dG9ucy5zb21lKChiKSA9PiBiID09PSBldmVudC5rZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5mb2N1cyh0aGlzLnNlYXJjaFJlc3VsdHNUcmVlTGlzdC5nZXRDZWxsRWxlbWVudCgwLCAnTmFtZScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQ6IEtleWJvYXJkRXZlbnQgPSBlLmV2ZW50IGFzIGFueTtcblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgIHRoaXMuY2xvc2VTZWFyY2hEcm9wRG93bigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tTZWFyY2hSZXN1dFBvcHVwVmlzaWJpbGl0eShlLnZhbHVlKTtcbiAgICAgIH0sXG4gICAgfSkuYWRkQ2xhc3MoWydmb3JtLWNvbnRyb2wnLCAnbXItc20tMicsICdzZWFyY2gtZHJvcGRvd24nXSk7XG5cbiAgICB0aGlzLnNlYXJjaERyb3BEb3duID0gJGlucHV0LmR4RHJvcERvd25Cb3goJ2luc3RhbmNlJyk7XG5cbiAgICBmb3JtRWxlbWVudC5hcHBlbmRDaGlsZCgkaW5wdXRbMF0pO1xuICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmQoZm9ybUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvTWVudUl0ZW0obWVudUl0ZW06IElFeHRlbmRlZE5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSB7XG4gICAgY29uc3QgdXJsID0gZ2V0VXJsQnlNZW51SXRlbURhdGEobWVudUl0ZW0pO1xuXG4gICAgaWYgKHVybCkge1xuICAgICAgdGhpcy5jbG9zZVNlYXJjaERyb3BEb3duKCk7XG5cbiAgICAgIGNvbnN0IGFyZ3M6IE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgPSB7XG4gICAgICAgIGl0ZW06IG1lbnVJdGVtLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBudWxsLFxuICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9uTWVudUl0ZW1DbGljaz8uKGFyZ3MpO1xuXG4gICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9uTWVudUl0ZW1PcGVuZWQgJiYgdGhpcy5vbk1lbnVJdGVtT3BlbmVkKHsgbWVudUl0ZW0gfSk7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlU2VhcmNoRHJvcERvd24oKSB7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzVHJlZUxpc3Qub3B0aW9uKCdmb2N1c2VkUm93S2V5JywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLnNlYXJjaERyb3BEb3duPy5vcHRpb24oJ3ZhbHVlJywgJycpO1xuICAgIHRoaXMuc2VhcmNoRHJvcERvd24/LmZvY3VzKCk7XG4gICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uYmx1cigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1NlYXJjaFJlc3V0UG9wdXBWaXNpYmlsaXR5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuc2VhcmNoRHJvcERvd24/Lm9wZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2hEcm9wRG93bj8uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERhdGFTb3VyY2VGb3JTZWFyY2goZHM6IElTZWFyY2hEYXRhU291cmNlKTogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFkcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRSZWR1Y2VyID0gKGlzR2xvYmFsOiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCByZWR1Y2VyID0gKHJlczogSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWxbXSwgaXRlbTogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLkl0ZW1zICYmIGl0ZW0uSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgaXRlbS5JdGVtcyA9IGl0ZW0uSXRlbXMucmVkdWNlKHJlZHVjZXIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IGl0ZW0uVmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0uVmlzaWJsZSA9PT0gbnVsbCB8fCBpdGVtLlZpc2libGUgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLkRpc2FibGVkID09PSB0cnVlO1xuXG4gICAgICAgIGlmIChpc1Zpc2libGUgJiYgIWlzRGlzYWJsZWQpIHtcbiAgICAgICAgICByZXMucHVzaCh7IC4uLml0ZW0sIGlzR2xvYmFsIH0gYXMgSUV4dGVuZGVkTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZWR1Y2VyO1xuICAgIH07XG5cbiAgICBpZiAoZHMucGVyc29uYWxJdGVtcyAmJiBkcy5wZXJzb25hbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgY29uc3QgZ2xvYmFsTWVudVJvb3QgPSB7XG4gICAgICAgIE5hbWU6ICdHbG9iYWwgTWVudScsIElkOiAtMSwgaXNHbG9iYWw6IHRydWUsIFR5cGU6IE1lbnVJdGVtVHlwZS5NZW51Tm9kZSxcbiAgICAgICAgSXRlbXM6IGRzLmdsb2FiYWxJdGVtcy5yZWR1Y2UoZ2V0UmVkdWNlcih0cnVlKSwgW10pXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwZXJzb25hbE1lbnVSb290ID0ge1xuICAgICAgICBOYW1lOiAnUGVyc29uYWwgTWVudScsIElkOiAtMiwgaXNHbG9iYWw6IGZhbHNlLCBUeXBlOiBNZW51SXRlbVR5cGUuTWVudU5vZGUsXG4gICAgICAgIEl0ZW1zOiBkcy5wZXJzb25hbEl0ZW1zLnJlZHVjZShnZXRSZWR1Y2VyKGZhbHNlKSwgW10pXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5nZXRJc0dsb2JhbE1lbnVTaG93bigpID8gW2dsb2JhbE1lbnVSb290LCBwZXJzb25hbE1lbnVSb290XSA6IFtwZXJzb25hbE1lbnVSb290LCBnbG9iYWxNZW51Um9vdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkcy5nbG9hYmFsSXRlbXMucmVkdWNlKGdldFJlZHVjZXIodHJ1ZSksIFtdKTtcbiAgICB9XG4gIH1cbn1cbiIsICJcdUZFRkZleHBvcnQgeyBEZXZFeHByZXNzRXZlbnRBcmdzIH0gZnJvbSAnLi9EZXZFeHByZXNzRXZlbnRBcmdzJztcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vRXZlbnRFbWl0dGVyJztcbmV4cG9ydCB7IGdldEdlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UgfSBmcm9tICcuL0dlbmVyYWxVc2VyRnJpZW5kbHlFcnJvck1lc3NhZ2UnO1xuIiwgIlx1RkVGRmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50TGlzdGVuZXJzOiBhbnlbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gW107XG4gIH1cblxuICBwdWJsaWMgb24oZXZ0LCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVyc1tldnRdKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0gPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gbGlzdGVuZXI7XG4gIH1cblxuICBwdWJsaWMgb25jZShldnQsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy5vbihldnQsIChlKSA9PiB7XG4gICAgICBsaXN0ZW5lcihlKTtcbiAgICAgIHRoaXMub2ZmKGV2dCwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXQoZXZ0LCBlID0gbnVsbCkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZ0XTtcblxuICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgY3VycmVudExpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICBpZiAoY3VycmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgY3VycmVudExpc3RlbmVyLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb2ZmKGV2dCwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2dF07XG5cbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRMaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMaXN0ZW5lciAhPT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGN1cnJlbnRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1tldnRdID0gZmlsdGVyZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEhhbmRsZXIoZXZlbnQ6IHN0cmluZywgb3JpZ2luSGFuZGxlciwgZ2V0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgaW50ZXJuYWxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgb3JpZ2luSGFuZGxlcihcbiAgICAgICAgZ2V0QXJndW1lbnRzKCksXG4gICAgICAgICgpID0+IHRoaXMub2ZmKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpXG4gICAgICApO1xuICAgIH07XG5cbiAgICB0aGlzLm9uKGV2ZW50LCBpbnRlcm5hbEhhbmRsZXIpO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xuaW1wb3J0IHsgdGhyb3dSZW5kZXJFcnJvciwgTXV0YWJsZSB9IGZyb20gJy4uL0NvbXBvbmVudHMvQ29yZSc7XG5pbXBvcnQgeyBJTGF5b3V0QnJlYWtwb2ludCwgYm9vdHN0cmFwTGF5b3V0QnJlYWtwb2ludHMsIGdldFVybEJ5TWVudUl0ZW1EYXRhIH0gZnJvbSAnLi4vSGVscGVycy9JbmRleCc7XG5pbXBvcnQgeyBVc2VyTWVudSwgVXNlck1lbnVJdGVtQ2xpY2tFdmVudCB9IGZyb20gJy4vVXNlck1lbnUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1lbnUsIE5hdmlnYXRpb25NZW51SXRlbUNsaWNrRXZlbnQgfSBmcm9tICcuL05hdmlnYXRpb25NZW51JztcbmltcG9ydCB7IExvZ28gfSBmcm9tICcuL0xvZ28nO1xuaW1wb3J0IHsgTWVudVN3aXRjaGVyIH0gZnJvbSAnLi9NZW51U3dpdGNoZXInO1xuaW1wb3J0IHsgSVVzZXJNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9JVXNlck1lbnVJdGVtJztcbmltcG9ydCB7IElNZW51U2V0dGluZ3MgfSBmcm9tICcuL0lNZW51U2V0dGluZ3MnO1xuaW1wb3J0IHsgSUFwcE1lbnVNb2RlbCB9IGZyb20gJy4vSUFwcE1lbnVNb2RlbCc7XG5pbXBvcnQgeyBJTmF2aWdhdGlvbk1lbnVJdGVtTW9kZWwgfSBmcm9tICcuL0lOYXZpZ2F0aW9uTWVudUl0ZW1Nb2RlbCc7XG5pbXBvcnQgU2VhcmNoLCB7IElPcGVuUmVwb3J0RXZlbnRBcmdzLCBJU2VhcmNoRGF0YVNvdXJjZSB9IGZyb20gJy4vU2VhcmNoJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL1V0aWxzL0luZGV4JztcblxuY29uc3QgSEVBREVSX0RBVEFfQ0FDSEVfRklFTEQgPSAnaXN6b2xlYS11aXxoZWFkZXItZGF0YS1jYWNoZSc7XG5jb25zdCBTSE9XX0dMT0JBTF9NRU5VX0tFWSA9ICdpc3pvbGVhLXVpfHNob3ctZ2xvYmFsLW1lbnUnO1xuXG5jb25zdCBnZXREYXRhU291cmNlQ2FjaGVGaWVsZCA9ICh1c2VyTmFtZT86IHN0cmluZykgPT4ge1xuICByZXR1cm4gYCR7SEVBREVSX0RBVEFfQ0FDSEVfRklFTER9JHt1c2VyTmFtZSA/IGB8JHt1c2VyTmFtZX1gIDogJyd9YDtcbn07XG5cbmV4cG9ydCB0eXBlIEhlYWRlclRoZW1lcyA9ICdpc3pvbGVhJztcbmV4cG9ydCBpbnRlcmZhY2UgSUhlYWRlck9wdGlvbnMge1xuICAkZWw6IEpRdWVyeTtcbiAgbWVudVNldHRpbmdzPzogSU1lbnVTZXR0aW5ncztcbiAgbG9nb1NldHRpbmdzPzogSUxvZ29TZXR0aW5ncyB8IHN0cmluZztcbiAgZGlzcGxheVNlYXJjaD86IGJvb2xlYW47XG4gIGltbWVkaWF0ZVJlbmRlcj86IGJvb2xlYW47XG4gIHRoZW1lPzogSGVhZGVyVGhlbWVzO1xuICBvbkluaXQ/OiAoKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSUhlYWRlckVsZW1lbnRzIHtcbiAgcmVhZG9ubHkgcm9vdD86IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBsb2dvQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGNvbnRlbnRDb250YWluZXI/OiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgdG9nZ2xlQnV0dG9uQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IHRvZ2dsZUJ1dHRvbj86IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBtZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IG1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xufVxuXG5pbnRlcmZhY2UgSUFqYXhQYWdlTWFya2VyIHtcbiAgaXNMb2FkZWRCeUFqYXg6IHRydWU7XG4gIHVybDogc3RyaW5nO1xuICBpc01lbnVTd2l0Y2hlckdsb2JhbDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVOVV9TV0lUQ0hFUl9JTklUSUFMSVpFRF9FVkVOVCA9ICdtZW51LXN3aXRjaGVyLWluaXRpYWxpemVkLWV2ZW50JztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHTE9CQUxfVVJMX1JFR0VYID0gbmV3IFJlZ0V4cCgnXig/OlthLXpdKzopPy8vJywgJ2knKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9DVFlQRV9NQVJLRVJfUkVHRVggPSBuZXcgUmVnRXhwKCchRE9DVFlQRSBodG1sPicsICdpJyk7XG5cbiAgcHVibGljIHVzZXJNZW51OiBVc2VyTWVudSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIG5hdmlnYXRpb25NZW51OiBOYXZpZ2F0aW9uTWVudSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIG1lbnVTd2l0Y2hlcjogTWVudVN3aXRjaGVyIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgbG9nbzogTG9nbyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGRhdGE6IElBcHBNZW51TW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0aGVtZTogSGVhZGVyVGhlbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ29TZXR0aW5nczogSUxvZ29TZXR0aW5ncyB8IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW51U2V0dGluZ3M6IElNZW51U2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVNlYXJjaDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXBzZUJyZWFrcG9pbnQ6IElMYXlvdXRCcmVha3BvaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRQYW5lbDogRGV2RXhwcmVzcy51aS5keExvYWRQYW5lbDtcbiAgcHJpdmF0ZSByZWFkb25seSAkcGFydGlhbFZpZXdQbGFjZUhvbGRlcjogSlF1ZXJ5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25QYXJ0aWFsVmlld0xvYWRlZDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyID0gdGhpcy5vbk5hdmlnYXRpb25NZW51SXRlbU9wZW5lZC5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uVXNlck1lbnVJdGVtQ2xpY2tIYW5kbGVyID0gdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgc2VhcmNoOiBTZWFyY2ggfCB1bmRlZmluZWQ7XG5cbiAgLy8gZWxlbWVudHNcbiAgcHJpdmF0ZSByZWFkb25seSAkZWw6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50czogTXV0YWJsZTxJSGVhZGVyRWxlbWVudHM+ID0ge307XG4gIHByaXZhdGUgJGxvYWRCYXI6IEpRdWVyeSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJSGVhZGVyT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiRlbCA9IG9wdGlvbnMuJGVsO1xuICAgIHRoaXMubWVudVNldHRpbmdzID0gb3B0aW9ucy5tZW51U2V0dGluZ3M7XG4gICAgdGhpcy5sb2dvU2V0dGluZ3MgPSBvcHRpb25zLmxvZ29TZXR0aW5ncztcbiAgICB0aGlzLnRoZW1lID0gb3B0aW9ucy50aGVtZSB8fCAnaXN6b2xlYSc7XG4gICAgdGhpcy5kaXNwbGF5U2VhcmNoID0gb3B0aW9ucy5kaXNwbGF5U2VhcmNoO1xuICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50ID0gb3B0aW9ucy5tZW51U2V0dGluZ3M/LmNvbGxhcHNlQnJlYWtwb2ludCB8fCBib290c3RyYXBMYXlvdXRCcmVha3BvaW50cy5tZDtcblxuICAgIHRoaXMuJHBhcnRpYWxWaWV3UGxhY2VIb2xkZXIgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ucGFydGlhbFZpZXdQbGFjZUhvbGRlcjtcbiAgICB0aGlzLnVwZGF0ZVVybEFmdGVyUGFydGlhbExvYWRpbmcgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8udXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZztcbiAgICB0aGlzLm9uUGFydGlhbFZpZXdMb2FkZWQgPSBvcHRpb25zLm1lbnVTZXR0aW5ncz8ub25QYXJ0aWFsVmlld0xvYWRlZDtcbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZyA9IG9wdGlvbnMubWVudVNldHRpbmdzPy5iZWZvcmVQYXJ0aWFsVmlld0xvYWRpbmc7XG5cbiAgICB0aGlzLmxvYWRQYW5lbCA9IHRoaXMuY3JlYXRlTG9hZFBhbmVsKCk7XG5cbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGVSZW5kZXIgPT09IGZhbHNlKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybignVGhlIFxcJ2ltbWVkaWF0ZVJlbmRlciA9PT0gZmFsc2VcXCcgb3B0aW9uIGlzblxcJ3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuJyk7XG4gICAgfVxuXG4gICAgLy9OT1RFOiBUbyBvdmVycmlkZSBib290c3RyYXAgaGVhZGVyIHotaW5kZXggd2hpY2ggaXMgMTYwMFxuICAgIERldkV4cHJlc3MudWkuZHhPdmVybGF5LmJhc2VaSW5kZXgoMTcwMCk7XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHRoaXMuaW5pdCgpXG4gICAgICAudGhlbigoKSA9PiBvcHRpb25zPy5vbkluaXQ/LigpKTtcblxuICAgIHRoaXMuc3Vic2NyaWJlT25IaXN0b3J5UG9wU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyQXBwTWVudU1vZGVsQ2FjaGUoKTtcbiAgICB0aGlzLmRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVyZW5kZXJNZW51cygpO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICAvKipcbiAgICAgKiA8Um9vdD5cbiAgICAgKiAgPEJyYW5kPlxuICAgICAqICAgIDxMb2dvIC8+XG4gICAgICogIDwvQnJhbmQ+XG4gICAgICogIDxDb250ZW50VG9nZ2xlciAvPlxuICAgICAqICA8Q29udGVudD5cbiAgICAgKiAgICA8U2VhcmNoIC8+XG4gICAgICogICAgPE5hdmlnYXRpb25NZW51IC8+XG4gICAgICogICAgPFVzZXJNZW51IC8+XG4gICAgICogIDwvQ29udGVudD5cbiAgICAgKiAgPE1lbnVTd2l0Y2hlciAvPlxuICAgICAqIDwvUm9vdD5cbiAgICAgKiA8TG9hZEJhciAvPlxuICAgICAqL1xuXG4gICAgdGhpcy5yZW5kZXJSb290KCk7XG4gICAgdGhpcy5yZW5kZXJCcmFuZCgpO1xuICAgIHRoaXMucmVuZGVyQ29udGVudFRvZ2dsZXIoKTtcbiAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICB0aGlzLnJlbmRlckxvYWRCYXIoKTtcblxuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZU9uSGlzdG9yeVBvcFN0YXRlKCkge1xuICAgIGlmICh0aGlzLiRwYXJ0aWFsVmlld1BsYWNlSG9sZGVyKSB7XG4gICAgICAkKHdpbmRvdykuYmluZCgncG9wc3RhdGUnLCAoZSkgPT4ge1xuICAgICAgICBjb25zdCBldmVudCA9IGUub3JpZ2luYWxFdmVudCBhcyBQb3BTdGF0ZUV2ZW50O1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlIGFzIElBamF4UGFnZU1hcmtlcjtcbiAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLmlzTG9hZGVkQnlBamF4KSB7XG4gICAgICAgICAgdGhpcy5sb2FkUGFnZVZpYUFqYXhDb3JlKHN0YXRlLnVybCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShzdGF0ZS5pc01lbnVTd2l0Y2hlckdsb2JhbCk7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9hZFBhbmVsKCk6IERldkV4cHJlc3MudWkuZHhMb2FkUGFuZWwge1xuICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhMb2FkUGFuZWwoe1xuICAgICAgc2hhZGluZ0NvbG9yOiAncmdiYSgwLDAsMCwwLjQpJyxcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgc2hvd0luZGljYXRvcjogdHJ1ZSxcbiAgICAgIHNob3dQYW5lOiB0cnVlLFxuICAgICAgc2hhZGluZzogdHJ1ZSxcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgIH0pLmFwcGVuZFRvKHRoaXMuJGVsKS5keExvYWRQYW5lbCgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyUm9vdCgpIHtcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QgPSB0aGlzLiRlbFswXTtcbiAgICB0aGlzLmVsZW1lbnRzLnJvb3QuY2xhc3NMaXN0LmFkZCgnaGVhZGVyJywgdGhpcy50aGVtZSwgJ25hdmJhcicsICduYXZiYXItZGFyaycsIGBuYXZiYXItZXhwYW5kLSR7dGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQubmFtZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQnJhbmQoKSB7XG4gICAgaWYgKHRoaXMubG9nbyB8fCAhdGhpcy5sb2dvU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmFuZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYnJhbmRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hlYWRlcl9fYnJhbmQnLCAnbmF2YmFyLWJyYW5kJyk7XG4gICAgYnJhbmRFbGVtZW50LmhyZWYgPSAnLyc7XG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKGJyYW5kRWxlbWVudCk7XG5cbiAgICB0aGlzLmVsZW1lbnRzLmxvZ29Db250YWluZXIgPSBicmFuZEVsZW1lbnQ7XG5cbiAgICB0aGlzLmxvZ28gPSBuZXcgTG9nbygkKHRoaXMuZWxlbWVudHMubG9nb0NvbnRhaW5lciksIHRoaXMubG9nb1NldHRpbmdzKTtcbiAgICB0aGlzLmxvZ28uaW5pdFdpZGdldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTZWFyY2goKSB7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXlTZWFyY2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xuICAgICAgJGNvbnRhaW5lcjogJCh0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpLFxuICAgICAgZ2V0TWVudURhdGFTb3VyY2U6ICgpID0+IHRoaXMuZ2V0U2VhcmNoRGF0YVNvdXJjZSh0aGlzLmRhdGEpLFxuICAgICAgZ2V0SXNHbG9iYWxNZW51U2hvd246ICgpID0+IHRoaXMuZ2V0SXNHbG9iYWxNZW51U2hvd24oKSxcbiAgICAgIG9uRGltZW5zaW9uc0NoYW5nZWQ6ICgpID0+IHRoaXMubmF2aWdhdGlvbk1lbnU/LmFwcGx5QWRhcHRpdml0eUNvbGxhcHNpbmcoKSxcbiAgICAgIG9uTWVudUl0ZW1DbGljazogdGhpcy5vbk5hdmlhZ3Rpb25NZW51SXRlbUNsaWNrSGFuZGxlcixcbiAgICAgIG9uTWVudUl0ZW1PcGVuZWQ6IHRoaXMub25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWRIYW5kbGVyLFxuICAgIH0pO1xuICAgIHRoaXMuc2VhcmNoLnJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJc0dsb2JhbE1lbnVTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCkgfHwgIXRoaXMuZGF0YT8uQWRkR2xvYmFsUGVyc29uYWxTd2l0Y2hlcjtcbiAgfVxuXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uTWVudUl0ZW1PcGVuZWQoZTogSU9wZW5SZXBvcnRFdmVudEFyZ3MpIHtcbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUubWVudUl0ZW0uaXNHbG9iYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNZW51U3dpdGNoZXJTdGF0ZShpc0dsb2JhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5tZW51U3dpdGNoZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIudmFsdWUgIT09IGlzR2xvYmFsKSB7XG4gICAgICB0aGlzLm1lbnVTd2l0Y2hlci5zZXRWYWx1ZShpc0dsb2JhbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb250ZW50VG9nZ2xlcigpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ25hdmJhci10b2dnbGVyJyk7XG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuICAgIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS10b2dnbGUnLCAnY29sbGFwc2UnKTtcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFyZ2V0JywgJy5oZWFkZXJfX2NvbnRlbnQnKTtcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2g/LnNldFNlYXJjaFRleHQoJycpO1xuICAgIH07XG5cbiAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGljb24uY2xhc3NMaXN0LmFkZCgnbmF2YmFyLXRvZ2dsZXItaWNvbicpO1xuXG4gICAgdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoZWFkZXJfX3RvZ2dsZS1idXR0b24tY29udGFpbmVyJyk7XG5cbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbik7XG4gICAgdGhpcy5lbGVtZW50cy5yb290LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uQ29udGFpbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMucm9vdCkge1xuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ3Jvb3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2UnLCAnbmF2YmFyLWNvbGxhcHNlJywgJ2hlYWRlcl9fY29udGVudCcpO1xuICAgIHRoaXMuZWxlbWVudHMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpO1xuXG4gICAgdGhpcy5yZW5kZXJTZWFyY2goKTtcbiAgICB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KFtdKTtcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xuICAgIHRoaXMucmVuZGVyVXNlck1lbnUoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJOYXZpZ2F0aW9uTWVudShtZW51SXRlbU1vZGVsczogSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsW10pIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIHRocm93UmVuZGVyRXJyb3IoJ2NvbnRlbnRDb250YWluZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0dsb2JhbE1lbnUgPSB0aGlzLmdldElzR2xvYmFsTWVudVNob3duKCk7XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uTWVudSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVEYXRhKG1lbnVJdGVtTW9kZWxzLCBpc0dsb2JhbE1lbnUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25NZW51ID0gbmV3IE5hdmlnYXRpb25NZW51KFxuICAgICAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIsXG4gICAgICAgIG1lbnVJdGVtTW9kZWxzLFxuICAgICAgICBpc0dsb2JhbE1lbnUsXG4gICAgICAgIHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxuICAgICAgICB0aGlzLm9uTmF2aWFndGlvbk1lbnVJdGVtQ2xpY2tIYW5kbGVyLFxuICAgICAgKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbk1lbnUucmVuZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblVzZXJNZW51SXRlbUNsaWNrKGU6IFVzZXJNZW51SXRlbUNsaWNrRXZlbnQpIHtcbiAgICB0aGlzLm1lbnVTZXR0aW5ncy5vblVzZXJNZW51Q2xpY2s/LihlKTtcbiAgICBpZiAoZS5jYW5jZWwgfHwgdGhpcy5pc0tleVByZXNzZWQoZS5vcmlnaW5hbEV2ZW50IGFzIE1vdXNlRXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gZS5pdGVtLlVybDtcblxuICAgIGlmIChlLml0ZW0uQWx3YXlzUmVsb2FkUGFnZSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25OYXZpYWd0aW9uTWVudUl0ZW1DbGljayhlOiBOYXZpZ2F0aW9uTWVudUl0ZW1DbGlja0V2ZW50KSB7XG4gICAgdGhpcy5tZW51U2V0dGluZ3Mub25OYXZpZ2F0aW9uTWVudUl0ZW1DbGljaz8uKGUpO1xuICAgIGlmIChlLmNhbmNlbCB8fCB0aGlzLmlzS2V5UHJlc3NlZChlLm9yaWdpbmFsRXZlbnQgYXMgTW91c2VFdmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZU1lbnVTd2l0Y2hlclN0YXRlKGUuaXRlbS5pc0dsb2JhbCk7XG5cbiAgICBjb25zdCB1cmwgPSBnZXRVcmxCeU1lbnVJdGVtRGF0YShlLml0ZW0pO1xuICAgIGUuY2FuY2VsID0gdGhpcy50cnlEb1BhcnRpYWxQYWdlTG9hZGluZyh1cmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0tleVByZXNzZWQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQgJiYgKGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5RG9QYXJ0aWFsUGFnZUxvYWRpbmcodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlciAmJiB1cmwgJiYgdGhpcy5jaGVja0lzTG9jYWxVcmwodXJsKSkge1xuICAgICAgaWYgKHRoaXMudXBkYXRlVXJsQWZ0ZXJQYXJ0aWFsTG9hZGluZykge1xuICAgICAgICBjb25zdCBzdGF0ZTogSUFqYXhQYWdlTWFya2VyID0ge1xuICAgICAgICAgIGlzTG9hZGVkQnlBamF4OiB0cnVlLFxuICAgICAgICAgIGlzTWVudVN3aXRjaGVyR2xvYmFsOiAhIXRoaXMubWVudVN3aXRjaGVyPy52YWx1ZSxcbiAgICAgICAgICB1cmxcbiAgICAgICAgfTtcblxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIG51bGwsIHVybCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9hZFBhZ2VWaWFBamF4Q29yZSh1cmwpO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uTWVudS51cGRhdGVBY3RpdmVJdGVtc1N0YXRlKCk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJc0xvY2FsVXJsKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuICFIZWFkZXIuR0xPQkFMX1VSTF9SRUdFWC50ZXN0KHVybCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSXNQYXJ0aWFsUGFnZUNvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgIUhlYWRlci5ET0NUWVBFX01BUktFUl9SRUdFWC50ZXN0KGNvbnRlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUGFnZVZpYUFqYXhDb3JlKHVybDogc3RyaW5nKSB7XG4gICAgd2luZG93LmlzSXNvelNlcnZlckV4Y2VwdGlvbiA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2FkUGFuZWwuc2hvdygpO1xuXG4gICAgY29uc3QgdXJsRm9yUGFydGlhbExvYWRpbmcgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB1cmwpO1xuICAgIHVybEZvclBhcnRpYWxMb2FkaW5nLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2lzb3pQYXJ0aWFsTG9hZGluZycsICd0cnVlJyk7XG4gICAgY29uc3QgcGFydGlhbFVybCA9IHVybEZvclBhcnRpYWxMb2FkaW5nLnRvU3RyaW5nKCk7XG5cbiAgICB0aGlzLmJlZm9yZVBhcnRpYWxWaWV3TG9hZGluZz8uKCk7XG5cbiAgICAkLmFqYXgocGFydGlhbFVybCwgeyBkYXRhVHlwZTogJ2h0bWwnIH0pLmFsd2F5cygoZGF0YSwgdGV4dFN0YXR1cykgPT4ge1xuICAgICAgaWYgKHRleHRTdGF0dXMgIT09ICdzdWNjZXNzJyB8fCAhdGhpcy5jaGVja0lzUGFydGlhbFBhZ2VDb250ZW50KGRhdGEpKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4kcGFydGlhbFZpZXdQbGFjZUhvbGRlci5odG1sKGRhdGEpO1xuICAgICAgICB0aGlzLm9uUGFydGlhbFZpZXdMb2FkZWQ/LigpO1xuICAgICAgICB0aGlzLmxvYWRQYW5lbC5oaWRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclVzZXJNZW51KGl0ZW1zOiBJVXNlck1lbnVJdGVtTW9kZWxbXSkge1xuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3M/LnVzZXJOYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZXJNZW51KSB7XG4gICAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXZpZGVyLmNsYXNzTGlzdC5hZGQoJ2Ryb3Bkb3duLWRpdmlkZXInKTtcbiAgICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5hcHBlbmRDaGlsZChkaXZpZGVyKTtcblxuICAgICAgdGhpcy51c2VyTWVudSA9IG5ldyBVc2VyTWVudSh7XG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5jb250ZW50Q29udGFpbmVyLFxuICAgICAgICB1c2VyTmFtZTogdGhpcy5tZW51U2V0dGluZ3MudXNlck5hbWUsXG4gICAgICAgIHVzZXJBdmF0YXI6IHRoaXMubWVudVNldHRpbmdzLnVzZXJBdmF0YXIsXG4gICAgICAgIGl0ZW1zLFxuICAgICAgICBjb2xsYXBzZUJyZWFrcG9pbnQ6IHRoaXMuY29sbGFwc2VCcmVha3BvaW50LFxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5vblVzZXJNZW51SXRlbUNsaWNrSGFuZGxlcixcbiAgICAgICAgZ2V0RGlzcGxheWVkVXNlckluZm86IHRoaXMubWVudVNldHRpbmdzLmdldERpc3BsYXllZFVzZXJJbmZvXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXNlck1lbnUucmVuZGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlck1lbnUudXBkYXRlSXRlbXMoaXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWVudVN3aXRjaGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhPy5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyKSB7XG4gICAgICBpZiAodGhpcy5tZW51U3dpdGNoZXIpIHtcbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXI/LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcj8ucmVtb3ZlKCk7XG5cbiAgICAgICAgdGhpcy5tZW51U3dpdGNoZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZWxlbWVudHMubWVudVN3aXRjaGVyRGVza3RvcENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWVudVN3aXRjaGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCdjb250ZW50Q29udGFpbmVyJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b25Db250YWluZXIpIHtcbiAgICAgIHJldHVybiB0aHJvd1JlbmRlckVycm9yKCd0b2dnbGVCdXR0b25Db250YWluZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlckRlc2t0b3BDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWVudS1zd2l0Y2hlcicpO1xuXG4gICAgdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtZW51LXN3aXRjaGVyJyk7XG5cbiAgICB0aGlzLm1lbnVTd2l0Y2hlciA9IG5ldyBNZW51U3dpdGNoZXIoe1xuICAgICAgZGVza3RvcENvbnRhaW5lcjogdGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLFxuICAgICAgbW9iaWxlQ29udGFpbmVyOiB0aGlzLmVsZW1lbnRzLm1lbnVTd2l0Y2hlck1vYmlsZUNvbnRhaW5lcixcbiAgICAgIGNvbGxhcHNlQnJlYWtwb2ludDogdGhpcy5jb2xsYXBzZUJyZWFrcG9pbnQsXG4gICAgICBzdGFydFZhbHVlOiB0aGlzLmlzU2hvd0dsb2JhbE1lbnUoKSxcbiAgICAgIG9uU3dpdGNoOiAodmFsdWUpID0+IHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNIT1dfR0xPQkFMX01FTlVfS0VZLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMuc2VhcmNoPy5zZXRTZWFyY2hUZXh0KCcnKTtcbiAgICAgICAgdGhpcy5zZWFyY2g/LnJlbG9hZE1lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyB8fCBbXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5tZW51U3dpdGNoZXIucmVuZGVyKCk7XG4gICAgdGhpcy5lbWl0KEhlYWRlci5NRU5VX1NXSVRDSEVSX0lOSVRJQUxJWkVEX0VWRU5UKTtcblxuICAgIHRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJEZXNrdG9wQ29udGFpbmVyLCB0aGlzLnVzZXJNZW51Py5yb290KTtcbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbkNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50cy5tZW51U3dpdGNoZXJNb2JpbGVDb250YWluZXIsIHRoaXMuZWxlbWVudHMudG9nZ2xlQnV0dG9uKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTG9hZEJhcigpIHtcbiAgICB0aGlzLiRsb2FkQmFyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsb2FkLWJhcicpLmhpZGUoKS5hcHBlbmRUbyh0aGlzLiRlbCk7XG5cbiAgICBjb25zdCAkbG9hZCA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9hZCcpLmFwcGVuZFRvKHRoaXMuJGxvYWRCYXIpO1xuICAgICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnYmFyJykuYXBwZW5kVG8oJGxvYWQpO1xuXG4gICAgZnVuY3Rpb24gcm90YXRlKHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICAgICQoc2VsZWN0b3IpLmFuaW1hdGUoeyBsZWZ0OiAkKCcubG9hZCcpLndpZHRoKCkgfSwgMjAwMCwgKCkgPT4ge1xuICAgICAgICAkKHNlbGVjdG9yKS5jc3MoJ2xlZnQnLCBgJHstJChzZWxlY3Rvcikud2lkdGgoKSF9cHhgKTtcbiAgICAgICAgcm90YXRlKHNlbGVjdG9yKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJvdGF0ZSgnLmJhcicpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXJlbmRlck1lbnVzKCkge1xuICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkl0ZW1zKHRoaXMuZGF0YSk7XG4gICAgY29uc3QgdXNlckl0ZW1zID0gdGhpcy5nZXRVc2VySXRlbXModGhpcy5kYXRhKTtcbiAgICAvLyBJZiBpdGVtcyBhcmUgdW5kZWZpbmVkIHdlIGRvbid0IHVwZGF0ZSBtZW51c1xuICAgIG5hdmlnYXRpb25JdGVtcyAmJiB0aGlzLnJlbmRlck5hdmlnYXRpb25NZW51KG5hdmlnYXRpb25JdGVtcyk7XG4gICAgdXNlckl0ZW1zICYmIHRoaXMucmVuZGVyVXNlck1lbnUodXNlckl0ZW1zKTtcbiAgICB0aGlzLnJlbmRlck1lbnVTd2l0Y2hlcigpO1xuICAgIHRoaXMudXBkYXRlQ29udGVudEFuZFRvZ2dsZXJWaXNpYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRBbmRUb2dnbGVyVmlzaWJsZSgpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuY29udGVudENvbnRhaW5lciAmJiAhdGhpcy5lbGVtZW50cy50b2dnbGVCdXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpZ2F0aW9uSXRlbXMgPSB0aGlzLmdldE5hdmlnYXRpb25JdGVtcyh0aGlzLmRhdGEpO1xuICAgIGNvbnN0IHVzZXJJdGVtcyA9IHRoaXMuZ2V0VXNlckl0ZW1zKHRoaXMuZGF0YSk7XG4gICAgY29uc3QgaXNWaXNpYmxlID0gKG5hdmlnYXRpb25JdGVtcyAmJiBuYXZpZ2F0aW9uSXRlbXMubGVuZ3RoID4gMClcbiAgICAgIHx8IHRoaXMubWVudVNldHRpbmdzPy51c2VyTmFtZVxuICAgICAgfHwgKHVzZXJJdGVtcyAmJiB1c2VySXRlbXMubGVuZ3RoID4gMCk7XG5cbiAgICB0aGlzLmVsZW1lbnRzLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKCdkLW5vbmUnLCAhaXNWaXNpYmxlKTtcbiAgICB0aGlzLmVsZW1lbnRzLmNvbnRlbnRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZC1ub25lJywgIWlzVmlzaWJsZSk7XG5cbiAgICB0aGlzLnNlYXJjaD8uc2V0VmlzaWJsZSghIWlzVmlzaWJsZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKTtcblxuICAgIGlmICghdGhpcy5lbGVtZW50cy5yb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXJlbmRlck1lbnVzKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWREYXRhKCk6IFByb21pc2U8SUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGhlYWRlciBkb2VzblxcJ3QgaGF2ZSBtZW51IHNldHRpbmdzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm1lbnVTZXR0aW5ncy5kYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMubWVudVNldHRpbmdzLmRhdGE7XG4gICAgfVxuXG4gICAgbGV0IGRhdGEgPSB0aGlzLmdldENhY2hlZEFwcE1lbnVNb2RlbCgpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWFyY2g/LnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgdGhpcy4kbG9hZEJhcj8uc2hvdygpO1xuICAgICAgZGF0YSA9IGF3YWl0IHNlbmRSZXF1ZXN0PElBcHBNZW51TW9kZWw+KHRoaXMubWVudVNldHRpbmdzLmRhdGEpO1xuICAgICAgdGhpcy5jYWNoZUFwcE1lbnVNb2RlbChkYXRhKTtcbiAgICAgIHRoaXMuc2VhcmNoPy5yZWxvYWRNZW51SXRlbXMoKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2VhcmNoPy5zZXRWaXNpYmxlKHRydWUpO1xuICAgICAgdGhpcy4kbG9hZEJhcj8uaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkl0ZW1zKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghYXBwTWVudU1vZGVsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3dHbG9iYWxNZW51ID0gdGhpcy5pc1Nob3dHbG9iYWxNZW51KCk7XG5cbiAgICByZXR1cm4gc2hvd0dsb2JhbE1lbnUgfHwgIWFwcE1lbnVNb2RlbC5BZGRHbG9iYWxQZXJzb25hbFN3aXRjaGVyXG4gICAgICA/IGFwcE1lbnVNb2RlbC5OYXZpZ2F0aW9uSXRlbXNcbiAgICAgIDogYXBwTWVudU1vZGVsLlBlcnNvbmFsTmF2aWdhdGlvbkl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWFyY2hEYXRhU291cmNlKGFwcE1lbnVNb2RlbDogSUFwcE1lbnVNb2RlbCB8IHVuZGVmaW5lZCk6IElTZWFyY2hEYXRhU291cmNlIHtcbiAgICBpZiAoIWFwcE1lbnVNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2xvYWJhbEl0ZW1zOiBhcHBNZW51TW9kZWwuTmF2aWdhdGlvbkl0ZW1zLFxuICAgICAgcGVyc29uYWxJdGVtczogYXBwTWVudU1vZGVsLkFkZEdsb2JhbFBlcnNvbmFsU3dpdGNoZXIgPyBhcHBNZW51TW9kZWwuUGVyc29uYWxOYXZpZ2F0aW9uSXRlbXMgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VySXRlbXMoYXBwTWVudU1vZGVsOiBJQXBwTWVudU1vZGVsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFhcHBNZW51TW9kZWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcE1lbnVNb2RlbC5Vc2VySXRlbXM7XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZEFwcE1lbnVNb2RlbCgpOiBJQXBwTWVudU1vZGVsIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1lbnVTZXR0aW5ncykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3VmFsdWUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSkpO1xuXG4gICAgcmV0dXJuIHJhd1ZhbHVlID09PSBudWxsID8gcmF3VmFsdWUgOiBKU09OLnBhcnNlKHJhd1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVBcHBNZW51TW9kZWwoZGF0YTogSUFwcE1lbnVNb2RlbCkge1xuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckFwcE1lbnVNb2RlbENhY2hlKCkge1xuICAgIGlmICghdGhpcy5tZW51U2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShnZXREYXRhU291cmNlQ2FjaGVGaWVsZCh0aGlzLm1lbnVTZXR0aW5ncy51c2VyTmFtZSkpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGlzU2hvd0dsb2JhbE1lbnUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3SXNHbG9iYWwgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU0hPV19HTE9CQUxfTUVOVV9LRVkpO1xuICAgIGNvbnN0IGlzR2xvYmFsID0gcmF3SXNHbG9iYWwgPT09IG51bGwgPyByYXdJc0dsb2JhbCBhcyBudWxsIDogSlNPTi5wYXJzZShyYXdJc0dsb2JhbCkgYXMgYm9vbGVhbjtcblxuICAgIHJldHVybiBpc0dsb2JhbCA9PT0gbnVsbCB8fCBpc0dsb2JhbDtcbiAgfVxufVxuIiwgIlx1RkVGRmNvbnN0IGdyaWRDb2x1bW5UeXBlcyA9IFsnZGVmYXVsdCcsICdzdHJpbmcnLCAnbnVtYmVyJywgJ2RhdGUnLCAnYm9vbGVhbicsICdvYmplY3QnLCAnZGF0ZXRpbWUnXTtcblxuZXhwb3J0IGRlZmF1bHQgZ3JpZENvbHVtblR5cGVzO1xuIiwgIlx1RkVGRmV4cG9ydCBlbnVtIENkbUltcG9ydEZpbGVNb2RlIHtcbiAgTm9uZSA9IDAsXG4gIEFkZE5ld1Jvd3MgPSAxLFxuICBSZXBsYWNlQWxsUm93cyA9IDIsXG59XG4iLCAiXHVGRUZGXG5leHBvcnQgZW51bSBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIE51bWJlciA9ICdudW1iZXInLFxuICBEYXRlID0gJ2RhdGUnLFxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxuICBPYmplY3QgPSAnb2JqZWN0JyxcbiAgRGF0ZXRpbWUgPSAnZGF0ZXRpbWUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRDb2x1bW5TdGF0ZSB7XG4gIGRhdGFGaWVsZDogc3RyaW5nO1xuICBkYXRhVHlwZTogR3JpZERhdGFDb2x1bW5EYXRhVHlwZTtcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGdyb3VwSW5kZXg/OiBudW1iZXI7XG4gIHNvcnRJbmRleD86IG51bWJlcjtcbiAgc29ydE9yZGVyPzogbnVtYmVyO1xuICB2aXNpYmxlPzogYm9vbGVhbjtcbiAgdmlzaWJsZUluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlIHtcbiAgY2FwdGlvbj86IHN0cmluZztcbiAgdG9vbHRpcD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUgZXh0ZW5kcyBJR3JpZENvbHVtblN0YXRlLCBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRTdGF0ZSB7XG4gIGNvbHVtbnM6IElHcmlkRXh0ZW5kZWRDb2x1bW5TdGF0ZVtdO1xufVxuIiwgImNvbnN0IGxvYWRlZFVybHM6IHN0cmluZ1tdID0gW11cblxuZnVuY3Rpb24gcmFuZG9tSW50ZWdlcihtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93ICgkY29udGFpbmVyOiBKUXVlcnksIGltYWdlVXJsczogc3RyaW5nW10sIGltZ0NoYW5nZUludGVydmFsU2VjOiBudW1iZXIgPSA1LCB0cmFuc2l0aW9uVGltZVNlYzogbnVtYmVyID0gMikge1xuICAvLyBTaHVmZmxlIHVybHNcbiAgY29uc3Qgc2h1ZmZsZWRVcmxzID0gaW1hZ2VVcmxzLnNvcnQoKGEsIGIpID0+IDAuNSAtIE1hdGgucmFuZG9tKCkpO1xuXG4gICRjb250YWluZXIuYWRkQ2xhc3MoJ2lzem9sZWEtYmFja2dyb3VuZC1pbWFnZS12aWV3ZXInKS5jc3Moe1xuICAgICd0cmFuc2l0aW9uJzogYGJhY2tncm91bmQtaW1hZ2UgJHt0cmFuc2l0aW9uVGltZVNlY31zIGVhc2UtaW4tb3V0IDBzYCxcbiAgfSk7XG5cbiAgc2h1ZmZsZWRVcmxzLmZvckVhY2goKHVybCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgbG9hZGVkVXJscy5wdXNoKHVybCk7XG5cbiAgICAgIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGluaXRJbWFnZXNDaGFuZ2luZygkY29udGFpbmVyLCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpbWcuc3JjID0gdXJsO1xuICAgIH0sIGluZGV4ICogMTAwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRJbmRleFRvU2hvdyAoY3VycmVudEluZGV4OiBudW1iZXIpIHtcbiAgaWYobG9hZGVkVXJscy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKGxvYWRlZFVybHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRJbmRleCA9PT0gMCA/IDEgOiAwO1xuICB9XG5cbiAgY29uc3QgbmV4dEluZGV4ID0gcmFuZG9tSW50ZWdlcigwLCBsb2FkZWRVcmxzLmxlbmd0aCAtIDEpO1xuXG4gIGlmKG5leHRJbmRleCA9PT0gY3VycmVudEluZGV4KSB7XG4gICAgcmV0dXJuIG5leHRJbmRleCA9PT0gbG9hZGVkVXJscy5sZW5ndGggLSAxID8gMCA6IG5leHRJbmRleCArIDE7XG4gIH1cblxuICByZXR1cm4gbmV4dEluZGV4O1xufVxuXG5mdW5jdGlvbiBpbml0SW1hZ2VzQ2hhbmdpbmcgKCRjb250YWluZXI6IEpRdWVyeSwgaW1nQ2hhbmdlSW50ZXJ2YWxTZWM6IG51bWJlcikge1xuICBsZXQgY3VycmVudFNob3duSW5kZXggPSAwO1xuXG4gIHNob3dJbWFnZSgkY29udGFpbmVyLCBjdXJyZW50U2hvd25JbmRleCk7XG5cbiAgd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICBpZihsb2FkZWRVcmxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN1cnJlbnRTaG93bkluZGV4ID0gZ2V0TmV4dEluZGV4VG9TaG93KGN1cnJlbnRTaG93bkluZGV4KTtcbiAgICBzaG93SW1hZ2UoJGNvbnRhaW5lciwgY3VycmVudFNob3duSW5kZXgpO1xuICB9LCBpbWdDaGFuZ2VJbnRlcnZhbFNlYyAqIDEwMDApO1xufVxuXG5mdW5jdGlvbiBzaG93SW1hZ2UgKCRjb250YWluZXI6IEpRdWVyeSwgaW5kZXg6IG51bWJlcikge1xuICAkY29udGFpbmVyLmNzcygnYmFja2dyb3VuZC1pbWFnZScsIGB1cmwoXCIke2xvYWRlZFVybHNbaW5kZXhdfVwiKWApO1xufVxuIiwgIlx1RkVGRmltcG9ydCB7IElMaWNlbmNlIH0gZnJvbSAnLi4vQnVzaW5lc3MnO1xuXG5leHBvcnQgZW51bSBGb290ZXJJbmRpY2F0b3JTdGF0dXMge1xuICBTdWNjZXNzLFxuICBXYXJuaW5nLFxuICBFcnJvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJJbmRpY2F0b3JWYWx1ZSB7XG4gIHN0YXR1czogRm9vdGVySW5kaWNhdG9yU3RhdHVzO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRm9vdGVySW5kaWNhdG9yT3B0aW9ucyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICB2YWx1ZTogSUZvb3RlckluZGljYXRvclZhbHVlO1xuICBnZXRWYWx1ZT86ICgpID0+IFByb21pc2U8SUZvb3RlckluZGljYXRvclZhbHVlPjtcbiAgZ2V0VmFsdWVJbnRlcnZhbE1zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGb290ZXJPcHRpb25zIHtcbiAgJHJvb3Q6IEpRdWVyeTtcbiAgbmFtZTogc3RyaW5nIHwgZmFsc2U7XG4gIGxpY2VuY2U6IElMaWNlbmNlIHwgZmFsc2U7XG4gIHllYXI/OiBudW1iZXIgfCAnbG9jYWwnIHwgZmFsc2U7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIHNlcnZlck5hbWU/OiBzdHJpbmc7XG4gIGRhdGFiYXNlPzogc3RyaW5nO1xuICBpbmRpY2F0b3JzPzogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8SUZvb3Rlck9wdGlvbnM+ID0ge1xuICB5ZWFyOiAnbG9jYWwnXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb290ZXIge1xuICBwcml2YXRlIHN0YXRpYyBnZXRDdXJyZW50WWVhcihjdXJyZW50WWVhcjogbnVtYmVyIHwgJ2xvY2FsJyB8IGZhbHNlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY3VycmVudFllYXIgPT09ICdsb2NhbCcgfHwgY3VycmVudFllYXIgPT09IGZhbHNlXG4gICAgICA/IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKVxuICAgICAgOiBjdXJyZW50WWVhcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgJHJvb3Q6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3RlZFRvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd05hbWU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGljZW5jZTogSUxpY2VuY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0xpY2VuY2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgeWVhcjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dZZWFyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dDb25uZWN0ZWRUbzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzT3B0aW9uczogSUZvb3RlckluZGljYXRvck9wdGlvbnNbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlOYW1lOiBNYXA8c3RyaW5nLCBKUXVlcnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvckNsYXNzQnlTdGF0dXMgPSBuZXcgTWFwPEZvb3RlckluZGljYXRvclN0YXR1cywgc3RyaW5nPihbXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5TdWNjZXNzLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV9zdWNjZXNzJ10sXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5XYXJuaW5nLCAnZm9vdGVyX19pbmRpY2F0b3JfdHlwZV93YXJuaW5nJ10sXG4gICAgW0Zvb3RlckluZGljYXRvclN0YXR1cy5FcnJvciwgJ2Zvb3Rlcl9faW5kaWNhdG9yX3R5cGVfZXJyb3InXVxuICBdKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRm9vdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLmRlZmF1bHRPcHRpb25zIH0gYXMgUmVxdWlyZWQ8SUZvb3Rlck9wdGlvbnM+O1xuXG4gICAgdGhpcy4kcm9vdCA9IG1lcmdlZE9wdGlvbnMuJHJvb3Q7XG4gICAgdGhpcy5uYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZSA/IG1lcmdlZE9wdGlvbnMubmFtZSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpY2VuY2UgPSBtZXJnZWRPcHRpb25zLmxpY2VuY2UgIT09IGZhbHNlID8gbWVyZ2VkT3B0aW9ucy5saWNlbmNlIDogdW5kZWZpbmVkO1xuICAgIHRoaXMueWVhciA9IEZvb3Rlci5nZXRDdXJyZW50WWVhcihtZXJnZWRPcHRpb25zLnllYXIpO1xuICAgIHRoaXMudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnNob3dOYW1lID0gbWVyZ2VkT3B0aW9ucy5uYW1lICE9PSBmYWxzZTtcbiAgICB0aGlzLnNob3dMaWNlbmNlID0gbWVyZ2VkT3B0aW9ucy5saWNlbmNlICE9PSBmYWxzZTtcbiAgICB0aGlzLnNob3dZZWFyID0gbWVyZ2VkT3B0aW9ucy55ZWFyICE9PSBmYWxzZTtcbiAgICB0aGlzLnNob3dDb25uZWN0ZWRUbyA9ICEhbWVyZ2VkT3B0aW9ucy5zZXJ2ZXJOYW1lICYmICEhbWVyZ2VkT3B0aW9ucy5kYXRhYmFzZTtcbiAgICB0aGlzLmluZGljYXRvcnNPcHRpb25zID0gb3B0aW9ucy5pbmRpY2F0b3JzIHx8IFtdO1xuICAgIHRoaXMuaW5kaWNhdG9yc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBKUXVlcnk+KCk7XG5cbiAgICB0aGlzLmNvbm5lY3RlZFRvID0gdGhpcy5zaG93Q29ubmVjdGVkVG8gPyBgJHttZXJnZWRPcHRpb25zLnNlcnZlck5hbWV9IC0gJHttZXJnZWRPcHRpb25zLmRhdGFiYXNlfWAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpIHtcbiAgICB0aGlzLiRyb290LmFkZENsYXNzKCdmb290ZXInKTtcblxuICAgIHRoaXMucmVuZGVySW5kaWNhdG9ycygpO1xuICAgIHRoaXMucmVuZGVyQ29weXJpZ2h0KCk7XG4gICAgdGhpcy5zaG93WWVhciAmJiB0aGlzLnJlbmRlclllYXIoKTtcbiAgICB0aGlzLnNob3dOYW1lICYmIHRoaXMucmVuZGVyTmFtZSgpO1xuICAgIHRoaXMuc2hvd0Nvbm5lY3RlZFRvICYmIHRoaXMucmVuZGVyQ29ubmVjdGVkVG8oKTtcbiAgICB0aGlzLnNob3dMaWNlbmNlICYmIHRoaXMucmVuZGVyTGljZW5jZSgpO1xuICB9XG5cbiAgcHVibGljIHNldEluZGljYXRvclZhbHVlKGluZGljYXRvck5hbWU6IHN0cmluZywgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZSkge1xuICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9IHRoaXMuaW5kaWNhdG9yc0J5TmFtZS5nZXQoaW5kaWNhdG9yTmFtZSk7XG4gICAgaWYgKCRpbmRpY2F0b3JFbCkge1xuICAgICAgdGhpcy5zZXRJbmRpY2F0b3JWYWx1ZUNvcmUoJGluZGljYXRvckVsLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJJbmRpY2F0b3JzKCkge1xuICAgIHRoaXMuaW5kaWNhdG9yc09wdGlvbnM/LmZvckVhY2goKG8pID0+IHtcbiAgICAgIGlmIChvLnRleHQpIHtcbiAgICAgICAgJCgnPHNwYW4+JylcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faW5kaWNhdG9yLXRleHQnKVxuICAgICAgICAgIC5odG1sKGAke28udGV4dH06YClcbiAgICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0ICRpbmRpY2F0b3JFbCA9ICQoJzxzcGFuPicpXG4gICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19pbmRpY2F0b3InKVxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XG5cbiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgby52YWx1ZSk7XG4gICAgICB0aGlzLmluZGljYXRvcnNCeU5hbWUuc2V0KG8ubmFtZSwgJGluZGljYXRvckVsKTtcblxuICAgICAgaWYgKG8uZ2V0VmFsdWUgJiYgby5nZXRWYWx1ZUludGVydmFsTXMpIHtcbiAgICAgICAgc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgby5nZXRWYWx1ZSgpO1xuICAgICAgICAgIHRoaXMuc2V0SW5kaWNhdG9yVmFsdWVDb3JlKCRpbmRpY2F0b3JFbCwgdmFsdWUpO1xuICAgICAgICB9LCBvLmdldFZhbHVlSW50ZXJ2YWxNcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEluZGljYXRvclZhbHVlQ29yZSgkaW5kaWNhdG9yRWw6IEpRdWVyeSwgdmFsdWU6IElGb290ZXJJbmRpY2F0b3JWYWx1ZSkge1xuICAgICRpbmRpY2F0b3JFbC5hdHRyKCd0aXRsZScsIHZhbHVlLnRpdGxlKTtcbiAgICAkaW5kaWNhdG9yRWwucmVtb3ZlQ2xhc3MoWy4uLnRoaXMuaW5kaWNhdG9yQ2xhc3NCeVN0YXR1cy52YWx1ZXMoKV0pO1xuICAgICRpbmRpY2F0b3JFbC5hZGRDbGFzcyh0aGlzLmluZGljYXRvckNsYXNzQnlTdGF0dXMuZ2V0KHZhbHVlLnN0YXR1cykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb3B5cmlnaHQoKSB7XG4gICAgJCgnPHNwYW4+JylcbiAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19jb3B5cmlnaHQnKVxuICAgICAgLmh0bWwoJyZjb3B5OycpXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck5hbWUoKSB7XG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fYXBwLW5hbWUnKVxuICAgICAgLnRleHQodGhpcy5uYW1lICsgKCEhdGhpcy52ZXJzaW9uID8gYDogJHt0aGlzLnZlcnNpb259YCA6ICcnKSlcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29ubmVjdGVkVG8oKSB7XG4gICAgdGhpcy5uYW1lICYmICQoJzxzcGFuPicpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fY29ubmVjdGVkLXRvJylcbiAgICAgIC50ZXh0KGBDb25uZWN0ZWQgdG86ICR7dGhpcy5jb25uZWN0ZWRUb30uYClcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyWWVhcigpIHtcbiAgICAkKCc8c3Bhbj4nKVxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2l0ZW0nKVxuICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2N1cnJlbnQteWVhcicpXG4gICAgICAudGV4dCh0aGlzLnllYXIpXG4gICAgICAuYXBwZW5kVG8odGhpcy4kcm9vdCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckxpY2VuY2UoKSB7XG4gICAgdGhpcy5saWNlbmNlICYmICQoJzxzcGFuPicpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9faXRlbScpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvb3Rlcl9fbGljZW5jZS1pbmZvJylcbiAgICAgIC5hcHBlbmQoXG4gICAgICAgICQoJzxzcGFuPicpXG4gICAgICAgICAgLmFkZENsYXNzKCdmb290ZXJfX2xpY2VuY2Utb3duZXInKVxuICAgICAgICAgIC50ZXh0KGAke3RoaXMuZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQodGhpcy5saWNlbmNlKX0uIGApXG4gICAgICApXG4gICAgICAuYXBwZW5kKFxuICAgICAgICAkKCc8c3Bhbj4nKVxuICAgICAgICAgIC5hZGRDbGFzcygnZm9vdGVyX19saWNlbmNlLWRhdGUnKVxuICAgICAgICAgIC50ZXh0KHRoaXMuZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQodGhpcy5saWNlbmNlKSlcbiAgICAgIClcbiAgICAgIC5hcHBlbmRUbyh0aGlzLiRyb290KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGljZW5jZU93bmVyRGlzcGxheVRleHQobGljZW5jZTogSUxpY2VuY2UpIHtcbiAgICByZXR1cm4gYExpY2VuY2VkIHRvOiAke2xpY2VuY2UuT3duZXJ9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGljZW5jZUV4cGlyYXRpb25EYXRlRGlzcGxheVRleHQobGljZW5jZTogSUxpY2VuY2UpIHtcbiAgICBjb25zdCBkYXRlID0gdHlwZW9mIGxpY2VuY2UuRXhwaXJhdGlvbkRhdGUgPT09ICdzdHJpbmcnID8gbmV3IERhdGUobGljZW5jZS5FeHBpcmF0aW9uRGF0ZSkgOiBsaWNlbmNlLkV4cGlyYXRpb25EYXRlO1xuXG4gICAgcmV0dXJuIGBMaWNlbmNlIEV4cGlyeTogJHtkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpfWA7XG4gIH1cbn1cbiIsICJcdUZFRkZsZXQgcmVwYWludFRpbWVvdXQgPSBudWxsO1xuY29uc3QgcmVzaXplSGFuZGxlcnMgPSBbXTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgaWYgKHJlcGFpbnRUaW1lb3V0KSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dChyZXBhaW50VGltZW91dCk7XG4gIH1cblxuICByZXBhaW50VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICByZXNpemVIYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiBoYW5kbGVyKCkpO1xuICAgIHJlcGFpbnRUaW1lb3V0ID0gbnVsbDtcbiAgfSwgMTAwKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvblJlc2l6ZTogKCkgPT4gdm9pZCkge1xuICByZXNpemVIYW5kbGVycy5wdXNoKG9uUmVzaXplKTtcbn1cbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xuXG5jb25zdCBDU1MgPSB7XG4gIG1haW46ICcubWFpbicsXG4gIGhlYWRlcjogJy5tYWluIC5oZWFkZXInLFxuICBjb250ZW50OiAnLmNvbnRlbnQtYXJlYScsXG4gIHBhbmVsOiAnLnBhbmVsJyxcbiAgZm9vdGVyOiAnZm9vdGVyJ1xufTtcblxubGV0IGxhc3RXaW5kb3dIZWlnaHQgPSBudWxsO1xubGV0IGxhc3RDb250ZW50SGVpZ2h0ID0gbnVsbDtcbmxldCBsYXN0V2lkZ2V0SGVpZ2h0ID0gbnVsbDtcblxuZnVuY3Rpb24gdXBkYXRlSGVpZ2h0KHdpZGdldCkge1xuICBjb25zdCAkY29udGVudCA9ICQoQ1NTLmNvbnRlbnQpO1xuXG4gICRjb250ZW50LmhlaWdodChsYXN0Q29udGVudEhlaWdodCk7XG4gIHdpZGdldC5vcHRpb24oJ2hlaWdodCcsIGxhc3RXaWRnZXRIZWlnaHQpO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0OiBEZXZFeHByZXNzLnVpLldpZGdldDxhbnk+LCBpZ25vcmVTaWJsaW5nczogYm9vbGVhbiA9IGZhbHNlLCBhZGRPd25TaXplOiBib29sZWFuID0gZmFsc2UpIHtcbiAgY29uc3QgJG1haW4gPSAkKENTUy5tYWluKTtcbiAgY29uc3QgJGhlYWRlciA9ICQoQ1NTLmhlYWRlcik7XG4gIGNvbnN0ICRjb250ZW50ID0gJChDU1MuY29udGVudCk7XG4gIGNvbnN0ICRmb290ZXIgPSAkKENTUy5mb290ZXIpO1xuXG4gIGNvbnN0IHBhZGRpbmdzID0gJGNvbnRlbnQub3V0ZXJIZWlnaHQoKSAtICRjb250ZW50LmhlaWdodCgpO1xuXG4gIGxhc3RDb250ZW50SGVpZ2h0ID0gJG1haW4uaGVpZ2h0KCkgLSAkaGVhZGVyLmhlaWdodCgpIC0gJGZvb3Rlci5vdXRlckhlaWdodCgpIC0gcGFkZGluZ3M7XG4gIGxhc3RXaW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XG5cbiAgY29uc3QgJGNvbnRlbnRFbGVtZW50cyA9ICRjb250ZW50LmNoaWxkcmVuKCk7XG4gIGxldCBjb250ZW50RWxlbWVudHNIZWlnaHQgPSAwO1xuXG4gIGlmICghaWdub3JlU2libGluZ3MpIHtcbiAgICBjb25zdCAkd2lkZ2V0RWxlbWVudCA9IHdpZGdldC5lbGVtZW50KCk7XG4gICAgJGNvbnRlbnRFbGVtZW50cy5lYWNoKChpbmRleCwgZWwpID0+IHtcbiAgICAgIGNvbnN0ICRjaGlsZCA9ICQoZWwpO1xuXG4gICAgICBpZiAoJGNoaWxkLmlzKCR3aWRnZXRFbGVtZW50KSB8fCAkY2hpbGQuaGFzKCR3aWRnZXRFbGVtZW50WzBdKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb250ZW50RWxlbWVudHNIZWlnaHQgKz0gKCRjaGlsZC5pcygnOnZpc2libGUnKSAmJiAkY2hpbGQuY3NzKCdwb3NpdGlvbicpICE9PSAnYWJzb2x1dGUnKSA/ICRjaGlsZC5vdXRlckhlaWdodCh0cnVlKSA6IDA7XG4gICAgfSk7XG4gIH1cblxuICBsYXN0V2lkZ2V0SGVpZ2h0ID0gbGFzdENvbnRlbnRIZWlnaHQgLSBjb250ZW50RWxlbWVudHNIZWlnaHQ7XG5cbiAgaWYgKGFkZE93blNpemUpIHtcbiAgICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IHdpZGdldC5lbGVtZW50KCkub3V0ZXJIZWlnaHQoKTtcbiAgfVxuXG4gIHVwZGF0ZUhlaWdodCh3aWRnZXQpO1xufVxuXG5mdW5jdGlvbiByZWNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcblxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XG4gIGxhc3RXaW5kb3dIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XG5cbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55PiwgaWdub3JlU2libGluZ3M6IGJvb2xlYW4gPSBmYWxzZSwgYWRkT3duU2l6ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQsIGlnbm9yZVNpYmxpbmdzLCBhZGRPd25TaXplKTtcblxuICBhdXRvUmVzaXplKCgpID0+IHJlY2FsY3VsYXRlSGVpZ2h0KHdpZGdldCkpO1xufVxuIiwgIlx1RkVGRmNvbnN0IERJU0FCTEVEX0NMQVNTID0gJ2lzb3otaWNvbi1kaXNhYmxlZCc7XG5cbmV4cG9ydCBjb25zdCBUSEVNRV9DTEFTU0VTID0ge1xuICBsZzogJ2lzem9sZWEtbGcnLFxuICBtZDogJ2lzem9sZWEtbWQnLFxuICBzbTogJ2lzem9sZWEtc20nXG59O1xuXG5leHBvcnQgY2xhc3MgVGhlbWVIZWxwZXIge1xuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNaWRkbGVTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMubWQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXRFbGVtZW50U21hbGxTaXplKGVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD4pIHtcbiAgICBlbGVtZW50LmFkZENsYXNzKFRIRU1FX0NMQVNTRVMuc20pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXRXaWRnZXRNaWRkbGVTaXplKGluc3RhbmNlOiBhbnkpIHtcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLm1kKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2V0V2lkZ2V0U21hbGxTaXplKGluc3RhbmNlOiBhbnkpIHtcbiAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTaXplKGluc3RhbmNlLCBUSEVNRV9DTEFTU0VTLnNtKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNsYXNzKGljb246IHN0cmluZywgZGlzYWJsZWQ/OiBib29sZWFuLCBzaXplOiAxNiB8IDI0ID0gMTYpIHtcbiAgICBjb25zdCBpY29uQ2xhc3MgPSBgaXNveiBpc296LWljb24tJHtpY29ufS0ke3NpemV9YDtcblxuICAgIHJldHVybiAhZGlzYWJsZWRcbiAgICAgID8gaWNvbkNsYXNzXG4gICAgICA6IGAke2ljb25DbGFzc30gJHtESVNBQkxFRF9DTEFTU31gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0V2lkZ2V0U2l6ZShpbnN0YW5jZTogYW55LCBzaXplQ2xhc3M6IHN0cmluZykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2Uub3B0aW9uKCdlbGVtZW50QXR0cicsIHsgY2xhc3M6IHNpemVDbGFzcyB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJcdUZFRkZjb25zdCBDTEFTU0VTID0ge1xuICB0aXRsZTogJ2lzb3otdGl0bGUnXG59O1xuXG5leHBvcnQgY2xhc3MgVG9vbGJhckhlbHBlciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxuICAgICAgdGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgJGVsID0gJChgPHNwYW4gY2xhc3M9XCIke0NMQVNTRVMudGl0bGV9XCI+JHt0aXRsZX08L3NwYW4+YCk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgJGVsLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYXMnKS5hZGRDbGFzcygnZmEtaW5mby1jaXJjbGUnKS5hZGRDbGFzcygncmVwb3J0LWRldGFpbHMtbGluaycpLmF0dHIoJ3RpdGxlJywgJ1JlcG9ydCBkZXRhaWxzJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICRlbDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgVEhFTUVfQ0xBU1NFUyB9IGZyb20gJy4uL0hlbHBlcnMvVGhlbWUnO1xuaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uL0hlbHBlcnMvVG9vbGJhcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2xiYXJTZXR0aW5nIHtcbiAgb3B0aW9ucz86IERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5jb25zdCBDTEFTU0VTID0ge1xuICB0aXRsZTogJ2lzb3otdGl0bGUnLFxuICBoZWFkZXI6ICdpc296LXRvb2xiYXItaGVhZGVyJyxcbiAgZHJvcERvd25CdXR0b246ICdkeC1kcm9wZG93bm1lbnUtYnV0dG9uJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3I6IHN0cmluZywgc2V0dGluZ3M6IElUb29sYmFyU2V0dGluZyA9IHsgdGl0bGU6ICcnLCBkZXNjcmlwdGlvbjogJycsIG9wdGlvbnM6IHt9IH0pOlxuICBEZXZFeHByZXNzLnVpLmR4VG9vbGJhciB7XG4gIGNvbnN0IHtcbiAgICB0aXRsZSA9ICcnLFxuICAgIGRlc2NyaXB0aW9uID0gJycsXG4gICAgb3B0aW9ucyA9IHt9LFxuICB9ID0gc2V0dGluZ3M7XG4gIGNvbnN0IHtcbiAgICBpdGVtcyA9IFtdLFxuICAgIGVsZW1lbnRBdHRyID0ge31cbiAgfSA9IG9wdGlvbnM7XG5cbiAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IG1pZGxkZVNpemVFbGVtZW50QXR0ciA9IHsgY2xhc3M6IFRIRU1FX0NMQVNTRVMubWQgfTtcblxuICAgIGlmIChpdGVtLm9wdGlvbnMpIHtcbiAgICAgIGxldCB7IGVkaXRvck9wdGlvbnMgfSA9IGl0ZW0ub3B0aW9ucztcblxuICAgICAgaWYgKCFlZGl0b3JPcHRpb25zKSB7XG4gICAgICAgIGVkaXRvck9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgZWRpdG9yT3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcbiAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IG1pZGxkZVNpemVFbGVtZW50QXR0cjtcbiAgICAgIGl0ZW0ub3B0aW9ucy5lZGl0b3JPdGlvbnMgPSBlZGl0b3JPcHRpb25zO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qgb25Db250ZW50UmVhZHkgPSAoZSkgPT4ge1xuICAgIGUuZWxlbWVudFxuICAgICAgLmZpbmQoYC4ke0NMQVNTRVMuZHJvcERvd25CdXR0b259YClcbiAgICAgIC5hZGRDbGFzcyhUSEVNRV9DTEFTU0VTLm1kKTtcblxuICAgIGlmIChvcHRpb25zPy5vbkNvbnRlbnRSZWFkeSkge1xuICAgICAgb3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuICQoYCR7c2VsZWN0b3J9YClcbiAgICAuZHhUb29sYmFyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBpdGVtczogW1xuICAgICAgICBUb29sYmFySGVscGVyLmdldFRvb2xiYXJUaXRsZVRlbXBsYXRlSXRlbSh0aXRsZSwgZGVzY3JpcHRpb24pLFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgXSxcbiAgICAgIG9uQ29udGVudFJlYWR5LFxuICAgICAgZWxlbWVudEF0dHI6IHtcbiAgICAgICAgLi4uZWxlbWVudEF0dHIsXG4gICAgICAgIGNsYXNzOiBDTEFTU0VTLmhlYWRlclxuICAgICAgfVxuICAgIH0pXG4gICAgLmR4VG9vbGJhcignaW5zdGFuY2UnKTtcbn1cbiIsICJcdUZFRkZpbXBvcnQgYXV0b1Jlc2l6ZSBmcm9tICcuL0F1dG9SZXNpemUnO1xuXG5jb25zdCBDU1MgPSB7XG4gIHBhbmVsOiAnLnBhbmVsLWJvZHknXG59O1xuXG5sZXQgbGFzdFdpbmRvd0hlaWdodCA9IG51bGw7XG5sZXQgbGFzdENvbnRlbnRIZWlnaHQgPSBudWxsO1xubGV0IGxhc3RXaWRnZXRIZWlnaHQgPSBudWxsO1xuXG5mdW5jdGlvbiB1cGRhdGVIZWlnaHQod2lkZ2V0KSB7XG4gIGNvbnN0ICR3aWRnZXQgPSB3aWRnZXQuZWxlbWVudCgpO1xuICBjb25zdCAkcGFuZWwgPSAkd2lkZ2V0LnBhcmVudHMoQ1NTLnBhbmVsKS5lcSgwKTtcblxuICAkcGFuZWwuaGVpZ2h0KGxhc3RDb250ZW50SGVpZ2h0KTtcbiAgd2lkZ2V0Lm9wdGlvbignaGVpZ2h0JywgbGFzdFdpZGdldEhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcbiAgY29uc3QgJHdpZGdldCA9IHdpZGdldC5lbGVtZW50KCk7XG4gIGNvbnN0ICRwYW5lbCA9IHdpZGdldC5lbGVtZW50KCkucGFyZW50cyhDU1MucGFuZWwpLmVxKDApO1xuXG4gIGNvbnN0IHBhbmVsVG9wID0gJHBhbmVsLnBvc2l0aW9uKCkudG9wO1xuICBjb25zdCBwYW5lbEhlaWdodCA9ICRwYW5lbC5oZWlnaHQoKTtcbiAgY29uc3QgcGFuZWxQYWRkaW5nID0gJHBhbmVsLm91dGVySGVpZ2h0KCkgLSAkcGFuZWwuaGVpZ2h0KCk7XG4gIGNvbnN0IHdpZGdldFRvcCA9ICR3aWRnZXQucG9zaXRpb24oKS50b3A7XG5cbiAgY29uc3Qgd2lkZ2V0SGVpZ2h0ID0gcGFuZWxIZWlnaHQgLSAod2lkZ2V0VG9wIC0gcGFuZWxUb3ApICsgcGFuZWxQYWRkaW5nIC8gMjtcblxuICB3aWRnZXQub3B0aW9uKCdoZWlnaHQnLCB3aWRnZXRIZWlnaHQpO1xufVxuXG5mdW5jdGlvbiByZWNhbGN1bGF0ZUhlaWdodCh3aWRnZXQ6IERldkV4cHJlc3MudWkuV2lkZ2V0PGFueT4pIHtcbiAgY29uc3Qgd2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xuICBjb25zdCBkaWZmID0gd2luZG93SGVpZ2h0IC0gbGFzdFdpbmRvd0hlaWdodDtcblxuICBsYXN0Q29udGVudEhlaWdodCArPSBkaWZmO1xuICBsYXN0V2lkZ2V0SGVpZ2h0ICs9IGRpZmY7XG4gIGxhc3RXaW5kb3dIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XG5cbiAgdXBkYXRlSGVpZ2h0KHdpZGdldCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHdpZGdldDogRGV2RXhwcmVzcy51aS5XaWRnZXQ8YW55Pikge1xuICBjYWxjdWxhdGVIZWlnaHQod2lkZ2V0KTtcblxuICBhdXRvUmVzaXplKCgpID0+IGNhbGN1bGF0ZUhlaWdodCh3aWRnZXQpKTtcbn1cbiIsICJcdUZFRkZpbXBvcnQgZnVsbFNjcmVlbiBmcm9tICcuLi9GdWxsU2NyZWVuJztcbmltcG9ydCBwYW5lbEhlaWdodCBmcm9tICcuLi9QYW5lbEhlaWdodCc7XG5pbXBvcnQgeyBDU1NfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKGlkOiBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGlzSW5QYW5lbEdyaWQgPSBmYWxzZSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XG4gIGNvbnN0IGdyaWQgPSBjcmVhdGVEYXRhR3JpZChpZCwgb3B0aW9ucyk7XG5cbiAgaWYgKCFvcHRpb25zLmhlaWdodCkge1xuICAgIGlmIChpc0luUGFuZWxHcmlkKSB7XG4gICAgICBwYW5lbEhlaWdodChncmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFNjcmVlbihncmlkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ3JpZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGFHcmlkKGVsOiBKUXVlcnksIG9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xuICBjb25zdCBncmlkID0gZWwuZHhEYXRhR3JpZChvcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xuXG4gIGdyaWQuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xuXG4gIHJldHVybiBncmlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KFxuICBlbDogc3RyaW5nIHwgSlF1ZXJ5LCBvcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3QuUHJvcGVydGllcywgaXNJblBhbmVsID0gZmFsc2Vcbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XG4gIGNvbnN0IHRyZWVMaXN0ID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgPyAkKGVsKSA6IGVsKS5keFRyZWVMaXN0KG9wdGlvbnMpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJyk7XG5cbiAgdHJlZUxpc3QuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xuXG4gIGlmICghb3B0aW9ucy5oZWlnaHQpIHtcbiAgICBpZiAoaXNJblBhbmVsKSB7XG4gICAgICBwYW5lbEhlaWdodCh0cmVlTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGxTY3JlZW4odHJlZUxpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cmVlTGlzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSh0ZXh0LCB0aXRsZSkge1xuICByZXR1cm4gJCgnPHNwYW4+JylcbiAgICAuYXR0cigndGl0bGUnLCB0aXRsZSlcbiAgICAudGV4dCh0ZXh0KTtcbn1cbiIsICJpbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDcmVhdGVHcmlkRXhwb3J0RnVuY3Rpb24ocmVwb3J0TmFtZTogc3RyaW5nKTogKGU6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5FeHBvcnRpbmdFdmVudCkgPT4gdm9pZCB7XG4gIHJldHVybiAoZTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLkV4cG9ydGluZ0V2ZW50KSA9PiB7XG4gICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgKHdpbmRvdyBhcyBhbnkpLkV4Y2VsSlMuV29ya2Jvb2soKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQocmVwb3J0TmFtZSk7XG5cbiAgICBEZXZFeHByZXNzLmV4Y2VsRXhwb3J0ZXIuZXhwb3J0RGF0YUdyaWQoe1xuICAgICAgd29ya3NoZWV0LFxuICAgICAgY29tcG9uZW50OiBlLmNvbXBvbmVudCxcbiAgICAgIGN1c3RvbWl6ZUNlbGw6IChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2VsQ2VsbCA9IG9wdGlvbnMuZXhjZWxDZWxsO1xuXG4gICAgICAgIGV4Y2VsQ2VsbC5mb250ID0geyBuYW1lOiAnQXJpYWwnLCBzaXplOiAxMiB9O1xuICAgICAgICBleGNlbENlbGwuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcgfTtcbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgd29ya2Jvb2sueGxzeC53cml0ZUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHNhdmVBcyhuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyB9KSwgYCR7cmVwb3J0TmFtZX0ueGxzeGApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZS5jYW5jZWwgPSB0cnVlO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgVG9vbGJhckhlbHBlciB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVG9vbGJhcic7XG5pbXBvcnQgeyBUaGVtZUhlbHBlciwgVEhFTUVfQ0xBU1NFUyB9IGZyb20gJy4uLy4uL0hlbHBlcnMvVGhlbWUnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vQ29uZmlnL0luZGV4JztcbmltcG9ydCBjcmVhdGVHcmlkRXhwb3J0Rm4gZnJvbSAnLi4vLi4vVXRpbHMvR3JpZEV4cG9ydCc7XG5cbmludGVyZmFjZSBJR3JpZFNldHRpbmdzQmFzZTxUPiB7XG4gIG9wdGlvbnM/OiBUO1xuXG4gIGV4cG9ydEZpbGVOYW1lPzogc3RyaW5nO1xuICBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaW5QYW5lbEdyaWQ/OiBib29sZWFuO1xuICBpc0Z1bGxTY3JlZW4/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBzZXREZWZhdWx0Q29sdW1uV2lkdGg/OiBib29sZWFuO1xuICBzaG93U3VtbWFyeUluQ29sdW1uPzogc3RyaW5nO1xuICBzdW1tYXJ5Q29sdW1uPzogc3RyaW5nO1xuICBkaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbj86IGJvb2xlYW47XG4gIHRpdGxlPzogc3RyaW5nO1xuICB0b29sYmFyQWNjZW50QnV0dG9uTmFtZT86IHN0cmluZztcbiAgdG9vbGJhckl0ZW1zPzogYW55W107XG4gIGJ1dHRvbnNTaXplPzogJ3NtJyB8ICdtZCc7XG59XG5cbmNvbnN0IGdldFdpZGdldE5hbWUgPSAod2lkZ2V0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHdpZGdldFxuICAgIC5zbGljZSgnZHgnLmxlbmd0aClcbiAgICAudG9Mb3dlckNhc2UoKTtcbn07XG5cbmNvbnN0IGdldFNlbGVjdG9ycyA9ICh3aWRnZXQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBncmlkTmFtZSA9IGdldFdpZGdldE5hbWUod2lkZ2V0KTtcblxuICByZXR1cm4ge1xuICAgIHNlYXJjaFBhbmVsOiBgLmR4LSR7Z3JpZE5hbWV9LXNlYXJjaC1wYW5lbGAsXG4gICAgdG9vbGJhckVkaXRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tdG9vbGJhci1idXR0b24uZHgtZWRpdC1idXR0b25gLFxuICAgIHRvb2xiYXJFeHBvcnRCdXR0b246IGAuZHgtJHtncmlkTmFtZX0tZXhwb3J0LWJ1dHRvbiAuZHgtYnV0dG9uYCxcbiAgICBzZWxlY3RDaGVja0JveDogJy5keC1zZWxlY3QtY2hlY2tib3gnXG4gIH07XG59O1xuZXhwb3J0IGludGVyZmFjZSBJRGF0YUdyaWRTZXR0aW5ncyBleHRlbmRzIElHcmlkU2V0dGluZ3NCYXNlPERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnM+IHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVHJlZUxpc3RTZXR0aW5ncyBleHRlbmRzIElHcmlkU2V0dGluZ3NCYXNlPERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+IHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyaWREZWZhdWx0T3B0aW9ucyhzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MpIHtcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcyA9IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IGdldExlZ2FjeURlZmF1bHRPcHRpb25zKHNldHRpbmdzKSA6IGdldERlZmF1bHRPcHRpb25zKHNldHRpbmdzKTtcblxuICBpZiAoc2V0dGluZ3Muc3VtbWFyeUNvbHVtbiB8fCBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uKSB7XG4gICAgKHJlc3VsdCBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllcykuc3VtbWFyeSA9IHtcbiAgICAgIHRvdGFsSXRlbXM6IFt7XG4gICAgICAgIGNvbHVtbjogc2V0dGluZ3Muc3VtbWFyeUNvbHVtbiB8fCBzZXR0aW5ncy5zaG93U3VtbWFyeUluQ29sdW1uLFxuICAgICAgICBzaG93SW5Db2x1bW46IHNldHRpbmdzLnNob3dTdW1tYXJ5SW5Db2x1bW4gfHwgc2V0dGluZ3Muc3VtbWFyeUNvbHVtbixcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcbiAgICAgIH1dXG4gICAgfTtcbiAgfVxuXG4gIHJlc3VsdC5leHBvcnQgPSB7XG4gICAgZW5hYmxlZDogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSxcbiAgICBhbGxvd0V4cG9ydFNlbGVjdGVkRGF0YTogdHJ1ZSxcbiAgfTtcblxuICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xuICAgIHJlc3VsdC5ncm91cFBhbmVsID0geyB2aXNpYmxlOiB0cnVlIH07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZUxpc3REZWZhdWx0T3B0aW9ucyhzZXR0aW5nczogSVRyZWVMaXN0U2V0dGluZ3MpIHtcbiAgY29uc3QgcmVzdWx0OiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xuXG4gIHJlc3VsdC5zZWxlY3Rpb24gPSB7IG1vZGU6ICdub25lJyB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcbiAgICBjYWNoZUVuYWJsZWQ6IHRydWUsXG4gICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxuICAgIGZpbHRlclJvdzogeyB2aXNpYmxlOiB0cnVlLCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXG4gICAgaGVhZGVyRmlsdGVyOiB7IHZpc2libGU6IHRydWUgfSxcbiAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDgwIH0sXG4gICAgcGFnZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxuICAgIHNjcm9sbGluZzoge1xuICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxuICAgICAgcm93UmVuZGVyaW5nTW9kZTogJ3ZpcnR1YWwnXG4gICAgfSxcbiAgICBzZWFyY2hQYW5lbDoge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHdpZHRoOiAyNDAsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaC4uLidcbiAgICB9LFxuICAgIHNob3dSb3dMaW5lczogdHJ1ZSxcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcbiAgICBzZWxlY3Rpb246IHsgbW9kZTogJ211bHRpcGxlJyB9LFxuICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZVxuICB9IGFzIFQ7XG59XG5cbmZ1bmN0aW9uIGdldExlZ2FjeURlZmF1bHRPcHRpb25zXG4gIDxUIGV4dGVuZHMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyB8IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdE9wdGlvbnM+KHNldHRpbmdzOiBJRGF0YUdyaWRTZXR0aW5ncyB8IElUcmVlTGlzdFNldHRpbmdzKTogVCB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcbiAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxuICAgIGNvbHVtbkF1dG9XaWR0aDogdHJ1ZSxcbiAgICBzaG93Qm9yZGVyczogdHJ1ZSxcbiAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogdHJ1ZSwgYXBwbHlGaWx0ZXI6ICdvbkNsaWNrJyB9LFxuXG4gICAgc2VsZWN0aW9uOiB7IG1vZGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmc6IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgc2VhcmNoUGFuZWw6IHsgdmlzaWJsZTogdHJ1ZSB9LFxuICAgIGhlYWRlckZpbHRlcjogeyB2aXNpYmxlOiB0cnVlIH0sXG4gICAgc2Nyb2xsaW5nOiB7IG1vZGU6ICd2aXJ0dWFsJyB9LFxuICB9IGFzIFQ7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVEZWZhdWx0VG9vbGJhckJ1dHRvbnModG9vbGJhck9wdGlvbnM6IGFueSwgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWU/OiBzdHJpbmcpIHtcbiAgY29uc3QgZmluZFRvb2xiYXJJdGVtID0gKGl0ZW1zOiBhbnlbXSwgbmFtZTogc3RyaW5nKSA9PiBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xuXG4gIGlmICh0b29sYmFyT3B0aW9ucz8uaXRlbXMpIHtcbiAgICBjb25zdCB7IGl0ZW1zIH0gPSB0b29sYmFyT3B0aW9ucztcblxuICAgIGlmICh0b29sYmFyQWNjZW50QnV0dG9uTmFtZSkge1xuICAgICAgY29uc3QgYWNjZW50QnV0dG9uSXRlbSA9IGZpbmRUb29sYmFySXRlbShpdGVtcywgdG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpO1xuICAgICAgaWYgKGFjY2VudEJ1dHRvbkl0ZW0pIHtcbiAgICAgICAgYWNjZW50QnV0dG9uSXRlbS5vcHRpb25zLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZUJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdzYXZlQnV0dG9uJyk7XG4gICAgaWYgKHNhdmVCdXR0b25JdGVtKSB7XG4gICAgICBzYXZlQnV0dG9uSXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xuICAgICAgc2F2ZUJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1NhdmUnO1xuICAgIH1cblxuICAgIGNvbnN0IHJldmVydEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZXZlcnRCdXR0b24nKTtcbiAgICBpZiAocmV2ZXJ0QnV0dG9uSXRlbSkge1xuICAgICAgcmV2ZXJ0QnV0dG9uSXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xuICAgICAgcmV2ZXJ0QnV0dG9uSXRlbS5vcHRpb25zLnRleHQgPSAnRGlzY2FyZCc7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaEJ1dHRvbkl0ZW0gPSBmaW5kVG9vbGJhckl0ZW0oaXRlbXMsICdyZWZyZXNoJyk7XG4gICAgaWYgKHJlZnJlc2hCdXR0b25JdGVtKSB7XG4gICAgICByZWZyZXNoQnV0dG9uSXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy50ZXh0ID0gJ1JlZnJlc2gnO1xuICAgICAgcmVmcmVzaEJ1dHRvbkl0ZW0ub3B0aW9ucy5oaW50ID0gJ1JlbG9hZCBEYXRhJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VtbWFyeUNvbHVtbklmUmVxdWlyZWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XG4gIGNvbnN0IHRvdGFsSXRlbXMgPSBncmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJykgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ107XG4gIGNvbnN0IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID0gdG90YWxJdGVtcz8uZmlsdGVyKChpKSA9PiBpLnN1bW1hcnlUeXBlID09PSAnY291bnQnKVswXT8uY29sdW1uO1xuXG4gIGxldCBzdW1tYXJ5Q29sdW1uSW5kZXggPSBjdXJyZW50U3VtbWFyeUNvbHVtbiAmJiBncmlkLmdldFZpc2libGVDb2x1bW5zKCkuZmluZEluZGV4KChlbCkgPT4gZWwuZGF0YUZpZWxkID09PSBjdXJyZW50U3VtbWFyeUNvbHVtbik7XG4gIGlmICghc3VtbWFyeUNvbHVtbkluZGV4KSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicpO1xuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubW9kZSAhPT0gJ25vbmUnO1xuICAgIHN1bW1hcnlDb2x1bW5JbmRleCA9IGhhc1NlbGVjdGlvbiA/IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiAhIWVsLmRhdGFGaWVsZCkgOiAwO1xuICB9XG5cbiAgY29uc3QgbmV3U3VtbWFyeUNvbHVtbiA9IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKVtzdW1tYXJ5Q29sdW1uSW5kZXhdPy5kYXRhRmllbGQ7XG5cbiAgaWYgKG5ld1N1bW1hcnlDb2x1bW4gJiYgY3VycmVudFN1bW1hcnlDb2x1bW4gIT09IG5ld1N1bW1hcnlDb2x1bW4pIHtcbiAgICBncmlkLm9wdGlvbignc3VtbWFyeScsIHtcbiAgICAgIHRvdGFsSXRlbXM6IFt7XG4gICAgICAgIGNvbHVtbjogZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZCxcbiAgICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcbiAgICAgIH1dXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhhbmRsZXJzPFQgZXh0ZW5kcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zIHwgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0T3B0aW9ucz4oXG4gIHdpZGdldDogJ2R4RGF0YUdyaWQnIHwgJ2R4VHJlZUxpc3QnLFxuICBzZXR0aW5nczogSURhdGFHcmlkU2V0dGluZ3MgfCBJVHJlZUxpc3RTZXR0aW5nc1xuKTogVCB7XG4gIGNvbnN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycyh3aWRnZXQpO1xuICBsZXQgaXNHcmlkSW5pdGlhbGl6YWVkID0gZmFsc2U7XG5cbiAgcmV0dXJuIHtcbiAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgZS5jZWxsRWxlbWVudC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uQ2VsbFByZXBhcmVkKSB7XG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ2VsbFByZXBhcmVkKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhR3JpZCA9IGUuY29tcG9uZW50O1xuXG4gICAgICBpZiAoIXNldHRpbmdzLmRpc2FibGVTdW1tYXJ5Q29sdW1uRGV0ZWN0aW9uKSB7XG4gICAgICAgIHVwZGF0ZVN1bW1hcnlDb2x1bW5JZlJlcXVpcmVkKGRhdGFHcmlkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0dyaWRJbml0aWFsaXphZWQpIHtcbiAgICAgICAgaXNHcmlkSW5pdGlhbGl6YWVkID0gdHJ1ZTtcblxuICAgICAgICAvL3RvIGZpeCBhdXRvc2Nyb2xsXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSBkYXRhR3JpZC5nZXRTY3JvbGxhYmxlKCk7XG5cbiAgICAgICAgICBpZiAoc2Nyb2xsYWJsZSkge1xuICAgICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7IHRvcDogMCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFHcmlkLmNvbHVtbkNvdW50KCk7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZGF0YVR5cGUnKTtcblxuICAgICAgICBpZiAoc2V0dGluZ3Muc2V0RGVmYXVsdENvbHVtbldpZHRoIHx8IHNldHRpbmdzLnNldERlZmF1bHRDb2x1bW5XaWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnNDVweCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICd3aWR0aCcsICcxMzVweCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgICBkYXRhR3JpZC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE0MHB4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScgfHwgZGF0YVR5cGUgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdhbGlnbm1lbnQnLCAncmlnaHQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgZGF0YUdyaWQuY29sdW1uT3B0aW9uKGksICdmb3JtYXQnLCAnZGQgTU1NIHl5eXknKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGRhdGFHcmlkLmNvbHVtbk9wdGlvbihpLCAnZm9ybWF0JywgJ0hIOm1tLCBkZCBNTU0geXl5eScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbmZpZy5pc0xlZ2FjeVJlbmRlcikge1xuICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRXaWRnZXRTbWFsbFNpemUoJChzZWxlY3RvcnMuc2VhcmNoUGFuZWwpLmR4VGV4dEJveCgnaW5zdGFuY2UnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgVGhlbWVIZWxwZXIuc2V0V2lkZ2V0TWlkZGxlU2l6ZSgkKHNlbGVjdG9ycy5zZWFyY2hQYW5lbCkuZHhUZXh0Qm94KCdpbnN0YW5jZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRoZW1lSGVscGVyLnNldEVsZW1lbnRTbWFsbFNpemUoZS5jb21wb25lbnQuZWxlbWVudCgpLmZpbmQoc2VsZWN0b3JzLnNlbGVjdENoZWNrQm94KSk7XG5cbiAgICAgICAgaWYgKCQoc2VsZWN0b3JzLnRvb2xiYXJFeHBvcnRCdXR0b24pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScpIHtcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldFNtYWxsU2l6ZSgkKHNlbGVjdG9ycy50b29sYmFyRXhwb3J0QnV0dG9uKS5keEJ1dHRvbignaW5zdGFuY2UnKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFRoZW1lSGVscGVyLnNldFdpZGdldE1pZGRsZVNpemUoJChzZWxlY3RvcnMudG9vbGJhckV4cG9ydEJ1dHRvbikuZHhCdXR0b24oJ2luc3RhbmNlJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0dGluZ3Mub3B0aW9ucz8ub25Db250ZW50UmVhZHkpIHtcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vbkNvbnRlbnRSZWFkeShlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uVG9vbGJhclByZXBhcmluZzogKGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdG9vbGJhck9wdGlvbnMgPSB7fVxuICAgICAgfSA9IGU7XG5cbiAgICAgIGNvbnN0IGRhdGFHcmlkID0gZS5jb21wb25lbnQ7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXRlbXMgPSBbXVxuICAgICAgfSA9IHRvb2xiYXJPcHRpb25zO1xuXG4gICAgICBpZiAoY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy50aXRsZSkge1xuICAgICAgICAgIGUudG9vbGJhck9wdGlvbnMuaXRlbXMudW5zaGlmdCh7XG4gICAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXG4gICAgICAgICAgICB0ZW1wbGF0ZSgpIHtcbiAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRWwgPSAkKCc8aDIgLz4nKS5hZGRDbGFzcygnZ3JpZC1oZWFkZXInKS50ZXh0KHNldHRpbmdzLnRpdGxlKTtcbiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhlYWRlckRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJFbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicgJiYgaXRlbS5uYW1lID09PSAnYXBwbHlGaWx0ZXJCdXR0b24nKSB7XG4gICAgICAgICAgICBpdGVtLm9wdGlvbnMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2V0dGluZ3MudGl0bGUpIHtcbiAgICAgICAgICBpdGVtcy51bnNoaWZ0KFRvb2xiYXJIZWxwZXIuZ2V0VG9vbGJhclRpdGxlVGVtcGxhdGVJdGVtKHNldHRpbmdzLnRpdGxlLCBzZXR0aW5ncy5oZWFkZXJEZXNjcmlwdGlvbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS53aWRnZXQgPT09ICdkeEJ1dHRvbicpIHtcbiAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdhcHBseUZpbHRlckJ1dHRvbicpIHtcbiAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLnZpc2libGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGljb25TaXplID0gc2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyAxNiA6IDI0O1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0ubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlICdhZGRSb3dCdXR0b24nOlxuICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5pY29uID0gVGhlbWVIZWxwZXIuZ2V0SWNvbkNsYXNzKCdwbHVzJywgZmFsc2UsIGljb25TaXplKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlICdzYXZlQnV0dG9uJzpcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IFRoZW1lSGVscGVyLmdldEljb25DbGFzcygnc2F2ZScsIGZhbHNlLCBpY29uU2l6ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAncmV2ZXJ0QnV0dG9uJzpcbiAgICAgICAgICAgICAgICBpdGVtLm9wdGlvbnMuaWNvbiA9IFRoZW1lSGVscGVyLmdldEljb25DbGFzcygnY2xvc2UnLCBmYWxzZSwgaWNvblNpemUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zLmljb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXRlbS5vcHRpb25zLmVsZW1lbnRBdHRyKSB7XG4gICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucy5lbGVtZW50QXR0ciA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9wdGlvbnMuZWxlbWVudEF0dHIuY2xhc3MgPSBzZXR0aW5ncy5idXR0b25zU2l6ZSA9PT0gJ3NtJyA/IFRIRU1FX0NMQVNTRVMuc20gOiBUSEVNRV9DTEFTU0VTLm1kO1xuICAgICAgICAgICAgaXRlbS5zaG93VGV4dCA9ICdhbHdheXMnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlcGFyZURlZmF1bHRUb29sYmFyQnV0dG9ucyh0b29sYmFyT3B0aW9ucywgc2V0dGluZ3MudG9vbGJhckFjY2VudEJ1dHRvbk5hbWUpO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy50b29sYmFySXRlbXMpIHtcbiAgICAgICAgICBpdGVtcy5wdXNoKC4uLnNldHRpbmdzLnRvb2xiYXJJdGVtcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0b29sYmFyT3B0aW9ucy5lbGVtZW50QXR0ciA9IHtcbiAgICAgICAgICBjbGFzczogJ2lzb3otdG9vbGJhci1oZWFkZXInXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhdmVCdXR0b25JbmRleCA9IGUudG9vbGJhck9wdGlvbnMuaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdzYXZlQnV0dG9uJyk7XG4gICAgICBjb25zdCBzZWFyY2hQYW5lbEluZGV4ID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gJ3NlYXJjaFBhbmVsJyk7XG4gICAgICBsZXQgaW5kZXhGb3JVcGRhdGUgPSAtMTtcblxuICAgICAgaWYgKHNhdmVCdXR0b25JbmRleCA+IC0xKSB7XG4gICAgICAgIGluZGV4Rm9yVXBkYXRlID0gc2F2ZUJ1dHRvbkluZGV4O1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hQYW5lbEluZGV4ID4gLTEpIHtcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBzZWFyY2hQYW5lbEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXhGb3JVcGRhdGUgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy5zcGxpY2UoaW5kZXhGb3JVcGRhdGUsIDAsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcbiAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXG4gICAgICAgICAgbmFtZTogJ3JlZnJlc2gnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGljb246ICdyZWZyZXNoJyxcbiAgICAgICAgICAgIGhlaWdodDogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gMzAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogYGR4LWRhdGFncmlkLXRvb2xiYXItYnV0dG9uICR7c2V0dGluZ3MuYnV0dG9uc1NpemUgPT09ICdzbScgPyBUSEVNRV9DTEFTU0VTLnNtIDogVEhFTUVfQ0xBU1NFUy5tZH1gIH0sXG4gICAgICAgICAgICBzdHlsaW5nTW9kZTogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gJ3RleHQnIDogJ2NvbnRhaW5lZCcsXG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBkYXRhR3JpZD8ucmVmcmVzaCgpLFxuICAgICAgICAgICAgb25Db250ZW50UmVhZHk6IGNvbmZpZy5pc0xlZ2FjeVJlbmRlciA/IChjb250ZW50UmVhZHlFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBjb250ZW50UmVhZHlFdmVudC5lbGVtZW50LmZpbmQoJy5keC1idXR0b24tY29udGVudCcpLmNzcyh7XG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogNixcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA2XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZFxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbi5Qcm9wZXJ0aWVzXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vblRvb2xiYXJQcmVwYXJpbmcpIHtcbiAgICAgICAgc2V0dGluZ3Mub3B0aW9ucy5vblRvb2xiYXJQcmVwYXJpbmcoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkVkaXRvclByZXBhcmluZzogKGUpID0+IHtcbiAgICAgIGlmICghY29uZmlnLmlzTGVnYWN5UmVuZGVyKSB7XG4gICAgICAgIGUuZWRpdG9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAuLi5lLmVkaXRvck9wdGlvbnMsXG4gICAgICAgICAgZWxlbWVudEF0dHI6IHtcbiAgICAgICAgICAgIGNsYXNzOiBUSEVNRV9DTEFTU0VTLm1kXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChlLmVkaXRvck5hbWUgPT09ICdkeFNlbGVjdEJveCcpIHtcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZHJvcERvd25PcHRpb25zID0ge1xuICAgICAgICAgICAgLi4uZS5lZGl0b3JPcHRpb25zLmRyb3BEb3duT3B0aW9ucyxcbiAgICAgICAgICAgIG9uU2hvd2luZzogKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB3aWRnZXROYW1lID0gZ2V0V2lkZ2V0TmFtZSh3aWRnZXQpO1xuICAgICAgICAgICAgICBhcmdzLmNvbXBvbmVudC5fJHBvcHVwQ29udGVudC5hZGRDbGFzcyhgaXNvei0ke3dpZGdldE5hbWV9LXNlbGVjdGJveC1wb3B1cGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5lZGl0b3JOYW1lID09PSAnZHhDaGVja0JveCcpIHtcbiAgICAgICAgICBUaGVtZUhlbHBlci5zZXRFbGVtZW50U21hbGxTaXplKGUuZWRpdG9yRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChlLnBhcmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnZmlsdGVyUm93JzpcbiAgICAgICAgICBjb25zdCBhcHBseUZpbHRlcjogRGV2RXhwcmVzcy51aS5keFRleHRFZGl0b3IuUHJvcGVydGllc1snb25FbnRlcktleSddID0gKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGUuZWxlbWVudCAmJiBlLmVsZW1lbnQuZmluZCgnLmR4LWFwcGx5LWJ1dHRvbicpLnRyaWdnZXIoJ2R4Y2xpY2snKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uRW50ZXJLZXkgPSBhcHBseUZpbHRlcjtcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25Gb2N1c091dCA9IGFwcGx5RmlsdGVyO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VhcmNoUGFuZWwnOlxuICAgICAgICAgIGNvbnN0IGFwcGx5U2VhcmNoOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9ICgpID0+IHsgfTtcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHlTZWFyY2g7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnM/Lm9uRWRpdG9yUHJlcGFyaW5nKSB7XG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnMub25FZGl0b3JQcmVwYXJpbmcoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbnRleHRNZW51UHJlcGFyaW5nOiAoZSkgPT4ge1xuICAgICAgaWYgKCFjb25maWcuaXNMZWdhY3lSZW5kZXIpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSAnY29udGVudCcgJiYgISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkge1xuICAgICAgICAgIGlmICghZS5pdGVtcykge1xuICAgICAgICAgICAgZS5pdGVtcyA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGUuaXRlbXMucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IGFsbCBkYXRhJyxcbiAgICAgICAgICAgIG9uSXRlbUNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmV4cG9ydFRvRXhjZWwoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGljb246ICd4bHN4ZmlsZSdcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhDb250ZXh0TWVudUl0ZW0pO1xuXG4gICAgICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnMuc2VsZWN0aW9uPy5tb2RlICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IGUuY29tcG9uZW50LmdldFNlbGVjdGVkUm93S2V5cygpO1xuXG4gICAgICAgICAgICBlLml0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0OiAnRXhwb3J0IHNlbGVjdGVkIHJvd3MnLFxuICAgICAgICAgICAgICBvbkl0ZW1DbGljazogKCkgPT4gZS5jb21wb25lbnQuZXhwb3J0VG9FeGNlbCh0cnVlKSxcbiAgICAgICAgICAgICAgaWNvbjogJ2V4cG9ydHNlbGVjdGVkJyxcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFzZWxlY3RlZFJvd3MgfHwgIXNlbGVjdGVkUm93cy5sZW5ndGhcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51SXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXR0aW5ncy5vcHRpb25zPy5vbkNvbnRleHRNZW51UHJlcGFyaW5nKSB7XG4gICAgICAgIHNldHRpbmdzLm9wdGlvbnM/Lm9uQ29udGV4dE1lbnVQcmVwYXJpbmcoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkV4cG9ydGluZzogISFzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSA/IGNyZWF0ZUdyaWRFeHBvcnRGbihzZXR0aW5ncy5leHBvcnRGaWxlTmFtZSkgOiB2b2lkIDAsXG4gIH0gYXMgVDtcbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBjcmVhdGVEYXRhR3JpZCwgY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkIH0gZnJvbSAnLi9DcmVhdGVGdWxsU2NyZWVuR3JpZCc7XG5pbXBvcnQgeyBnZXRHcmlkRGVmYXVsdE9wdGlvbnMsIGdldEhhbmRsZXJzLCBJRGF0YUdyaWRTZXR0aW5ncyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWw6IEpRdWVyeSwgc2V0dGluZ3M6IElEYXRhR3JpZFNldHRpbmdzKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRHcmlkRGVmYXVsdE9wdGlvbnMoc2V0dGluZ3MpO1xuICBsZXQgbWVyZ2VkT3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgc2V0dGluZ3Mub3B0aW9ucyk7XG4gIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnM8RGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucz4oJ2R4RGF0YUdyaWQnLCAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9KSk7XG5cbiAgbWVyZ2VkT3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBtZXJnZWRPcHRpb25zLCBoYW5kbGVycyk7XG5cbiAgaWYgKHNldHRpbmdzLmlzRnVsbFNjcmVlbiB8fCBzZXR0aW5ncy5pc0Z1bGxTY3JlZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQoZWwsIG1lcmdlZE9wdGlvbnMsIHNldHRpbmdzLmluUGFuZWxHcmlkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRGF0YUdyaWQoZWwsIG1lcmdlZE9wdGlvbnMpO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyB9IGZyb20gJy4vQ3JlYXRlRnVsbFNjcmVlbkdyaWQnO1xuaW1wb3J0IGRlZmF1bHRHcmlkIGZyb20gJy4vRGVmYXVsdEdyaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcbiAgaWQ6IHN0cmluZywgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZ1xuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcbiAgcmV0dXJuIGRlZmF1bHRHcmlkKCQoYCMke2lkfWApLCB7XG4gICAgb3B0aW9uczogZGF0YUdyaWRPcHRpb25zLFxuICAgIGV4cG9ydEZpbGVOYW1lOiBhZGRpdGlvbmFsT3B0aW9ucy5leHBvcnRGaWxlTmFtZSxcbiAgICBpblBhbmVsR3JpZDogYWRkaXRpb25hbE9wdGlvbnMuaW5QYW5lbEdyaWQsXG4gICAgc2hvd1N1bW1hcnlJbkNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc2hvd1N1bW1hcnlJbkNvbHVtbixcbiAgICBzdW1tYXJ5Q29sdW1uOiBhZGRpdGlvbmFsT3B0aW9ucy5zdW1tYXJ5Q29sdW1uLFxuICAgIGhlYWRlckRlc2NyaXB0aW9uLFxuICAgIHRpdGxlOiBoZWFkZXJUZXh0XG4gIH0pO1xufVxuIiwgIlx1RkVGRmltcG9ydCB7IElUcmVlTGlzdFNldHRpbmdzLCBnZXRUcmVlTGlzdERlZmF1bHRPcHRpb25zLCBnZXRIYW5kbGVycyB9IGZyb20gJy4vRGVmYXVsdEdyaWRCYXNlJztcbmltcG9ydCB7IGNyZWF0ZUZ1bGxTY3JlZW5UcmVlTGlzdCB9IGZyb20gJy4vQ3JlYXRlRnVsbFNjcmVlbkdyaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihcbiAgaWQ6IHN0cmluZyB8IEpRdWVyeSxcbiAgc2V0dGluZ3M6IElUcmVlTGlzdFNldHRpbmdzID0ge31cbik6IERldkV4cHJlc3MudWkuZHhUcmVlTGlzdCB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0VHJlZUxpc3REZWZhdWx0T3B0aW9ucyhzZXR0aW5ncyk7XG4gIGxldCBtZXJnZWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBzZXR0aW5ncy5vcHRpb25zKTtcbiAgY29uc3QgaGFuZGxlcnMgPSBnZXRIYW5kbGVyczxEZXZFeHByZXNzLnVpLmR4VHJlZUxpc3RPcHRpb25zPignZHhUcmVlTGlzdCcsICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgeyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0pKTtcblxuICBtZXJnZWRPcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG1lcmdlZE9wdGlvbnMsIGhhbmRsZXJzKTtcblxuICByZXR1cm4gY3JlYXRlRnVsbFNjcmVlblRyZWVMaXN0KGlkLCBtZXJnZWRPcHRpb25zLCBzZXR0aW5ncy5pblBhbmVsR3JpZCk7XG59XG4iLCAiaW1wb3J0IENyb3BwciBmcm9tICdjcm9wcHInO1xuaW1wb3J0IHsgY3JlYXRlRGlhbG9nIH0gZnJvbSAnLi4vUG9wdXAnO1xuXG5pbXBvcnQgSW5pdGlhbGl6ZWRFdmVudEluZm8gPSBEZXZFeHByZXNzLmV2ZW50cy5Jbml0aWFsaXplZEV2ZW50SW5mbztcblxuY29uc3QgYXZhdGFyU2l6ZSA9IHtcbiAgaGVpZ2h0OiAzMDAsXG4gIHdpZHRoOiAzMDAsXG59XG5cbmZ1bmN0aW9uIHNldEltYWdlVG9QcmV2aWV3IChwcmV2aWV3OiBKUXVlcnksIGJhc2U2NEltZzogc3RyaW5nIHwgbnVsbCkge1xuICBwcmV2aWV3LmF0dHIoJ3NyYycsIGJhc2U2NEltZyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRNYXJrdXAgKGltYWdlQmFzZTY0OiBzdHJpbmcgfCBudWxsKSB7XG4gIGNvbnN0ICRhdmF0YXJQb3B1cENvbnRlbnQgPSAkKCc8ZGl2PicpXG4gICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX2Ryb3B6b25lJyk7XG4gIC8vLm9uKCdkcm9wJyAsIGV2ID0+IGV2LmRhdGFUcmFuc2Zlci5maWxlcylcblxuICBjb25zdCAkY3JvcHBlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcbiAgICAuYWRkQ2xhc3MoJ2F2YXRhci1wb3B1cF9fY3JvcC1jb250YWluZXInKVxuICAgIC5hcHBlbmRUbygkYXZhdGFyUG9wdXBDb250ZW50KTtcblxuICBjb25zdCAkY3JvcEltYWdlID0gJCgnPGltZyAvPicpLnByZXBlbmRUbygkY3JvcHBlckNvbnRhaW5lcik7XG5cbiAgc2V0SW1hZ2VUb1ByZXZpZXcoJGNyb3BJbWFnZSwgaW1hZ2VCYXNlNjQpO1xuXG4gIGNvbnN0IGNyb3BwZXIgPSBuZXcgQ3JvcHByKCRjcm9wSW1hZ2VbMF0sIHtcbiAgICBhc3BlY3RSYXRpbzogMSxcbiAgICBzdGFydFNpemU6IFs5MCwgOTBdLFxuICB9KTtcblxuXG4gIHJldHVybiB7XG4gICAgJGNvbnRlbnQ6ICRhdmF0YXJQb3B1cENvbnRlbnQsXG4gICAgY3JvcHBlclxuICB9O1xufVxuXG5mdW5jdGlvbiBzaG93UG9wdXAgKCRjb250ZW50OiBKUXVlcnksIGNyb3BwZXI6IENyb3Bwciwgb25BdmF0YXJVcGRhdGVkOiAocGhvdG9CYXNlNjQ6IHN0cmluZykgPT4gdm9pZCkge1xuICBjcmVhdGVEaWFsb2coXG4gICAge1xuICAgICAgdGl0bGU6ICdVcGRhdGUgcHJvZmlsZSBwaWN0dXJlJyxcbiAgICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcbiAgICAgIHJlc2l6ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICBtYXhXaWR0aDogMTAyNCxcbiAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlOiBJbml0aWFsaXplZEV2ZW50SW5mbzxEZXZFeHByZXNzLnVpLmR4UG9wdXA+KSA9PiB7XG4gICAgICAgIGUuY29tcG9uZW50ICYmIGUuY29tcG9uZW50Lm9wdGlvbignZnVsbFNjcmVlbicsIHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwMjQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgJGNvbnRlbnQsXG4gICAge1xuICAgICAgdGV4dDogJ1VwZGF0ZScsXG4gICAgICBvbkNsaWNrOiAoY2xvc2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JvcE9wdGlvbnMgPSBjcm9wcGVyLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0ICRjYW52YXM6IEpRdWVyeTxIVE1MQ2FudmFzRWxlbWVudD4gPSAkKCc8Y2FudmFzPicpLmF0dHIoJ2hlaWdodCcsIGF2YXRhclNpemUuaGVpZ2h0KS5hdHRyKCd3aWR0aCcsIGF2YXRhclNpemUud2lkdGgpIGFzIEpRdWVyeTxIVE1MQ2FudmFzRWxlbWVudD47XG4gICAgICAgIGNvbnN0IGN0eCA9ICgkY2FudmFzWzBdIGFzIGFueSkuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgY29uc3QgJGltYWdlID0gJGNvbnRlbnQuZmluZCgnaW1nLmNyb3Bwci1pbWFnZScpWzBdO1xuXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoJGltYWdlLCBjcm9wT3B0aW9ucy54LCBjcm9wT3B0aW9ucy55LCBjcm9wT3B0aW9ucy53aWR0aCwgY3JvcE9wdGlvbnMuaGVpZ2h0LCAwLCAwLCBhdmF0YXJTaXplLndpZHRoLCBhdmF0YXJTaXplLmhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgY3JvcHBlZCA9ICRjYW52YXNbMF0udG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgMC45KTtcblxuICAgICAgICBvbkF2YXRhclVwZGF0ZWQoY3JvcHBlZCk7XG4gICAgICAgIGNsb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgIG9uQ2xpY2s6IChjbG9zZSkgPT4gY2xvc2UoKVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdyAoaW1hZ2VCYXNlNjQ6IHN0cmluZyB8IG51bGwsIG9uQXZhdGFyVXBkYXRlZDogKHBob3RvQmFzZTY0OiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgY29uc3QgY29udGVudCA9IGNyZWF0ZUNvbnRlbnRNYXJrdXAoaW1hZ2VCYXNlNjQpO1xuXG4gIHNob3dQb3B1cChjb250ZW50LiRjb250ZW50LCBjb250ZW50LmNyb3BwZXIsIG9uQXZhdGFyVXBkYXRlZCk7XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdldEJhc2U2NCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmlsZVJlYWRlci5yZXN1bHQ7XG4gICAgICAgIHJlc29sdmUodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyByZXN1bHQgOiBudWxsKTtcbiAgICAgIH07XG5cbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59O1xuIiwgImltcG9ydCB7SVJlbmRlcmVkfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL0NvcmUnO1xuaW1wb3J0IHtEZXZFeHByZXNzRXZlbnRBcmdzfSBmcm9tICcuLi8uLi9VdGlscy9EZXZFeHByZXNzRXZlbnRBcmdzJztcbmltcG9ydCB7IHNob3cgfSBmcm9tICcuLi8uLi9XaWRnZXRzL0ltYWdlQ3JvcERpYWxvZyc7XG5pbXBvcnQge2dldEJhc2U2NH0gZnJvbSAnLi4vLi4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cvSGVscGVycyc7XG5pbXBvcnQgZHhUZXh0Qm94T3B0aW9ucyA9IERldkV4cHJlc3MudWkuZHhUZXh0Qm94T3B0aW9ucztcbmltcG9ydCBkeFRleHRCb3ggPSBEZXZFeHByZXNzLnVpLmR4VGV4dEJveDtcbmltcG9ydCBJc3pvbGVhVUkgZnJvbSAnLi4vLi4vaW5kZXgnO1xuXG5jb25zdCBtYXhGaWxlTWJTaXplID0gMTA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjY291bnRTZXR0aW5nc0RhdGEge1xuICBVc2VyTmFtZTogc3RyaW5nO1xuICBGaXJzdE5hbWU6IHN0cmluZztcbiAgTGFzdE5hbWU6IHN0cmluZztcbiAgUGhvbmVOdW1iZXI6IHN0cmluZztcbiAgRW1haWw6IHN0cmluZztcbiAgT2xkUGFzc3dvcmQ6IHN0cmluZztcbiAgTmV3UGFzc3dvcmQ6IHN0cmluZztcbiAgTmV3UGFzc3dvcmRSZXBlYXQ6IHN0cmluZztcbiAgQXZhdGFyOiBzdHJpbmc7XG4gIEhhc0NoYW5nZXM6IGJvb2xlYW47XG4gIEVycm9yTWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIHtcbiAgSWQ6IHN0cmluZztcbiAgVXNlck5hbWU6IHN0cmluZztcbiAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gIExhc3ROYW1lOiBzdHJpbmc7XG4gIFVzZXJBdmF0YXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEFjY291bnRTZXR0aW5nc1BhZ2UgaW1wbGVtZW50cyBJUmVuZGVyZWQge1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VySW5mbzogSVVzZXIgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50U2V0dGluZ3NEYXRhOiBJQWNjb3VudFNldHRpbmdzRGF0YSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1BY3Rpb246IHN0cmluZztcbiAgcHJpdmF0ZSBhdmF0YXJVcGxvYWRlcjogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhY2NvdW50U2V0dGluZ3NGb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybSB8IHVuZGVmaW5lZDtcblxuICAvLyBlbGVtZW50c1xuICBwcml2YXRlIHJlYWRvbmx5IF8kcm9vdEVsZW1lbnQ6IEpRdWVyeTxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgJGNvbnRhaW5lcjogSlF1ZXJ5PEhUTUxEaXZFbGVtZW50PixcbiAgICBmb3JtQWN0aW9uOiBzdHJpbmcsXG4gICAgYWNjb3VudFNldHRpbmdzRGF0YTogSUFjY291bnRTZXR0aW5nc0RhdGEgfCB1bmRlZmluZWQsXG4gICAgdXNlckluZm86IElVc2VyIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRGF0YSA9IGFjY291bnRTZXR0aW5nc0RhdGE7XG4gICAgdGhpcy5jdXJyZW50VXNlckluZm8gPSB1c2VySW5mbztcbiAgICB0aGlzLl8kcm9vdEVsZW1lbnQgPSAkY29udGFpbmVyO1xuICAgIHRoaXMuZm9ybUFjdGlvbiA9IGZvcm1BY3Rpb247XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIHRoaXMucmVuZGVyVXBsb2FkZXIodGhpcy4kcm9vdEVsZW1lbnQpO1xuICAgIHRoaXMucmVuZGVyQWNjb3VudFNldHRpbmdzRm9ybSh0aGlzLiRyb290RWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldCAkcm9vdEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl8kcm9vdEVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJvb3QgZWxlbWVudCBpcyB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fJHJvb3RFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcbiAgICB0aGlzLmF2YXRhclVwbG9hZGVyID0gJCgnPGRpdj4nKVxuICAgICAgLmFkZENsYXNzKCdhdmF0YXItcG9wdXBfX3VwbG9hZGVyJylcbiAgICAgIC5keEZpbGVVcGxvYWRlcih7XG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgdXBsb2FkTW9kZTogJ3VzZUZvcm0nLFxuICAgICAgICBhY2NlcHQ6ICdpbWFnZS8qJyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG1heEZpbGVTaXplOiBtYXhGaWxlTWJTaXplICogMTAwMDAwMCxcblxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGU6IERldkV4cHJlc3NFdmVudEFyZ3M8RGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlck9wdGlvbnMsICdvblZhbHVlQ2hhbmdlZCc+KSA9PiB7XG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaWxlID0gZS52YWx1ZVswXTtcbiAgICAgICAgICBjb25zdCBtYXhTaXplID0gZS5jb21wb25lbnQub3B0aW9uKCdtYXhGaWxlU2l6ZScpIHx8IG1heEZpbGVNYlNpemU7XG5cbiAgICAgICAgICBpZiAoIWZpbGUgfHwgZmlsZS5zaXplID4gbWF4U2l6ZSkge1xuICAgICAgICAgICAgRGV2RXhwcmVzcy51aS5ub3RpZnkoYEZpbGUgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7bWF4RmlsZU1iU2l6ZX0gTUIuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlYCwgJ2Vycm9yJywgNTAwMCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBnZXRCYXNlNjQoZmlsZSlcbiAgICAgICAgICAgIC50aGVuKChpbWFnZUJhc2U2NCkgPT4ge1xuICAgICAgICAgICAgICBzaG93KGltYWdlQmFzZTY0LCAobmV3SW1nU291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50U2V0dGluZ3NGb3JtPy51cGRhdGVEYXRhKCdBdmF0YXInLCBuZXdJbWdTb3VyY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8ucmVwYWludCgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiBEZXZFeHByZXNzLnVpLm5vdGlmeShlcnJvciwgJ2Vycm9yJywgMzAwMCkpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBlbmRUbygkY29udGFpbmVyKVxuICAgICAgLmR4RmlsZVVwbG9hZGVyKCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBY2NvdW50U2V0dGluZ3NGb3JtKCRjb250YWluZXI6IEpRdWVyeSkge1xuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0gPSAkKCc8Zm9ybSAvPicpXG4gICAgICAuYXR0cignYWN0aW9uJywgdGhpcy5mb3JtQWN0aW9uKVxuICAgICAgLmF0dHIoJ21ldGhvZCcsICdwb3N0JylcbiAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fZm9ybScpXG4gICAgICAuYWRkQ2xhc3MoJ2Zvcm0tY29udGVudCcpXG4gICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcilcbiAgICAgIC5keEZvcm0odGhpcy5nZXRGb3JtT3B0aW9ucygpKVxuICAgICAgLmR4Rm9ybSgnaW5zdGFuY2UnKTtcblxuICAgIGlmICh0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gSXN6b2xlYVVJLndpZGdldHMubm90aWZ5KCdDaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZCcsIHRydWUpLCA1MDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybU9wdGlvbnMoKSA6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGEsXG4gICAgICBtaW5Db2xXaWR0aDogMjAwLFxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXG4gICAgICBhbGlnbkl0ZW1MYWJlbHM6IHRydWUsXG4gICAgICBzaG93VmFsaWRhdGlvblN1bW1hcnk6IHRydWUsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaXRlbVR5cGU6ICdncm91cCcsXG4gICAgICAgICAgY29sQ291bnQ6IDE2LFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbFNwYW46IDYsXG4gICAgICAgICAgICAgIGNhcHRpb246ICdQcm9maWxlIFBpY3R1cmUnLFxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdBdmF0YXInLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGF2YXRhclZpZXdDb250YWluZXIgPSAkKCc8ZGl2PicpXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkYXZhdGFyQ29udGFpbmVyID0gJCgnPGRpdj4nKVxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgJCgnPGRpdj4nKVxuICAgICAgICAgICAgICAgICAgICAgIC5hZGQoJGF2YXRhclZpZXdDb250YWluZXIpXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxkaXY+JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItYnV0dG9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmR4QnV0dG9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAncGhvdG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVcGxvYWQgbmV3IGltYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5hdmF0YXJVcGxvYWRlciAmJiB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZGlhbG9nVHJpZ2dlcicsIGUuZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICApLmFwcGVuZFRvKCRhdmF0YXJDb250YWluZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2YXRhckJhc2U2NCA9IGRhdGEuZWRpdG9yT3B0aW9ucy52YWx1ZSB8fCB0aGlzLmN1cnJlbnRVc2VySW5mbz8uVXNlckF2YXRhcjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXZhdGFyQmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgJCgnPGltZz4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdhY2NvdW50LXNldHRpbmdzX19hdmF0YXItdmlldycpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgYXZhdGFyQmFzZTY0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dD4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2FjY291bnQtc2V0dGluZ3NfX2F2YXRhci1pbnB1dCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdBdmF0YXInKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGF2YXRhckNvbnRhaW5lcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChkYXRhLmVkaXRvck9wdGlvbnMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAkKCc8aT4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKFsnYWNjb3VudC1zZXR0aW5nc19fYXZhdGFyLXZpZXctZGVmYXVsdCcsICdmYXMnLCAnZmEtdXNlciddKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRhdmF0YXJWaWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuYXZhdGFyVXBsb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignZHJvcFpvbmUnLCAkYXZhdGFyQ29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUVudGVyJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5hZGRDbGFzcygnZHJvcCcpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmF2YXRhclVwbG9hZGVyLm9wdGlvbignb25Ecm9wWm9uZUxlYXZlJywgKCkgPT4gJGF2YXRhckNvbnRhaW5lci5yZW1vdmVDbGFzcygnZHJvcCcpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXZhdGFyQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXRlbVR5cGU6ICdlbXB0eScsXG4gICAgICAgICAgICAgIGNvbFNwYW46IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbFNwYW46IDksXG4gICAgICAgICAgICAgIGNhcHRpb246ICdBY2NvdW50IERldGFpbHMnLFxuICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdFcnJvck1lc3NhZ2UnLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZGF0YSAmJiBkYXRhLmVkaXRvck9wdGlvbnMgJiYgZGF0YS5lZGl0b3JPcHRpb25zLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2UgJiYgJCgnPGRpdiAvPicpLnRleHQoZXJyb3JNZXNzYWdlKS5hZGRDbGFzcygnZXJyb3ItbWVzc2FnZScpO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgICAgICAvLyAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcbiAgICAgICAgICAgICAgICAvLyAgIGRhdGFGaWVsZDogJ0hhc0NoYW5nZXMnLFxuICAgICAgICAgICAgICAgIC8vICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgICAvLyAgIH0sXG4gICAgICAgICAgICAgICAgLy8gICB2aXNpYmxlOiB0aGlzLmFjY291bnRTZXR0aW5nc0RhdGE/Lkhhc0NoYW5nZXMgJiYgIXRoaXMuYWNjb3VudFNldHRpbmdzRGF0YS5FcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgLy8gICB0ZW1wbGF0ZTogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gJCgnPGRpdiAvPicpLnRleHQoJ0NoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkJykuYWRkQ2xhc3MoJ3N1Y2Nlc3MtbWVzc2FnZScpO1xuICAgICAgICAgICAgICAgIC8vICAgfSxcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcbiAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZDogJ1VzZXJOYW1lJyxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdVc2VybmFtZSdcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnVXNlcm5hbWUgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcbiAgICAgICAgICAgICAgICAgIGNvbENvdW50OiAyLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdGaXJzdE5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnRmlyc3QgTmFtZSdcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVxdWlyZWQnLCBtZXNzYWdlOiAnRmlyc3QgTmFtZSBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnTGFzdE5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTGFzdCBOYW1lJ1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdMYXN0IE5hbWUgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdQaG9uZU51bWJlcicsXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnUGhvbmUgTnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdzaW1wbGUnLFxuICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnRW1haWwnLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0VtYWlsJ1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcsIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZW1haWwnLCBtZXNzYWdlOiAnUGxlYXNlIHVzZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnIH1cbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcbiAgICAgICAgICAgICAgICAgIGNzc0NsYXNzOiAnYWNjb3VudC1zZXR0aW5nc19fcGFzc3dvcmQtYXJlYScsXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4gJCgnPGRpdiAvPicpLmNzcygnZm9udC13ZWlnaHQnLCAnYm9sZCcpLnRleHQoJ0NoYW5nZSBQYXNzd29yZCcpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdPbGRQYXNzd29yZCcsXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ3VycmVudCBwYXNzd29yZCdcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdwYXNzd29yZCdcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgICAgICAgICAgIHJlZXZhbHVhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAocGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZighIXRoaXMuYWNjb3VudFNldHRpbmdzRm9ybT8uZ2V0RWRpdG9yKCdOZXdQYXNzd29yZCcpPy5vcHRpb24oJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdPbGQgcGFzc3dvcmQgaXMgcmVxdWlyZWQnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZCcsXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnTmV3IHBhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRBdHRyOiB7IGF1dG9jb21wbGV0ZTogJ25ldy1wYXNzd29yZCcgfVxuICAgICAgICAgICAgICAgICAgfSBhcyBkeFRleHRCb3hPcHRpb25zPGR4VGV4dEJveD4sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdOZXdQYXNzd29yZFJlcGVhdCcsXG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ29uZmlybSBuZXcgcGFzc3dvcmQnXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBtb2RlOiAncGFzc3dvcmQnXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgICAgICAgICByZWV2YWx1YXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DYWxsYmFjazogKHBhcmFtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmFjY291bnRTZXR0aW5nc0Zvcm0/LmdldEVkaXRvcignTmV3UGFzc3dvcmQnKT8ub3B0aW9uKCd2YWx1ZScpIHx8ICcnKSA9PT0gcGFyYW1zLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkIG1pc21hdGNoJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgICAgICAgICAgICAgICBjc3NDbGFzczogJ2FjY291bnQtc2V0dGluZ3NfX3N1Ym1pdC1idG4nLFxuICAgICAgICAgICAgICAgICAgYnV0dG9uT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU2F2ZSBDaGFuZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICB1c2VTdWJtaXRCZWhhdmlvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG59XG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbmZpcm0odGV4dDogc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4ge1xuICAgIGNvbnN0ICRkZWZmZXJlZDogSlF1ZXJ5RGVmZXJyZWQ8Ym9vbGVhbj4gPSAkLkRlZmVycmVkKCk7XG4gICAgY29uc3QgJGVsZW1lbnQgPSAkKCc8ZGl2Lz4nKS5hcHBlbmRUbyh3aW5kb3cuZG9jdW1lbnQuYm9keSk7XG5cbiAgICBjb25zdCBwb3B1cCA9ICRlbGVtZW50LmR4UG9wdXAoe1xuICAgICAgICBzaG93VGl0bGU6IGZhbHNlLFxuICAgICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgICAgd2lkdGg6IDM3MCxcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgICRjb250ZW50LmFkZENsYXNzKCdpc3pvbGVhLWR4LWNvbmZpcm0nKTtcblxuICAgICAgICAgICAgJCgnPGIvPicpLmFkZENsYXNzKCdtZXNzYWdlJykudGV4dCh0ZXh0KS5hcHBlbmRUbygkY29udGVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0ICRidXR0b25zU2VjdGlvbiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdidXR0b25zJykuYXBwZW5kVG8oJGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAkKCc8ZGl2Lz4nKS5keEJ1dHRvbih7XG4gICAgICAgICAgICAgICAgdGV4dDogJ0RlbGV0ZScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsXG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgJGRlZmZlcmVkLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oJGJ1dHRvbnNTZWN0aW9uKTtcblxuICAgICAgICAgICAgJCgnPGRpdi8+JykuZHhCdXR0b24oe1xuICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICRkZWZmZXJlZC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9uc1NlY3Rpb24pO1xuICAgICAgICB9LFxuICAgICAgb25IaWRkZW46ICgpID0+IHtcbiAgICAgICAgcG9wdXAuZGlzcG9zZSgpO1xuICAgICAgICBwb3B1cC5lbGVtZW50KCkucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSkuZHhQb3B1cCgnaW5zdGFuY2UnKTtcblxuICAgIHBvcHVwLnNob3coKTtcblxuICAgIHJldHVybiAkZGVmZmVyZWQ7XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgSUxvZ29TZXR0aW5ncyB9IGZyb20gJy4uL0RhdGEnO1xuaW1wb3J0IHsgTE9HT19TRVRUSU5HU19DQUNIRV9LRVkgfSBmcm9tICcuLi9Db25zdGFudHMvQ2FjaGVLZXlzJztcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vRGF0YS9SZXF1ZXN0JztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL0NvbmZpZy9JbmRleCc7XG5pbXBvcnQgeyBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhL0lCYWNrZ3JvdW5kUGhvdG9WaWV3ZXJTZXR0aW5ncyc7XG5pbXBvcnQgeyBzaG93IGFzIHNob3dJbWFnZVZpZXdlciB9IGZyb20gJy4uL1dpZGdldHMvQmFja2dyb3VuZEltYWdlVmlld2VyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmRpbmcoJGNvbnRhaW5lcjogSlF1ZXJ5LCBsb2dvU2V0dGluZ3M6IElMb2dvU2V0dGluZ3MgfCBzdHJpbmcsIHNob3dTaWduSW5CdXR0b246IGJvb2xlYW4sIHBob3RvR2FsbGVyeVNldHRpbmdzOiBJQmFja2dyb3VuZFBob3RvVmlld2VyU2V0dGluZ3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH0pIHtcbiAgZ2V0TG9nb1NldHRpbmdzKGxvZ29TZXR0aW5ncykudGhlbigoc2V0dGluZ3MpID0+IHtcbiAgICBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXIsIHNldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uLCBwaG90b0dhbGxlcnlTZXR0aW5ncyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRMb2dvU2V0dGluZ3MobG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzIHwgc3RyaW5nKTogSlF1ZXJ5RGVmZXJyZWQ8SUxvZ29TZXR0aW5ncz4ge1xuICBjb25zdCAkZGVmZmVyZWQ6IEpRdWVyeURlZmVycmVkPElMb2dvU2V0dGluZ3M+ID0gJC5EZWZlcnJlZCgpO1xuXG4gIGlmICh0eXBlb2YgbG9nb1NldHRpbmdzID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGNhY2hlZFNldHRpbmdzUmF3ID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVkpO1xuICAgIGlmIChjYWNoZWRTZXR0aW5nc1Jhdykge1xuICAgICAgJGRlZmZlcmVkLnJlc29sdmUoSlNPTi5wYXJzZShjYWNoZWRTZXR0aW5nc1JhdykgYXMgSUxvZ29TZXR0aW5ncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmRSZXF1ZXN0KGxvZ29TZXR0aW5ncywgJ3Bvc3QnKS5kb25lKChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICBhcHBsaWNhdGlvbk5hbWU6IGRhdGEuQXBwbGljYXRpb25OYW1lLFxuICAgICAgICAgIGJ1c2luZXNzTmFtZTogZGF0YS5CdXNpbmVzc05hbWUsXG4gICAgICAgICAgbGFuZGluZ1BhZ2VMb2dvOiBkYXRhLkxhbmRpbmdQYWdlTG9nbyxcbiAgICAgICAgICBsb2dvSW1hZ2U6IGRhdGEuTG9nb0ltYWdlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLkRlc2NyaXB0aW9uXG4gICAgICAgIH0gYXMgSUxvZ29TZXR0aW5ncztcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oTE9HT19TRVRUSU5HU19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgICAgICAkZGVmZmVyZWQucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgICRkZWZmZXJlZC5yZXNvbHZlKGxvZ29TZXR0aW5ncyk7XG4gIH1cblxuICByZXR1cm4gJGRlZmZlcmVkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMYW5kaW5nTWFya3VwKCRjb250YWluZXI6IEpRdWVyeSwgbG9nb1NldHRpbmdzOiBJTG9nb1NldHRpbmdzLCBzaG93U2lnbkluQnV0dG9uOiBib29sZWFuLCBwaG90b0dhbGxlcnlTZXR0aW5nczogSUJhY2tncm91bmRQaG90b1ZpZXdlclNldHRpbmdzKSB7XG4gIGNvbnN0ICRsYW5kaW5nUGFnZSA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnaXN6b2xlYS1sYW5kaW5nLXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcbiAgbGV0ICRsYW5kaW5nQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdsYW5kaW5nLWNvbnRhaW5lcicpLmFwcGVuZFRvKCRsYW5kaW5nUGFnZSk7XG5cbiAgaWYocGhvdG9HYWxsZXJ5U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICRsYW5kaW5nUGFnZS5hZGRDbGFzcygncGhvdG8tZ2FsbGVyeS1tb2RlJyk7XG4gIH0gZWxzZSB7XG4gICAgJGxhbmRpbmdQYWdlLmFkZENsYXNzKCdkZWZhdWx0LW1vZGUnKTtcbiAgICAkbGFuZGluZ0NvbnRhaW5lciA9ICRsYW5kaW5nUGFnZTtcbiAgfVxuXG4gICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbG9nby1jb250YWluZXInKVxuICAgIC5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcilcbiAgICAuYXBwZW5kKFxuICAgICAgJCgnPGltZyAvPicpLmF0dHIoJ3NyYycsIGxvZ29TZXR0aW5ncy5sYW5kaW5nUGFnZUxvZ28pLmFkZENsYXNzKCdsb2dvLWxhcmdlJykuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpLFxuICAgICAgJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnYnVzaW5lc3MtbmFtZScpLnRleHQobG9nb1NldHRpbmdzLmJ1c2luZXNzTmFtZSkuYXBwZW5kVG8oJGxhbmRpbmdDb250YWluZXIpXG4gICk7XG5cbiAgJCgnPGgyIC8+JykudGV4dChgV2VsY29tZSB0byAke2xvZ29TZXR0aW5ncy5kZXNjcmlwdGlvbn1gKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XG5cbiAgaWYgKHNob3dTaWduSW5CdXR0b24pIHtcbiAgICAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ3NpZ24taW4tYnV0dG9uJykuYXBwZW5kKCQoJzxkaXYgLz4nKS5keEJ1dHRvbih7XG4gICAgICB0ZXh0OiAnU2lnbiBJbicsXG4gICAgICB3aWR0aDogY29uZmlnLmlzTGVnYWN5UmVuZGVyID8gdW5kZWZpbmVkIDogJzE0MHB4JyxcbiAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYC9Ib21lL0xvZ2luP3JldHVyblVybD0ke2VuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZi50b1N0cmluZygpKX1gO1xuICAgICAgfVxuICAgIH0pKS5hcHBlbmRUbygkbGFuZGluZ0NvbnRhaW5lcik7XG4gIH1cblxuICBpZihwaG90b0dhbGxlcnlTZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgc2hvd0ltYWdlVmlld2VyKFxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MuJGNvbnRhaW5lciB8fCAkbGFuZGluZ1BhZ2UsXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWFnZVVybHMgfHwgW10sXG4gICAgICBwaG90b0dhbGxlcnlTZXR0aW5ncy5pbWdDaGFuZ2VJbnRlcnZhbFNlYyB8fCA4LFxuICAgICAgcGhvdG9HYWxsZXJ5U2V0dGluZ3MudHJhbnNpdGlvblRpbWVTZWMgfHwgMlxuICAgICk7XG4gIH1cbn1cbiIsICJcdUZFRkZleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWNjZXNzRGVuaWVkVG9SZXBvcnQoJGNvbnRhaW5lcjogSlF1ZXJ5LCBhbGxvd2VkUmVwb3J0Um9sZXM6IHN0cmluZ1tdLCBhbGxvd2VkQ29ubmVjdGlvblJvbGVzOiBzdHJpbmdbXSkge1xuICBjb25zdCAkaXN6b2xlYUNvbnRhaW5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2FjY2Vzcy1kZW5pZWQtdG8tcmVwb3J0LXBhZ2UnKS5hcHBlbmRUbygkY29udGFpbmVyKTtcbiAgJCgnPGgyPicpLmFkZENsYXNzKCdlcnJvci10ZXh0JykudGV4dCgnQWNjZXNzIGRlbmllZCB0byB0aGUgcmVwb3J0JykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xuXG4gIGlmIChhbGxvd2VkUmVwb3J0Um9sZXMgJiYgYWxsb3dlZFJlcG9ydFJvbGVzLmxlbmd0aCkge1xuICAgIGNvbnN0IHJlcG9ydFJvbGVzID0gYWxsb3dlZFJlcG9ydFJvbGVzLm1hcCgocikgPT4gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ3JvbGUnKS50ZXh0KHIpKTtcbiAgICAkKCc8cD4nKS50ZXh0KCdSZXF1aXJlZCByb2xlcyBmb3IgcmVwb3J0OiAnKS5hcHBlbmQocmVwb3J0Um9sZXMpLmFwcGVuZFRvKCRpc3pvbGVhQ29udGFpbmVyKTtcbiAgfVxuXG4gIGlmIChhbGxvd2VkQ29ubmVjdGlvblJvbGVzICYmIGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnNSb2xlcyA9IGFsbG93ZWRDb25uZWN0aW9uUm9sZXMubWFwKChyKSA9PiAkKCc8c3Bhbj4nKS5hZGRDbGFzcygncm9sZScpLnRleHQocikpO1xuICAgICQoJzxwPicpLnRleHQoJ1JlcXVpcmVkIHJvbGVzIGZvciBkYiBjb25uZWN0aW9uOiAnKS5hcHBlbmQoY29ubmVjdGlvbnNSb2xlcykuYXBwZW5kVG8oJGlzem9sZWFDb250YWluZXIpO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcbmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XG5pbXBvcnQgeyBJQ2RtUmVwb3J0UGFyYW1zLCBNb2RlIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XG5pbXBvcnQgeyBDb250cm9sQ29uZmlndXJhdG9yLCBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xuaW1wb3J0IHsgQ29udHJvbERpc3BsYXksIElDb250cm9sRGlzcGxheU9wdGlvbnMgfSBmcm9tICcuL0NvbnRyb2xEaXNwbGF5JztcbmltcG9ydCB7IERpc3BsYXlNYW5hZ2VyLCBJRGlzcGxheU1hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi9EaXNwbGF5TWFuYWdlcic7XG5pbXBvcnQge0lSZXBvcnRDb21wb25lbnR9IGZyb20gJy4uLy4uL0lSZXBvcnRDb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDRE1SZXBvcnRQYWdlT3B0aW9ucyB7XG4gICRjb250YWluZXI6IEpRdWVyeTtcbiAgcmVwb3J0UGFyYW1zOiBJQ2RtUmVwb3J0UGFyYW1zO1xuICB1c2VyTmFtZTogc3RyaW5nO1xuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XG4gIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0RNUmVwb3J0UGFnZSBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19ERVNJR05FUl9URVhUID0gJ1N3aXRjaCB0byBTZXR0aW5ncyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX1ZJRVdFUl9URVhUID0gJ1N3aXRjaCB0byBEaXNwbGF5JztcbiAgcHJpdmF0ZSByZWFkb25seSBTVE9SQUdFX01PREVfS0VZID0gJ0NETV9TVE9SQUdFX01PREVfS0VZJztcblxuICBwcml2YXRlIHJlYWRvbmx5ICRyb290RWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5TWFuYWdlck9wdGlvbnM6IElEaXNwbGF5TWFuYWdlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbERpc3BsYXlPcHRpb25zOiBJQ29udHJvbERpc3BsYXlPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtdWx0aVZpZXc6IERldkV4cHJlc3MudWkuZHhNdWx0aVZpZXc7XG4gIHByaXZhdGUgdGFiUGFuZWw6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbDtcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlcjtcblxuICBwcml2YXRlIG1vZGU6IE1vZGU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUNETVJlcG9ydFBhZ2VPcHRpb25zKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IGAvJHtvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmx9LyR7b3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YDtcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcbiAgICB0aGlzLnJlcG9ydFBhcmFtcyA9IG9wdGlvbnMucmVwb3J0UGFyYW1zO1xuICAgIHRoaXMuYWxsb3dFZGl0aW5nID0gb3B0aW9ucy5hbGxvd0VkaXRpbmc7XG4gICAgdGhpcy5tb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XG5cbiAgICB0aGlzLmNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zID0gdGhpcy5nZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLmNkbVJlcG9ydENvbnRyb2xsZXJVcmwpO1xuICAgIHRoaXMuZGlzcGxheU1hbmFnZXJPcHRpb25zID0gdGhpcy5nZXREaXNwbGF5TWFuYWdlck9wdGlvbnMoYmFzZVVybCk7XG4gICAgdGhpcy5jb250cm9sRGlzcGxheU9wdGlvbnMgPSB0aGlzLmdldENvbnRyb2xEaXNwbGF5T3B0aW9ucyhiYXNlVXJsLCBvcHRpb25zLnVzZXJOYW1lLCBvcHRpb25zLnJlcG9ydFBhcmFtcyk7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XG4gICAgICB0aGlzLmluaXRTd2l0Y2hNb2RlQnV0dG9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLm11bHRpVmlldz8uZGlzcG9zZSgpO1xuICAgIHRoaXMudGFiUGFuZWw/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBvcG92ZXI/LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJlZnJlc2goKTogdm9pZCB7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyRGlzcGxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlclRhYlBhbmVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyhiYXNlVXJsOiBzdHJpbmcsIGNkbVJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZyk6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRjb250YWluZXI6IG51bGwsXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcbiAgICAgIHBhZ2VUaXRsZTogJycsXG4gICAgICBhdmFpbGFibGVSb2xlc1VybDogYC8ke2NkbVJlcG9ydENvbnRyb2xsZXJVcmx9L0F2YWlsYWJsZVJvbGVzYCxcbiAgICAgIGdyb3VwRmllbGRzVXJsOiBgJHtiYXNlVXJsfS9BbGxDb250cm9sRmllbGRzYCxcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db25maWd1cmF0b3JEYXRhYCxcbiAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbmZpZ3VyYXRvckRhdGFgXG4gICAgfSBhcyBJQ29udHJvbENvbmZpZ3VyYXRvck9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldERpc3BsYXlNYW5hZ2VyT3B0aW9ucyhiYXNlVXJsOiBzdHJpbmcpOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGNvbnRhaW5lcjogbnVsbCxcbiAgICAgIGlzU3RhbmRhbG9uZVBhZ2U6IGZhbHNlLFxuICAgICAgcGFnZVRpdGxlOiAnJyxcbiAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9Db250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2AsXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheVVzZXJBc3NpZ25tZW50c2BcbiAgICB9IGFzIElEaXNwbGF5TWFuYWdlck9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyb2xEaXNwbGF5T3B0aW9ucyhcbiAgICBiYXNlVXJsOiBzdHJpbmcsXG4gICAgdXNlck5hbWU6IHN0cmluZyxcbiAgICByZXBvcnRQYXJhbXM6IElDZG1SZXBvcnRQYXJhbXNcbiAgKTogSUNvbnRyb2xEaXNwbGF5T3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRjb250YWluZXI6IG51bGwsXG4gICAgICBpc1N0YW5kYWxvbmVQYWdlOiBmYWxzZSxcbiAgICAgIHBhZ2VUaXRsZTogJycsXG4gICAgICBleHBvcnRGaWxlTmFtZTogcmVwb3J0UGFyYW1zLk5hbWUsXG4gICAgICB1c2VyQ29uZmlnVXJsOiBgJHtiYXNlVXJsfS9GaWVsZHNQZXJtaXNzaW9uc2AsXG4gICAgICBjb250cm9sTG9nc1VybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbExvZ3NgLFxuICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0NvbnRyb2xEaXNwbGF5RGF0YWAsXG4gICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheURhdGFgLFxuICAgICAgdXNlck5hbWUsXG4gICAgICBpbXBvcnRGaWxlT3B0aW9uczogcmVwb3J0UGFyYW1zLkFsbG93SW1wb3J0aW5nID8ge1xuICAgICAgICBtb2RlOiByZXBvcnRQYXJhbXMuSW1wb3J0RmlsZU1vZGUsXG4gICAgICAgIGNyZWF0ZVRhYmxlVXJsOiBgJHtiYXNlVXJsfS9jcmVhdGUtdGFibGVgLFxuICAgICAgICBhZGRSb3dzVXJsOiBgJHtiYXNlVXJsfS9hZGQtcm93c2AsXG4gICAgICAgIGZpbGVVcGxvYWRVcmw6IGAke2Jhc2VVcmx9L2dldC1jb2x1bW5zYCxcbiAgICAgICAgcHJlZGVmaW5lZFRhYmxlOiByZXBvcnRQYXJhbXMuRmlsZUltcG9ydGVyVGFibGVJbmZvXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczoge1xuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbEZpbHRlcnNgLFxuICAgICAgICBpbnNlcnREYXRhVXJsOiBgJHtiYXNlVXJsfS9BZGRDb250cm9sRmlsdGVyYCxcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbEZpbHRlcmAsXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xGaWx0ZXJgXG4gICAgICB9LFxuICAgICAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IHtcbiAgICAgICAgbG9hZERhdGFVcmw6IGAke2Jhc2VVcmx9L0dldENvbnRyb2xWaWV3c2AsXG4gICAgICAgIGluc2VydERhdGFVcmw6IGAke2Jhc2VVcmx9L0FkZENvbnRyb2xWaWV3YCxcbiAgICAgICAgdXBkYXRlRGF0YVVybDogYCR7YmFzZVVybH0vVXBkYXRlQ29udHJvbFZpZXdgLFxuICAgICAgICBkZWxldGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9SZW1vdmVDb250cm9sVmlld2BcbiAgICAgIH0sXG4gICAgICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczoge1xuICAgICAgICBsb2FkRGF0YVVybDogYCR7YmFzZVVybH0vR2V0Q29udHJvbERpc3BsYXlzYCxcbiAgICAgICAgaW5zZXJ0RGF0YVVybDogYCR7YmFzZVVybH0vQWRkQ29udHJvbERpc3BsYXlgLFxuICAgICAgICB1cGRhdGVEYXRhVXJsOiBgJHtiYXNlVXJsfS9VcGRhdGVDb250cm9sRGlzcGxheWAsXG4gICAgICAgIGRlbGV0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1JlbW92ZUNvbnRyb2xEaXNwbGF5YFxuICAgICAgfSxcbiAgICAgIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiB7XG4gICAgICAgIGxvYWREYXRhVXJsOiBgJHtiYXNlVXJsfS9HZXRDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc2AsXG4gICAgICAgIHVwZGF0ZURhdGFVcmw6IGAke2Jhc2VVcmx9L1VwZGF0ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzYCxcbiAgICAgIH1cbiAgICB9IGFzIElDb250cm9sRGlzcGxheU9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgICAgfVxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckRpc3BsYXkoKSB7XG4gICAgdGhpcy4kcm9vdEVsZW1lbnQuaHRtbCgnJyk7XG4gICAgY29uc3QgJHZpZXcgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kcm9vdEVsZW1lbnQpO1xuXG4gICAgdGhpcy5tdWx0aVZpZXcgPSAkdmlldy5keE11bHRpVmlldyh7XG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb250cm9sRGlzcGxheSh7IC4uLnRoaXMuY29udHJvbERpc3BsYXlPcHRpb25zLCAkY29udGFpbmVyOiAkKCc8ZGl2IC8+JykgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQucmVuZGVyKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuJGNvbnRhaW5lcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KS5hZGRDbGFzcygnY2RtLXJlcG9ydF9fZGlzcGx5LWdyaWQnKS5keE11bHRpVmlldygnaW5zdGFuY2UnKTtcbiAgICBmdWxsU2NyZWVuKHRoaXMubXVsdGlWaWV3LCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRhYlBhbmVsKCkge1xuICAgIHRoaXMuJHJvb3RFbGVtZW50Lmh0bWwoJycpO1xuXG4gICAgY29uc3QgJG1haW5UYWJQYW5lbCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XG5cbiAgICB0aGlzLnRhYlBhbmVsID0gdGhpcy5jcmVhdGVUYWJQYW5lbCgkbWFpblRhYlBhbmVsKTtcbiAgICBmdWxsU2NyZWVuKHRoaXMudGFiUGFuZWwsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGFiUGFuZWwoZWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50Pik6IERldkV4cHJlc3MudWkuZHhUYWJQYW5lbCB7XG4gICAgcmV0dXJuIGVsZW1lbnQuZHhUYWJQYW5lbCh7XG4gICAgICBzd2lwZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgc2hvd05hdkJ1dHRvbnM6IHRydWUsXG4gICAgICBmb2N1c1N0YXRlRW5hYmxlZDogZmFsc2UsXG4gICAgICBhY3RpdmVTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBlLmNvbXBvbmVudC5yZXBhaW50KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogJ0NvbmZpZ3VyYXRvcicsXG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb250cm9sQ29uZmlndXJhdG9yKHsgLi4udGhpcy5jb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6ICdEaXNwbGF5IE1hbmFnZXInLFxuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgRGlzcGxheU1hbmFnZXIoeyAuLi50aGlzLmRpc3BsYXlNYW5hZ2VyT3B0aW9ucywgJGNvbnRhaW5lcjogJCgnPGRpdiAvPicpIH0pO1xuICAgICAgICAgICAgY29tcG9uZW50LnJlbmRlcigpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LiRjb250YWluZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgXVxuICAgIH0pLmFkZENsYXNzKCdjZG0tcmVwb3J0X19jb25maWd1cmF0aW9uLXRhYi1wYW5lbCcpXG4gICAgICAuZHhUYWJQYW5lbCgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLlNUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcbiAgfVxufVxuIiwgIlx1RkVGRmV4cG9ydCBmdW5jdGlvbiBpbml0UG9wb3ZlcihsaW5rOiBzdHJpbmcsIGRldGFpbHM6IHN0cmluZyk6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHtcbiAgY29uc3QgaHRtbCA9ICQoJzxwLz4nKS5odG1sKGRldGFpbHMpLnRleHQoKTtcblxuICBjb25zdCBwb3BvdmVyID0gJCgnPGRpdj4nLCB7IGNsYXNzOiAncmVwb3J0LWRldGFpbHMtcG9wb3ZlcicgfSlcbiAgICAuaHRtbChodG1sKVxuICAgIC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcblxuICByZXR1cm4gJChwb3BvdmVyKS5keFBvcG92ZXIoe1xuICAgIHRhcmdldDogbGluayxcbiAgICBzaG93RXZlbnQ6ICdkeGNsaWNrJyxcbiAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgd2lkdGg6IDUwMFxuICB9KS5keFBvcG92ZXIoJ2luc3RhbmNlJyk7XG59XG4iLCAiXHVGRUZGaW1wb3J0IGZ1bGxTY3JlZW4gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcbmltcG9ydCB7Q1NTX0NMQVNTRVN9IGZyb20gJy4uLy4uLy4uL1N0eWxpbmcvSW5kZXgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbE9wdGlvbnMge1xuICBleHBvcnRGaWxlTmFtZT86IHN0cmluZztcbiAgc3VtbWFyeUNvbHVtbj86IHN0cmluZztcbiAgc2hvd1N1bW1hcnlJbkNvbHVtbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRhR3JpZChcbiAgJHRhcmdldCwgZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucyA9IHt9LFxuICBoZWFkZXJUZXh0Pzogc3RyaW5nLCBoZWFkZXJEZXNjcmlwdGlvbj86IHN0cmluZywgZGVmYXVsdENvbHVtbldpZHRoID0gZmFsc2Vcbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XG4gIGxldCBpc0dyaWRJbml0aWFsaXphZWQgPSBmYWxzZTtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSB7XG4gICAgZXhwb3J0OiB7XG4gICAgICBlbmFibGVkOiAhIWFkZGl0aW9uYWxPcHRpb25zLmV4cG9ydEZpbGVOYW1lLFxuICAgICAgYWxsb3dFeHBvcnRTZWxlY3RlZERhdGE6IHRydWVcbiAgICB9LFxuICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXG5cbiAgICBjb2x1bW5BdXRvV2lkdGg6IHRydWUsXG4gICAgc2hvd0JvcmRlcnM6IHRydWUsXG5cbiAgICBzZWxlY3Rpb246IHttb2RlOiAnbXVsdGlwbGUnfSxcbiAgICBrZXlib2FyZE5hdmlnYXRpb246IHtlbmFibGVkOiBmYWxzZX0sXG4gICAgcGFnaW5nOiB7cGFnZVNpemU6IDUwfSxcbiAgICBzZWFyY2hQYW5lbDoge3Zpc2libGU6IHRydWV9LFxuICAgIGZpbHRlclJvdzoge3Zpc2libGU6IHRydWV9LFxuICAgIGhlYWRlckZpbHRlcjoge3Zpc2libGU6IHRydWV9LFxuICAgIHNjcm9sbGluZzoge21vZGU6ICd2aXJ0dWFsJ30sXG4gICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XG4gICAgICB1cGRhdGVTdW1tYXJ5Q29sdW1uSWZSZXF1aXJlZChlLmNvbXBvbmVudCk7XG5cbiAgICAgIGlmIChpc0dyaWRJbml0aWFsaXphZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpc0dyaWRJbml0aWFsaXphZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoIWRlZmF1bHRDb2x1bW5XaWR0aCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUuY29tcG9uZW50LmNvbHVtbkNvdW50KCk7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gZS5jb21wb25lbnQuY29sdW1uT3B0aW9uKGksICdkYXRhVHlwZScpO1xuXG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJykpIHtcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihpLCAnd2lkdGgnLCAnMTAwcHgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5jb2x1bW5PcHRpb24oaSwgJ3dpZHRoJywgJzE1MHB4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vdG8gZml4IGF1dG9zY3JvbGxcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gZS5jb21wb25lbnQuZ2V0U2Nyb2xsYWJsZSgpO1xuXG4gICAgICAgIGlmIChzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgc2Nyb2xsYWJsZS5zY3JvbGxUbyh7dG9wOiAwfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xuICAgICAgaWYgKGhlYWRlclRleHQpIHtcbiAgICAgICAgZS50b29sYmFyT3B0aW9ucy5pdGVtcy51bnNoaWZ0KHtcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXG4gICAgICAgICAgdGVtcGxhdGUoKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJFbCA9ICQoJzxoMiAvPicpLmFkZENsYXNzKCdncmlkLWhlYWRlcicpLnRleHQoaGVhZGVyVGV4dCk7XG4gICAgICAgICAgICBpZiAoaGVhZGVyRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgaGVhZGVyRWwuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhcycpLmFkZENsYXNzKCdmYS1pbmZvLWNpcmNsZScpLmFkZENsYXNzKCdyZXBvcnQtZGV0YWlscy1saW5rJykuYXR0cigndGl0bGUnLCAnQ2xpY2sgdG8gc2VlIGZ1cnRoZXIgZGV0YWlscycpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gZGF0YUdyaWRPcHRpb25zLm9uQ29udGVudFJlYWR5XG4gICAgPyAoZSkgPT4ge1xuICAgICAgZGVmYXVsdE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XG4gICAgICBkYXRhR3JpZE9wdGlvbnMub25Db250ZW50UmVhZHkoZSk7XG4gICAgfVxuICAgIDogZGVmYXVsdE9wdGlvbnMub25Db250ZW50UmVhZHk7XG5cbiAgdHJ5U2V0VG90YWxTdW1tYXJ5KGRhdGFHcmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMpO1xuXG4gIGNvbnN0IG1lcmdlZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIGRhdGFHcmlkT3B0aW9ucywge29uQ29udGVudFJlYWR5fSk7XG5cbiAgY29uc3QgZ3JpZCA9ICR0YXJnZXQuZHhEYXRhR3JpZChtZXJnZWRPcHRpb25zKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xuXG4gIGdyaWQuZWxlbWVudCgpLmFkZENsYXNzKENTU19DTEFTU0VTLmR4RGF0YUdyaWQpO1xuXG4gIHJldHVybiBncmlkO1xufVxuXG5mdW5jdGlvbiB0cnlTZXRUb3RhbFN1bW1hcnkoZGF0YUdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9uczogSUdyaWRBZGRpdGlvbmFsT3B0aW9ucykge1xuICBpZiAoZGF0YUdyaWRPcHRpb25zPy5zdW1tYXJ5Py50b3RhbEl0ZW1zPy5zb21lKChpKSA9PiBpLnN1bW1hcnlUeXBlID09PSAnY291bnQnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzdW1tYXJ5Q29sdW1uID0gYWRkaXRpb25hbE9wdGlvbnM/LnN1bW1hcnlDb2x1bW47XG4gIGlmICghc3VtbWFyeUNvbHVtbiAmJiBkYXRhR3JpZE9wdGlvbnM/LmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgIHN1bW1hcnlDb2x1bW4gPSB0eXBlb2YgZGF0YUdyaWRPcHRpb25zLmNvbHVtbnNbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdXG4gICAgICA6IGRhdGFHcmlkT3B0aW9ucy5jb2x1bW5zWzBdLmRhdGFGaWVsZDtcbiAgfVxuXG4gIGlmIChzdW1tYXJ5Q29sdW1uKSB7XG4gICAgaWYgKCFkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeSkge1xuICAgICAgZGF0YUdyaWRPcHRpb25zLnN1bW1hcnkgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMpIHtcbiAgICAgIGRhdGFHcmlkT3B0aW9ucy5zdW1tYXJ5LnRvdGFsSXRlbXMgPSBbXTtcbiAgICB9XG5cbiAgICBkYXRhR3JpZE9wdGlvbnMuc3VtbWFyeS50b3RhbEl0ZW1zLnB1c2goe1xuICAgICAgY29sdW1uOiBzdW1tYXJ5Q29sdW1uLFxuICAgICAgc3VtbWFyeVR5cGU6ICdjb3VudCdcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTdW1tYXJ5Q29sdW1uSWZSZXF1aXJlZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcbiAgY29uc3QgdG90YWxJdGVtcyA9IGdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXTtcbiAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0b3RhbEl0ZW1zPy5maWx0ZXIoKGkpID0+IGkuc3VtbWFyeVR5cGUgPT09ICdjb3VudCcpWzBdPy5jb2x1bW47XG5cbiAgbGV0IHN1bW1hcnlDb2x1bW5JbmRleCA9IGN1cnJlbnRTdW1tYXJ5Q29sdW1uICYmIGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kSW5kZXgoKGVsKSA9PiBlbC5kYXRhRmllbGQgPT09IGN1cnJlbnRTdW1tYXJ5Q29sdW1uKTtcbiAgaWYgKCFzdW1tYXJ5Q29sdW1uSW5kZXgpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBncmlkLm9wdGlvbignc2VsZWN0aW9uJyk7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5tb2RlICE9PSAnbm9uZSc7XG4gICAgc3VtbWFyeUNvbHVtbkluZGV4ID0gaGFzU2VsZWN0aW9uID8gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbmRJbmRleCgoZWwpID0+ICEhZWwuZGF0YUZpZWxkKSA6IDA7XG4gIH1cblxuICBjb25zdCBuZXdTdW1tYXJ5Q29sdW1uID0gZ3JpZC5nZXRWaXNpYmxlQ29sdW1ucygpW3N1bW1hcnlDb2x1bW5JbmRleF0/LmRhdGFGaWVsZDtcblxuICBpZiAobmV3U3VtbWFyeUNvbHVtbiAmJiBjdXJyZW50U3VtbWFyeUNvbHVtbiAhPT0gbmV3U3VtbWFyeUNvbHVtbikge1xuICAgIGdyaWQub3B0aW9uKCdzdW1tYXJ5Jywge1xuICAgICAgdG90YWxJdGVtczogW3tcbiAgICAgICAgY29sdW1uOiBncmlkLmdldFZpc2libGVDb2x1bW5zKClbc3VtbWFyeUNvbHVtbkluZGV4XT8uZGF0YUZpZWxkLFxuICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xuICAgICAgfV1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnVsbFNjcmVlbkRhdGFHcmlkKFxuICAkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zOiBJR3JpZEFkZGl0aW9uYWxPcHRpb25zID0ge30sXG4gIGhlYWRlclRleHQ/OiBzdHJpbmcsIGhlYWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLCBkZWZhdWx0Q29sdW1uV2lkdGggPSBmYWxzZSwgc2tpcEZ1bGxTY3JlZW4gPSBmYWxzZVxuKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcbiAgY29uc3QgZ3JpZCA9IGNyZWF0ZURlZmF1bHREYXRhR3JpZCgkdGFyZ2V0LCBkYXRhR3JpZE9wdGlvbnMsIGFkZGl0aW9uYWxPcHRpb25zLCBoZWFkZXJUZXh0LCBoZWFkZXJEZXNjcmlwdGlvbiwgZGVmYXVsdENvbHVtbldpZHRoKTtcblxuICBpZiAoIXNraXBGdWxsU2NyZWVuKSB7XG4gICAgZnVsbFNjcmVlbihncmlkKTtcbiAgfVxuXG4gIHJldHVybiBncmlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKHRleHQsIHRpdGxlKSB7XG4gIHJldHVybiAkKCc8c3Bhbj4nKVxuICAgIC5hdHRyKCd0aXRsZScsIHRpdGxlKVxuICAgIC50ZXh0KHRleHQpO1xufVxuIiwgIlx1RkVGRmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcbmltcG9ydCB7IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCwgY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlIH0gZnJvbSAnLi4vR3JpZC9DcmVhdGVEZWZhdWx0R3JpZCc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcbmltcG9ydCB7SUxvb2t1cER0b30gZnJvbSAnLi4vLi4vLi4vRGF0YS9BcGlSZXNwb25zZSc7XG5cbi8vIE5PVEU6IGNvbnN0IGRlZmF1bHRTaG93ZWRSb2xlcyA9IFsnUHJvZHVjdGlvbicsICdTYWxlcycsICdGbG9vciddO1xuY29uc3Qgcm9sZXNPcmRlciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmV4cG9ydCBjb25zdCBlbnVtIERpc3BsYXlUeXBlIHtcbiAgSWNvbnMgPSAxLFxuICBQcmVkZWZpbmVkVmFsdWVzID0gMixcbiAgUmFiYml0QWN0aW9uID0gM1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJY29uc0NvbHVtbkVkaXRvckl0ZW0ge1xuICB2YWx1ZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBpbWFnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbSB7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEge1xuICBhY3Rpb25UeXBlOiBzdHJpbmc7XG4gIGZpZWxkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCB0eXBlIElEaXNwbGF5VHlwZVNldHRpbmdzID0gSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB8IElEaXNwbGF5SVByZWRlZmluZWRWYWx1ZXNUeXBlU2V0dGluZ3MgfCBJRGlzcGxheUlSYWJiaXRBY3Rpb25UeXBlU2V0dGluZ3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJY29uc1R5cGVTZXR0aW5ncyB7XG4gIHR5cGU6IERpc3BsYXlUeXBlLkljb25zO1xuICBkYXRhOiBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpc3BsYXlJUHJlZGVmaW5lZFZhbHVlc1R5cGVTZXR0aW5ncyB7XG4gIHR5cGU6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXM7XG4gIGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5SVJhYmJpdEFjdGlvblR5cGVTZXR0aW5ncyB7XG4gIHR5cGU6IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbjtcbiAgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xDb25maWd1cmF0b3JPcHRpb25zIHtcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBpc1N0YW5kYWxvbmVQYWdlOiBib29sZWFuO1xuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcbiAgZ3JvdXBGaWVsZHNVcmw6IHN0cmluZztcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhIHtcbiAgZmllbGRzOiBJTG9va3VwRHRvPHN0cmluZz5bXTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRyb2xDb25maWd1cmF0b3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXZhaWxhYmxlUm9sZXNVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cEZpZWxkc1VybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheVR5cGVzOiBhbnlbXSA9IFtcbiAgICB7IGtleTogRGlzcGxheVR5cGUuSWNvbnMsIHZhbHVlOiAnSWNvbnMnIH0sXG4gICAgeyBrZXk6IERpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXMsIHZhbHVlOiAnUHJlZGVmaW5lZFZhbHVlcycgfSxcbiAgICB7IGtleTogRGlzcGxheVR5cGUuUmFiYml0QWN0aW9uLCB2YWx1ZTogJ1JhYmJpdEFjdGlvbicgfVxuICBdO1xuICBwcml2YXRlIHJlYWRvbmx5IGVkaXRvcnMgPSB7XG4gICAgW0Rpc3BsYXlUeXBlLkljb25zXTogSWNvbnNDb2x1bW5FZGl0b3IsXG4gICAgW0Rpc3BsYXlUeXBlLlByZWRlZmluZWRWYWx1ZXNdOiBQcmVkZWZpbmVkVmFsdWVzQ29sdW1uRWRpdG9yLFxuICAgIFtEaXNwbGF5VHlwZS5SYWJiaXRBY3Rpb25dOiBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3IsXG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdG9yc0luaXREYXRhIDoge1tpZDogbnVtYmVyXSA6IG9iamVjdDt9ID0ge307XG4gIHByaXZhdGUgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgZmllbGRzOiBJTG9va3VwRHRvPHN0cmluZz5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sQ29uZmlndXJhdG9yT3B0aW9ucykge1xuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcbiAgICB0aGlzLmlzU3RhbmRhbG9uZVBhZ2UgPSBvcHRpb25zLmlzU3RhbmRhbG9uZVBhZ2U7XG4gICAgdGhpcy5hdmFpbGFibGVSb2xlc1VybCA9IG9wdGlvbnMuYXZhaWxhYmxlUm9sZXNVcmw7XG4gICAgdGhpcy5ncm91cEZpZWxkc1VybCA9IG9wdGlvbnMuZ3JvdXBGaWVsZHNVcmw7XG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xuICAgIHRoaXMucGFnZVRpdGxlID0gb3B0aW9ucy5wYWdlVGl0bGU7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcygnYXBzLWdyaWQnKTtcblxuICAgIFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlUm9sZXMoKSxcbiAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlRmllbGRzKClcbiAgICBdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHRoaXMucm9sZXMgPSByZXN1bHRbMF07XG4gICAgICB0aGlzLmZpZWxkcyA9IHJlc3VsdFsxXTtcbiAgICAgIHRoaXMuZWRpdG9yc0luaXREYXRhW0Rpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbl0gPSB7IGZpZWxkczogdGhpcy5maWVsZHMgfTtcbiAgICAgIHRoaXMuY3JlYXRlTWFpbkdyaWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlUm9sZXMoKSB7XG4gICAgcmV0dXJuIHNlbmRSZXF1ZXN0PEFycmF5PHsgTmFtZTogc3RyaW5nIH0+Pih0aGlzLmF2YWlsYWJsZVJvbGVzVXJsKVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLm1hcCgocikgPT4gci5OYW1lKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGEpIHx8IDk5OTk7XG4gICAgICAgIGNvbnN0IGJPcmRlciA9IHJvbGVzT3JkZXIuZ2V0KGIpIHx8IDk5OTk7XG5cbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXZhaWxhYmxlRmllbGRzKCk6IFByb21pc2U8SUxvb2t1cER0bzxzdHJpbmc+W10+IHtcbiAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy5ncm91cEZpZWxkc1VybCk7XG4gIH1cblxuICBwcml2YXRlIGdldERpc3BsYXlUeXBlRWRpdG9yKCRjb250YWluZXIsIHR5cGUsIGRhdGEpIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcnNbdHlwZV07XG4gICAgY29uc3QgaW5pdERhdGEgPSB0aGlzLmVkaXRvcnNJbml0RGF0YVt0eXBlXTtcblxuICAgIHJldHVybiBlZGl0b3JcbiAgICAgID8gbmV3IGVkaXRvcigkY29udGFpbmVyLCBkYXRhLCBpbml0RGF0YSlcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWQoKSB7XG4gICAgbGV0IGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcblxuICAgIGNvbnN0IGdyaWRPcHRpb25zID0ge1xuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVNYWluR3JpZERhdGFTb3VyY2UoKSxcbiAgICAgIGNvbHVtbkNob29zZXI6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWxsb3dTZWFyY2g6IHRydWUsXG4gICAgICAgIG1vZGU6ICdzZWxlY3QnXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBlZGl0aW5nOiB7XG4gICAgICAgIG1vZGU6ICdjZWxsJyxcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcbiAgICAgICAgcmVmcmVzaE1vZGU6ICdyZXBhaW50J1xuICAgICAgfSxcbiAgICAgIHJlcGFpbnRDaGFuZ2VzT25seTogdHJ1ZSxcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHtcbiAgICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgICAgcGFnaW5nOiB0cnVlLFxuICAgICAgICBncm91cGluZzogZmFsc2UsXG4gICAgICAgIHNvcnRpbmc6IGZhbHNlLFxuICAgICAgICBmaWx0ZXJpbmc6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgYWxsb3dDb2xsYXBzaW5nOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGdyb3VwUGFuZWw6IHtcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgbW9kZTogJ211bHRpcGxlJ1xuICAgICAgfSxcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogZmFsc2UsXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxuICAgICAgY29sdW1uQXV0b1dpZHRoOiBmYWxzZSxcbiAgICAgIHJvd0FsdGVybmF0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGNvbHVtbk1pbldpZHRoOiA4MCxcbiAgICAgIG9uUm93VXBkYXRpbmc6IChlKSA9PiB7XG4gICAgICAgIGlmICghZS5uZXdEYXRhIHx8ICFlLm9sZERhdGEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZFJvbGVzID0gZS5uZXdEYXRhLlJvbGVzO1xuICAgICAgICBjb25zdCBjdXJyZW50Um9sZXMgPSBlLm9sZERhdGEuUm9sZXM7XG5cbiAgICAgICAgY29uc3QgYWRkT2xkRGF0YVRvTmV3RGF0YSA9IChmaWVsZE5hbWU6IHN0cmluZywgbmV3RGF0YVNlY3Rpb24gPSBlLm5ld0RhdGEsIG9sZERhdGFTZWN0aW9uID0gZS5vbGREYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKCFuZXdEYXRhU2VjdGlvbi5oYXNPd25Qcm9wZXJ0eShmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICBuZXdEYXRhU2VjdGlvbltmaWVsZE5hbWVdID0gb2xkRGF0YVNlY3Rpb25bZmllbGROYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRSb2xlcyAmJiBjdXJyZW50Um9sZXMpIHtcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh1cGRhdGVkUm9sZXMpXG4gICAgICAgICAgICAuZm9yRWFjaCgocm9sZU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJvbGUgPSB1cGRhdGVkUm9sZXNbcm9sZU5hbWVdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Um9sZSA9IGN1cnJlbnRSb2xlc1tyb2xlTmFtZV07XG5cbiAgICAgICAgICAgICAgdXBkYXRlZFJvbGUuSWQgPSBjdXJyZW50Um9sZS5JZDtcblxuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZUNyZWF0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVJlYWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZVVwZGF0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xuICAgICAgICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdDYW5CZURlbGV0ZWQnLCB1cGRhdGVkUm9sZSwgY3VycmVudFJvbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdMYWJlbCcpO1xuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdPcmRlcicpO1xuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdUb29sVGlwJyk7XG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0lzRGVmYXVsdFZpZXdGaWVsZCcpO1xuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdJc0tleUNvbHVtbicpO1xuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdHcm91cEZpZWxkJyk7XG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0Rpc3BsYXlUeXBlJyk7XG4gICAgICAgIGFkZE9sZERhdGFUb05ld0RhdGEoJ0RhdGFPd25lcicpO1xuICAgICAgICBhZGRPbGREYXRhVG9OZXdEYXRhKCdYTFNTY2hlZHVsZUxhYmVsJyk7XG4gICAgICB9LFxuICAgICAgb25Sb3dVcGRhdGVkOiAoZSkgPT4ge1xuICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XG4gICAgICAgIGUuY29tcG9uZW50LnJlcGFpbnQoKTtcbiAgICAgIH0sXG4gICAgICBjb2x1bW5zOiB0aGlzLnByZXBhcmVNYWluR3JpZENvbHVtbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXG4gICAgICAgICAgY2FwdGlvbjogJ0ZpZWxkJyxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxuICAgICAgICAgIGZpeGVkOiB0cnVlLFxuICAgICAgICAgIGZpeGVkUG9zaXRpb246ICdsZWZ0JyxcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIHdpZHRoOiAxODAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhRmllbGQ6ICdHcm91cEZpZWxkJyxcbiAgICAgICAgICBjYXB0aW9uOiAnR3JvdXAnLFxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKS5keFNlbGVjdEJveCh7XG4gICAgICAgICAgICAgIHZhbHVlOiBjZWxsSW5mby52YWx1ZSxcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZTogWy4uLm5ldyBTZXQoZ3JpZC5nZXREYXRhU291cmNlKCkuaXRlbXMoKS5maWx0ZXIoKGkpID0+IGkuR3JvdXBGaWVsZCkubWFwKChpKSA9PiBpLkdyb3VwRmllbGQpLnNvcnQoKSldLFxuICAgICAgICAgICAgICBhY2NlcHRDdXN0b21WYWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZShlLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnTGFiZWwnLFxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICB3aWR0aDogMTgwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICB3aWR0aDogODAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhRmllbGQ6ICdEYXRhT3duZXInLFxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICB3aWR0aDogODAsXG4gICAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUoJ0RPJywgJ0RhdGEgT3duZXInKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnWExTU2NoZWR1bGVMYWJlbCcsXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxuICAgICAgICAgIHdpZHRoOiA4MCxcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnWExTJywgJ1hMUyBTY2hlZHVsZSBMYWJlbCcpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhRmllbGQ6ICdEaXNwbGF5VHlwZScsXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxuICAgICAgICAgIHdpZHRoOiAxNjAsXG4gICAgICAgICAgY3VzdG9taXplVGV4dDogKGNlbGxJbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNlbGxJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoY2VsbEluZm8udmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kaXNwbGF5VHlwZXNcbiAgICAgICAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBzZXR0aW5ncy50eXBlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVkaXRDZWxsVGVtcGxhdGU6IChfLCBjZWxsSW5mbykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGNlbGxJbmZvLnZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZXR0aW5ncyA/IHNldHRpbmdzLnR5cGUgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHNldHRpbmdzID8gc2V0dGluZ3MuZGF0YSA6IFtdO1xuXG4gICAgICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4RHJvcERvd25Cb3goe1xuICAgICAgICAgICAgICBkcm9wRG93bk9wdGlvbnM6IHsgd2lkdGg6IDQwMCB9LFxuICAgICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmRpc3BsYXlUeXBlcyxcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAna2V5JyxcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd2YWx1ZScsXG4gICAgICAgICAgICAgIHZhbHVlOiB0eXBlLFxuICAgICAgICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKGUudmFsdWUpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb250ZW50VGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkY29udGFpdGVyID0gJCgnPGRpdiAvPicpO1xuICAgICAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RvciA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkYm9keSA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW46IDhweCAwO1wiIC8+JykuYXBwZW5kVG8oJGNvbnRhaXRlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJ1dHRvbnMgPSAkKCc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCIgLz4nKS5hcHBlbmRUbygkY29udGFpdGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkc2F2ZUJ1dHRvbiA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDhweDtcIiAvPicpLmFwcGVuZFRvKCRidXR0b25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkY2FuY2VsQnV0dG9uID0gJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4O1wiIC8+JykuYXBwZW5kVG8oJGJ1dHRvbnMpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRvciA9IHR5cGVcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5nZXREaXNwbGF5VHlwZUVkaXRvcigkYm9keSwgdHlwZSwgZGF0YSlcbiAgICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICRib2R5Lmh0bWwoJycpO1xuICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlbmRlcigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICRzZWxlY3Rvci5keFNlbGVjdEJveCh7XG4gICAgICAgICAgICAgICAgICBpdGVtczogdGhpcy5kaXNwbGF5VHlwZXMsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcjogJ2tleScsXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmdldERpc3BsYXlUeXBlRWRpdG9yKCRib2R5LCBlLnZhbHVlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgJGJvZHkuaHRtbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgJHNhdmVCdXR0b24uZHhCdXR0b24oJ2luc3RhbmNlJykub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICRzYXZlQnV0dG9uLmR4QnV0dG9uKHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6ICdTYXZlJyxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhID0gZWRpdG9yLmdldERhdGEoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVkaXRvckRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJHNlbGVjdG9yLmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpLm9wdGlvbigndmFsdWUnKSxcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlZGl0b3JEYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgY2VsbEluZm8uY29tcG9uZW50LmNsb3NlRWRpdENlbGwoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5hcHBlbmRUbygkYnV0dG9ucyk7XG5cbiAgICAgICAgICAgICAgICAkY2FuY2VsQnV0dG9uLmR4QnV0dG9uKHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjZWxsSW5mby5jb21wb25lbnQuY2xvc2VFZGl0Q2VsbCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmFwcGVuZFRvKCRidXR0b25zKTtcblxuICAgICAgICAgICAgICAgICRjb250YWl0ZXIuZHhTY3JvbGxWaWV3KHtcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICRjb250YWl0ZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFGaWVsZDogJ0lzRGVmYXVsdFZpZXdGaWVsZCcsXG4gICAgICAgICAgY2FwdGlvbjogJ0Rpc3BsYXkgaW4gZGVmYXVsdCB2aWV3JyxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFGaWVsZDogJ0lzS2V5Q29sdW1uJyxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXG4gICAgICAgICAgd2lkdGg6IDE1MCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFGaWVsZDogJ09yZGVyJyxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxuICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdPcmRlciBjYW5cXCd0IGJlIG5lZ2F0aXZlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgd2lkdGg6IDgwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnV2lkdGgnLFxuICAgICAgICAgIGRhdGFUeXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnV2lkdGgnLCAnV2lkdGggKGluIHBpeGVscyknKSxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXG4gICAgICAgICAgZWRpdG9yT3B0aW9uczogeyBmb3JtYXQ6ICcjJyB9LFxuICAgICAgICAgIHZhbGlkYXRpb25SdWxlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxuICAgICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdXaWR0aCBjYW5cXCd0IGJlIGxlc3MgdGhlbiAxcHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICB3aWR0aDogODAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhRmllbGQ6ICdIaWRpbmdPcmRlcicsXG4gICAgICAgICAgZGF0YVR5cGU6ICdudW1iZXInLFxuICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdIaWRlJywgJ0hpZGluZyBPcmRlcicpLFxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7IGZvcm1hdDogJyMnIH0sXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdyYW5nZScsXG4gICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0hpZGluZyBvcmRlciBjYW5cXCd0IGJlIGxlc3MgdGhlbiAxJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgd2lkdGg6IDcwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnVG9vbFRpcCcsXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxuICAgICAgICAgIG1pbldpZHRoOiAxODBcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdSb2xlcycsXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxuICAgICAgICAgIGFsbG93SGlkaW5nOiBmYWxzZSxcbiAgICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxuICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY3JlYXRlUm9sZXNDb2x1bW5zKHRoaXMucm9sZXMpXG4gICAgICAgIH1cbiAgICAgIF0pLFxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucztcblxuICAgIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgICAgc3VtbWFyeUNvbHVtbjogJ05hbWUnXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmlzU3RhbmRhbG9uZVBhZ2UpIHtcbiAgICAgIGdyaWQgPSBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQodGhpcy4kY29udGFpbmVyLCBncmlkT3B0aW9ucywgYWRkaXRpb25hbE9wdGlvbnMsIHRoaXMucGFnZVRpdGxlLCAnJywgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZCh0aGlzLiRjb250YWluZXIsIHtcbiAgICAgICAgb3B0aW9uczogZ3JpZE9wdGlvbnMsXG4gICAgICAgIHN1bW1hcnlDb2x1bW46IGFkZGl0aW9uYWxPcHRpb25zLnN1bW1hcnlDb2x1bW4sXG4gICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBncmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlTWFpbkdyaWRDb2x1bW5zKGNvbHVtbnM6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdKSB7XG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2x1bW4uYWxsb3dIaWRpbmcgPT09IHVuZGVmaW5lZCB8fCBjb2x1bW4uYWxsb3dIaWRpbmcgPT09IG51bGwpIHtcbiAgICAgICAgY29sdW1uLmFsbG93SGlkaW5nID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2x1bW4uc2hvd0luQ29sdW1uQ2hvb3NlciA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID09PSBudWxsKSB7XG4gICAgICAgIGNvbHVtbi5zaG93SW5Db2x1bW5DaG9vc2VyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUm9sZXNDb2x1bW5zKHJvbGVzOiBzdHJpbmdbXSk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbltdIHtcbiAgICByZXR1cm4gcm9sZXNcbiAgICAgIC5tYXAoKHJvbGUpID0+ICh7XG4gICAgICAgIG5hbWU6IHJvbGUsXG4gICAgICAgIGNhcHRpb246IHJvbGUsXG4gICAgICAgIGFsbG93SGlkaW5nOiB0cnVlLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgdGhpcy5jcmVhdGVSb2xlc1Blcm1pc3Npb25Db2x1bW4ocm9sZSwgJ0NhbkJlUmVhZCcsIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxUZW1wbGF0ZTogY3JlYXRlSGVhZGVyQ2VsbFRlbXBsYXRlKCdSZWFkJywgJ1JlYWQnKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZXNQZXJtaXNzaW9uQ29sdW1uKHJvbGUsICdDYW5CZVVwZGF0ZWQnLCB7XG4gICAgICAgICAgICBoZWFkZXJDZWxsVGVtcGxhdGU6IGNyZWF0ZUhlYWRlckNlbGxUZW1wbGF0ZSgnRWRpdCcsICdFZGl0JylcbiAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJvbGVzUGVybWlzc2lvbkNvbHVtbihcbiAgICByb2xlOiBzdHJpbmcsIHBlcm1pc3Npb25OYW1lOiBzdHJpbmcsIGJhc2VDb2x1bW5PcHRpb25zPzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uXG4gICk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2VDb2x1bW5PcHRpb25zLFxuICAgICAgbmFtZTogYCR7cm9sZX1fJHtwZXJtaXNzaW9uTmFtZX1gLFxuICAgICAgZGF0YUZpZWxkOiBgUm9sZXMuJHtyb2xlfS4ke3Blcm1pc3Npb25OYW1lfWAsXG4gICAgICBhbGxvd0hpZGluZzogZmFsc2UsXG4gICAgICBzaG93SW5Db2x1bW5DaG9vc2VyOiBmYWxzZSxcbiAgICAgIGFsbG93SGVhZGVyRmlsdGVyaW5nOiBmYWxzZSxcbiAgICAgIGFsbG93RmlsdGVyaW5nOiBmYWxzZSxcbiAgICAgIG1pbldpZHRoOiA2MFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZSgpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydkYXRhU291cmNlJ10ge1xuICAgIHJldHVybiB7XG4gICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcbiAgICAgICAgbG9hZFVybDogdGhpcy5sb2FkRGF0YVVybCxcbiAgICAgICAgdXBkYXRlVXJsOiB0aGlzLnVwZGF0ZURhdGFVcmwsXG4gICAgICAgIGtleTogJ05hbWUnLFxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmNsYXNzIEljb25zQ29sdW1uRWRpdG9yIHtcbiAgcHJpdmF0ZSByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdO1xuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcblxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XG4gICAgICBkYXRhU291cmNlOiB0aGlzLmRhdGEsXG4gICAgICBlZGl0aW5nOiB7XG4gICAgICAgIG1vZGU6ICdyb3cnLFxuICAgICAgICBhbGxvd0FkZGluZzogdHJ1ZSxcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcbiAgICAgICAgdXNlSWNvbnM6IHRydWVcbiAgICAgIH0sXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgIGdyb3VwaW5nOiB7IGNvbnRleHRNZW51RW5hYmxlZDogZmFsc2UgfSxcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIG1vZGU6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhRmllbGQ6ICd0aXRsZScsXG4gICAgICAgICAgYWxsb3dFZGl0aW5nOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiAnaW1hZ2UnLFxuICAgICAgICAgIGFsbG93RWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6IChjb250YWluZXIsIGNlbGxEYXRhKSA9PiB7XG4gICAgICAgICAgICAkKCc8ZGl2PicpXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY2VsbERhdGEuZGF0YS5pbWFnZSB9KSlcbiAgICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlZGl0Q2VsbFRlbXBsYXRlOiAoXywgY2VsbEluZm8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltZyA9IGNlbGxJbmZvLnZhbHVlIHx8ICcnO1xuXG4gICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIgLz4nKTtcbiAgICAgICAgICAgIGNvbnN0ICRpbWcgPSAkKGA8aW1nIHNyYz1cIiR7aW1nfVwiIC8+YCk7XG4gICAgICAgICAgICBjb25zdCAkbGluayA9ICQoJzxhIGNsYXNzPVwiZHgtbGluayBkeC1pY29uLXVwbG9hZFwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMThweDtcIiAvPicpO1xuICAgICAgICAgICAgY29uc3QgJGZpbGVJbnB1dCA9ICQoJzxpbnB1dCB0eXBlPVwiZmlsZVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiIC8+Jyk7XG5cbiAgICAgICAgICAgICRsaW5rLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgJGZpbGVJbnB1dC5jbGljaygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRmaWxlSW5wdXQub24oJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICgoZS50YXJnZXQgYXMgYW55KS5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAkaW1nLmF0dHIoJ3NyYycsIChyZWFkZXIucmVzdWx0IGFzIHN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgY2VsbEluZm8uc2V0VmFsdWUoKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAoZS50YXJnZXQgYXMgYW55KS5maWxlc1swXTtcblxuICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJGltZy5hcHBlbmRUbygkY29udGFpbmVyKTtcbiAgICAgICAgICAgICRsaW5rLmFwcGVuZFRvKCRjb250YWluZXIpO1xuICAgICAgICAgICAgJGZpbGVJbnB1dC5hcHBlbmRUbygkY29udGFpbmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgJ2VkaXQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnRGVsZXRlJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpO1xuXG4gICAgICAgICAgICAgICAgKHJvd3MgYXMgYW55W10pLnNwbGljZShlLnJvdy5yb3dJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHJvd3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIGNvbnN0ICRncmlkID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcik7XG5cbiAgICB0aGlzLmdyaWQgPSBjcmVhdGVEZWZhdWx0R3JpZChcbiAgICAgICRncmlkLFxuICAgICAge1xuICAgICAgICBvcHRpb25zLFxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhKCk6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnKSBhcyBJSWNvbnNDb2x1bW5FZGl0b3JJdGVtW107XG4gIH1cbn1cblxuY2xhc3MgUHJlZGVmaW5lZFZhbHVlc0NvbHVtbkVkaXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IElQcmVkZWZpbmVkVmFsdWVzRWRpdG9ySXRlbVtdO1xuICBwcml2YXRlIGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcblxuICBjb25zdHJ1Y3RvcigkY29udGFpbmVyOiBKUXVlcnksIGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXSkge1xuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9uczogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXMgPSB7XG4gICAgICBkYXRhU291cmNlOiB0aGlzLmRhdGEsXG4gICAgICBlZGl0aW5nOiB7XG4gICAgICAgIG1vZGU6ICdyb3cnLFxuICAgICAgICBhbGxvd0FkZGluZzogdHJ1ZSxcbiAgICAgICAgYWxsb3dEZWxldGluZzogdHJ1ZSxcbiAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcbiAgICAgICAgdXNlSWNvbnM6IHRydWVcbiAgICAgIH0sXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgIGdyb3VwaW5nOiB7IGNvbnRleHRNZW51RW5hYmxlZDogZmFsc2UgfSxcbiAgICAgIGdyb3VwUGFuZWw6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IGZhbHNlIH0sXG4gICAgICBmaWx0ZXJSb3c6IHsgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIG1vZGU6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFGaWVsZDogJ3ZhbHVlJyxcbiAgICAgICAgICBhbGxvd0VkaXRpbmc6IHRydWUsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAnZWRpdCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdEZWxldGUnLFxuICAgICAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJyk7XG5cbiAgICAgICAgICAgICAgICAocm93cyBhcyBhbnlbXSkuc3BsaWNlKGUucm93LnJvd0luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgcm93cyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgY29uc3QgJGdyaWQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8odGhpcy4kY29udGFpbmVyKTtcblxuICAgIHRoaXMuZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKCRncmlkLCB7XG4gICAgICBvcHRpb25zLFxuICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGEoKTogSUljb25zQ29sdW1uRWRpdG9ySXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScpIGFzIElJY29uc0NvbHVtbkVkaXRvckl0ZW1bXTtcbiAgfVxufVxuXG5jbGFzcyBSYWJiaXRBY3Rpb25Db2x1bW5FZGl0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9yRGF0YTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0RGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckluaXREYXRhO1xuICBwcml2YXRlIGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtO1xuXG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXI6IEpRdWVyeSwgZGF0YTogSVJhYmJpdEFjdGlvbkVkaXRvckRhdGEsIGluaXREYXRhOiBJUmFiYml0QWN0aW9uRWRpdG9ySW5pdERhdGEpIHtcbiAgICB0aGlzLiRjb250YWluZXIgPSAkY29udGFpbmVyO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5pbml0RGF0YSA9IGluaXREYXRhO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICB0aGlzLmZvcm0gPSAkKCc8ZGl2IC8+JykuZHhGb3JtKHtcbiAgICAgIGZvcm1EYXRhOiB0aGlzLmRhdGEsXG4gICAgICBsYWJlbExvY2F0aW9uOiAndG9wJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhRmllbGQ6ICdhY3Rpb25UeXBlJyxcbiAgICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XG4gICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnXG4gICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFGaWVsZDogJ2ZpZWxkcycsXG4gICAgICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKGUudmFsdWUgYXMgYW55KS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1aXJlZCdcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhUYWdCb3gnLFxuICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2U6IHRoaXMuaW5pdERhdGEuZmllbGRzLFxuICAgICAgICAgICAgZGlzcGxheUV4cHI6ICdUZXh0JyxcbiAgICAgICAgICAgIHZhbHVlRXhwcjogJ1ZhbHVlJyxcbiAgICAgICAgICAgIHNlYXJjaEVuYWJsZWQ6IHRydWVcbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUYWdCb3hPcHRpb25zXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KS5hcHBlbmRUbyh0aGlzLiRjb250YWluZXIpLmR4Rm9ybSgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhKCk6IElSYWJiaXRBY3Rpb25FZGl0b3JEYXRhIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5mb3JtLnZhbGlkYXRlKCk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdhY3Rpb25UeXBlJykub3B0aW9uKCd2YWx1ZScpIGFzIHN0cmluZztcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZvcm0uZ2V0RWRpdG9yKCdmaWVsZHMnKS5vcHRpb24oJ3ZhbHVlJykgYXMgc3RyaW5nW107XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uVHlwZSxcbiAgICAgIGZpZWxkc1xuICAgIH07XG4gIH1cbn1cblxuKERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCBhcyBhbnkpLnJlZ2lzdGVyTW9kdWxlKCdjb2x1bW5DaG9vc2VyU29ydGluZycsIHtcbiAgZXh0ZW5kZXJzOiB7XG4gICAgY29udHJvbGxlcnM6IHtcbiAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgZ2V0Q2hvb3NlckNvbHVtbnMobG9hZEFsbENvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSAodGhpcyBhcyBhbnkpLmNhbGxCYXNlKGxvYWRBbGxDb2x1bW5zKTtcblxuICAgICAgICAgIHJldHVybiByZXN1bHQuc29ydCgoY29sdW1uMSwgY29sdW1uMikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjEgPSBjb2x1bW4xPy5jYXB0aW9uIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgY2FwdGlvbjIgPSBjb2x1bW4yPy5jYXB0aW9uIHx8ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbjEubG9jYWxlQ29tcGFyZShjYXB0aW9uMik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuIiwgIlx1RkVGRmNvbnN0IGFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsID0gKHByZXY6IGFueVtdIHwgbnVsbCwgbmV4dDogYW55W10gfCBudWxsKSA9PiB7XG4gIGlmIChwcmV2ID09PSBudWxsIHx8IG5leHQgPT09IG51bGwgfHwgcHJldi5sZW5ndGggIT09IG5leHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHByZXZbaV0gIT09IG5leHRbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBtZW1vaXplID0gPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZnVuYzogVCk6IFQgPT4ge1xuICBsZXQgbGFzdEFyZ3M6IGFueVtdIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0UmVzdWx0OiB1bmtub3duIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBvbmx5LWFycm93LWZ1bmN0aW9uc1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGlmICghYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwobGFzdEFyZ3MsIGFyZ3MpKSB7XG4gICAgICBsYXN0UmVzdWx0ID0gZnVuYyguLi5hcmdzIGFzIGFueSk7XG4gICAgfVxuXG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuXG4gICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gIH0gYXMgVDtcbn07XG4iLCAiXHVGRUZGLy8gdHNsaW50OmRpc2FibGU6IG1lbWJlci1vcmRlcmluZ1xuaW1wb3J0IHsgSUdyaWRTdGF0ZSB9IGZyb20gJy4vR3JpZFN0YXRlJztcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuLi8uLi8uLi9VdGlscy9NZW1vaXplJztcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlWaWV3IHtcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBncmlkU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xuICBpc0dsb2JhbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheVZpZXdEdG8ge1xuICBJZDogbnVtYmVyO1xuICBOYW1lOiBzdHJpbmc7XG4gIEdyaWRTdGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgSXNHbG9iYWw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRWaWV3c01hbmFnZXJPcHRpb25zIHtcbiAgLy8gcmVhZG9ubHkgZGVmYXVsdE9wZW5lZFZpZXdJZDogbnVtYmVyO1xuICBsb2FkRGF0YVVybDogc3RyaW5nO1xuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xufVxuXG50eXBlIENvbnRyb2xEaXNwbGF5Vmlld1VwZGF0ZXMgPSBQYXJ0aWFsPFBpY2s8SUNvbnRyb2xEaXNwbGF5VmlldywgJ25hbWUnIHwgJ2dyaWRTdGF0ZScgfCAnaXNHbG9iYWwnPj47XG5cbmV4cG9ydCBjbGFzcyBHcmlkVmlld3NNYW5hZ2VyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3OiBJQ29udHJvbERpc3BsYXlWaWV3ID0ge1xuICAgIGlkOiAwLFxuICAgIG5hbWU6ICdEZWZhdWx0JyxcbiAgICBncmlkU3RhdGU6IG51bGwsXG4gICAgaXNHbG9iYWw6IGZhbHNlXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFZpZXdzID0gW0dyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlld107XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2N1cnJlbnRWaWV3SWQ6IG51bWJlciA9IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcbiAgcHJpdmF0ZSB2aWV3czogSUNvbnRyb2xEaXNwbGF5Vmlld1tdID0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Vmlld3M7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZERhdGFVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGFVcmw6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGdldFZpZXdCeUlkSW50ZXJuYWwgPSAodmlld0lkOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cyAmJiB0aGlzLnZpZXdzLmZpbmQoKHYpID0+IHYuaWQgPT09IHZpZXdJZCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWaWV3QnlJZCA9IG1lbW9pemUodGhpcy5nZXRWaWV3QnlJZEludGVybmFsKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpIHtcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcbiAgICB0aGlzLmluc2VydERhdGFVcmwgPSBvcHRpb25zLmluc2VydERhdGFVcmw7XG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xuICAgIHRoaXMuZGVsZXRlRGF0YVVybCA9IG9wdGlvbnMuZGVsZXRlRGF0YVVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Vmlld0J5SWQodGhpcy5fY3VycmVudFZpZXdJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWaWV3SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWaWV3SWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGN1cnJlbnRWaWV3SWQoaWQ6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRWaWV3SWQgPSBpZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3cygpOiBQcm9taXNlPElDb250cm9sRGlzcGxheVZpZXdbXT4ge1xuICAgIGlmICh0aGlzLnZpZXdzID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRWaWV3cykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52aWV3cztcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50Vmlldyh2aWV3VXBkYXRlczogQ29udHJvbERpc3BsYXlWaWV3VXBkYXRlcykge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZpZXcodGhpcy5jdXJyZW50Vmlldy5pZCwgdmlld1VwZGF0ZXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5ld1ZpZXcodmlld05hbWU6IHN0cmluZywgZ3JpZFN0YXRlOiBJR3JpZFN0YXRlLCBpc0dsb2JhbCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5Vmlldz4ge1xuICAgIGxldCBuZXdWaWV3RHRvOiBJQ29udHJvbERpc3BsYXlWaWV3RHRvID0gdGhpcy5tYXBWaWV3TW9kZWxUb0R0byh7XG4gICAgICBpZDogLTEsXG4gICAgICBuYW1lOiB2aWV3TmFtZSxcbiAgICAgIGdyaWRTdGF0ZSxcbiAgICAgIGlzR2xvYmFsXG4gICAgfSk7XG5cbiAgICBuZXdWaWV3RHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5Vmlld0R0bz4odGhpcy5pbnNlcnREYXRhVXJsLCAnUE9TVCcsIG5ld1ZpZXdEdG8pO1xuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5tYXBWaWV3RHRvVG9Nb2RlbChuZXdWaWV3RHRvKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3KHZpZXdJZDogbnVtYmVyLCB1cGRhdGVzOiBDb250cm9sRGlzcGxheVZpZXdVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHZpZXdJZCA9PT0gR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0Vmlld0J5SWQodmlld0lkKTtcbiAgICBpZiAoIXZpZXcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkVmlldzogSUNvbnRyb2xEaXNwbGF5VmlldyA9IHtcbiAgICAgIC4uLnZpZXcsXG4gICAgICAuLi51cGRhdGVzXG4gICAgfTtcbiAgICBsZXQgdXBkYXRlZFZpZXdEdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8gPSB0aGlzLm1hcFZpZXdNb2RlbFRvRHRvKHVwZGF0ZWRWaWV3KTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgdXBkYXRlZFZpZXdEdG8gPSBhd2FpdCBzZW5kUmVxdWVzdDxJQ29udHJvbERpc3BsYXlWaWV3RHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLCB1cGRhdGVkVmlld0R0byk7XG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld3MoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZVZpZXcodmlld0lkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3QnlJZCh2aWV3SWQpO1xuICAgIGlmICghdmlldykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgdmlld0lkIH0pO1xuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdzKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFZpZXdzKCkge1xuICAgIGNvbnN0IHZpZXdzID0gYXdhaXQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb248SUNvbnRyb2xEaXNwbGF5Vmlld0R0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcblxuICAgIHRoaXMudmlld3MgPSB2aWV3cy5tYXAoKGR0bykgPT4gdGhpcy5tYXBWaWV3RHRvVG9Nb2RlbChkdG8pKTtcbiAgICB0aGlzLnZpZXdzLnVuc2hpZnQoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3KTtcbiAgICAvLyBOT1RFOiByZXNldCBtZW1vaXplXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0Vmlld0J5SWRGdW5jdGlvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMudmlld3M7XG4gIH1cblxuICBwcml2YXRlIG1hcFZpZXdNb2RlbFRvRHRvKG1vZGVsOiBJQ29udHJvbERpc3BsYXlWaWV3KTogSUNvbnRyb2xEaXNwbGF5Vmlld0R0byB7XG4gICAgcmV0dXJuIHtcbiAgICAgIElkOiBtb2RlbC5pZCxcbiAgICAgIE5hbWU6IG1vZGVsLm5hbWUsXG4gICAgICBHcmlkU3RhdGU6IEpTT04uc3RyaW5naWZ5KG1vZGVsLmdyaWRTdGF0ZSksXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBWaWV3RHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheVZpZXdEdG8pOiBJQ29udHJvbERpc3BsYXlWaWV3IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGR0by5JZCxcbiAgICAgIG5hbWU6IGR0by5OYW1lLFxuICAgICAgZ3JpZFN0YXRlOiBKU09OLnBhcnNlKGR0by5HcmlkU3RhdGUpLFxuICAgICAgaXNHbG9iYWw6IGR0by5Jc0dsb2JhbFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Q2FjaGVkUmVzdWx0T2ZHZXRWaWV3QnlJZEZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0Vmlld0J5SWQgPSBtZW1vaXplKHRoaXMuZ2V0Vmlld0J5SWRJbnRlcm5hbCk7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBJR3JpZFN0YXRlIH0gZnJvbSAnLi9HcmlkU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPbmVUaW1lR3JpZFN0YXRlTWFuYWdlck9wdGlvbnMge1xuICByZWFkb25seSBvd25lcjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xuICByZWFkb25seSBpbml0aWFsU3RhdGU6IElHcmlkU3RhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIge1xuICBwdWJsaWMgY3VycmVudFNhdmVkR3JpZFN0YXRlOiBJR3JpZFN0YXRlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSU9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJT25lVGltZUdyaWRTdGF0ZU1hbmFnZXJPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZSA9IG9wdGlvbnMuaW5pdGlhbFN0YXRlO1xuXG4gICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3RhdGVTdG9yaW5nJywge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgY3VzdG9tTG9hZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKVxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snc3RhdGVTdG9yaW5nJ10pO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNDaGFuZ2VzKCkge1xuICAgIC8vIFRPRE86IHVzZSBkZWVwIGVxdWFsXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlICE9PSBudWxsICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUpICE9PSBKU09OLnN0cmluZ2lmeShcbiAgICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFVuc2F2ZWRHcmlkU3RhdGUoKTogSUdyaWRTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZVVuc2F2ZWRHcmlkU3RhdGUodGhpcy5vcHRpb25zLm93bmVyLnN0YXRlKCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFwcGx5KGdyaWRTdGF0ZTogSUdyaWRTdGF0ZSB8IG51bGwsIHJlc2V0RmlsdGVyID0gdHJ1ZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RmlsdGVyID0gcmVzZXRGaWx0ZXIgPyB1bmRlZmluZWQgOiB0aGlzLm9wdGlvbnMub3duZXIuZmlsdGVyKCk7XG5cbiAgICAgIC8qIE5PVEU6IFNvbWV0aW1lcyBhIGdyaWQgY2FuIHJldHVybiBhIG5ldyBzdGF0ZSB3aXRoIG9sZCBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgc28gd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWx0ZXJWYWx1ZSBiZWZvcmUgc3RhdGUgYXBwbHlpbmdcbiAgICAgICAgaWYgdGhpcyBidWcgd2lsbCBiZSBmaXhlZCBvbiB0aGUgRGV2RXh0cmVtZSBzaWRlIHdlIGNhbiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAqL1xuICAgICAgdGhpcy5vcHRpb25zLm93bmVyLmJlZ2luVXBkYXRlKCk7XG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2xlYXJGaWx0ZXIoJ2ZpbHRlclZhbHVlJyk7XG5cbiAgICAgIHRoaXMub3B0aW9ucy5vd25lci5zdGF0ZShncmlkU3RhdGUpO1xuXG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMub3B0aW9ucy5vd25lci5nZXRWaXNpYmxlQ29sdW1ucygpLmZpbHRlcigoYykgPT4gIWMudHlwZSk7XG5cbiAgICAgIGlmICh2aXNpYmxlQ29sdW1uc1swXSAmJiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignc3VtbWFyeScsIHtcbiAgICAgICAgICB0b3RhbEl0ZW1zOiBbe1xuICAgICAgICAgICAgY29sdW1uOiB2aXNpYmxlQ29sdW1uc1swXS5kYXRhRmllbGQsXG4gICAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xuICAgICAgICAgIH1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50RmlsdGVyICYmIHRoaXMub3B0aW9ucy5vd25lci5maWx0ZXIoY3VycmVudEZpbHRlcik7XG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuZW5kVXBkYXRlKCk7XG5cbiAgICAgIGNvbnN0IG9uQ29udGVudFJlYWR5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLm9wdGlvbnMub3duZXIub2ZmKCdjb250ZW50UmVhZHknLCBvbkNvbnRlbnRSZWFkeSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIub24oJ2NvbnRlbnRSZWFkeScsIG9uQ29udGVudFJlYWR5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlKCkge1xuICAgIHRoaXMuY3VycmVudFNhdmVkR3JpZFN0YXRlID0gdGhpcy5jdXJyZW50VW5zYXZlZEdyaWRTdGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMub3duZXIuc3RhdGUodGhpcy5jdXJyZW50U2F2ZWRHcmlkU3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlVW5zYXZlZEdyaWRTdGF0ZSh1bnNhdmVkR3JpZFN0YXRlOiBJR3JpZFN0YXRlKTogSUdyaWRTdGF0ZSB7XG4gICAgaWYgKHVuc2F2ZWRHcmlkU3RhdGUuY29sdW1ucykge1xuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB1bnNhdmVkR3JpZFN0YXRlLmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKTtcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB2aXNpYmxlQ29sdW1uc1t2aXNpYmxlQ29sdW1ucy5sZW5ndGggLSAxXTtcbiAgICAgIGxhc3RDb2x1bW4ud2lkdGggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuc2F2ZWRHcmlkU3RhdGU7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NNYW5hZ2VyLCBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRWaWV3c01hbmFnZXInO1xuaW1wb3J0IHsgT25lVGltZUdyaWRTdGF0ZU1hbmFnZXIgfSBmcm9tICcuL0dyaWRTdGF0ZU1hbmFnZXInO1xuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XG5pbXBvcnQgeyBjcmVhdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL1BvcHVwJztcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucyB7XG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9uVmlld0FwcGxpZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IG9uVmlld0RlbGV0ZWQ/OiAodmlld0lkOiBudW1iZXIpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IGNhbkNyZWF0ZUdsb2JhbFZpZXdzOiBib29sZWFuO1xuICByZWFkb25seSB2aXNpYmxlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XG4gIHJlYWRvbmx5IGdyaWRTdGF0ZU1hbmFnZXI6IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyO1xuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zID1cbiAgTXV0YWJsZTxPbWl0PElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50T3B0aW9ucywga2V5b2YgSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+ICZcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50RGVmYXVsdE9wdGlvbnM+PjtcblxuZXhwb3J0IGNsYXNzIEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xuICAvLyB0b29sYmFyIGl0ZW1zXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfdmlld3NUb29sYmFySXRlbTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHwgdW5kZWZpbmVkO1xuICAvLyB0c2xpbnQ6ZW5hYmxlIHZhcmlhYmxlLW5hbWVcblxuICAvLyB0b29sYmFyIHdpZGdldHNcbiAgcHJpdmF0ZSB2aWV3c0Ryb3Bkb3duQm94OiBEZXZFeHByZXNzLnVpLmR4U2VsZWN0Qm94IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHZpZXdzRGF0YUdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjdXJyZW50Vmlld1RpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzYXZlVmlld0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzYXZlVmlld0FzQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbHVtbkNob29zZXJCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZ3JpZFN0YXRlTWFuYWdlcjogb3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyID8gb3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyIDogbmV3IE9uZVRpbWVHcmlkU3RhdGVNYW5hZ2VyKHtcbiAgICAgICAgb3duZXI6IG9wdGlvbnMub3duZXIsXG4gICAgICAgIGluaXRpYWxTdGF0ZTogbnVsbFxuICAgICAgfSksXG4gICAgICBncmlkVmlld3NNYW5hZ2VyOiBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgPyBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXIgOiBuZXcgR3JpZFZpZXdzTWFuYWdlcihvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zKSxcbiAgICAgIGF1dG9JbnRlZ3JhdGlvbjogKG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IG51bGwpXG4gICAgICAgID8gb3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gOiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMub3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gJiYgdGhpcy5pbnRlZ3JhdGVUb0dyaWQodGhpcy5vcHRpb25zLm93bmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cnlBcHBseVZpZXcodmlld0lkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpc0NhbkJlVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm1DaGFuZ2VzTG9zcygpO1xuXG4gICAgaWYgKGlzQ2FuQmVWaWV3QXBwbGllZCkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcodmlld0lkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNDYW5CZVZpZXdBcHBsaWVkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFwcGx5Vmlldyh2aWV3SWQ6IG51bWJlcikge1xuICAgIHRoaXMuYmVnaW5WaWV3QXBwbHlpbmdMb2FkaW5nKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID0gdmlld0lkO1xuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmFwcGx5KHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3LmdyaWRTdGF0ZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5lbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCk7XG4gICAgdGhpcy5zeW5jVUlXaXRoQ3VycmVudFZpZXcoKTtcblxuICAgIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkICYmIHRoaXMub3B0aW9ucy5vblZpZXdBcHBsaWVkKHZpZXdJZCk7XG5cbiAgfVxuXG4gIHByaXZhdGUgaW50ZWdyYXRlVG9HcmlkKGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xuXG4gICAgZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycsIChlOiBhbnkpID0+IHtcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xuICAgICAgdGhpcy5vbkdyaWRUb29sYmFyUHJlcGFyaW5nKGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkdyaWRUb29sYmFyUHJlcGFyaW5nOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zWydvblRvb2xiYXJQcmVwYXJpbmcnXSA9IChlKSA9PiB7XG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xuICAgIGlmICghdG9vbGJhckl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVEZWZhdWx0Q29sdW1uQ2hvb3NlckJ1dHRvbih0b29sYmFySXRlbXMpO1xuXG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSgxLCAwLFxuICAgICAgdGhpcy52aWV3c1Rvb2xiYXJJdGVtLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURlZmF1bHRDb2x1bW5DaG9vc2VyQnV0dG9uKHRvb2xiYXJJdGVtczogQXJyYXk8eyBuYW1lPzogc3RyaW5nIH0+KSB7XG4gICAgdG9vbGJhckl0ZW1zLnNwbGljZSh0b29sYmFySXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdjb2x1bW5DaG9vc2VyQnV0dG9uJyksIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmlld3NUb29sYmFySXRlbSgpIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdzVG9vbGJhckl0ZW0pIHtcbiAgICAgIHRoaXMuX3ZpZXdzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmlld3NUb29sYmFySXRlbTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzRGVmYXVsdFZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgPT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50VmlldztcbiAgICBpZiAoIXRoaXMuY3VycmVudFZpZXdUaXRsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScpICE9PSBjdXJyZW50Vmlldy5uYW1lIHx8IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmhhc0NoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZpZXdzVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtIHtcbiAgICBsZXQgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcblxuICAgIHJldHVybiB7XG4gICAgICB3aWRnZXQ6ICdkeERyb3BEb3duQm94JyBhcyBhbnksXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcbiAgICAgIHRleHQ6ICdWaWV3cycsXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcbiAgICAgIGNzc0NsYXNzOiAnYXBzLXZpZXdzX190b29sYmFyLWl0ZW0nLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9LFxuICAgICAgICBpdGVtczogW0dyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlld10sXG4gICAgICAgIHZhbHVlOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQsXG4gICAgICAgIHZhbHVlRXhwcjogJ2lkJyxcbiAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJyxcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgZHJvcERvd25PcHRpb25zOiB7XG4gICAgICAgICAgd2lkdGg6IDU1MFxuICAgICAgICB9LFxuICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMudmlld3NEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xuICAgICAgICAgIHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUudmFsdWUgPT09IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgfHwgIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzVmlld0FwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5VmlldyhlLnZhbHVlKTtcbiAgICAgICAgICBpZiAoaXNWaWV3QXBwbGllZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc3luY1VJV2l0aEN1cnJlbnRWaWV3KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBjb250ZW50VGVtcGxhdGU6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZCA9IHRoaXMuY3JlYXRlVmlld3NEYXRhR3JpZChlLmNvbXBvbmVudCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50Vmlld1RpdGxlKGUuY29tcG9uZW50KTtcbiAgICAgICAgICB0aGlzLnNhdmVWaWV3QnV0dG9uID0gdGhpcy5jcmVhdGVTYXZlVmlld0J1dHRvbigpO1xuICAgICAgICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiA9IHRoaXMuY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpO1xuICAgICAgICAgIHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbiA9IHRoaXMuY3JlYXRlQ29sdW1uQ2hvb3NlckJ1dHRvbigpO1xuXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19faGVhZGVyJylcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50Vmlld1RpdGxlLmVsZW1lbnQoKSlcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlVmlld0J1dHRvbi5lbGVtZW50KCkpXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuc2F2ZVZpZXdBc0J1dHRvbi5lbGVtZW50KCkpXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMuY29sdW1uQ2hvb3NlckJ1dHRvbi5lbGVtZW50KCkpO1xuXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpXG4gICAgICAgICAgICAuaGVpZ2h0KCcxMDAlJylcbiAgICAgICAgICAgIC5hcHBlbmQoZHJvcGRvd25Db250ZW50SGVhZGVyKVxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLnZpZXdzRGF0YUdyaWQuZWxlbWVudCgpKTtcblxuICAgICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWaWV3c0RhdGFHcmlkKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxuICAgICAgLmR4RGF0YUdyaWQoe1xuICAgICAgICBkYXRhU291cmNlOiBkcm9wZG93bkJveE93bmVyLmdldERhdGFTb3VyY2UoKSxcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXG4gICAgICAgIGVkaXRpbmc6IHtcbiAgICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogdHJ1ZSxcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0cnVlLFxuICAgICAgICAgIG1vZGU6ICdjZWxsJyxcbiAgICAgICAgICB1c2VJY29uczogdHJ1ZSxcbiAgICAgICAgICB0ZXh0czoge1xuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgdmlldz8nXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvYWRQYW5lbDoge1xuICAgICAgICAgIHNoYWRpbmc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ25hbWUnLFxuICAgICAgICAgICAgYWxsb3dFZGl0aW5nOiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgd2lkdGg6IDcwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXG4gICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoZSkgPT4gZS5yb3cgJiYgZS5yb3cua2V5ICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXG4gICAgICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnc2luZ2xlJyB9LFxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gdmlld3MnLFxuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgICAgZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3ZhbHVlJywgZS5zZWxlY3RlZFJvd0tleXMgJiYgZS5zZWxlY3RlZFJvd0tleXMubGVuZ3RoID8gZS5zZWxlY3RlZFJvd0tleXNbMF0gOiAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuZGF0YUZpZWxkID09PSAnaXNHbG9iYWwnKSB7XG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbFZpZXdzO1xuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLnZpc2libGUgPSBlLnJvdy5kYXRhLmlkICE9PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gYXN5bmMgKG9wdCkgPT4ge1xuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZVZpZXcoZS5yb3cuZGF0YS5pZCwgeyBpc0dsb2JhbDogb3B0LnZhbHVlIH0pO1xuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5lbmRDdXN0b21Mb2FkaW5nKCk7XG5cbiAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZWQob3B0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkNlbGxQcmVwYXJlZDogKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5jb2x1bW4udHlwZSAhPT0gJ2J1dHRvbnMnIHx8ICFlLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gIWUuZGF0YS5pc0dsb2JhbFxuICAgICAgICAgICAgfHwgKGUuZGF0YS5pc0dsb2JhbCAmJiB0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsVmlld3MpO1xuXG4gICAgICAgICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGUuY2VsbEVsZW1lbnQuY2hpbGRyZW4oKSkuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAkKGMpLmNzcyh7XG4gICAgICAgICAgICAgICAgY29sb3I6ICcjZGRkICFpbXBvcnRhbnQnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXG4gICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcbiAgICAgICAgICBpZiAoIWUua2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5kZWxldGVWaWV3KGUua2V5KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDdXJyZW50Vmlld1RpdGxlKGRyb3Bkb3duQm94T3duZXI6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveCk6IERldkV4cHJlc3MudWkuZHhUZXh0Qm94IHtcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fY3VycmVudC12aWV3IGlzem9sZWEtbWQnKVxuICAgICAgLmR4VGV4dEJveCh7XG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxuICAgICAgICByZWFkT25seTogdGhpcy5pc0RlZmF1bHRWaWV3XG4gICAgICB9KVxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxuICAgICAgLmFkZENsYXNzKCdhcHMtdmlld3NfX3NhdmUtdmlldyBpc3pvbGVhLW1kJylcbiAgICAgIC5keEJ1dHRvbih7XG4gICAgICAgIHRleHQ6ICdTYXZlJyxcbiAgICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGVmYXVsdFZpZXcsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuc2F2ZS5iaW5kKHRoaXMpLFxuICAgICAgICBpY29uOiAnc2F2ZScsXG4gICAgICAgIHdpZHRoOiA4N1xuICAgICAgfSlcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdBc0J1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy12aWV3c19fc2F2ZS12aWV3LWFzIGlzem9sZWEtbWQnKVxuICAgICAgLmR4QnV0dG9uKHtcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcbiAgICAgICAgb25DbGljazogdGhpcy5jcmVhdGVTYXZlQXNEaWFsb2cuYmluZCh0aGlzKSxcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxuICAgICAgICB3aWR0aDogMTE4XG4gICAgICB9KVxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5DaG9vc2VyQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xuICAgIHJldHVybiAkKCc8YnV0dG9uIC8+JylcbiAgICAgIC5hZGRDbGFzcygnYXBzLXZpZXdzX19jb2x1bW4tY2hvb3NlciBpc3pvbGVhLW1kJylcbiAgICAgIC5keEJ1dHRvbih7XG4gICAgICAgIG9uQ2xpY2s6IHRoaXMub3BlbkNvbHVtbkNob29zZXIuYmluZCh0aGlzKSxcbiAgICAgICAgaWNvbjogJ2NvbHVtbi1jaG9vc2VyJ1xuICAgICAgfSlcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUFzRGlhbG9nKCkge1xuICAgIGNvbnN0ICRwb3B1cENvbnRlbnQgPSAkKCc8ZGl2IC8+Jyk7XG5cbiAgICBjb25zdCBkaWFsb2dDb250ZW50RWxlbWVudCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIiAvPicpLmR4VGV4dEJveCh7XG4gICAgICBwbGFjZWhvbGRlcjogJ1ZpZXcgTmFtZScsXG4gICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXG4gICAgfSkuZHhWYWxpZGF0b3Ioe1xuICAgICAgdmFsaWRhdGlvblJ1bGVzOiBbXG4gICAgICAgIHsgdHlwZTogJ3JlcXVpcmVkJyB9LFxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IHZpZXdOYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcbiAgICBjb25zdCB2aWV3TmFtZVRleHRCb3hWYWxpZGF0b3IgPSBkaWFsb2dDb250ZW50RWxlbWVudC5keFZhbGlkYXRvcignaW5zdGFuY2UnKTtcblxuICAgIHZpZXdOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XG5cbiAgICBjb25zdCB2aWV3SXNHbG9iYWxDaGVja2JveCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCIgLz4nKVxuICAgICAgLmR4Q2hlY2tCb3goe1xuICAgICAgICB0ZXh0OiAnR2xvYmFsIHZpZXcnLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3c1xuICAgICAgfSlcbiAgICAgIC5keENoZWNrQm94KCdpbnN0YW5jZScpO1xuXG4gICAgdmlld0lzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRwb3B1cENvbnRlbnQpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZURpYWxvZyhcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IFZpZXcnLFxuICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgbWF4V2lkdGg6ICczMDBweCcsXG4gICAgICB9LFxuICAgICAgJHBvcHVwQ29udGVudCxcbiAgICAgIHtcbiAgICAgICAgdGV4dDogJ09rJyxcbiAgICAgICAgb25DbGljazogYXN5bmMgKGNsb3NlUG9wdXApID0+IHtcbiAgICAgICAgICBpZiAoIXZpZXdOYW1lVGV4dEJveFZhbGlkYXRvci52YWxpZGF0ZSgpLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVBcyh2aWV3TmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpLCB2aWV3SXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJykpO1xuICAgICAgICAgIGNsb3NlUG9wdXAoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICBvbkNsaWNrOiAoY2xvc2VQb3B1cCkgPT4gY2xvc2VQb3B1cCgpXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkNvbHVtbkNob29zZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLm93bmVyLnNob3dDb2x1bW5DaG9vc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCkge1xuICAgIGlmICghdGhpcy52aWV3c0Ryb3Bkb3duQm94KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3MgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xuICAgICAga2V5OiAnaWQnLFxuICAgICAgZGF0YTogdmlld3NcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XG4gICAgdGhpcy52aWV3c0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkKTtcbiAgICB0aGlzLnZpZXdzRGF0YUdyaWQgJiYgdGhpcy52aWV3c0RhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlKCkge1xuICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLnVwZGF0ZUN1cnJlbnRWaWV3KHtcbiAgICAgIG5hbWU6IHRoaXMuY3VycmVudFZpZXdUaXRsZS5vcHRpb24oJ3ZhbHVlJyksXG4gICAgICBncmlkU3RhdGU6IHRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyLmN1cnJlbnRTYXZlZEdyaWRTdGF0ZVxuICAgIH0pO1xuXG4gICAgbm90aWZ5KCdTYXZlZCcsIHRydWUpO1xuXG4gICAgYXdhaXQgdGhpcy5sb2FkVmlld0Ryb3Bkb3duQm94RGF0YSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlQXModmlld05hbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkU3RhdGVNYW5hZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuc2F2ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZWRWaWV3ID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuY3JlYXRlTmV3VmlldyhcbiAgICAgIHZpZXdOYW1lLFxuICAgICAgdGhpcy5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlLFxuICAgICAgaXNHbG9iYWxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMubG9hZFZpZXdEcm9wZG93bkJveERhdGEoKTtcbiAgICBhd2FpdCB0aGlzLmFwcGx5Vmlldyh1cGRhdGVkVmlldy5pZCk7XG5cbiAgICBub3RpZnkoJ1ZpZXcgaXMgY3JlYXRlZCcsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVWaWV3KHZpZXdJZDogbnVtYmVyKSB7XG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRWaWV3c01hbmFnZXIuZGVsZXRlVmlldyh2aWV3SWQpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMub25WaWV3RGVsZXRlZCkge1xuICAgICAgdGhpcy5vcHRpb25zLm9uVmlld0RlbGV0ZWQodmlld0lkKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvYWRWaWV3RHJvcGRvd25Cb3hEYXRhKCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQgIT09IEdyaWRWaWV3c01hbmFnZXIuZGVmYXVsdENvbnRyb2xEaXNwbGF5Vmlldy5pZCkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJlZ2luVmlld0FwcGx5aW5nTG9hZGluZygpIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0cnVlKTtcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgIHRoaXMuc2F2ZVZpZXdBc0J1dHRvbiAmJiB0aGlzLnNhdmVWaWV3QXNCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgIHRoaXMudmlld3NEYXRhR3JpZCAmJiB0aGlzLnZpZXdzRGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBcHBseWluZy4uLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRWaWV3QXBwbHlpbmdMb2FkaW5nKCkge1xuICAgIHRoaXMuY3VycmVudFZpZXdUaXRsZSAmJiB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCdyZWFkT25seScsIGZhbHNlKTtcbiAgICB0aGlzLnNhdmVWaWV3QnV0dG9uICYmIHRoaXMuc2F2ZVZpZXdCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICB0aGlzLnNhdmVWaWV3QXNCdXR0b24gJiYgdGhpcy5zYXZlVmlld0FzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCBmYWxzZSk7XG4gICAgdGhpcy52aWV3c0RhdGFHcmlkICYmIHRoaXMudmlld3NEYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNVSVdpdGhDdXJyZW50VmlldyhpZ25vcmVDdXJyZW50Vmlld1RpdGxlID0gZmFsc2UpIHtcbiAgICBpZiAoIWlnbm9yZUN1cnJlbnRWaWV3VGl0bGUgJiYgdGhpcy5jdXJyZW50Vmlld1RpdGxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3VGl0bGUub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3Lm5hbWUpO1xuICAgICAgdGhpcy5jdXJyZW50Vmlld1RpdGxlLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLmlzRGVmYXVsdFZpZXcpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdzRHJvcGRvd25Cb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy52aWV3c0RhdGFHcmlkKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkID09PSBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWQpIHtcbiAgICAgICAgICB0aGlzLnZpZXdzRGF0YUdyaWQuc2VsZWN0Um93c0J5SW5kZXhlcyhbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlld3NEYXRhR3JpZC5zZWxlY3RSb3dzKFt0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG5cbiAgICBjb25zdCBpc0dsb2JhbFZpZXcgPSB0aGlzLm9wdGlvbnMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlldy5pc0dsb2JhbFxuICAgICAgJiYgIXRoaXMub3B0aW9ucy5jYW5DcmVhdGVHbG9iYWxWaWV3cztcblxuICAgIHRoaXMuc2F2ZVZpZXdCdXR0b24gJiYgdGhpcy5zYXZlVmlld0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgdGhpcy5pc0RlZmF1bHRWaWV3IHx8IGlzR2xvYmFsVmlldyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xuICAgICk7XG4gIH1cbn1cbiIsICJcdUZFRkYvLyB0c2xpbnQ6ZGlzYWJsZTogbWVtYmVyLW9yZGVyaW5nXG5pbXBvcnQgeyBzZW5kUmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL0RhdGEvUmVxdWVzdCc7XG5pbXBvcnQgbG9hZFdpdGhNdWx0aXBsZVByb3RlY3Rpb24gZnJvbSAnLi4vLi4vLi4vRGF0YS9Mb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbic7XG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnLi4vLi4vLi4vVXRpbHMvTWVtb2l6ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5RmlsdGVyIHtcbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzR2xvYmFsOiBib29sZWFuO1xuICByZWFkb25seSBmaWx0ZXJTdGF0ZTogYW55IHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIElDb250cm9sRGlzcGxheUZpbHRlckR0byB7XG4gIElkOiBudW1iZXI7XG4gIE5hbWU6IHN0cmluZztcbiAgSXNEZWZhdWx0OiBib29sZWFuO1xuICBJc0dsb2JhbDogYm9vbGVhbjtcbiAgRmlsdGVyU3RhdGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMge1xuICAvLyByZWFkb25seSBkZWZhdWx0T3BlbmVkRmlsdGVySWQ6IG51bWJlcjtcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XG4gIGRlbGV0ZURhdGFVcmw6IHN0cmluZztcbn1cblxudHlwZSBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMgPSBQYXJ0aWFsPFBpY2s8SUNvbnRyb2xEaXNwbGF5RmlsdGVyLCAnbmFtZScgfCAnZmlsdGVyU3RhdGUnIHwgJ2lzR2xvYmFsJz4+O1xuXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuICBwcml2YXRlIF9jdXJyZW50RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmaWx0ZXJzOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJbXSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGdldEZpbHRlckJ5SWRJbnRlcm5hbCA9IChmaWx0ZXJJZDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMuZmluZCgodikgPT4gdi5pZCA9PT0gZmlsdGVySWQpO1xuICB9XG4gIHByaXZhdGUgZ2V0RmlsdGVyQnlJZCA9IG1lbW9pemUodGhpcy5nZXRGaWx0ZXJCeUlkSW50ZXJuYWwpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRmlsdGVyc01hbmFnZXJPcHRpb25zKSB7XG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XG4gICAgdGhpcy5pbnNlcnREYXRhVXJsID0gb3B0aW9ucy5pbnNlcnREYXRhVXJsO1xuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcbiAgICB0aGlzLmRlbGV0ZURhdGFVcmwgPSBvcHRpb25zLmRlbGV0ZURhdGFVcmw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyQnlJZCh0aGlzLl9jdXJyZW50RmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50RmlsdGVySWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY3VycmVudEZpbHRlcklkKGlkOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVySWQgPSBpZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRGaWx0ZXJzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5RmlsdGVyW10+IHtcbiAgICBpZiAoIXRoaXMuZmlsdGVycykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ3VycmVudEZpbHRlcihmaWx0ZXJVcGRhdGVzOiBDb250cm9sRGlzcGxheUZpbHRlclVwZGF0ZXMpIHtcbiAgICByZXR1cm4gISF0aGlzLmN1cnJlbnRGaWx0ZXIgJiYgdGhpcy51cGRhdGVGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyLmlkLCBmaWx0ZXJVcGRhdGVzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoZmlsdGVyTmFtZTogc3RyaW5nLCBmaWx0ZXJTdGF0ZTogYW55LCBpc0RlZmF1bHQ6IGJvb2xlYW4sIGlzR2xvYmFsOiBib29sZWFuKVxuICAgIDogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlGaWx0ZXI+IHtcbiAgICBsZXQgbmV3RmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8oe1xuICAgICAgaWQ6IC0xLFxuICAgICAgbmFtZTogZmlsdGVyTmFtZSxcbiAgICAgIGlzRGVmYXVsdCxcbiAgICAgIGlzR2xvYmFsLFxuICAgICAgZmlsdGVyU3RhdGVcbiAgICB9KTtcblxuICAgIG5ld0ZpbHRlckR0byA9IGF3YWl0IHNlbmRSZXF1ZXN0PElDb250cm9sRGlzcGxheUZpbHRlckR0bz4odGhpcy5pbnNlcnREYXRhVXJsLFxuICAgICAgJ1BPU1QnLCBuZXdGaWx0ZXJEdG8pO1xuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcnMoKTtcblxuICAgIHJldHVybiB0aGlzLm1hcEZpbHRlckR0b1RvTW9kZWwobmV3RmlsdGVyRHRvKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgdXBkYXRlczogQ29udHJvbERpc3BsYXlGaWx0ZXJVcGRhdGVzKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRGaWx0ZXJCeUlkKGZpbHRlcklkKTtcbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRGaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlciA9IHtcbiAgICAgIC4uLmZpbHRlcixcbiAgICAgIC4uLnVwZGF0ZXNcbiAgICB9O1xuICAgIGxldCB1cGRhdGVkRmlsdGVyRHRvOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8gPSB0aGlzLm1hcEZpbHRlck1vZGVsVG9EdG8odXBkYXRlZEZpbHRlcik7XG5cbiAgICB1cGRhdGVkRmlsdGVyRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5RmlsdGVyRHRvPih0aGlzLnVwZGF0ZURhdGFVcmwsXG4gICAgICAnUFVUJywgdXBkYXRlZEZpbHRlckR0byk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVycygpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlckJ5SWQoZmlsdGVySWQpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXdhaXQgc2VuZFJlcXVlc3QodGhpcy5kZWxldGVEYXRhVXJsLCAnREVMRVRFJywgeyBmaWx0ZXJJZCB9KTtcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJzKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZpbHRlcnMoKSB7XG4gICAgY29uc3QgZmlsdGVycyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheUZpbHRlckR0b1tdPih0aGlzLmxvYWREYXRhVXJsKTtcblxuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnMubWFwKChkdG8pID0+IHRoaXMubWFwRmlsdGVyRHRvVG9Nb2RlbChkdG8pKTtcbiAgICAvLyBOT1RFOiByZXNldCBtZW1vaXplXG4gICAgdGhpcy5yZXNldENhY2hlZFJlc3VsdE9mR2V0RmlsdGVyQnlJZEZ1bmN0aW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBGaWx0ZXJNb2RlbFRvRHRvKG1vZGVsOiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpOiBJQ29udHJvbERpc3BsYXlGaWx0ZXJEdG8ge1xuICAgIHJldHVybiB7XG4gICAgICBJZDogbW9kZWwuaWQsXG4gICAgICBOYW1lOiBtb2RlbC5uYW1lLFxuICAgICAgSXNEZWZhdWx0OiBtb2RlbC5pc0RlZmF1bHQsXG4gICAgICBJc0dsb2JhbDogbW9kZWwuaXNHbG9iYWwsXG4gICAgICBGaWx0ZXJTdGF0ZTogSlNPTi5zdHJpbmdpZnkobW9kZWwuZmlsdGVyU3RhdGUpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwRmlsdGVyRHRvVG9Nb2RlbChkdG86IElDb250cm9sRGlzcGxheUZpbHRlckR0byk6IElDb250cm9sRGlzcGxheUZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkdG8uSWQsXG4gICAgICBuYW1lOiBkdG8uTmFtZSxcbiAgICAgIGlzRGVmYXVsdDogZHRvLklzRGVmYXVsdCB8fCBmYWxzZSxcbiAgICAgIGlzR2xvYmFsOiBkdG8uSXNHbG9iYWwgfHwgZmFsc2UsXG4gICAgICBmaWx0ZXJTdGF0ZTogSlNPTi5wYXJzZShkdG8uRmlsdGVyU3RhdGUpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRDYWNoZWRSZXN1bHRPZkdldEZpbHRlckJ5SWRGdW5jdGlvbigpIHtcbiAgICB0aGlzLmdldEZpbHRlckJ5SWQgPSBtZW1vaXplKHRoaXMuZ2V0RmlsdGVyQnlJZEludGVybmFsKTtcbiAgfVxufVxuIiwgIlx1RkVGRmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciwgSUNvbnRyb2xEaXNwbGF5RmlsdGVyLCBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcbmltcG9ydCB7IENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB9IGZyb20gJy4vQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyJztcbmltcG9ydCBub3RpZnkgZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Ob3RpZnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zIHtcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XG4gIHJlYWRvbmx5IGFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlcjogQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyO1xuICByZWFkb25seSBhdXRvSW50ZWdyYXRpb246IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9uRmlsdGVyQXBwbGllZD86IChmaWx0ZXJJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkZpbHRlckRlbGV0ZWQ/OiAoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgY2FuQ3JlYXRlR2xvYmFsRmlsdGVyczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmlzaWJsZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xuICByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xufVxuXG50eXBlIE11dGFibGU8VD4gPSB7XG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXTtcbn07XG5cbmV4cG9ydCB0eXBlIEdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMgPVxuICBNdXRhYmxlPE9taXQ8SUdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudE9wdGlvbnMsIGtleW9mIElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+ICZcbiAgTXV0YWJsZTxQYXJ0aWFsPElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnREZWZhdWx0T3B0aW9ucz4+O1xuXG5leHBvcnQgY2xhc3MgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IElHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnRPcHRpb25zO1xuICAvLyB0b29sYmFyIGl0ZW1zXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfZmlsdGVyc1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XG4gIC8vIHRzbGludDplbmFibGUgdmFyaWFibGUtbmFtZVxuXG4gIC8vIHRvb2xiYXIgd2lkZ2V0c1xuICBwcml2YXRlIGZpbHRlcnNEcm9wZG93bkJveDogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZpbHRlcnNEYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGN1cnJlbnRGaWx0ZXJUaXRsZTogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbmV3RmlsdGVyQnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHwgdW5kZWZpbmVkO1xuICAvLyB3aWRnZXRzXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcbiAgcHJpdmF0ZSBfZmlsdGVyUG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmaWx0ZXJOYW1lVGV4dEJveDogRGV2RXhwcmVzcy51aS5keFRleHRCb3ggfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmlsdGVyQnVpbGRlcjogRGV2RXhwcmVzcy51aS5keEZpbHRlckJ1aWxkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3I6IERldkV4cHJlc3MudWkuZHhGaWx0ZXJCdWlsZGVyO1xuICBwcml2YXRlIGZpbHRlcklzR2xvYmFsQ2hlY2tib3g6IERldkV4cHJlc3MudWkuZHhDaGVja0JveCB8IHVuZGVmaW5lZDtcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgaXNJbkZpbHRlckFwcGx5aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50T3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBncmlkRmlsdGVyc01hbmFnZXI6IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyXG4gICAgICAgID8gb3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXJcbiAgICAgICAgOiBuZXcgR3JpZEZpbHRlcnNNYW5hZ2VyKG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyksXG4gICAgICBhdXRvSW50ZWdyYXRpb246IChvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYXV0b0ludGVncmF0aW9uICE9PSBudWxsKVxuICAgICAgICA/IG9wdGlvbnMuYXV0b0ludGVncmF0aW9uIDogdHJ1ZVxuICAgIH07XG5cbiAgICB0aGlzLm9wdGlvbnMuYXV0b0ludGVncmF0aW9uICYmIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XG4gICAgdGhpcy5maWx0ZXJFeHByZXNzaW9uQ2FsY3VsYXRvciA9ICQoJzxkaXYgLz4nKVxuICAgICAgLmR4RmlsdGVyQnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3QodGhpcy5vcHRpb25zLm93bmVyLm9wdGlvbignY29sdW1ucycpKVxuICAgICAgfSlcbiAgICAgIC5keEZpbHRlckJ1aWxkZXIoJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdHJ5QXBwbHlGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGlzQ2FuQmVGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy5jb25maXJtQ2hhbmdlc0xvc3MoKTtcblxuICAgIGlmIChpc0NhbkJlRmlsdGVyQXBwbGllZCkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ2FuQmVGaWx0ZXJBcHBsaWVkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFwcGx5RmlsdGVyKGZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmVycmVkTG9hZGluZyA9IGZhbHNlKSB7XG4gICAgLy8gTk9URTogSWYgd2UgY2hhbmdlIHRoZSBmaWx0ZXIsIHRoZSBncmlkIHdpbGwgYmUgcmVsb2FkZWQgaW4gdGhlIGZpbHRlcnNEcm9wZG93bkJveC5vblZhbHVlQ2hhbmdlZFxuICAgIC8vIGNvbnN0IGZpbHRlckNoYW5nZWQgPSB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCAhPT0gZmlsdGVySWQ7XG4gICAgdGhpcy5pc0luRmlsdGVyQXBwbHlpbmcgPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkID0gZmlsdGVySWQ7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyKTtcblxuICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XG5cbiAgICBsZXQgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xuICAgICAgLy8gTk9URTogbmVlZCB0byBwcm9jZXNzIGZpbHRlciB2YWx1ZSBieSB0aGUgZ2V0RmlsdGVyRXhwcmVzc2lvbiBtZXRob2RcbiAgICAgIC8vIHRvIGJlIHN1cmUgaXQgd2lsbCB3b3JrIGluIGRhdGFzb3VyY2UgKGZvciBleGFtcGxlLCB0aGUgJ2JldHdlZW4nIGNvbmRpdGlvbilcbiAgICAgIC8vIHdpbGwgYmUgbW9kaWZpZWQgdG8gXCI+PSBhbmQgPD1cIiBiZWNhdXNlIGRhdGEgc291cmNlIGRvZXNuJ3Qgc3VwcG9ydCAnYmV0d2VlbicuXG5cbiAgICAgIHRoaXMuZmlsdGVyRXhwcmVzc2lvbkNhbGN1bGF0b3Iub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbHRlckV4cHJlc3Npb25DYWxjdWxhdG9yLmdldEZpbHRlckV4cHJlc3Npb24oKTtcblxuICAgICAgaWYgKGdyaWREYXRhU291cmNlLmlzTG9hZGluZygpKSB7XG4gICAgICAgIGNvbnN0IGFwcGx5VmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgZ3JpZERhdGFTb3VyY2Uub2ZmKCdsb2FkaW5nQ2hhbmdlZCcsIGFwcGx5VmFsdWUpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UgPSB0aGlzLm9wdGlvbnMub3duZXIuZ2V0RGF0YVNvdXJjZSgpO1xuICAgICAgICAgICAgZ3JpZERhdGFTb3VyY2UuZmlsdGVyKHZhbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ3JpZERhdGFTb3VyY2Uub24oJ2xvYWRpbmdDaGFuZ2VkJywgYXBwbHlWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIodmFsKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBncmlkRGF0YVNvdXJjZS5maWx0ZXIobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gaWYgKCFmaWx0ZXJDaGFuZ2VkKSB7XG4gICAgaWYgKCFkZWZlcnJlZExvYWRpbmcpIHtcbiAgICAgIGF3YWl0IGdyaWREYXRhU291cmNlLmxvYWQoKTtcbiAgICB9XG4gICAgLy8gfVxuXG4gICAgdGhpcy5vcHRpb25zLm9uRmlsdGVyQXBwbGllZCAmJiB0aGlzLm9wdGlvbnMub25GaWx0ZXJBcHBsaWVkKGZpbHRlcklkKTtcbiAgICB0aGlzLmlzSW5GaWx0ZXJBcHBseWluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XG4gICAgY29uc3QgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgPSBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJyk7XG5cbiAgICBncmlkLm9wdGlvbignb25Ub29sYmFyUHJlcGFyaW5nJywgKGU6IGFueSkgPT4ge1xuICAgICAgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcgJiYgY3VycmVudFRvb2xiYXJQcmVwYXJpbmcoZSk7XG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZFRvb2xiYXJQcmVwYXJpbmc6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ29uVG9vbGJhclByZXBhcmluZyddID0gKGUpID0+IHtcbiAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zICYmIGUudG9vbGJhck9wdGlvbnMuaXRlbXM7XG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b29sYmFySXRlbXMuc3BsaWNlKDEsIDAsXG4gICAgICB0aGlzLmZpbHRlcnNUb29sYmFySXRlbVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCBmaWx0ZXJzVG9vbGJhckl0ZW0oKSB7XG4gICAgaWYgKCF0aGlzLl9maWx0ZXJzVG9vbGJhckl0ZW0pIHtcbiAgICAgIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlRmlsdGVyc1Rvb2xiYXJJdGVtKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnNUb29sYmFySXRlbTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGZpbHRlclBvcHVwKCkge1xuICAgIGlmICghdGhpcy5fZmlsdGVyUG9wdXApIHtcbiAgICAgIHRoaXMuX2ZpbHRlclBvcHVwID0gdGhpcy5jcmVhdGVGaWx0ZXJQb3B1cCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9maWx0ZXJQb3B1cDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgY29uc3QgY3VycmVudEZpbHRlciA9IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcjtcblxuICAgIGNvbnN0IG5ld05hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94ICYmIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScpO1xuICAgIGNvbnN0IG9sZE5hbWUgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIubmFtZTtcblxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IHRoaXMuZmlsdGVyQnVpbGRlciAmJiB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xuICAgIGNvbnN0IG9sZEZpbHRlciA9IGN1cnJlbnRGaWx0ZXIgJiYgY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZTtcblxuICAgIGNvbnN0IG5ld0lzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94ICYmIHRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveC5vcHRpb24oJ3ZhbHVlJyk7XG4gICAgY29uc3Qgb2xkSXNHbG9iYWwgPSBjdXJyZW50RmlsdGVyICYmIGN1cnJlbnRGaWx0ZXIuaXNHbG9iYWw7XG5cbiAgICByZXR1cm4gbmV3TmFtZSAhPT0gb2xkTmFtZSB8fCBuZXdGaWx0ZXIgIT09IG9sZEZpbHRlciB8fCBuZXdJc0dsb2JhbCAhPT0gb2xkSXNHbG9iYWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcnNUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0ge1xuICAgIGxldCBpc05lZWRIYW5kbGVWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZGdldDogJ2R4RHJvcERvd25Cb3gnIGFzIGFueSxcbiAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxuICAgICAgdGV4dDogJ0RhdGEgU2V0cycsXG4gICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbnMudmlzaWJsZSxcbiAgICAgIGNzc0NsYXNzOiAnYXBzLWZpbHRlcnNfX3Rvb2xiYXItaXRlbScsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXG4gICAgICAgIHZhbHVlOiB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCxcbiAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxuICAgICAgICBkaXNwbGF5RXhwcjogJ25hbWUnLFxuICAgICAgICBzaG93Q2xlYXJCdXR0b246IHRydWUsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXG4gICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgIGRyb3BEb3duT3B0aW9uczoge1xuICAgICAgICAgIHdpZHRoOiA1MDBcbiAgICAgICAgfSxcbiAgICAgICAgb25Jbml0aWFsaXplZDogYXN5bmMgKGUpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbHRlcnNEcm9wZG93bkJveCA9IGUuY29tcG9uZW50O1xuICAgICAgICAgIGNvbnN0IFssIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIuZ2V0VXNlclNldHRpbmdzKClcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQgJiYgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xuICAgICAgICB9LFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogYXN5bmMgKGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc0luRmlsdGVyQXBwbHlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzTmVlZEhhbmRsZVZhbHVlQ2hhbmdlZCkge1xuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCB2YWx1ZSA9IGUudmFsdWU7XG4gICAgICAgICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcih2YWx1ZSk7XG5cbiAgICAgICAgICBpZiAoIWlzRmlsdGVyQXBwbGllZCkge1xuICAgICAgICAgICAgaXNOZWVkSGFuZGxlVmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICB2YWx1ZSA9IGUucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgICAgIGUuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgJiYgdGhpcy5maWx0ZXJzRGF0YUdyaWQuc2VsZWN0Um93cyh2YWx1ZSwgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuY3VycmVudEZpbHRlclRpdGxlICYmIHRoaXMuY3VycmVudEZpbHRlclRpdGxlLm9wdGlvbigndmFsdWUnLFxuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd0ZXh0JykgfHwgZS5jb21wb25lbnQub3B0aW9uKCdwbGFjZWhvbGRlcicpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25PcGVuZWQ6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKCFlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLnNlbGVjdFJvd3MoZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZTogKGUpID0+IHtcbiAgICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5maWx0ZXJzRGF0YUdyaWQgPSB0aGlzLmNyZWF0ZUZpbHRlcnNEYXRhR3JpZChlLmNvbXBvbmVudCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyVGl0bGUgPSB0aGlzLmNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShlLmNvbXBvbmVudCk7XG4gICAgICAgICAgdGhpcy5uZXdGaWx0ZXJCdXR0b24gPSB0aGlzLmNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpO1xuXG4gICAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19oZWFkZXInKVxuICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmN1cnJlbnRGaWx0ZXJUaXRsZS5lbGVtZW50KCkpXG4gICAgICAgICAgICAuYXBwZW5kKHRoaXMubmV3RmlsdGVyQnV0dG9uLmVsZW1lbnQoKSk7XG5cbiAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuY3NzKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAgICAgICAuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcilcbiAgICAgICAgICAgIC5hcHBlbmQodGhpcy5maWx0ZXJzRGF0YUdyaWQuZWxlbWVudCgpKTtcblxuICAgICAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJzRGF0YUdyaWQoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHtcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpXG4gICAgICAuZHhEYXRhR3JpZCh7XG4gICAgICAgIGRhdGFTb3VyY2U6IGRyb3Bkb3duQm94T3duZXIuZ2V0RGF0YVNvdXJjZSgpLFxuICAgICAgICByZW1vdGVPcGVyYXRpb25zOiBmYWxzZSxcbiAgICAgICAgZWRpdGluZzoge1xuICAgICAgICAgIGFsbG93QWRkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxuICAgICAgICAgIGFsbG93RGVsZXRpbmc6IHRydWUsXG4gICAgICAgICAgbW9kZTogJ2NlbGwnLFxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxuICAgICAgICAgIHRleHRzOiB7XG4gICAgICAgICAgICBjb25maXJtRGVsZXRlTWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkYXRhIHNldD8nXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3b3JkV3JhcEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcbiAgICAgICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ2lzRGVmYXVsdCcsXG4gICAgICAgICAgICBjYXB0aW9uOiAnSXMgRGVmYXVsdCcsXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgd2lkdGg6IDgwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNHbG9iYWwnLFxuICAgICAgICAgICAgY2FwdGlvbjogJ0lzIEdsb2JhbCcsXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgd2lkdGg6IDcwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9ucycsXG4gICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpY29uOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgaGludDogJ0VkaXQnLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWUucm93IHx8ICFlLnJvdy5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc0ZpbHRlckFwcGxpZWQgPSBhd2FpdCB0aGlzLnRyeUFwcGx5RmlsdGVyKGUucm93LmtleSk7XG4gICAgICAgICAgICAgICAgICBpc0ZpbHRlckFwcGxpZWQgJiYgIXRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd2aXNpYmxlJylcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vcGVuRWRpdEZpbHRlclBvcHVwKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnZGVsZXRlJ1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7XG4gICAgICAgICAgZWRpdE9uS2V5UHJlc3M6IGZhbHNlLFxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9jdXNlZFJvd0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzaG93Qm9yZGVyczogZmFsc2UsXG4gICAgICAgIHNob3dDb2x1bW5MaW5lczogZmFsc2UsXG4gICAgICAgIHNlbGVjdGlvbjogeyBtb2RlOiAnc2luZ2xlJyB9LFxuICAgICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSA1MXB4KScsXG4gICAgICAgIHNjcm9sbGluZzogeyBtb2RlOiAnc3RhbmRhcmQnIH0sXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICBub0RhdGFUZXh0OiAnTm8gZGF0YSBzZXRzJyxcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuc2VsZWN0ZWRSb3dLZXlzID8gZS5zZWxlY3RlZFJvd0tleXNbMF0gOiBudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FZGl0b3JQcmVwYXJpbmc6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuZGF0YUZpZWxkID09PSAnaXNHbG9iYWwnKSB7XG4gICAgICAgICAgICBlLmVkaXRvck9wdGlvbnMuZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnM7XG5cbiAgICAgICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VkID0gZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xuICAgICAgICAgICAgZS5lZGl0b3JPcHRpb25zLm9uVmFsdWVDaGFuZ2VkID0gYXN5bmMgKG9wdCkgPT4ge1xuICAgICAgICAgICAgICBlLmNvbXBvbmVudC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1VwZGF0aW5nJyk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGUucm93LmRhdGEuaWQsIHsgaXNHbG9iYWw6IG9wdC52YWx1ZSB9KTtcbiAgICAgICAgICAgICAgZS5jb21wb25lbnQuZW5kQ3VzdG9tTG9hZGluZygpO1xuXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkKG9wdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuY29sdW1uLnR5cGUgIT09ICdidXR0b25zJyB8fCAhZS5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlLmNvbHVtbi50eXBlID09PSAnYnV0dG9ucycpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSAhZS5kYXRhLmlzR2xvYmFsXG4gICAgICAgICAgICAgIHx8IChlLmRhdGEuaXNHbG9iYWwgJiYgdGhpcy5vcHRpb25zLmNhbkNyZWF0ZUdsb2JhbEZpbHRlcnMpO1xuXG4gICAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgQXJyYXkuZnJvbShlLmNlbGxFbGVtZW50LmNoaWxkcmVuKCkpLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICAkKGMpLmNzcyh7XG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyNkZGQgIWltcG9ydGFudCcsXG4gICAgICAgICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIH0pLm9mZignY2xpY2snKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblJvd1VwZGF0aW5nOiAoZSkgPT4ge1xuICAgICAgICAgIGlmICghZS5rZXkgfHwgZS5uZXdEYXRhLmlzRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGUuY29tcG9uZW50LmdldERhdGFTb3VyY2UoKS5pdGVtcygpLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmlzRGVmYXVsdCk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIuaXNEZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFwc0NvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlci51cGRhdGVVc2VyU2V0dGluZ3Moe1xuICAgICAgICAgICAgZGVmYXVsdEZpbHRlcklkOiBlLm5ld0RhdGEuaXNEZWZhdWx0ID8gZS5rZXkgOiB1bmRlZmluZWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Sb3dSZW1vdmluZzogKGUpID0+IHtcbiAgICAgICAgICBpZiAoIWUua2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXIoZS5rZXkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnRGaWx0ZXJUaXRsZShkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB7XG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxuICAgICAgLmFkZENsYXNzKCdhcHMtZmlsdGVyc19fY3VycmVudC1maWx0ZXInKVxuICAgICAgLmR4VGV4dEJveCh7XG4gICAgICAgIHZhbHVlOiBkcm9wZG93bkJveE93bmVyLm9wdGlvbigndGV4dCcpIHx8IGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCdwbGFjZWhvbGRlcicpLFxuICAgICAgICByZWFkT25seTogdHJ1ZVxuICAgICAgfSlcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5ld0ZpbHRlckJ1dHRvbigpOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uIHtcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1maWx0ZXJzX19hZGQtbmV3LWZpbHRlciBpc3pvbGVhLW1kJylcbiAgICAgIC5keEJ1dHRvbih7XG4gICAgICAgIHRleHQ6ICdOZXcgRGF0YSBTZXQnLFxuICAgICAgICB0eXBlOiAnbm9ybWFsJyxcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMub3Blbk5ld0ZpbHRlclBvcHVwKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGljb246ICdwbHVzJ1xuICAgICAgfSlcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyUG9wdXAoKSB7XG4gICAgY29uc3QgJHBvcHVwUm9vdCA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygnYm9keScpO1xuICAgIGxldCBpc1BvcHVwSGlkaW5nQ29uZmlybWVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gJHBvcHVwUm9vdC5keFBvcHVwKHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5vcHRpb25zLm93bmVyLmVsZW1lbnQoKSxcbiAgICAgIHNoYWRpbmc6IGZhbHNlLFxuICAgICAgcmVzaXplRW5hYmxlZDogdHJ1ZSxcbiAgICAgIHdpZHRoOiA2NTAsXG4gICAgICBoZWlnaHQ6IDUwMCxcbiAgICAgIG9uU2hvd2luZzogKGUpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3ggJiYgdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3guY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgICBvbkhpZGluZzogYXN5bmMgKGUpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCkge1xuICAgICAgICAgIGlzUG9wdXBIaWRpbmdDb25maXJtZWQgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGUuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgaXNQb3B1cEhpZGluZ0NvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKCk7XG4gICAgICAgIGlmIChpc1BvcHVwSGlkaW5nQ29uZmlybWVkKSB7XG4gICAgICAgICAgZS5jb21wb25lbnQuaGlkZSgpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94ICYmIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmR4UG9wdXAoJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpbHRlck5hbWVUZXh0Qm94KCkge1xuICAgIHJldHVybiAkKCc8ZGl2IC8+JylcbiAgICAgIC5keFRleHRCb3goe1xuICAgICAgICBwbGFjZWhvbGRlcjogJ0VudGVyIERhdGEgU2V0IE5hbWUuLi4nLFxuICAgICAgfSlcbiAgICAgIC5keFRleHRCb3goJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcklzR2xvYmFsQ2hlY2tib3goKSB7XG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxuICAgICAgLmR4Q2hlY2tCb3goe1xuICAgICAgICB0ZXh0OiAnR2xvYmFsIGRhdGEgc2V0JyxcbiAgICAgIH0pXG4gICAgICAuZHhDaGVja0JveCgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmxhdENvbHVtbnNMaXN0KHNvdXJjZUNvbHVtbnMsIC4uLnJlc3QpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUNvbHVtbiBvZiBzb3VyY2VDb2x1bW5zKSB7XG4gICAgICBpZiAoc291cmNlQ29sdW1uLmNvbHVtbnMgJiYgc291cmNlQ29sdW1uLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXN0ZWRDb2x1bW5zID0gdGhpcy5nZXRGbGF0Q29sdW1uc0xpc3Qoc291cmNlQ29sdW1uLmNvbHVtbnMpO1xuXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobmVzdGVkQ29sdW1ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSAkLmV4dGVuZCh7fSwgc291cmNlQ29sdW1uKTtcblxuICAgICAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZScgfHwgY29sdW1uLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgY29uc3QgaXNEYXRlVGltZSA9IGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJztcbiAgICAgICAgICBjb25zdCBkYXRlRm9ybWF0ID0gJ2RkIE1NTSB5eSc7XG4gICAgICAgICAgY29uc3QgZGF0ZVRpbWVGb3JtYXQgPSAnaGg6bW0sIGRkIE1NTSB5eSc7XG4gICAgICAgICAgY29uc3QgZGlzcGxheUZvcm1hdCA9IGlzRGF0ZVRpbWUgPyBkYXRlVGltZUZvcm1hdCA6IGRhdGVGb3JtYXQ7XG5cbiAgICAgICAgICBjb25zdCBwYXJzZURhdGVUaW1lID0gKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVQYXJ0cyA9IGRhdGVTdHIuc3BsaXQoJywgJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGRhdGVUaW1lUGFydHNbMV0sIGRhdGVGb3JtYXQpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVQYXJ0cyA9IGRhdGVUaW1lUGFydHNbMF0uc3BsaXQoJzonKTtcblxuICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KHRpbWVQYXJ0c1swXSkpO1xuICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQodGltZVBhcnRzWzFdKSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29sdW1uLmZvcm1hdCA9IGRpc3BsYXlGb3JtYXQ7XG4gICAgICAgICAgY29sdW1uLmVkaXRvclRlbXBsYXRlID0gKGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2IC8+JykuZHhEYXRlQm94KHtcbiAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdCxcbiAgICAgICAgICAgICAgdHlwZTogaXNEYXRlVGltZSA/ICdkYXRldGltZScgOiAnZGF0ZScsXG4gICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG4gICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoeyB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zZXRWYWx1ZShEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5mb3JtYXREYXRlKHZhbHVlLCBkaXNwbGF5Rm9ybWF0KSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbHVlOiAoaXNEYXRlVGltZSA/IHBhcnNlRGF0ZVRpbWUoZS52YWx1ZSkgOiBEZXZFeHByZXNzLmxvY2FsaXphdGlvbi5wYXJzZURhdGUoZS52YWx1ZSwgZGlzcGxheUZvcm1hdCkpXG4gICAgICAgICAgICAgICAgfHwgbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb2x1bW4uZmlsdGVyT3BlcmF0aW9ucyA9IFsnPScsICc8PicsICc8JywgJz4nLCAnPD0nLCAnPj0nLCAnaXNibGFuaycsICdpc25vdGJsYW5rJ107XG4gICAgICAgICAgY29sdW1uLmNhbGN1bGF0ZUZpbHRlckV4cHJlc3Npb24gPSBmdW5jdGlvbihmaWx0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IFtzb3VyY2VDb2x1bW5zLCAuLi5yZXN0XTtcblxuICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcbiAgICAgICAgICAgICAgaWYgKGlzRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBhcmdzWzBdID0gcGFyc2VEYXRlVGltZShhcmdzWzBdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcmdzWzBdID0gRGV2RXhwcmVzcy5sb2NhbGl6YXRpb24ucGFyc2VEYXRlKGZpbHRlclZhbHVlLCBkaXNwbGF5Rm9ybWF0KSB8fCBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRDYWxjdWxhdGVGaWx0ZXJFeHByZXNzaW9uKC4uLmFyZ3MpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQucHVzaChjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQuc29ydCgoY29sMSwgY29sMikgPT4ge1xuICAgICAgY29uc3QgY2FwdGlvbjEgPSAoY29sMS5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgY2FwdGlvbjIgPSAoY29sMi5jYXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoY2FwdGlvbjEgPCBjYXB0aW9uMikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXB0aW9uMSA+IGNhcHRpb24yKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyQnVpbGRlcigpIHtcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyID0gJCgnPGRpdiAvPicpXG4gICAgICAuZHhGaWx0ZXJCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiB0aGlzLmdldEZsYXRDb2x1bW5zTGlzdCh0aGlzLm9wdGlvbnMub3duZXIub3B0aW9uKCdjb2x1bW5zJykpXG4gICAgICB9KVxuICAgICAgLmR4RmlsdGVyQnVpbGRlcignaW5zdGFuY2UnKTtcblxuICAgIHJldHVybiBmaWx0ZXJCdWlsZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cENvbnRlbnQoZmlsdGVyPzogSUNvbnRyb2xEaXNwbGF5RmlsdGVyKSB7XG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJzEwMCUnKTtcblxuICAgIGNvbnN0ICRuYW1lQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImFwcy1maWx0ZXJzX19uYW1lLWNvbnRhaW5lclwiIC8+JykuaGVpZ2h0KCczNnB4Jyk7XG5cbiAgICAvLyBOT1RFOiBSZWNyZWF0ZSB3aWRnZXRzXG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveCA9IHRoaXMuY3JlYXRlRmlsdGVyTmFtZVRleHRCb3goKTtcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIgPSB0aGlzLmNyZWF0ZUZpbHRlckJ1aWxkZXIoKTtcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3ggPSB0aGlzLmNyZWF0ZUZpbHRlcklzR2xvYmFsQ2hlY2tib3goKTtcblxuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScsIGZpbHRlciAmJiBmaWx0ZXIubmFtZSk7XG4gICAgdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5lbGVtZW50KCkuYXBwZW5kVG8oJG5hbWVDb250YWluZXIpO1xuXG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnLCBmaWx0ZXIgJiYgZmlsdGVyLmlzR2xvYmFsKTtcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3guZWxlbWVudCgpLmFwcGVuZFRvKCRuYW1lQ29udGFpbmVyKTtcbiAgICB0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gub3B0aW9uKCdkaXNhYmxlZCcsICF0aGlzLm9wdGlvbnMuY2FuQ3JlYXRlR2xvYmFsRmlsdGVycyk7XG5cbiAgICAkbmFtZUNvbnRhaW5lci5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcblxuICAgIHRoaXMuZmlsdGVyQnVpbGRlci5vcHRpb24oJ3ZhbHVlJywgZmlsdGVyICYmIGZpbHRlci5maWx0ZXJTdGF0ZSk7XG5cbiAgICBjb25zdCAkZmlsdGVyQnVpbGRlckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5oZWlnaHQoJ2NhbGMoMTAwJSAtIDM2cHgpJykuYXBwZW5kVG8oJHBvcHVwQ29udGVudCk7XG5cbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIuZWxlbWVudCgpLmFwcGVuZFRvKCRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyKTtcblxuICAgICRmaWx0ZXJCdWlsZGVyQ29udGFpbmVyLmR4U2Nyb2xsVmlldyh7XG4gICAgICBzY3JvbGxCeUNvbnRlbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIHJldHVybiAkcG9wdXBDb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtcyhmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW1bXSB7XG4gICAgcmV0dXJuIGZpbHRlciA/IFtcbiAgICAgIHRoaXMuY3JlYXRlVXBkYXRlRmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxuICAgICAgdGhpcy5jcmVhdGVTYXZlRmlsdGVyQXNOZXdQb3B1cFRvb2xiYXJJdGVtKCksXG4gICAgICB0aGlzLmNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpLFxuICAgICAgdGhpcy5jcmVhdGVEZWxldGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKClcbiAgICBdIDogW3RoaXMuY3JlYXRlU2F2ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKV07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNhdmVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFNhdmUnLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmNyZWF0ZU5ld0ZpbHRlci5iaW5kKHRoaXMpLFxuICAgICAgICBpY29uOiAnc2F2ZSdcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVGaWx0ZXJQb3B1cFRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhQb3B1cC5Ub29sYmFySXRlbSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxuICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0ZXh0OiAnQXBwbHkgYW5kIFVwZGF0ZScsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGljb246ICdzYXZlJ1xuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNhdmVGaWx0ZXJBc05ld1BvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHRleHQ6ICdTYXZlIEFzIE5ldycsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY3JlYXRlTmV3RmlsdGVyLmJpbmQodGhpcyksXG4gICAgICAgIGljb246ICdzYXZlJ1xuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc2V0RmlsdGVyUG9wdXBUb29sYmFySXRlbSgpOiBEZXZFeHByZXNzLnVpLmR4UG9wdXAuVG9vbGJhckl0ZW0ge1xuICAgIHJldHVybiB7XG4gICAgICB0b29sYmFyOiAnYm90dG9tJyxcbiAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcbiAgICAgIGxvY2F0aW9uOiAnYmVmb3JlJyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgdGV4dDogJ1Jlc2V0JyxcbiAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5oYXNDaGFuZ2VzIHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgRGV2RXhwcmVzcy51aS5kaWFsb2cuY29uZmlybShcbiAgICAgICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgdW5zYXZlZCBjaGFuZ2VzPycsXG4gICAgICAgICAgICAnUmVzZXQgdGhlIGRhdGEgc2V0J1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucmVzZXRDaGFuZ2VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGljb246ICd1bmRvJ1xuICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlbGV0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW0oKTogRGV2RXhwcmVzcy51aS5keFBvcHVwLlRvb2xiYXJJdGVtIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHRleHQ6ICdEZWxldGUgRGF0YSBTZXQnLFxuICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXG4gICAgICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgXCIke3RoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lfVwiIGRhdGEgc2V0P2AsXG4gICAgICAgICAgICAnRGVsZXRlIHRoZSBkYXRhIHNldCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZpbHRlcih0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJQb3B1cC5oaWRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGljb246ICd0cmFzaCdcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTmV3RmlsdGVyUG9wdXAoKSB7XG4gICAgY29uc3QgaXNGaWx0ZXJBcHBsaWVkID0gYXdhaXQgdGhpcy50cnlBcHBseUZpbHRlcih1bmRlZmluZWQpO1xuICAgIGlmICghaXNGaWx0ZXJBcHBsaWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJQb3B1cENvbnRlbnQoKTtcbiAgICB0aGlzLmZpbHRlclBvcHVwLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkVkaXRGaWx0ZXJQb3B1cChmaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlcikge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcik7XG4gICAgdGhpcy5maWx0ZXJQb3B1cC5zaG93KCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclBvcHVwQ29udGVudChmaWx0ZXI/OiBJQ29udHJvbERpc3BsYXlGaWx0ZXIpIHtcbiAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uID0gdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicpO1xuXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3RpdGxlJywgZmlsdGVyID8gYEVkaXQgdGhlIFwiJHtmaWx0ZXIubmFtZX1cIiBkYXRhIHNldGAgOiAnQ3JlYXRlIGEgbmV3IGRhdGEgc2V0Jyk7XG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2NvbnRlbnRUZW1wbGF0ZScsICgpID0+IHRoaXMuY3JlYXRlRmlsdGVyUG9wdXBDb250ZW50KGZpbHRlcikpO1xuICAgIHRoaXMuZmlsdGVyUG9wdXAub3B0aW9uKCd0b29sYmFySXRlbXMnLCB0aGlzLmNyZWF0ZUZpbHRlclBvcHVwVG9vbGJhckl0ZW1zKGZpbHRlcikpO1xuICAgIHRoaXMuZmlsdGVyUG9wdXAucmVwYWludCgpO1xuXG4gICAgdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ2FuaW1hdGlvbicsIGN1cnJlbnRBbmltYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdGaWx0ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlck5hbWVUZXh0Qm94IHx8ICF0aGlzLmZpbHRlckJ1aWxkZXIgfHwgIXRoaXMuZmlsdGVySXNHbG9iYWxDaGVja2JveCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLmZpbHRlck5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKTtcbiAgICBjb25zdCBmaWx0ZXJCdWlsZGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xuICAgIGNvbnN0IGlzRGVmYXVsdCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcblxuICAgIGlmICghZmlsdGVyTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xEaXNwbGF5RmlsdGVyID0gYXdhaXQgdGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jcmVhdGVOZXdGaWx0ZXIoXG4gICAgICBmaWx0ZXJOYW1lLCBmaWx0ZXJCdWlsZGVyU3RhdGUsIGlzRGVmYXVsdCwgaXNHbG9iYWxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlckRyb3Bkb3duQm94RGF0YSgpO1xuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIoY29udHJvbERpc3BsYXlGaWx0ZXIuaWQpO1xuXG4gICAgbm90aWZ5KCdDcmVhdGVkJywgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUZpbHRlcihmaWx0ZXI6IElDb250cm9sRGlzcGxheUZpbHRlcikge1xuICAgIGlmICghdGhpcy5maWx0ZXJOYW1lVGV4dEJveCB8fCAhdGhpcy5maWx0ZXJCdWlsZGVyIHx8ICF0aGlzLmZpbHRlcklzR2xvYmFsQ2hlY2tib3gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gdGhpcy5maWx0ZXJOYW1lVGV4dEJveC5vcHRpb24oJ3ZhbHVlJyk7XG4gICAgY29uc3QgZmlsdGVyU3RhdGUgPSB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScpO1xuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnKTtcblxuICAgIGlmICghZmlsdGVyTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzVXBkYXRlZCA9IGF3YWl0IHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIudXBkYXRlRmlsdGVyKGZpbHRlci5pZCwge1xuICAgICAgbmFtZTogZmlsdGVyTmFtZSxcbiAgICAgIGZpbHRlclN0YXRlLFxuICAgICAgaXNHbG9iYWxcbiAgICB9KTtcbiAgICBpZiAoIWlzVXBkYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHVwZGF0ZSB0aXRsZVxuICAgIG5vdGlmeSgnVXBkYXRlZCcsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodGhpcy5vcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVyLmlkKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIpIHtcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmRlbGV0ZUZpbHRlcihmaWx0ZXJJZCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5vbkZpbHRlckRlbGV0ZWQoZmlsdGVySWQpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYXBwbHlGaWx0ZXIodW5kZWZpbmVkKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXJEcm9wZG93bkJveERhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRDaGFuZ2VzKCkge1xuICAgIHRoaXMuZmlsdGVyTmFtZVRleHRCb3gub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5uYW1lKTtcbiAgICB0aGlzLmZpbHRlckJ1aWxkZXIub3B0aW9uKCd2YWx1ZScsIHRoaXMub3B0aW9ucy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlci5maWx0ZXJTdGF0ZSk7XG4gICAgdGhpcy5maWx0ZXJJc0dsb2JhbENoZWNrYm94Lm9wdGlvbigndmFsdWUnLCB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXIuaXNHbG9iYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsdGVyRHJvcGRvd25Cb3hEYXRhKCkge1xuICAgIGlmICghdGhpcy5maWx0ZXJzRHJvcGRvd25Cb3gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBbdXNlclNldHRpbmdzLCBmaWx0ZXJzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMub3B0aW9ucy5hcHNDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIuZ2V0VXNlclNldHRpbmdzKCksXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmdldEZpbHRlcnMoKVxuICAgIF0pO1xuXG4gICAgaWYgKHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXJzLmZpbmQoKGYpID0+IGYuaWQgPT09IHVzZXJTZXR0aW5ncy5kZWZhdWx0RmlsdGVySWQpO1xuICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcbiAgICAgICAgKGRlZmF1bHRGaWx0ZXIgYXMgYW55KS5pc0RlZmF1bHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xuICAgICAga2V5OiAnaWQnLFxuICAgICAgZGF0YTogZmlsdGVyc1xuICAgIH0pO1xuICAgIHRoaXMuZmlsdGVyc0Ryb3Bkb3duQm94Lm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xuICAgIHRoaXMuZmlsdGVyc0RhdGFHcmlkICYmIHRoaXMuZmlsdGVyc0RhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2hhbmdlc0xvc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gTk9URTogRGVsYXkgZm9yIHBvcHVwIHZpc2liaWxpdHkgY2hlY2tpbmdcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDApKTtcbiAgICBpZiAoIXRoaXMuaGFzQ2hhbmdlcyB8fCAhdGhpcy5maWx0ZXJQb3B1cC5vcHRpb24oJ3Zpc2libGUnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbG9zdCBpZiB5b3UgY2xvc2UgdGhpcyBwb3B1cC4gRG8geW91IHdhbnQgdG8gY2xvc2UgdGhlIHBvcHVwIGFuZCBub3Qgc2F2ZSBjaGFuZ2VzPycsXG4gICAgICAnVW5zYXZlZCBjaGFuZ2VzJ1xuICAgICk7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBJQXBpUmVzcG9uc2UsIFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4uLy4uL0RhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlVXBsb2FkZXJPcHRpb25zIHtcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBtYXhGaWxlU2l6ZTogbnVtYmVyO1xuICBhY2NlcHRlZEZpbGVUeXBlczogc3RyaW5nO1xuICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xuICBvblZhbHVlQ2hhbmdlZD86IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlZhbHVlQ2hhbmdlZEV2ZW50KSA9PiB2b2lkO1xuICBvblVwbG9hZFN0YXJ0ZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRTdGFydGVkRXZlbnQpID0+IHZvaWQ7XG4gIG9uVXBsb2FkZWQ/OiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRlZEV2ZW50KSA9PiB2b2lkO1xuICBzZWxlY3RCdXR0b25UZXh0Pzogc3RyaW5nO1xuICBjc3NDbGFzcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEZpbGVTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjZXB0ZWRGaWxlVHlwZXM6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uVmFsdWVDaGFuZ2VkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5WYWx1ZUNoYW5nZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZFN0YXJ0ZWQ6IChlOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyLlVwbG9hZFN0YXJ0ZWRFdmVudCkgPT4gdm9pZCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvblVwbG9hZGVkOiAoZTogRGV2RXhwcmVzcy51aS5keEZpbGVVcGxvYWRlci5VcGxvYWRlZEV2ZW50KSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNzc0NsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZmlsZVVwbG9hZGVyOiBEZXZFeHByZXNzLnVpLmR4RmlsZVVwbG9hZGVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElGaWxlVXBsb2FkZXJPcHRpb25zKSB7XG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xuICAgIHRoaXMuY3NzQ2xhc3MgPSBvcHRpb25zLmNzc0NsYXNzO1xuICAgIHRoaXMubWF4RmlsZVNpemUgPSBvcHRpb25zLm1heEZpbGVTaXplO1xuICAgIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPSBvcHRpb25zLmFjY2VwdGVkRmlsZVR5cGVzO1xuICAgIHRoaXMuc2VsZWN0QnV0dG9uVGV4dCA9IG9wdGlvbnMuc2VsZWN0QnV0dG9uVGV4dDtcbiAgICB0aGlzLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucyA9IG9wdGlvbnMuYWxsb3dlZEZpbGVFeHRlbnNpb25zO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQgPSBvcHRpb25zLm9uVmFsdWVDaGFuZ2VkO1xuICAgIHRoaXMub25VcGxvYWRTdGFydGVkID0gb3B0aW9ucy5vblVwbG9hZFN0YXJ0ZWQ7XG4gICAgdGhpcy5vblVwbG9hZGVkID0gb3B0aW9ucy5vblVwbG9hZGVkO1xuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCAkZmlsZVVwbG9hZGVyID0gJCgnPGRpdiAvPicpO1xuICAgIGlmICh0aGlzLmNzc0NsYXNzKSB7XG4gICAgICAkZmlsZVVwbG9hZGVyLmFkZENsYXNzKHRoaXMuY3NzQ2xhc3MpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsZVVwbG9hZGVyID0gJGZpbGVVcGxvYWRlci5keEZpbGVVcGxvYWRlcih7XG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiB0aGlzLnNlbGVjdEJ1dHRvblRleHQsXG4gICAgICBsYWJlbFRleHQ6ICcnLFxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiB0aGlzLmFsbG93ZWRGaWxlRXh0ZW5zaW9ucyxcbiAgICAgIGFjY2VwdDogdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyxcbiAgICAgIHVwbG9hZE1vZGU6ICd1c2VGb3JtJyxcbiAgICAgIG1heEZpbGVTaXplOiB0aGlzLm1heEZpbGVTaXplLFxuICAgICAgc2hvd0ZpbGVMaXN0OiBmYWxzZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ2xhYmVsVGV4dCcsIGUudmFsdWVbMF0gPyBlLnZhbHVlWzBdLm5hbWUgOiAnJyk7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQ/LihlKTtcbiAgICAgIH0sXG4gICAgICBvblVwbG9hZFN0YXJ0ZWQ6IChlKSA9PiB7XG4gICAgICAgIGUuZWxlbWVudC5maW5kKCcuZHgtZmlsZXVwbG9hZGVyLXVwbG9hZC1idXR0b24nKS5oaWRlKCk7XG4gICAgICAgIHRoaXMub25VcGxvYWRTdGFydGVkPy4oZSk7XG4gICAgICB9LFxuICAgICAgb25VcGxvYWRlZDogKGUpID0+IHtcbiAgICAgICAgdGhpcy5vblVwbG9hZGVkPy4oZSk7XG4gICAgICB9LFxuICAgIH0pLmR4RmlsZVVwbG9hZGVyKCdpbnN0YW5jZScpO1xuXG4gICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZCh0aGlzLmZpbGVVcGxvYWRlci5lbGVtZW50KCkpO1xuICB9XG5cbiAgcHVibGljIHVwbG9hZDxUPih1cGxvYWRVcmw6IHN0cmluZywgcGFyYW1zPzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGZkID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBjb25zdCBmaWxlID0gKHRoaXMuZmlsZVVwbG9hZGVyLmVsZW1lbnQoKS5maW5kKCdpbnB1dCcpWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzWzBdO1xuXG4gICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcblxuICAgICAgLyogZXNsaW50IGd1YXJkLWZvci1pbjogb2ZmICovXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZvcmluXG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFyYW1zKSB7XG4gICAgICAgIGZkLmFwcGVuZChwcm9wLCBwYXJhbXNbcHJvcF0pO1xuICAgICAgfVxuXG4gICAgICAkLmFqYXgoe1xuICAgICAgICB1cmw6IHVwbG9hZFVybCxcbiAgICAgICAgdHlwZTogJ3Bvc3QnLFxuICAgICAgICBkYXRhOiBmZCxcbiAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IChyZXNwb25zZTogSUFwaVJlc3BvbnNlPFQ+KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLlJlcXVlc3RTdGF0ZSA9PT0gUmVxdWVzdFN0YXRlLkNvbXBsZXRlZCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5EYXRhIGFzIGFueSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZS5NZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KCdVbmtub3duIGVycm9yJylcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xuaW1wb3J0IG5vdGlmeSBmcm9tICcuLi8uLi9XaWRnZXRzL05vdGlmeSc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuLi9GaWxlVXBsb2FkZXIvSW5kZXgnO1xuaW1wb3J0IHsgSUZpbGVJbXBvcnRlckNvbHVtbkluZm8sIElGaWxlSW1wb3J0ZXJUYWJsZU1ldGFkYXRhIH0gZnJvbSAnLi9JRmlsZUltcG9ydGVyVGFibGVNZXRhZGF0YSc7XG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi4vLi4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRHcmlkJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL1V0aWxzL0V2ZW50RW1pdHRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB7XG4gIHNjaGVtYTogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlSW1wb3J0ZXJPcHRpb25zIHtcbiAgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICB0aXRsZTogc3RyaW5nO1xuICBmaWxlVXBsb2FkVXJsOiBzdHJpbmc7XG4gIGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XG4gIGFkZFJvd3NVcmw6IHN0cmluZztcbiAgZ2V0VGFibGVzTGlzdFVybD86IHN0cmluZztcbiAgcHJlZGVmaW5lZFRhYmxlPzogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcbiAgcHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlPzogSW1wb3J0RmlsZU1vZGU7XG4gIGNyZWF0ZVRhYmxlQnV0dG9uVGV4dD86IHN0cmluZztcbiAgdXBkYXRlVGFibGVCdXR0b25UZXh0Pzogc3RyaW5nO1xuICBjcmVhdGVUYWJsZU1vZGVUZXh0Pzogc3RyaW5nO1xuICB1cGRhdGVUYWJsZU1vZGVUZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBJbXBvcnRGaWxlTW9kZSB7XG4gIENyZWF0ZU5ld1RhYmxlID0gMCxcbiAgQWRkTmV3Um93cyA9IDFcbn1cblxuZXhwb3J0IGNsYXNzIEZpbGVJbXBvcnRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEFCTEVfVVBEQVRFRF9FVkVOVCA9ICdmaWxlLWltcG9ydGVyLXRhYmxlLXVwZGF0ZWQtZXZlbnQnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVVcGxvYWRVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZVRhYmxlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUm93c1VybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBnZXRUYWJsZXNMaXN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuQ2hhbmdlTW9kZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVUYWJsZUJ1dHRvblRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVUYWJsZU1vZGVUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlVGFibGVNb2RlVGV4dDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcbiAgcHJpdmF0ZSBmb3JtOiBEZXZFeHByZXNzLnVpLmR4Rm9ybTtcbiAgcHJpdmF0ZSBmaWxlVXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcbiAgcHJpdmF0ZSBkYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xuICBwcml2YXRlIGFjdGlvbkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcbiAgcHJpdmF0ZSByb3dzQ291bnRlckNvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJvd3NDb3VudGVyOiBKUXVlcnk7XG4gIHByaXZhdGUgbW9kZTogSW1wb3J0RmlsZU1vZGU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSUZpbGVJbXBvcnRlck9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmlsZVVwbG9hZFVybCA9IG9wdGlvbnMuZmlsZVVwbG9hZFVybDtcbiAgICB0aGlzLiRjb250YWluZXIgPSBvcHRpb25zLiRjb250YWluZXI7XG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XG4gICAgdGhpcy5nZXRUYWJsZXNMaXN0VXJsID0gb3B0aW9ucy5nZXRUYWJsZXNMaXN0VXJsO1xuICAgIHRoaXMuY3JlYXRlVGFibGVVcmwgPSBvcHRpb25zLmNyZWF0ZVRhYmxlVXJsO1xuICAgIHRoaXMuYWRkUm93c1VybCA9IG9wdGlvbnMuYWRkUm93c1VybDtcbiAgICB0aGlzLnByZWRlZmluZWRUYWJsZSA9IG9wdGlvbnMucHJlZGVmaW5lZFRhYmxlO1xuICAgIHRoaXMuY2FuQ2hhbmdlTW9kZSA9IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlID09PSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tb2RlID0gb3B0aW9ucy5wcmVkZWZpbmVkSW1wb3J0RmlsZU1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlIDogSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XG4gICAgdGhpcy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgPSBvcHRpb25zLmNyZWF0ZVRhYmxlQnV0dG9uVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcbiAgICB0aGlzLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dCA9IG9wdGlvbnMudXBkYXRlVGFibGVCdXR0b25UZXh0IHx8ICdBZGQgTmV3IFJvd3MnO1xuICAgIHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCA9IG9wdGlvbnMuY3JlYXRlVGFibGVNb2RlVGV4dCB8fCAnQ3JlYXRlIFRhYmxlJztcbiAgICB0aGlzLnVwZGF0ZVRhYmxlTW9kZVRleHQgPSBvcHRpb25zLnVwZGF0ZVRhYmxlTW9kZVRleHQgfHwgJ0FkZCBOZXcgUm93cyc7XG4gIH1cblxuICBwdWJsaWMgc2hvdygpIHtcbiAgICB0aGlzLnBvcHVwID0gJCgnPGRpdiAvPicpLmFwcGVuZFRvKHRoaXMuJGNvbnRhaW5lcilcbiAgICAgIC5keFBvcHVwKHtcbiAgICAgICAgc2hvd1RpdGxlOiB0cnVlLFxuICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGRyYWdFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIGZ1bGxTY3JlZW46IHRydWUsXG4gICAgICAgIG1heFdpZHRoOiAxMzAwLFxuICAgICAgICBtYXhIZWlnaHQ6IDgwMCxcbiAgICAgICAgY29udGVudFRlbXBsYXRlOiAoJGNvbnRhaW5lcikgPT4ge1xuICAgICAgICAgIGNvbnN0ICRzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xuXG4gICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgICAgICAgJHNjcm9sbFZpZXcuYXBwZW5kKHRoaXMuZm9ybS5lbGVtZW50KCkpO1xuXG4gICAgICAgICAgJHNjcm9sbFZpZXcuZHhTY3JvbGxWaWV3KHtcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgICAgIH0pLmFwcGVuZFRvKCRjb250YWluZXIpO1xuICAgICAgICB9LFxuICAgICAgICB0b29sYmFySXRlbXM6IFt7XG4gICAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXG4gICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dCgpLFxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24gPSBlLmNvbXBvbmVudDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUYWJsZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm93c1RvVGFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcbiAgICAgICAgfSwge1xuICAgICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxuICAgICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcbiAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHRoaXMucG9wdXAuaGlkZSgpXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuICAgICAgICB9XVxuICAgICAgfSlcbiAgICAgIC5keFBvcHVwKCdpbnN0YW5jZScpO1xuXG4gICAgdGhpcy5wb3B1cC5zaG93KCk7XG4gICAgdGhpcy5vbk1vZGVTd2l0Y2hpbmcoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLnBvcHVwKSB7XG4gICAgICB0aGlzLnBvcHVwLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKTogRGV2RXhwcmVzcy51aS5keEZvcm0ge1xuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2PicpLmR4Rm9ybSh7XG4gICAgICBzaG93Q29sb25BZnRlckxhYmVsOiB0cnVlLFxuICAgICAgbGFiZWxMb2NhdGlvbjogJ3RvcCcsXG4gICAgICBjb2xDb3VudEJ5U2NyZWVuOiB7IG1kOiA0LCBzbTogMSB9LFxuICAgICAgc2NyZWVuQnlXaWR0aDogKHdpZHRoKSA9PiB3aWR0aCA8IDEyNTYgPyAnc20nIDogJ21kJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgZGF0YUZpZWxkOiAnTW9kZScsXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTW9kZVN3aXRjaGVyKCRjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkYXRhRmllbGQ6ICdTY2hlbWEnLFxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcbiAgICAgICAgfV1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGUnLFxuICAgICAgICBlZGl0b3JPcHRpb25zOiB7XG4gICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmNhbkNoYW5nZU1vZGVcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VGV4dEJveC5Qcm9wZXJ0aWVzLFxuICAgICAgICB2YWxpZGF0aW9uUnVsZXM6IFt7XG4gICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcbiAgICAgICAgfV1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YUZpZWxkOiAnVGFibGVTZWxlY3RvcicsXG4gICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgdGV4dDogJ1RhYmxlJ1xuICAgICAgICB9LFxuICAgICAgICBlZGl0b3JUeXBlOiAnZHhTZWxlY3RCb3gnLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgY29sU3BhbjogMixcbiAgICAgICAgZWRpdG9yT3B0aW9uczoge1xuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XG4gICAgICAgICAgICBzdG9yZTogY3JlYXRlRHhEYXRhU291cmNlKHtcbiAgICAgICAgICAgICAgbG9hZFVybDogdGhpcy5nZXRUYWJsZXNMaXN0VXJsLFxuICAgICAgICAgICAgICBsb2FkUGFyYW1zOiB7IGNvbnRleHROYW1lOiAnJywgdGFibGVzT25seTogdHJ1ZSwgaXNXYXJlaG91c2VDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIGxvYWRNZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3I6IGZhbHNlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHBhZ2luYXRlOiBmYWxzZSxcbiAgICAgICAgICAgIHNvcnQ6ICd0aGlzJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzZWFyY2hFbmFibGVkOiB0cnVlLFxuICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUZXh0Qm94LlByb3BlcnRpZXMsXG4gICAgICAgIHZhbGlkYXRpb25SdWxlczogW3tcbiAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnLFxuICAgICAgICB9XVxuICAgICAgfSwge1xuICAgICAgICBkYXRhRmllbGQ6ICdTb3VyY2UgRmlsZScsXG4gICAgICAgIGl0ZW1UeXBlOiAnc2ltcGxlJyxcbiAgICAgICAgdGVtcGxhdGU6IChfZGF0YSwgJGNvbnRhaW5lcikgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhRmllbGQ6ICdDb2x1bW5zIFNlbGVjdG9yJyxcbiAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBjb2xTcGFuOiA0LFxuICAgICAgICBpdGVtVHlwZTogJ3NpbXBsZScsXG4gICAgICAgIHRlbXBsYXRlOiAoX2RhdGEsICRjb250YWluZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZURhdGFHcmlkKCRjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICB9XVxuICAgIH0pLmR4Rm9ybSgnaW5zdGFuY2UnKTtcblxuICAgIHJldHVybiBmb3JtO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNb2RlU3dpdGNoZXIoJGNvbnRhaW5lcjogSlF1ZXJ5KSB7XG4gICAgJCgnPGRpdiAvPicpLmR4QnV0dG9uR3JvdXAoe1xuICAgICAgaXRlbXM6IFt7XG4gICAgICAgIHRleHQ6IHRoaXMuY3JlYXRlVGFibGVNb2RlVGV4dCxcbiAgICAgICAgaWNvbjogJ2luc2VydHRhYmxlJyxcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlXG4gICAgICB9LCB7XG4gICAgICAgIHRleHQ6IHRoaXMudXBkYXRlVGFibGVNb2RlVGV4dCxcbiAgICAgICAgaWNvbjogJ2luc2VydHJvd2JlbG93JyxcbiAgICAgICAgdmFsdWU6IEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3NcbiAgICAgIH1dIGFzIGFueSxcbiAgICAgIGtleUV4cHI6ICd2YWx1ZScsXG4gICAgICBkaXNhYmxlZDogIXRoaXMuY2FuQ2hhbmdlTW9kZSxcbiAgICAgIHN0eWxpbmdNb2RlOiAnb3V0bGluZWQnLFxuICAgICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXG4gICAgICBzZWxlY3RlZEl0ZW1LZXlzOiBbdGhpcy5tb2RlXSxcbiAgICAgIG9uSXRlbUNsaWNrOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLm1vZGUgPSBlLml0ZW1EYXRhLnZhbHVlO1xuICAgICAgICB0aGlzLm9uTW9kZVN3aXRjaGluZygpO1xuICAgICAgfSxcbiAgICB9KS5hcHBlbmRUbygkY29udGFpbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmlsZXNVcGxvYWRlcigkY29udGFpbmVyOiBKUXVlcnkpIHtcbiAgICB0aGlzLmZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xuICAgICAgJGNvbnRhaW5lcixcbiAgICAgIGNzc0NsYXNzOiAndGFibGUtY3JlYXRvcl9fdXBsb2FkJyxcbiAgICAgIG1heEZpbGVTaXplOiAxMCAqIDEwMDAwMDAsXG4gICAgICBhY2NlcHRlZEZpbGVUeXBlczogJy54bHMsIC54bHN4JyxcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogWycueGxzJywgJy54bHN4J10sXG4gICAgICBzZWxlY3RCdXR0b25UZXh0OiAnU2VsZWN0IEV4Y2VsIGZpbGUnLFxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BhcnNpbmcgc2VsZWN0ZWQgZmlsZS4uLicpO1xuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8SUZpbGVJbXBvcnRlclRhYmxlTWV0YWRhdGE+KHRoaXMuZmlsZVVwbG9hZFVybCkudGhlbigodGFibGVNZXRhKSA9PiB7XG4gICAgICAgICAgaWYgKHRhYmxlTWV0YSkge1xuICAgICAgICAgICAgdGhpcy5zZXRSb3dzQ291bnQodGFibGVNZXRhLlJvd3NDb3VudCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERldkV4cHJlc3MuZGF0YS5EYXRhU291cmNlKHtcbiAgICAgICAgICAgICAgc3RvcmU6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgIGtleTogJ0lkJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB0YWJsZU1ldGEuQ29sdW1uc1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYWdpbmF0ZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFHcmlkLm9wdGlvbignZGF0YVNvdXJjZScsIGRhdGFTb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBub3RpZnkoYFBhcnNpbmcgRXJyb3IgOiAke2V9YCwgZmFsc2UpO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGFHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5maWxlVXBsb2FkZXIucmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFHcmlkKCRjb250YWluZXI6IEpRdWVyeSkge1xuICAgIGNvbnN0IGdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xuICAgICAgbm9EYXRhVGV4dDogJ1NlbGVjdCBFeGNlbCBGaWxlJyxcbiAgICAgIGhvdmVyU3RhdGVFbmFibGVkOiB0cnVlLFxuICAgICAgc2VhcmNoUGFuZWw6IHtcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBncm91cFBhbmVsOiB7XG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgaGVhZGVyRmlsdGVyOiB7XG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGZpbHRlclJvdzoge1xuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHNvcnRpbmc6IHtcbiAgICAgICAgbW9kZTogJ25vbmUnXG4gICAgICB9LFxuICAgICAgcGFnaW5nOiB7XG4gICAgICAgIHBhZ2VTaXplOiAxMDAwMCxcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZWRpdGluZzoge1xuICAgICAgICBhbGxvd1VwZGF0aW5nOiB0cnVlLFxuICAgICAgICBtb2RlOiAnY2VsbCcsXG4gICAgICB9LFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIG1vZGU6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIGNvbHVtbnM6IFt7XG4gICAgICAgIGRhdGFGaWVsZDogJ0lkJyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGFGaWVsZDogJ1NlbGVjdGVkJyxcbiAgICAgICAgZGF0YVR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgdmlzaWJsZTogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhRmllbGQ6ICdJc0tleUNvbHVtbicsXG4gICAgICAgIGRhdGFUeXBlOiAnYm9vbGVhbicsXG4gICAgICAgIHZpc2libGU6IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YUZpZWxkOiAnTmFtZScsXG4gICAgICAgIGNhcHRpb246ICdDb2x1bW4gTmFtZSdcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YUZpZWxkOiAnVHlwZScsXG4gICAgICAgIGFsbG93RWRpdGluZzogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YUZpZWxkOiAnSXNOdWxsYWJsZScsXG4gICAgICAgIGFsbG93RWRpdGluZzogdGhpcy5tb2RlID09PSBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZSAmJiB0aGlzLmNhbkNoYW5nZU1vZGUsXG4gICAgICAgIHNldENlbGxWYWx1ZTogKG5ld0RhdGEsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgbmV3RGF0YS5Jc051bGxhYmxlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBuZXdEYXRhLklzS2V5Q29sdW1uID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XSxcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IGZhbHNlLFxuICAgICAgb25Ub29sYmFyUHJlcGFyaW5nOiAoZSkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFySXRlbXMgPSBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xuICAgICAgICB0b29sYmFySXRlbXMucHVzaCh7XG4gICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAkKCc8ZGl2PicpXG4gICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JylcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3RhYmxlLWNyZWF0b3JfX3RhYmxlLWhlYWRlcicpXG4gICAgICAgICAgICAgICAgLnRleHQoJ1BhcnNlZCBGaWxlIE1ldGFkYXRhJyksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd3NDb3VudGVyID0gJCgnPHNwYW4+JykudGV4dCgnMTAwMCcpO1xuICAgICAgICAgICAgdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lciA9ICQoJzxkaXY+JylcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKS50ZXh0KCdSb3dzIENvdW50OiAnKSwgdGhpcy5yb3dzQ291bnRlcikuaGlkZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzQ291bnRlckNvbnRhaW5lcjtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZGF0YVJvdycgJiYgZS5kYXRhRmllbGQgPT09ICdJc0tleUNvbHVtbicpIHtcbiAgICAgICAgICBjb25zdCBlZGl0b3JPcHRpb25zID0gZS5lZGl0b3JPcHRpb25zIGFzIERldkV4cHJlc3MudWkuZHhDaGVja0JveE9wdGlvbnM7XG4gICAgICAgICAgZWRpdG9yT3B0aW9ucy5kaXNhYmxlZCA9IGUucm93LmRhdGEuSXNOdWxsYWJsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRhdGFHcmlkID0gZGVmYXVsdEdyaWQoJCgnPGRpdiAvPicpLCB7XG4gICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcbiAgICAgIHN1bW1hcnlDb2x1bW46ICdOYW1lJyxcbiAgICAgIGlzRnVsbFNjcmVlbjogZmFsc2UsXG4gICAgICBzZXREZWZhdWx0Q29sdW1uV2lkdGg6IGZhbHNlXG4gICAgfSk7XG5cbiAgICAkY29udGFpbmVyLmFwcGVuZCh0aGlzLmRhdGFHcmlkLmVsZW1lbnQoKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhYmxlKCkge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xuICAgICAgaWYgKCFkcykge1xuICAgICAgICBub3RpZnkoJ1NlbGVjdCBmaWxlIHdpdGggZGF0YScsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xuICAgICAgaWYgKCF0aGlzLmFyZUNvbHVtbnNWYWxpZChjb2x1bW5zKSkge1xuICAgICAgICBub3RpZnkoJ0F0IGxlYXN0IDEga2V5IGNvbHVtbiBtdXN0IGJlIHNldCcsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuZm9ybS5vcHRpb24oJ2Zvcm1EYXRhJykuU2NoZW1hLFxuICAgICAgICAgIHRhYmxlOiB0aGlzLmZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLlRhYmxlLFxuICAgICAgICAgIGNvbHVtbnM6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdDcmVhdGluZyBhbmQgZmlsbGluZyBEQiB0YWJsZS4uLicpO1xuICAgICAgICB0aGlzLmZpbGVVcGxvYWRlci51cGxvYWQ8Ym9vbGVhbj4odGhpcy5jcmVhdGVUYWJsZVVybCwgcGFyYW1zKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XG4gICAgICAgICAgICBub3RpZnkoYFRoZSB0YWJsZSBbJHtwYXJhbXMuc2NoZW1hfV0uWyR7cGFyYW1zLnRhYmxlfV0gaGFzIGJlZW4gY3JlYXRlZGAsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KEZpbGVJbXBvcnRlci5UQUJMRV9VUERBVEVEX0VWRU5UKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm90aWZ5KCdUaGUgdGFibGUgaGFzIG5vdCBiZWVuIGNyZWF0ZWQnLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIG5vdGlmeShgVGFibGUgY3JlYXRpbmcgZXJyb3I6ICR7ZX1gLCBmYWxzZSk7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFJvd3NUb1RhYmxlKCkge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLmZvcm0udmFsaWRhdGUoKTtcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBjb25zdCBkcyA9IHRoaXMuZGF0YUdyaWQuZ2V0RGF0YVNvdXJjZSgpO1xuICAgICAgaWYgKCFkcykge1xuICAgICAgICBub3RpZnkoJ1NlbGVjdCBmaWxlIHdpdGggZGF0YScsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkcy5pdGVtcygpO1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICB0YWJsZTogdGhpcy5mb3JtLm9wdGlvbignZm9ybURhdGEnKS5UYWJsZVNlbGVjdG9yLFxuICAgICAgICBjb2x1bW5zOiBKU09OLnN0cmluZ2lmeShjb2x1bW5zKVxuICAgICAgfTtcbiAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdBZGRpbmcgcm93cyB0byBEQiB0YWJsZS4uLicpO1xuICAgICAgdGhpcy5maWxlVXBsb2FkZXIudXBsb2FkPGJvb2xlYW4+KHRoaXMuYWRkUm93c1VybCwgcGFyYW1zKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcbiAgICAgICAgICBub3RpZnkoYFRoZSB0YWJsZSAke3BhcmFtcy50YWJsZX0gaGFzIGJlZW4gdXBkYXRlZGAsIHRydWUpO1xuICAgICAgICAgIHRoaXMuZW1pdChGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm90aWZ5KCdUaGUgdGFibGUgaGFzIG5vdCBiZWVuIHVwZGF0ZWQnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIG5vdGlmeShgVGFibGUgdXBkYXRpbmcgZXJyb3I6ICR7ZX1gLCBmYWxzZSk7XG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uTW9kZVN3aXRjaGluZygpIHtcbiAgICBjb25zdCBpc0NyZWF0ZVRhYmxlTW9kZSA9IHRoaXMubW9kZSA9PT0gSW1wb3J0RmlsZU1vZGUuQ3JlYXRlTmV3VGFibGU7XG5cbiAgICB0aGlzLmFjdGlvbkJ1dHRvbi5vcHRpb24oJ3RleHQnLCB0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoKSk7XG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzS2V5Q29sdW1uJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XG4gICAgdGhpcy5kYXRhR3JpZC5jb2x1bW5PcHRpb24oJ0lzTnVsbGFibGUnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcblxuICAgIGlmICghdGhpcy5jYW5DaGFuZ2VNb2RlKSB7XG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCB0cnVlKTtcbiAgICAgIHRoaXMuZm9ybS51cGRhdGVEYXRhKCdTY2hlbWEnLCB0aGlzLnByZWRlZmluZWRUYWJsZS5zY2hlbWEpO1xuXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGUnLCAndmlzaWJsZScsIHRydWUpO1xuICAgICAgdGhpcy5mb3JtLnVwZGF0ZURhdGEoJ1RhYmxlJywgdGhpcy5wcmVkZWZpbmVkVGFibGUudGFibGUpO1xuXG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGVTZWxlY3RvcicsICd2aXNpYmxlJywgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignU2NoZW1hJywgJ3Zpc2libGUnLCBpc0NyZWF0ZVRhYmxlTW9kZSk7XG4gICAgICB0aGlzLmZvcm0uaXRlbU9wdGlvbignVGFibGUnLCAndmlzaWJsZScsIGlzQ3JlYXRlVGFibGVNb2RlKTtcbiAgICAgIHRoaXMuZm9ybS5pdGVtT3B0aW9uKCdUYWJsZVNlbGVjdG9yJywgJ3Zpc2libGUnLCAhaXNDcmVhdGVUYWJsZU1vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aW9uQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IEltcG9ydEZpbGVNb2RlLkNyZWF0ZU5ld1RhYmxlID8gdGhpcy5jcmVhdGVUYWJsZUJ1dHRvblRleHQgOiB0aGlzLnVwZGF0ZVRhYmxlQnV0dG9uVGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgYXJlQ29sdW1uc1ZhbGlkKGNvbHVtbnM6IElGaWxlSW1wb3J0ZXJDb2x1bW5JbmZvW10pIHtcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMuU2VsZWN0ZWQpLnNvbWUoKHMpID0+IHMuSXNLZXlDb2x1bW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRSb3dzQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgIHRoaXMucm93c0NvdW50ZXJDb250YWluZXIuc2hvdygpO1xuICAgIHRoaXMucm93c0NvdW50ZXIudGV4dChjb3VudCk7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkRGlzcGxheXNNYW5hZ2VyIH0gZnJvbSAnLi9HcmlkRGlzcGxheXNNYW5hZ2VyJztcclxuaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciB9IGZyb20gJy4vR3JpZEZpbHRlcnNNYW5hZ2VyJztcclxuaW1wb3J0IHsgY3JlYXRlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9Qb3B1cCc7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi4vLi4vQnVzaW5lc3MnO1xyXG5pbXBvcnQgeyBGaWxlSW1wb3J0ZXIsIElGaWxlSW1wb3J0ZXJUYWJsZUluZm8sIEltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9GaWxlSW1wb3J0ZXIvSW5kZXgnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRmlsZUltcG9ydGVyT3B0aW9ucyB7XHJcbiAgbW9kZTogQ2RtSW1wb3J0RmlsZU1vZGU7XHJcbiAgY3JlYXRlVGFibGVVcmw6IHN0cmluZztcclxuICBhZGRSb3dzVXJsOiBzdHJpbmc7XHJcbiAgZmlsZVVwbG9hZFVybDogc3RyaW5nO1xyXG4gIHByZWRlZmluZWRUYWJsZTogSUZpbGVJbXBvcnRlclRhYmxlSW5mbztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB7XHJcbiAgcmVhZG9ubHkgb3duZXI6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZDtcclxuICByZWFkb25seSBlZGl0TW9kZTogYm9vbGVhbjtcclxuICByZWFkb25seSBncmlkRGlzcGxheXNNYW5hZ2VyOiBHcmlkRGlzcGxheXNNYW5hZ2VyO1xyXG4gIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXI6IEdyaWRWaWV3c01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgZ3JpZEZpbHRlcnNNYW5hZ2VyOiBHcmlkRmlsdGVyc01hbmFnZXI7XHJcbiAgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM/OiBJRmlsZUltcG9ydGVyT3B0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWREaXNwbGF5c1Rvb2xiYXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGlzcGxheXNNYW5hZ2VyOiBHcmlkRGlzcGxheXNNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZFZpZXdzTWFuYWdlcjogR3JpZFZpZXdzTWFuYWdlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRGaWx0ZXJzTWFuYWdlcjogR3JpZEZpbHRlcnNNYW5hZ2VyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1wb3J0RmlsZU9wdGlvbnM6IElGaWxlSW1wb3J0ZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGRpc3BsYXlzRHJvcGRvd25Cb3g6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3ggfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RGlzcGxheVRpdGxlOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveCB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHNhdmVCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBzYXZlQXNCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBkYXRhR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgZmlsZUltcG9ydGVyOiBGaWxlSW1wb3J0ZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlIHZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9kaXNwbGF5c1Rvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaW1wb3J0RmlsZVRvb2xiYXJJdGVtOiBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgLy8gdHNsaW50OmVuYWJsZSB2YXJpYWJsZS1uYW1lXHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyID0gb3B0aW9ucy5ncmlkRGlzcGxheXNNYW5hZ2VyO1xyXG4gICAgdGhpcy5ncmlkVmlld3NNYW5hZ2VyID0gb3B0aW9ucy5ncmlkVmlld3NNYW5hZ2VyO1xyXG4gICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIgPSBvcHRpb25zLmdyaWRGaWx0ZXJzTWFuYWdlcjtcclxuICAgIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMgPSBvcHRpb25zLmltcG9ydEZpbGVPcHRpb25zO1xyXG5cclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5vbkRpc3BsYWlzTG9hZGVkID0gKGRpc3BsYXlzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkFycmF5U3RvcmUoe1xyXG4gICAgICAgIGtleTogJ0lkJyxcclxuICAgICAgICBkYXRhOiBkaXNwbGF5c1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveCAmJiB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3gub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcblxyXG4gICAgICB0aGlzLmRhdGFHcmlkICYmIHRoaXMuZGF0YUdyaWQub3B0aW9uKCdkYXRhU291cmNlJywgZGF0YVNvdXJjZSk7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQgJiYgdGhpcy5kYXRhR3JpZC5lbmRDdXN0b21Mb2FkaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5vbkRpc3BsYXlDaGFuZ2VkID0gKGRpc3BsYXkpID0+IHtcclxuICAgICAgdGhpcy5kaXNwbGF5c0Ryb3Bkb3duQm94ICYmIHRoaXMuZGlzcGxheXNEcm9wZG93bkJveC5vcHRpb24oJ3ZhbHVlJywgZGlzcGxheSA/IGRpc3BsYXkuSWQgOiBudWxsKTtcclxuICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlICYmIHRoaXMuY3VycmVudERpc3BsYXlUaXRsZS5vcHRpb24oJ3ZhbHVlJywgZGlzcGxheSA/IGRpc3BsYXkuTmFtZSA6IG51bGwpO1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUgJiYgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcbiAgICAgIHRoaXMuc2F2ZUFzQnV0dG9uICYmIHRoaXMuc2F2ZUFzQnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhZGlzcGxheSk7XHJcbiAgICAgIHRoaXMuc2F2ZUJ1dHRvbiAmJiB0aGlzLnNhdmVCdXR0b24ub3B0aW9uKCdkaXNhYmxlZCcsICFkaXNwbGF5KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRhdGFHcmlkKSB7XHJcbiAgICAgICAgZGlzcGxheVxyXG4gICAgICAgICAgPyB0aGlzLmRhdGFHcmlkLnNlbGVjdFJvd3MoW2Rpc3BsYXkuSWRdLCBmYWxzZSlcclxuICAgICAgICAgIDogdGhpcy5kYXRhR3JpZC5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuaW50ZWdyYXRlVG9HcmlkKHRoaXMub3B0aW9ucy5vd25lcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludGVncmF0ZVRvR3JpZChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nID0gZ3JpZC5vcHRpb24oJ29uVG9vbGJhclByZXBhcmluZycpO1xyXG5cclxuICAgIGdyaWQub3B0aW9uKCdvblRvb2xiYXJQcmVwYXJpbmcnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nICYmIGN1cnJlbnRUb29sYmFyUHJlcGFyaW5nKGUpO1xyXG4gICAgICB0aGlzLm9uR3JpZFRvb2xiYXJQcmVwYXJpbmcoZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25HcmlkVG9vbGJhclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25Ub29sYmFyUHJlcGFyaW5nJ10gPSAoZSkgPT4ge1xyXG4gICAgY29uc3QgdG9vbGJhckl0ZW1zID0gZS50b29sYmFyT3B0aW9ucyAmJiBlLnRvb2xiYXJPcHRpb25zLml0ZW1zO1xyXG4gICAgaWYgKCF0b29sYmFySXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0l0ZW1zID0gW3RoaXMuZGlzcGxheXNUb29sYmFySXRlbV07XHJcblxyXG4gICAgaWYgKHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMgJiYgdGhpcy5pbXBvcnRGaWxlT3B0aW9ucy5tb2RlICE9PSBDZG1JbXBvcnRGaWxlTW9kZS5Ob25lKSB7XHJcbiAgICAgIG5ld0l0ZW1zLnB1c2godGhpcy5pbXBvcnRGaWxlVG9vbGJhckl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRvb2xiYXJJdGVtcy5zcGxpY2UoMSwgMCwgLi4ubmV3SXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhR3JpZChkcm9wZG93bkJveE93bmVyOiBEZXZFeHByZXNzLnVpLmR4RHJvcERvd25Cb3gpOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuZHhEYXRhR3JpZCh7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogZHJvcGRvd25Cb3hPd25lci5nZXREYXRhU291cmNlKCksXHJcbiAgICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXHJcbiAgICAgICAgZWRpdGluZzoge1xyXG4gICAgICAgICAgYWxsb3dBZGRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgYWxsb3dVcGRhdGluZzogZmFsc2UsXHJcbiAgICAgICAgICBhbGxvd0RlbGV0aW5nOiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUsXHJcbiAgICAgICAgICBtb2RlOiAncm93JyxcclxuICAgICAgICAgIHVzZUljb25zOiB0cnVlLFxyXG4gICAgICAgICAgdGV4dHM6IHtcclxuICAgICAgICAgICAgY29uZmlybURlbGV0ZU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGlzcGxheT8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkUGFuZWw6IHtcclxuICAgICAgICAgIHNoYWRpbmc6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFsbG93Q29sdW1uUmVzaXppbmc6IHRydWUsXHJcbiAgICAgICAgY29sdW1uQXV0b1dpZHRoOiB0cnVlLFxyXG4gICAgICAgIHdvcmRXcmFwRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBjb2x1bW5zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ05hbWUnLFxyXG4gICAgICAgICAgICBjYXB0aW9uOiAnRGlzcGxheSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGFGaWVsZDogJ0ZpbHRlcklkJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ0RhdGEgU2V0JyxcclxuICAgICAgICAgICAgbG9va3VwOiB7XHJcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAnaWQnLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlFeHByOiAnbmFtZSdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnVmlld0lkJyxcclxuICAgICAgICAgICAgY2FwdGlvbjogJ1ZpZXcnLFxyXG4gICAgICAgICAgICBsb29rdXA6IHtcclxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICdpZCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICduYW1lJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBrZXlib2FyZE5hdmlnYXRpb246IHtcclxuICAgICAgICAgIGVkaXRPbktleVByZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q29sdW1uSGVhZGVyczogdHJ1ZSxcclxuICAgICAgICBob3ZlclN0YXRlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBmb2N1c2VkUm93RW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgc2hvd0JvcmRlcnM6IGZhbHNlLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gJ2NhbGMoMTAwJSAtIDUxcHgpJyA6ICcxMDAlJyxcclxuICAgICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgIHBhZ2luZzogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgIG5vRGF0YVRleHQ6ICdObyBkaXNwbGF5cycsXHJcbiAgICAgICAgb25Jbml0aWFsaXplZDogYXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBhd2FpdCB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5nZXRGaWx0ZXJzKCk7XHJcbiAgICAgICAgICBjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5nZXRWaWV3cygpO1xyXG5cclxuICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbignRmlsdGVySWQnLCAnbG9va3VwLmRhdGFTb3VyY2UnLCBmaWx0ZXJzKTtcclxuICAgICAgICAgIGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbignVmlld0lkJywgJ2xvb2t1cC5kYXRhU291cmNlJywgdmlld3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25DZWxsQ2xpY2s6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5yb3dUeXBlICE9PSAnZGF0YScpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGRyb3Bkb3duQm94T3duZXIub3B0aW9uKCd2YWx1ZScsIGUuZGF0YS5JZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvblJvd1JlbW92aW5nOiBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhR3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5kZWxldGVEaXNwbGF5KGUua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaXNwbGF5c1Rvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICBjb25zdCBiYXNpY09wdGlvbnM6IERldkV4cHJlc3MudWkuZHhTZWxlY3RCb3guUHJvcGVydGllcyB8IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveC5Qcm9wZXJ0aWVzID0ge1xyXG4gICAgICB2YWx1ZUV4cHI6ICdJZCcsXHJcbiAgICAgIGRpc3BsYXlFeHByOiAnTmFtZScsXHJcbiAgICAgIHNob3dDbGVhckJ1dHRvbjogdHJ1ZSxcclxuICAgICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcclxuICAgICAgd2lkdGg6IDIwMCxcclxuICAgICAgb25Jbml0aWFsaXplZDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlzRHJvcGRvd25Cb3ggPSBlLmNvbXBvbmVudDtcclxuICAgICAgICB0aGlzLmdyaWREaXNwbGF5c01hbmFnZXIuZ2V0RGlzcGxheXMoKTtcclxuICAgICAgfSxcclxuICAgICAgb25WYWx1ZUNoYW5nZWQ6IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheSA9IHRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsdGVyQ2hhbmdlZCA9IGRpc3BsYXkgJiYgZGlzcGxheS5GaWx0ZXJJZCAhPT0gdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkO1xyXG4gICAgICAgIGNvbnN0IHZpZXdDaGFuZ2VkID0gZGlzcGxheSAmJiBkaXNwbGF5LlZpZXdJZCAhPT0gdGhpcy5ncmlkVmlld3NNYW5hZ2VyLmN1cnJlbnRWaWV3SWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IChmaWx0ZXJDaGFuZ2VkIHx8IHZpZXdDaGFuZ2VkXHJcbiAgICAgICAgICA/IHRoaXMuY29uZmlybUNoYW5nZXNMb3NzKClcclxuICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHRydWUpKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpcm1lZCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5SWQgPSBlLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkcm9wRG93bkJveE9wdGlvbnM6IERldkV4cHJlc3MudWkuZHhEcm9wRG93bkJveE9wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdpc3pvbGVhLW1kJ30sXHJcbiAgICAgIGRyb3BEb3duT3B0aW9uczoge1xyXG4gICAgICAgIHdpZHRoOiA4MDBcclxuICAgICAgfSxcclxuICAgICAgY29udGVudFRlbXBsYXRlOiAhdGhpcy5vcHRpb25zLmVkaXRNb2RlID8gdm9pZCAwIDogKGUpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFHcmlkID0gdGhpcy5jcmVhdGVEYXRhR3JpZChlLmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpdGxlID0gdGhpcy5jcmVhdGVDdXJyZW50RGlzcGxheVRpdGxlKGUuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLnNhdmVCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QnV0dG9uKCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQXNCdXR0b24gPSB0aGlzLmNyZWF0ZVNhdmVWaWV3QXNCdXR0b24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50SGVhZGVyID0gJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19faGVhZGVyJylcclxuICAgICAgICAgIC5hcHBlbmQodGhpcy5jdXJyZW50RGlzcGxheVRpdGxlLmVsZW1lbnQoKSlcclxuICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlQnV0dG9uLmVsZW1lbnQoKSlcclxuICAgICAgICAgIC5hcHBlbmQodGhpcy5zYXZlQXNCdXR0b24uZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db250ZW50ID0gJCgnPGRpdiAvPicpLmhlaWdodCgnMTAwJScpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVkaXRNb2RlKSB7XHJcbiAgICAgICAgICBkcm9wZG93bkNvbnRlbnQuYXBwZW5kKGRyb3Bkb3duQ29udGVudEhlYWRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkcm9wZG93bkNvbnRlbnQuYXBwZW5kKHRoaXMuZGF0YUdyaWQuZWxlbWVudCgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyb3Bkb3duQ29udGVudDtcclxuICAgICAgfSxcclxuICAgICAgb25PcGVuZWQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmVBc0J1dHRvbiAmJiB0aGlzLnNhdmVBc0J1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIXRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyLmN1cnJlbnRGaWx0ZXJJZCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uICYmIHRoaXMuc2F2ZUJ1dHRvbi5vcHRpb24oJ2Rpc2FibGVkJywgIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkZ2V0OiB0aGlzLm9wdGlvbnMuZWRpdE1vZGUgPyAoJ2R4RHJvcERvd25Cb3gnIGFzIGFueSkgOiAnZHhTZWxlY3RCb3gnLFxyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgdGV4dDogJ0Rpc3BsYXlzJyxcclxuICAgICAgY3NzQ2xhc3M6ICdhcHMtZGlzcGxheXNfX3Rvb2xiYXItaXRlbScsXHJcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5lZGl0TW9kZSA/ICQuZXh0ZW5kKGJhc2ljT3B0aW9ucywgZHJvcERvd25Cb3hPcHRpb25zKSA6IGJhc2ljT3B0aW9uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlSW1wb3J0RmlsZVRvb2xiYXJJdGVtKCk6IERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcclxuICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgaWNvbjogJ3VwbG9hZCcsXHJcbiAgICAgICAgaGludDogJ0ltcG9ydCBmaWxlJyxcclxuICAgICAgICBoZWlnaHQ6IDMwLFxyXG4gICAgICAgIHN0eWxpbmdNb2RlOiAndGV4dCcsXHJcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmlsZUltcG9ydGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZUltcG9ydGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlciA9IG5ldyBGaWxlSW1wb3J0ZXIoe1xyXG4gICAgICAgICAgICAkY29udGFpbmVyOiB0aGlzLm9wdGlvbnMub3duZXIuZWxlbWVudCgpLnBhcmVudCgpLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0ltcG9ydCBGaWxlIHRvIENETScsXHJcbiAgICAgICAgICAgIGNyZWF0ZVRhYmxlVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmNyZWF0ZVRhYmxlVXJsLFxyXG4gICAgICAgICAgICBhZGRSb3dzVXJsOiB0aGlzLmltcG9ydEZpbGVPcHRpb25zLmFkZFJvd3NVcmwsXHJcbiAgICAgICAgICAgIGZpbGVVcGxvYWRVcmw6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMuZmlsZVVwbG9hZFVybCxcclxuICAgICAgICAgICAgcHJlZGVmaW5lZEltcG9ydEZpbGVNb2RlOiB0aGlzLmdldFByZWRlZmluZWRJbXBvcnRGaWxlTW9kZSh0aGlzLmltcG9ydEZpbGVPcHRpb25zLm1vZGUpLFxyXG4gICAgICAgICAgICBwcmVkZWZpbmVkVGFibGU6IHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMucHJlZGVmaW5lZFRhYmxlLFxyXG4gICAgICAgICAgICBjcmVhdGVUYWJsZUJ1dHRvblRleHQ6ICdSZXBsYWNlIEFsbCBSb3dzJyxcclxuICAgICAgICAgICAgY3JlYXRlVGFibGVNb2RlVGV4dDogJ1JlcGxhY2UgUm93cycsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5vbihGaWxlSW1wb3J0ZXIuVEFCTEVfVVBEQVRFRF9FVkVOVCwgKCkgPT4gdGhpcy5vcHRpb25zLm93bmVyLnJlZnJlc2goKSk7XHJcbiAgICAgICAgICB0aGlzLmZpbGVJbXBvcnRlci5zaG93KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICAgIGUuZWxlbWVudC5maW5kKCcuZHgtYnV0dG9uLWNvbnRlbnQnKS5jc3Moe1xyXG4gICAgICAgICAgICBwYWRkaW5nVG9wOiA1LFxyXG4gICAgICAgICAgICBwYWRkaW5nQm90dG9tOiA1XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keEJ1dHRvbk9wdGlvbnNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZWRlZmluZWRJbXBvcnRGaWxlTW9kZShtb2RlOiBDZG1JbXBvcnRGaWxlTW9kZSk6IEltcG9ydEZpbGVNb2RlIHtcclxuICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICBjYXNlIENkbUltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3M6XHJcbiAgICAgICAgcmV0dXJuIEltcG9ydEZpbGVNb2RlLkFkZE5ld1Jvd3M7XHJcblxyXG4gICAgICBjYXNlIENkbUltcG9ydEZpbGVNb2RlLlJlcGxhY2VBbGxSb3dzOlxyXG4gICAgICAgIHJldHVybiBJbXBvcnRGaWxlTW9kZS5DcmVhdGVOZXdUYWJsZTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBtb2RlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUN1cnJlbnREaXNwbGF5VGl0bGUoZHJvcGRvd25Cb3hPd25lcjogRGV2RXhwcmVzcy51aS5keERyb3BEb3duQm94KTogRGV2RXhwcmVzcy51aS5keFRleHRCb3gge1xyXG4gICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5c19fY3VycmVudC1kaXNwbGF5IGlzem9sZWEtbWQnKVxyXG4gICAgICAuZHhUZXh0Qm94KHtcclxuICAgICAgICB2YWx1ZTogZHJvcGRvd25Cb3hPd25lci5vcHRpb24oJ3RleHQnKSB8fCBkcm9wZG93bkJveE93bmVyLm9wdGlvbigncGxhY2Vob2xkZXInKSxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZ3JpZERpc3BsYXlzTWFuYWdlci5jdXJyZW50RGlzcGxheSxcclxuICAgICAgfSlcclxuICAgICAgLmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZVZpZXdCdXR0b24oKTogRGV2RXhwcmVzcy51aS5keEJ1dHRvbiB7XHJcbiAgICByZXR1cm4gJCgnPGJ1dHRvbiAvPicpXHJcbiAgICAgIC5hZGRDbGFzcygnYXBzLWRpc3BsYXlzX19zYXZlLWRpc3BsYXkgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmN1cnJlbnREaXNwbGF5LFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLnVwZGF0ZUN1cnJlbnREaXNwbGF5KFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGl0bGUub3B0aW9uKCd2YWx1ZScpLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzTWFuYWdlci5jdXJyZW50RmlsdGVySWQsXHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlci5jdXJyZW50Vmlld0lkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaWNvbjogJ3NhdmUnLFxyXG4gICAgICAgIHdpZHRoOiAxMjVcclxuICAgICAgfSlcclxuICAgICAgLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTYXZlVmlld0FzQnV0dG9uKCk6IERldkV4cHJlc3MudWkuZHhCdXR0b24ge1xyXG4gICAgcmV0dXJuICQoJzxidXR0b24gLz4nKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2Fwcy1kaXNwbGF5X19zYXZlLWRpc3BsYXktYXMgaXN6b2xlYS1tZCcpXHJcbiAgICAgIC5keEJ1dHRvbih7XHJcbiAgICAgICAgdGV4dDogJ1NhdmUgQXMnLFxyXG4gICAgICAgIHR5cGU6ICdub3JtYWwnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IChcclxuICAgICAgICAgIHRoaXMuY3JlYXRlU2F2ZUFzRGlhbG9nKClcclxuICAgICAgICApLFxyXG4gICAgICAgIGljb246ICdzYXZlJyxcclxuICAgICAgICB3aWR0aDogMTYwXHJcbiAgICAgIH0pXHJcbiAgICAgIC5keEJ1dHRvbignaW5zdGFuY2UnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2F2ZUFzRGlhbG9nKCkge1xyXG4gICAgY29uc3QgJHBvcHVwQ29udGVudCA9ICQoJzxkaXYgLz4nKTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dDb250ZW50RWxlbWVudCA9ICQoJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjhweDtcIiAvPicpLmR4VGV4dEJveCh7XHJcbiAgICAgIHBsYWNlaG9sZGVyOiAnRGlzcGxheSBOYW1lJyxcclxuICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgfSkuZHhWYWxpZGF0b3Ioe1xyXG4gICAgICB2YWxpZGF0aW9uUnVsZXM6IFtcclxuICAgICAgICB7IHR5cGU6ICdyZXF1aXJlZCcgfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBuYW1lVGV4dEJveCA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcclxuICAgIGNvbnN0IHZhbGlkYXRvciA9IGRpYWxvZ0NvbnRlbnRFbGVtZW50LmR4VmFsaWRhdG9yKCdpbnN0YW5jZScpO1xyXG5cclxuICAgIG5hbWVUZXh0Qm94LmVsZW1lbnQoKS5hcHBlbmRUbygkcG9wdXBDb250ZW50KTtcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlRGlhbG9nKFxyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdDcmVhdGUgTmV3IERpc3BsYXknLFxyXG4gICAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICczMDBweCcsXHJcbiAgICAgIH0sXHJcbiAgICAgICRwb3B1cENvbnRlbnQsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZXh0OiAnT2snLFxyXG4gICAgICAgIG9uQ2xpY2s6IGFzeW5jIChjbG9zZVBvcHVwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXZhbGlkYXRvci52YWxpZGF0ZSgpLmlzVmFsaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZGF0YUdyaWQuYmVnaW5DdXN0b21Mb2FkaW5nKCdMb2FkaW5nJyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyLmNyZWF0ZU5ld0Rpc3BsYXkoXHJcbiAgICAgICAgICAgIG5hbWVUZXh0Qm94Lm9wdGlvbigndmFsdWUnKSxcclxuICAgICAgICAgICAgdGhpcy5ncmlkRmlsdGVyc01hbmFnZXIuY3VycmVudEZpbHRlcklkLFxyXG4gICAgICAgICAgICB0aGlzLmdyaWRWaWV3c01hbmFnZXIuY3VycmVudFZpZXdJZFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBjbG9zZVBvcHVwKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6ICdDYW5jZWwnLFxyXG4gICAgICAgIG9uQ2xpY2s6IChjbG9zZVBvcHVwKSA9PiBjbG9zZVBvcHVwKClcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1DaGFuZ2VzTG9zcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBjbG9zZSB0aGlzIHBvcHVwLiBEbyB5b3Ugd2FudCB0byBjbG9zZSB0aGUgcG9wdXAgYW5kIG5vdCBzYXZlIGNoYW5nZXM/JyxcclxuICAgICAgJ1Vuc2F2ZWQgY2hhbmdlcydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBkaXNwbGF5c1Rvb2xiYXJJdGVtKCkge1xyXG4gICAgaWYgKCF0aGlzLl9kaXNwbGF5c1Rvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2Rpc3BsYXlzVG9vbGJhckl0ZW0gPSB0aGlzLmNyZWF0ZURpc3BsYXlzVG9vbGJhckl0ZW0oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheXNUb29sYmFySXRlbTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGltcG9ydEZpbGVUb29sYmFySXRlbSgpIHtcclxuICAgIGlmICghdGhpcy5faW1wb3J0RmlsZVRvb2xiYXJJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbSA9IHRoaXMuY3JlYXRlSW1wb3J0RmlsZVRvb2xiYXJJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ltcG9ydEZpbGVUb29sYmFySXRlbTtcclxuICB9XHJcbn1cclxuIiwgIlx1RkVGRmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnMge1xuICBsb2FkRGF0YVVybDogc3RyaW5nO1xuICBpbnNlcnREYXRhVXJsOiBzdHJpbmc7XG4gIHVwZGF0ZURhdGFVcmw6IHN0cmluZztcbiAgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sRGlzcGxheSB7XG4gIHJlYWRvbmx5IElkOiBudW1iZXI7XG4gIHJlYWRvbmx5IE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgRmlsdGVySWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgVmlld0lkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmlkRGlzcGxheXNNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBkaXNwbGF5czogSUNvbnRyb2xEaXNwbGF5W10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyczoge1xuICAgIGNoYW5nZWQ6IEFycmF5PChkaXNwbGF5OiBJQ29udHJvbERpc3BsYXkpID0+IHZvaWQ+LFxuICAgIGxvYWRlZDogQXJyYXk8KGRpc3BsYWlzOiBJQ29udHJvbERpc3BsYXlbXSkgPT4gdm9pZD5cbiAgfTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX2N1cnJlbnREaXNwbGF5SWQ6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc2VydERhdGFVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlRGF0YVVybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucykge1xuICAgIHRoaXMubG9hZERhdGFVcmwgPSBvcHRpb25zLmxvYWREYXRhVXJsO1xuICAgIHRoaXMuaW5zZXJ0RGF0YVVybCA9IG9wdGlvbnMuaW5zZXJ0RGF0YVVybDtcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XG4gICAgdGhpcy5kZWxldGVEYXRhVXJsID0gb3B0aW9ucy5kZWxldGVEYXRhVXJsO1xuXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzID0ge1xuICAgICAgY2hhbmdlZDogW10sXG4gICAgICBsb2FkZWQ6IFtdXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRGlzcGxheXMoKSB7XG4gICAgdGhpcy5kaXNwbGF5cyA9IGF3YWl0IGxvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uPElDb250cm9sRGlzcGxheVtdPih0aGlzLmxvYWREYXRhVXJsKTtcbiAgICB0aGlzLm9uRGlzcGxhaXNMb2FkZWRQcml2YXRlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREaXNwbGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cyB8fCBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xuICB9XG5cbiAgcHVibGljIGdldERpc3BsYXlCeUlkID0gKGlkOiBudW1iZXIpID0+IHtcbiAgICBpZiAoIWlkIHx8ICF0aGlzLmRpc3BsYXlzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5cy5maW5kKCh2KSA9PiB2LklkID09PSBpZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmV3RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XG4gICAgY29uc3QgbmV3Vmlld0R0byA9IHtcbiAgICAgIElkOiAwLFxuICAgICAgTmFtZTogbmFtZSxcbiAgICAgIEZpbHRlcklkOiBmaWx0ZXJJZCxcbiAgICAgIFZpZXdJZDogdmlld0lkXG4gICAgfTtcblxuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuaW5zZXJ0RGF0YVVybCwgJ1BPU1QnLCBuZXdWaWV3RHRvKTtcbiAgICBhd2FpdCB0aGlzLmxvYWREaXNwbGF5cygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZURpc3BsYXkoaWQ6IG51bWJlcikge1xuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGVsZXRlRGF0YVVybCwgJ0RFTEVURScsIHsgaWQgfSk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRGlzcGxheXMoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDdXJyZW50RGlzcGxheShuYW1lOiBzdHJpbmcsIGZpbHRlcklkOiBudW1iZXIsIHZpZXdJZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheSh0aGlzLmN1cnJlbnREaXNwbGF5LklkLCBuYW1lLCBmaWx0ZXJJZCwgdmlld0lkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEaXNwbGF5KGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgZmlsdGVySWQ6IG51bWJlciwgdmlld0lkOiBudW1iZXIpIHtcbiAgICBhd2FpdCBzZW5kUmVxdWVzdCh0aGlzLnVwZGF0ZURhdGFVcmwsICdQVVQnLCB7XG4gICAgICBpZCwgbmFtZSwgZmlsdGVySWQsIHZpZXdJZFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubG9hZERpc3BsYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRGlzcGxheUNoYW5nZWRQcml2YXRlKCkge1xuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5jaGFuZ2VkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXG4gICAgICBoYW5kbGVycyh0aGlzLmN1cnJlbnREaXNwbGF5KVxuICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BsYWlzTG9hZGVkUHJpdmF0ZSgpIHtcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMubG9hZGVkLmZvckVhY2goKGhhbmRsZXJzKSA9PiAoXG4gICAgICBoYW5kbGVycyh0aGlzLmRpc3BsYXlzKVxuICAgICkpO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50RGlzcGxheUlkKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RGlzcGxheUlkO1xuICB9XG5cbiAgcHVibGljIHNldCBjdXJyZW50RGlzcGxheUlkKGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jdXJyZW50RGlzcGxheUlkID0gaWQ7XG4gICAgdGhpcy5vbkRpc3BsYXlDaGFuZ2VkUHJpdmF0ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50RGlzcGxheSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5QnlJZCh0aGlzLl9jdXJyZW50RGlzcGxheUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgb25EaXNwbGF5Q2hhbmdlZChoYW5kbGVyOiAoZGlzcGxheTogSUNvbnRyb2xEaXNwbGF5KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNoYW5nZWQucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgb25EaXNwbGFpc0xvYWRlZChoYW5kbGVyOiAoZGlzcGxhaXM6IElDb250cm9sRGlzcGxheVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmxvYWRlZC5wdXNoKGhhbmRsZXIpO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gJy4uLy4uLy4uL0NvbXBvbmVudHMvQ29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG93bmVyOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XG4gIHJlYWRvbmx5IGF1dG9JbnRlZ3JhdGlvbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbkRlZmF1bHRPcHRpb25zIHtcbiAgcmVhZG9ubHkgYXV0b0ludGVncmF0aW9uOiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMgPVxuICBNdXRhYmxlPE9taXQ8SU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucywga2V5b2YgSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luRGVmYXVsdE9wdGlvbnM+PiAmXG4gIE11dGFibGU8UGFydGlhbDxJTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW5EZWZhdWx0T3B0aW9ucz4+O1xuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4ge1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSU11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbk9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYXV0b0ludGVncmF0aW9uOiAob3B0aW9ucy5hdXRvSW50ZWdyYXRpb24gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAhPT0gbnVsbClcbiAgICAgICAgPyBvcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiA6IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5vcHRpb25zLmF1dG9JbnRlZ3JhdGlvbiAmJiB0aGlzLmludGVncmF0ZVRvR3JpZCh0aGlzLm9wdGlvbnMub3duZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlZ3JhdGVUb0dyaWQoZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkKSB7XG4gICAgZ3JpZC5vcHRpb24oJ3NlbGVjdGlvbicsIHtcbiAgICAgIG1vZGU6ICdtdWx0aXBsZSdcbiAgICB9IGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZE9wdGlvbnNbJ3NlbGVjdGlvbiddKTtcbiAgICBncmlkLm9uKCdlZGl0b3JQcmVwYXJpbmcnLCB0aGlzLm9uR3JpZEVkaXRvclByZXBhcmluZyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uR3JpZEVkaXRvclByZXBhcmluZzogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snb25FZGl0b3JQcmVwYXJpbmcnXSA9IChlKSA9PiB7XG4gICAgaWYgKCFlLmNvbXBvbmVudCB8fCAhZS5lZGl0b3JPcHRpb25zIHx8IGUucGFyZW50VHlwZSAhPT0gJ2RhdGFSb3cnIHx8ICFlLmRhdGFGaWVsZCB8fCAhZS5yb3cgfHwgIWUucm93LmtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFGaWVsZCA9IGUuZGF0YUZpZWxkO1xuICAgIGNvbnN0IGVkaXRvcktleSA9IGUucm93LmtleTtcbiAgICBjb25zdCBkZWZhdWx0TGlzdGVuZXIgPSBlLmVkaXRvck9wdGlvbnMub25WYWx1ZUNoYW5nZWQ7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxuICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IChldmVudDogeyB2YWx1ZTogYW55IH0pID0+IHtcbiAgICAgIGRlZmF1bHRMaXN0ZW5lcihldmVudCk7XG5cbiAgICAgIHRoaXMudXBkYXRlTXVsdGlwbGVSb3dzKGRhdGFGaWVsZCwgZWRpdG9yS2V5LCBldmVudC52YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTXVsdGlwbGVSb3dzPFQ+KGRhdGFGaWVsZDogc3RyaW5nLCBlZGl0b3JLZXk6IHN0cmluZywgdmFsdWU6IFQpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd0tleXM6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5vcHRpb25zLm93bmVyLmdldFNlbGVjdGVkUm93S2V5cygpO1xuICAgIGlmICghc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRvcktleVNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZFJvd0tleXMuZmluZEluZGV4KChrKSA9PiBrID09PSBlZGl0b3JLZXkpO1xuICAgIGlmIChlZGl0b3JLZXlTZWxlY3RlZEluZGV4IDwgMCB8fCBzZWxlY3RlZFJvd0tleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZWN0ZWRSb3dLZXlzLnNwbGljZShlZGl0b3JLZXlTZWxlY3RlZEluZGV4LCAxKTtcbiAgICBzZWxlY3RlZFJvd0tleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbnMub3duZXIuY2VsbFZhbHVlKHRoaXMub3B0aW9ucy5vd25lci5nZXRSb3dJbmRleEJ5S2V5KGtleSksIGRhdGFGaWVsZCwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgR3JpZFZpZXdzTWFuYWdlciB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vQ29tcG9uZW50cy9Db3JlJztcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcbmltcG9ydCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbiBmcm9tICcuLi8uLi8uLi9EYXRhL0xvYWRXaXRoTXVsdGlwbGVQcm90ZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3Mge1xuICByZWFkb25seSBkZWZhdWx0RmlsdGVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZGVmYXVsdFZpZXdJZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvIHtcbiAgRGVmYXVsdEZpbHRlcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIERlZmF1bHRWaWV3SWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHVzZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBsb2FkZWRVc2VyU2V0dGluZ3M/OiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tZW1wdHktaW50ZXJmYWNlXG5pbnRlcmZhY2UgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zIHtcbn1cblxuZXhwb3J0IHR5cGUgQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gIE11dGFibGU8T21pdDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucywga2V5b2YgSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj4gJlxuICBNdXRhYmxlPFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckRlZmF1bHRPcHRpb25zPj47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlck9wdGlvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRVc2VyU2V0dGluZ3M6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncyA9IHtcbiAgICBkZWZhdWx0RmlsdGVySWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0Vmlld0lkOiBHcmlkVmlld3NNYW5hZ2VyLmRlZmF1bHRDb250cm9sRGlzcGxheVZpZXcuaWRcbiAgfTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG4gIHByb3RlY3RlZCBfbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBhdXRvUmVzZXR0aW5nQ2FjaGVUaW1lcklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQVBTQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZGVkVXNlclNldHRpbmdzKSB7XG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IHRoaXMub3B0aW9ucy5sb2FkZWRVc2VyU2V0dGluZ3M7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydEF1dG9DYWNoZVJlc2V0dGluZ1RpbWVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIHNldCBsYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3ModmFsdWU6IElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5ncykge1xuICAgIHRoaXMuX2xhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IHZhbHVlO1xuICAgIHRoaXMuaXNMYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3NFeHBpcmVkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XG4gICAgaWYgKCF0aGlzLmlzTGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzRXhwaXJlZCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF0ZXN0TG9hZGVkVXNlclNldHRpbmdzO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMubG9hZFVzZXJTZXR0aW5ncygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3ModXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sYXRlc3RMb2FkZWRVc2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxhdGVzdExvYWRlZFVzZXJTZXR0aW5ncztcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPjtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPjtcblxuICBwcm90ZWN0ZWQgc3RhcnRBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcbiAgICB0aGlzLmF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5pc0xhdGVzdExvYWRlZFVzZXJTZXR0aW5nc0V4cGlyZWQgPSB0cnVlO1xuICAgIH0sIDUwMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0b3BBdXRvQ2FjaGVSZXNldHRpbmdUaW1lcigpIHtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZXNldHRpbmdDYWNoZVRpbWVySWQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMb2NhbENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciBleHRlbmRzIENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlciB7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmFnZUtleSA9ICdhcHM6Y29udHJvbC1kaXNwbGF5OnVzZXItc2V0dGluZ3MnO1xuXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkVXNlclNldHRpbmdzKCk6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XG4gICAgY29uc3QgcmF3VXNlclNldHRpbmdzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSk7XG4gICAgaWYgKCFyYXdVc2VyU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNldHRpbmdzOiBJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3MgPSBKU09OLnBhcnNlKHJhd1VzZXJTZXR0aW5ncyk7XG5cbiAgICByZXR1cm4gdXNlclNldHRpbmdzO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5nc0ludGVybmFsKHVwZGF0ZXM6IFBhcnRpYWw8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPik6IFByb21pc2U8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzPiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XG4gICAgY29uc3QgdXBkYXRlZFVzZXJTZXR0aW5ncyA9IHsgLi4uY3VycmVudFVzZXJTZXR0aW5ncywgLi4udXBkYXRlcyB9O1xuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXIudXNlclNldHRpbmdzU3RvcmFnZUtleSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWRVc2VyU2V0dGluZ3MpKTtcblxuICAgIHJldHVybiB1cGRhdGVkVXNlclNldHRpbmdzO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zIHtcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcbiAgdXBkYXRlRGF0YVVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucyA9XG4gIElDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJPcHRpb25zICYgSVJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIGV4dGVuZHMgQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5sb2FkRGF0YVVybCA9IG9wdGlvbnMubG9hZERhdGFVcmw7XG4gICAgdGhpcy51cGRhdGVEYXRhVXJsID0gb3B0aW9ucy51cGRhdGVEYXRhVXJsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcbiAgICBjb25zdCB1c2VyU2V0dGluZ3NEdG8gPSBhd2FpdCBsb2FkV2l0aE11bHRpcGxlUHJvdGVjdGlvbjxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+KHRoaXMubG9hZERhdGFVcmwpO1xuXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5nc0R0byA/IHRoaXMubWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKHVzZXJTZXR0aW5nc0R0bykgOiB0aGlzLmRlZmF1bHRVc2VyU2V0dGluZ3M7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzSW50ZXJuYWwodXBkYXRlczogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUHJvbWlzZTxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzID0geyAuLi5jdXJyZW50VXNlclNldHRpbmdzLCAuLi51cGRhdGVzIH07XG5cbiAgICBjb25zdCB1cGRhdGVkVXNlclNldHRpbmdzRHRvID0gYXdhaXQgc2VuZFJlcXVlc3Q8SUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvPihcbiAgICAgIHRoaXMudXBkYXRlRGF0YVVybCwgJ1BVVCcsXG4gICAgICB0aGlzLm1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byh1cGRhdGVkVXNlclNldHRpbmdzKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5tYXBDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc0R0b1RvTW9kZWwodXBkYXRlZFVzZXJTZXR0aW5nc0R0byk7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICBwcml2YXRlIG1hcENvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTW9kZWxUb0R0byhtb2RlbDogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3M+KTogUGFydGlhbDxJQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG8+IHtcbiAgICByZXR1cm4ge1xuICAgICAgRGVmYXVsdEZpbHRlcklkOiBtb2RlbC5kZWZhdWx0RmlsdGVySWQsXG4gICAgICBEZWZhdWx0Vmlld0lkOiBtb2RlbC5kZWZhdWx0Vmlld0lkXG4gICAgfTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gIHByaXZhdGUgbWFwQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NEdG9Ub01vZGVsKGR0bzogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzRHRvKTogSUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVmYXVsdEZpbHRlcklkOiBkdG8uRGVmYXVsdEZpbHRlcklkLFxuICAgICAgZGVmYXVsdFZpZXdJZDogZHRvLkRlZmF1bHRWaWV3SWRcbiAgICB9O1xuICB9XG59XG4iLCAiXHVGRUZGZXhwb3J0IGZ1bmN0aW9uIGdldFN1bW1hcnlDb2x1bW4oY29sdW1uczogQXJyYXk8eyB2aXNpYmxlSW5kZXg6IG51bWJlciwgdmlzaWJsZTogYm9vbGVhbiwgZGF0YUZpZWxkOiBzdHJpbmcgfT4gfFxyXG4gIFJlYWRvbmx5QXJyYXk8UGljazxEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4sICd2aXNpYmxlSW5kZXgnIHwgJ3Zpc2libGUnIHwgJ2RhdGFGaWVsZCc+Pikge1xyXG4gIGxldCBjb2x1bW5Gb3JTdW1tYXJ5ID0gJyc7XHJcblxyXG4gIGNvbnN0IHZpc2libGVDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgY29uc3QgY29sdW1uc1dpdGhJbmRleCA9IHZpc2libGVDb2x1bW5zLmZpbHRlcigoYykgPT4gYy52aXNpYmxlSW5kZXggIT09IG51bGwgJiYgYy52aXNpYmxlSW5kZXggIT09IHZvaWQgMCk7XHJcblxyXG4gIGlmICghIWNvbHVtbnNXaXRoSW5kZXgubGVuZ3RoKSB7XHJcbiAgICBjb2x1bW5Gb3JTdW1tYXJ5ID0gY29sdW1uc1dpdGhJbmRleC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KVswXS5kYXRhRmllbGQ7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbHVtbkZvclN1bW1hcnkgPSAodmlzaWJsZUNvbHVtbnNbMF0gJiYgdmlzaWJsZUNvbHVtbnNbMF0uZGF0YUZpZWxkKSB8fCAnJztcclxuICB9XHJcblxyXG4gIHJldHVybiBjb2x1bW5Gb3JTdW1tYXJ5O1xyXG59XHJcbiIsICJcdUZFRkZpbXBvcnQgeyBHcmlkVmlld3NUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9HcmlkVmlld3NUb29sYmFyQ29tcG9uZW50JztcclxuaW1wb3J0IHsgR3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9HcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50LCBJRmlsZUltcG9ydGVyT3B0aW9ucyB9IGZyb20gJy4vR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWREaXNwbGF5c01hbmFnZXIsIElHcmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZERpc3BsYXlzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRWaWV3c01hbmFnZXIsIElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucyB9IGZyb20gJy4vR3JpZFZpZXdzTWFuYWdlcic7XHJcbmltcG9ydCB7IEdyaWRGaWx0ZXJzTWFuYWdlciwgSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRGaWx0ZXJzTWFuYWdlcic7XHJcbmltcG9ydCB7IE11bHRpcGxlRWRpdGluZ0RhdGFHcmlkUGx1Z2luIH0gZnJvbSAnLi9NdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbic7XHJcbmltcG9ydCB7IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucywgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyIH0gZnJvbSAnLi9Db250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXInO1xyXG5pbXBvcnQgeyBEaXNwbGF5VHlwZSwgSURpc3BsYXlUeXBlU2V0dGluZ3MsIElJY29uc0NvbHVtbkVkaXRvckl0ZW0gfSBmcm9tICcuL0NvbnRyb2xDb25maWd1cmF0b3InO1xyXG5pbXBvcnQgeyBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUsIElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcclxuaW1wb3J0IGNyZWF0ZURlZmF1bHRHcmlkIGZyb20gJy4uLy4uLy4uL1dpZGdldHMvR3JpZC9EZWZhdWx0R3JpZCc7XHJcbmltcG9ydCB7IGNyZWF0ZUR4RGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL0RhdGEvRHhEYXRhU291cmNlJztcclxuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBnZXRTdW1tYXJ5Q29sdW1uIH0gZnJvbSAnLi9HcmlkU3VtbWFyeUhlbHBlcic7XHJcbmltcG9ydCB7IENkbUltcG9ydEZpbGVNb2RlIH0gZnJvbSAnLi4vLi4vQnVzaW5lc3MnO1xyXG5cclxuaW50ZXJmYWNlIElBUFNDb250cm9sRmllbGRDb25maWd1cmF0aW9uIHtcclxuICBQZXJtaXNzaW9uczogQ29udHJvbFJvbGVQZXJtaXNzaW9ucztcclxuICBOYW1lOiBzdHJpbmc7XHJcbiAgVHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdvYmplY3QnIHwgJ2RhdGUnIHwgJ2RhdGV0aW1lJztcclxuICBMYWJlbDogc3RyaW5nO1xyXG4gIE9yZGVyOiBudW1iZXI7XHJcbiAgVG9vbFRpcDogc3RyaW5nO1xyXG4gIElzRGVmYXVsdFZpZXdGaWVsZDogYm9vbGVhbjtcclxuICBJc0tleUNvbHVtbjogYm9vbGVhbjtcclxuICBHcm91cEZpZWxkOiBzdHJpbmc7XHJcbiAgRGlzcGxheVR5cGU6IHN0cmluZztcclxuICBXaWR0aD86IG51bWJlcjtcclxuICBIaWRpbmdPcmRlcj86IG51bWJlcjtcclxuICBDb2x1bW5zPzogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIElVc2VyQ29uZmlndXJhdGlvblJlc3BvbnNlIHtcclxuICBGaWVsZHNDb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdO1xyXG4gIENhbkNyZWF0ZUdsb2JhbFZpZXdzOiBib29sZWFuO1xyXG4gIENhbkNyZWF0ZUdsb2JhbEZpbHRlcnM6IGJvb2xlYW47XHJcbiAgQ2FuQ3JlYXRlRmlsdGVyczogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVWaWV3czogYm9vbGVhbjtcclxuICBDYW5DcmVhdGVEaXNwbGF5czogYm9vbGVhbjtcclxuICBDYW5BcHBsYXlEaXNwbGF5czogYm9vbGVhbjtcclxufVxyXG5cclxuLyogZXNsaW50IG5vLWJpdHdpc2U6IG9mZiAqL1xyXG4vKiB0c2xpbnQ6ZGlzYWJsZTogbm8tYml0d2lzZSAqL1xyXG5jb25zdCBlbnVtIENvbnRyb2xSb2xlUGVybWlzc2lvbnMge1xyXG4gIE5vbmUgPSAwLFxyXG4gIFJlYWQgPSAxIDw8IDAsXHJcbiAgQ3JlYXRlID0gMSA8PCAxLFxyXG4gIFVwZGF0ZSA9IDEgPDwgMixcclxuICBEZWxldGUgPSAxIDw8IDMsXHJcbn1cclxuLyogdHNsaW50OmVuYWJsZTogbm8tYml0d2lzZSAqL1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbERpc3BsYXlPcHRpb25zIHtcclxuICAkY29udGFpbmVyOiBKUXVlcnk7XHJcbiAgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcclxuICBwYWdlVGl0bGU6IHN0cmluZztcclxuICBleHBvcnRGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgdXNlckNvbmZpZ1VybDogc3RyaW5nO1xyXG4gIGNvbnRyb2xMb2dzVXJsOiBzdHJpbmc7XHJcbiAgbG9hZERhdGFVcmw6IHN0cmluZztcclxuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9uczogSUdyaWRGaWx0ZXJzTWFuYWdlck9wdGlvbnM7XHJcbiAgZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnM6IElHcmlkVmlld3NNYW5hZ2VyT3B0aW9ucztcclxuICBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczogSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gIHJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zOiBJUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM7XHJcbiAgaW1wb3J0RmlsZU9wdGlvbnM/OiBJRmlsZUltcG9ydGVyT3B0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRyb2xEaXNwbGF5IHtcclxuICBwdWJsaWMgcmVhZG9ubHkgJGNvbnRhaW5lcjogSlF1ZXJ5O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNvbmZpZ1VybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbExvZ3NVcmw6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvYWREYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRmlsdGVyc01hbmFnZXJPcHRpb25zOiBJR3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRWaWV3c01hbmFnZXJPcHRpb25zOiBJR3JpZFZpZXdzTWFuYWdlck9wdGlvbnM7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9uczogSUdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyTG9hZE9wdGlvbnM6IElSZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGltcG9ydEZpbGVPcHRpb25zOiBJRmlsZUltcG9ydGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBtYWluR3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQ6IEdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50OiBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgZ3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudDogR3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBtdWx0aXBsZUVkaXRpbmdEYXRhR3JpZFBsdWdpbjogTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb250cm9sRGlzcGxheU9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGNvbnRhaW5lciA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcclxuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcclxuICAgIHRoaXMucGFnZVRpdGxlID0gb3B0aW9ucy5wYWdlVGl0bGU7XHJcbiAgICB0aGlzLmV4cG9ydEZpbGVOYW1lID0gb3B0aW9ucy5leHBvcnRGaWxlTmFtZTtcclxuICAgIHRoaXMudXNlck5hbWUgPSBvcHRpb25zLnVzZXJOYW1lO1xyXG4gICAgdGhpcy51c2VyQ29uZmlnVXJsID0gb3B0aW9ucy51c2VyQ29uZmlnVXJsO1xyXG4gICAgdGhpcy5jb250cm9sTG9nc1VybCA9IG9wdGlvbnMuY29udHJvbExvZ3NVcmw7XHJcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcclxuICAgIHRoaXMudXBkYXRlRGF0YVVybCA9IG9wdGlvbnMudXBkYXRlRGF0YVVybDtcclxuICAgIHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucztcclxuICAgIHRoaXMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnMgPSBvcHRpb25zLmdyaWRWaWV3c01hbmFnZXJPcHRpb25zO1xyXG4gICAgdGhpcy5ncmlkRGlzcGxheXNNYW5hZ2VyT3B0aW9ucyA9IG9wdGlvbnMuZ3JpZERpc3BsYXlzTWFuYWdlck9wdGlvbnM7XHJcbiAgICB0aGlzLnJlbW90ZUNvbnRyb2xEaXNwbGF5VXNlclNldHRpbmdzTWFuYWdlckxvYWRPcHRpb25zID0gb3B0aW9ucy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucztcclxuICAgIHRoaXMuaW1wb3J0RmlsZU9wdGlvbnMgPSBvcHRpb25zLmltcG9ydEZpbGVPcHRpb25zO1xyXG5cclxuICAgIHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcyhbJ2Fwcy1ncmlkJywgJ2NvbnRyb2wtZGlzcGxheS1ncmlkJ10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHNlbmRSZXF1ZXN0PElVc2VyQ29uZmlndXJhdGlvblJlc3BvbnNlPih0aGlzLnVzZXJDb25maWdVcmwpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBjb25zdCBncmlkRmlsdGVyc01hbmFnZXIgPSBuZXcgR3JpZEZpbHRlcnNNYW5hZ2VyKHRoaXMuZ3JpZEZpbHRlcnNNYW5hZ2VyT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZ3JpZFZpZXdzTWFuYWdlciA9IG5ldyBHcmlkVmlld3NNYW5hZ2VyKHRoaXMuZ3JpZFZpZXdzTWFuYWdlck9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGdyaWREaXNwbGF5c01hbmFnZXIgPSBuZXcgR3JpZERpc3BsYXlzTWFuYWdlcih0aGlzLmdyaWREaXNwbGF5c01hbmFnZXJPcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYWluR3JpZCA9IHRoaXMuY3JlYXRlTWFpbkdyaWQocmVzLkZpZWxkc0NvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVEaXNwbGF5cyA9IHJlcy5DYW5DcmVhdGVEaXNwbGF5cyAmJiByZXMuQ2FuQ3JlYXRlVmlld3MgJiYgcmVzLkNhbkNyZWF0ZUZpbHRlcnM7XHJcblxyXG4gICAgICAgIGlmIChjYW5DcmVhdGVEaXNwbGF5cyB8fCByZXMuQ2FuQXBwbGF5RGlzcGxheXMpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZERpc3BsYXlzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkRGlzcGxheXNUb29sYmFyQ29tcG9uZW50KHtcclxuICAgICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWQsXHJcbiAgICAgICAgICAgIGVkaXRNb2RlOiBjYW5DcmVhdGVEaXNwbGF5cyxcclxuICAgICAgICAgICAgZ3JpZEZpbHRlcnNNYW5hZ2VyLFxyXG4gICAgICAgICAgICBncmlkVmlld3NNYW5hZ2VyLFxyXG4gICAgICAgICAgICBncmlkRGlzcGxheXNNYW5hZ2VyLFxyXG4gICAgICAgICAgICBpbXBvcnRGaWxlT3B0aW9uczogdGhpcy5pbXBvcnRGaWxlT3B0aW9uc1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQgPSBuZXcgR3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudCh7XHJcbiAgICAgICAgICBvd25lcjogdGhpcy5tYWluR3JpZCxcclxuICAgICAgICAgIG9uVmlld0FwcGxpZWQ6IHRoaXMub25WaWV3QXBwbGllZCxcclxuICAgICAgICAgIG9uVmlld0RlbGV0ZWQ6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgZ3JpZERpc3BsYXlzTWFuYWdlci5sb2FkRGlzcGxheXMoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhdXRvSW50ZWdyYXRpb246IHRydWUsXHJcbiAgICAgICAgICBncmlkVmlld3NNYW5hZ2VyLFxyXG4gICAgICAgICAgY2FuQ3JlYXRlR2xvYmFsVmlld3M6IHJlcy5DYW5DcmVhdGVHbG9iYWxWaWV3cyxcclxuICAgICAgICAgIHZpc2libGU6IHJlcy5DYW5DcmVhdGVWaWV3c1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdyaWRGaWx0ZXJzVG9vbGJhckNvbXBvbmVudCA9IG5ldyBHcmlkRmlsdGVyc1Rvb2xiYXJDb21wb25lbnQoe1xyXG4gICAgICAgICAgYXBzQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyOiBuZXcgUmVtb3RlQ29udHJvbERpc3BsYXlVc2VyU2V0dGluZ3NNYW5hZ2VyKHtcclxuICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJOYW1lLFxyXG4gICAgICAgICAgICBsb2FkRGF0YVVybDogdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucy5sb2FkRGF0YVVybCxcclxuICAgICAgICAgICAgdXBkYXRlRGF0YVVybDogdGhpcy5yZW1vdGVDb250cm9sRGlzcGxheVVzZXJTZXR0aW5nc01hbmFnZXJMb2FkT3B0aW9ucy51cGRhdGVEYXRhVXJsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG93bmVyOiB0aGlzLm1haW5HcmlkLFxyXG4gICAgICAgICAgb25GaWx0ZXJEZWxldGVkOiBhc3luYyAoZmlsdGVySWQpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgZ3JpZERpc3BsYXlzTWFuYWdlci5sb2FkRGlzcGxheXMoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhdXRvSW50ZWdyYXRpb246IHRydWUsXHJcbiAgICAgICAgICBncmlkRmlsdGVyc01hbmFnZXIsXHJcbiAgICAgICAgICBjYW5DcmVhdGVHbG9iYWxGaWx0ZXJzOiByZXMuQ2FuQ3JlYXRlR2xvYmFsRmlsdGVycyxcclxuICAgICAgICAgIHZpc2libGU6IHJlcy5DYW5DcmVhdGVGaWx0ZXJzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMubXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4gPSBuZXcgTXVsdGlwbGVFZGl0aW5nRGF0YUdyaWRQbHVnaW4oe1xyXG4gICAgICAgICAgb3duZXI6IHRoaXMubWFpbkdyaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ3JpZERpc3BsYXlzTWFuYWdlci5vbkRpc3BsYXlDaGFuZ2VkID0gYXN5bmMgKGRpc3BsYXkpID0+IHtcclxuICAgICAgICAgIGlmIChkaXNwbGF5KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50LmFwcGx5RmlsdGVyKGRpc3BsYXkuRmlsdGVySWQsIHRydWUpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQuYXBwbHlWaWV3KGRpc3BsYXkuVmlld0lkKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZEZpbHRlcnNUb29sYmFyQ29tcG9uZW50LmFwcGx5RmlsdGVyKHZvaWQgMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5hcHBseVZpZXcoR3JpZFZpZXdzTWFuYWdlci5kZWZhdWx0Q29udHJvbERpc3BsYXlWaWV3LmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qIHRzbGludDpkaXNhYmxlOiBuby1iaXR3aXNlICovXHJcbiAgcHJpdmF0ZSBoYXNQZXJtaXNzb24ocnVsZXMsIHBlcm1pc3Nvbikge1xyXG4gICAgcmV0dXJuIHJ1bGVzICYgcGVybWlzc29uO1xyXG4gIH1cclxuICAvKiB0c2xpbnQ6ZW5hYmxlOiBuby1iaXR3aXNlICovXHJcblxyXG4gIHByaXZhdGUgYnVpbGRUcmVlKGNvbHVtbnMpIHtcclxuICAgIGNvbnN0IGdyb3VwUHJlZml4ID0gJ19fR1JPVVBfXyc7XHJcblxyXG4gICAgbGV0IGNvbHVtbnNNYXAgPSBjb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2x1bW4pID0+IHtcclxuICAgICAgY29sdW1uLkNvbHVtbnMgPSBbXTtcclxuICAgICAgY29sdW1uLkdyb3VwRmllbGQgPSBjb2x1bW4uR3JvdXBGaWVsZFxyXG4gICAgICAgID8gYCR7Z3JvdXBQcmVmaXh9JHtjb2x1bW4uR3JvdXBGaWVsZH1gXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgICBhY2NbY29sdW1uLk5hbWVdID0gY29sdW1uO1xyXG5cclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxuXHJcbiAgICBjb2x1bW5zTWFwID0gY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5Hcm91cEZpZWxkKVxyXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5Hcm91cEZpZWxkKVxyXG4gICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxyXG4gICAgICAucmVkdWNlKChhY2MsIGdyb3VwRmllbGQpID0+IHtcclxuICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gZ3JvdXBGaWVsZC5yZXBsYWNlKGdyb3VwUHJlZml4LCAnJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyb3VwQ29sdW1uID0ge1xyXG4gICAgICAgICAgTmFtZTogZ3JvdXBGaWVsZCxcclxuICAgICAgICAgIExhYmVsOiBjb2x1bW5OYW1lLFxyXG4gICAgICAgICAgQ29sdW1uczogW10sXHJcbiAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTogbWF4LWxpbmUtbGVuZ3RoICovXHJcbiAgICAgICAgICBHcm91cEZpZWxkOiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdICYmIGNvbHVtbnNNYXBbY29sdW1uTmFtZV0uR3JvdXBGaWVsZCAmJiBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGQgIT09IGdyb3VwRmllbGRcclxuICAgICAgICAgICAgPyBjb2x1bW5zTWFwW2NvbHVtbk5hbWVdLkdyb3VwRmllbGRcclxuICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgYWNjW2dyb3VwRmllbGRdID0gZ3JvdXBDb2x1bW47XHJcblxyXG4gICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgIH0sIGNvbHVtbnNNYXApO1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBpbiBjb2x1bW5zTWFwKSB7XHJcbiAgICAgIGlmIChjb2x1bW5zTWFwLmhhc093blByb3BlcnR5KGNvbHVtbk5hbWUpKSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc01hcFtjb2x1bW5OYW1lXTtcclxuXHJcbiAgICAgICAgaWYgKGNvbHVtbi5Hcm91cEZpZWxkKSB7XHJcbiAgICAgICAgICBjb2x1bW5zTWFwW2NvbHVtbi5Hcm91cEZpZWxkXS5Db2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goY29sdW1uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEaXNwbGF5VHlwZShzZXR0aW5nczogSURpc3BsYXlUeXBlU2V0dGluZ3MsIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLCBwZXJtaXNzaW9uczogQ29udHJvbFJvbGVQZXJtaXNzaW9ucykge1xyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLkljb25zKSB7XHJcbiAgICAgIGNvbHVtbi5jZWxsVGVtcGxhdGUgPSAoY29udGFpbmVyLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcob3B0aW9ucy52YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgY2VsbFNldHRpbmdzID0gc2V0dGluZ3MuZGF0YS5maW5kKChpdGVtKSA9PiBTdHJpbmcoaXRlbS52YWx1ZSkgPT09IHN0cmluZ1ZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKGNlbGxTZXR0aW5ncykge1xyXG4gICAgICAgICAgJCgnPGRpdj4nKVxyXG4gICAgICAgICAgICAuY3NzKHsgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyB9KVxyXG4gICAgICAgICAgICAuYXR0cigndGl0bGUnLCBjZWxsU2V0dGluZ3MudGl0bGUpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJCgnPGltZz4nLCB7IHNyYzogY2VsbFNldHRpbmdzLmltYWdlIH0pKVxyXG4gICAgICAgICAgICAuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgJCgnPGRpdiAvPicpXHJcbiAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgIC50ZXh0KG9wdGlvbnMudmFsdWUpXHJcbiAgICAgICAgICAgIC5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2V0dGluZ3MuZGF0YSxcclxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogJ3RpdGxlJyxcclxuICAgICAgICAgIGl0ZW1UZW1wbGF0ZTogKGRhdGE6IElJY29uc0NvbHVtbkVkaXRvckl0ZW0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgIC5jc3MoeyAndGV4dC1hbGlnbic6ICdjZW50ZXInIH0pXHJcbiAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgZGF0YS50aXRsZSlcclxuICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpbWc+JywgeyBzcmM6IGRhdGEuaW1hZ2UgfSkpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgIGZpZWxkVGVtcGxhdGU6IChkYXRhLCBlbCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IHNldHRpbmdzLmRhdGEuZmluZCgoaXRlbSkgPT4gcGFyc2VJbnQoaXRlbS52YWx1ZSkgPT09IGNlbGxJbmZvLnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgJGl0ZW1OYW1lID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdpdGVtLW5hbWUnKTtcclxuICAgICAgICAgICAgY29uc3QgJHJlc3VsdCA9ICQoJzxkaXYgLz4nKVxyXG4gICAgICAgICAgICAgIC5hZGRDbGFzcygnYXBzLWljb24tZWRpdG9yX19jdXN0b20taXRlbScpXHJcbiAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aW1nPicsIHsgc3JjOiBjdXJyZW50SXRlbSA/IGN1cnJlbnRJdGVtLmltYWdlIDogJycgfSkuYXR0cigndGl0bGUnLCBjdXJyZW50SXRlbSA/IGN1cnJlbnRJdGVtLnRpdGxlIDogJycpKVxyXG4gICAgICAgICAgICAgIC5hcHBlbmQoJGl0ZW1OYW1lKTtcclxuXHJcbiAgICAgICAgICAgICRpdGVtTmFtZVxyXG4gICAgICAgICAgICAgIC5keFRleHRCb3goe1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxyXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWVcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGVsLmFwcGVuZCgkcmVzdWx0KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUsIGNvbXBvbmVudCB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLnNldFZhbHVlKHBhcnNlSW50KHZhbHVlLnZhbHVlKSk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5ibHVyKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmFsdWU6IChjZWxsSW5mby52YWx1ZSAhPT0gbnVsbCAmJiBjZWxsSW5mbyAhPT0gdm9pZCAwKSAmJiBjZWxsSW5mby52YWx1ZS50b1N0cmluZygpLFxyXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtOiBzZXR0aW5ncy5kYXRhLmZpbmQoKGl0ZW0pID0+IHBhcnNlSW50KGl0ZW0udmFsdWUpID09PSBjZWxsSW5mby52YWx1ZSlcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29sdW1uLmFsbG93U2VhcmNoID0gZmFsc2U7XHJcbiAgICAgIGNvbHVtbi5hbGxvd0ZpbHRlcmluZyA9IGZhbHNlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dIZWFkZXJGaWx0ZXJpbmcgPSB0cnVlO1xyXG4gICAgICBjb2x1bW4uYWxsb3dHcm91cGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXR0aW5ncy50eXBlID09PSBEaXNwbGF5VHlwZS5QcmVkZWZpbmVkVmFsdWVzKSB7XHJcbiAgICAgIGNvbHVtbi5lZGl0Q2VsbFRlbXBsYXRlID0gKGNvbnRhaW5lciwgY2VsbEluZm8pID0+IHtcclxuICAgICAgICAkKCc8ZGl2IC8+JykuZHhTZWxlY3RCb3goe1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2V0dGluZ3MuZGF0YS5tYXAoKGkpID0+IGkudmFsdWUpLnNvcnQoKSxcclxuICAgICAgICAgIGFjY2VwdEN1c3RvbVZhbHVlOiB0cnVlLFxyXG4gICAgICAgICAgc2hvd0NsZWFyQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh7IHZhbHVlLCBjb21wb25lbnQgfSkgPT4ge1xyXG4gICAgICAgICAgICBjZWxsSW5mby5zZXRWYWx1ZSh2YWx1ZSB8fCAnJyk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5ibHVyKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlLFxyXG4gICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09IERpc3BsYXlUeXBlLlJhYmJpdEFjdGlvbikge1xyXG4gICAgICBjb2x1bW4uZWRpdENlbGxUZW1wbGF0ZSA9IChjb250YWluZXIsIGNlbGxJbmZvKSA9PiB7XHJcbiAgICAgICAgJCgnPGRpdiAvPicpLmR4Q2hlY2tCb3goe1xyXG4gICAgICAgICAgdmFsdWU6IGNlbGxJbmZvLnZhbHVlIHx8IGZhbHNlLFxyXG4gICAgICAgICAgcmVhZE9ubHk6ICF0aGlzLmhhc1Blcm1pc3NvbihwZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpLFxyXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgICAgIGNlbGxJbmZvLmNvbXBvbmVudC5jZWxsVmFsdWUoY2VsbEluZm8ucm93SW5kZXgsIGNlbGxJbmZvLmNvbHVtbi5kYXRhRmllbGQsIGUudmFsdWUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVDb2x1bW4oY29sdW1uQ29uZmlnOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbik6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiB7XHJcbiAgICBjb25zdCB0aXRsZSA9IGNvbHVtbkNvbmZpZy5MYWJlbCB8fCBjb2x1bW5Db25maWcuTmFtZTtcclxuICAgIGNvbnN0IHRvb2x0aXAgPSBjb2x1bW5Db25maWcuVG9vbFRpcCB8fCB0aXRsZTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW46IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZENvbHVtbiA9ICFjb2x1bW5Db25maWcuQ29sdW1ucy5sZW5ndGhcclxuICAgICAgPyB7XHJcbiAgICAgICAgZGF0YUZpZWxkOiBjb2x1bW5Db25maWcuTmFtZSxcclxuICAgICAgICBkYXRhVHlwZTogY29sdW1uQ29uZmlnLlR5cGUsXHJcbiAgICAgICAgY2FwdGlvbjogdGl0bGUsXHJcbiAgICAgICAgaGVhZGVyQ2VsbFRlbXBsYXRlOiBjcmVhdGVIZWFkZXJDZWxsVGVtcGxhdGUodGl0bGUsIHRvb2x0aXApLFxyXG4gICAgICAgIHZpc2libGU6IGNvbHVtbkNvbmZpZy5Jc0RlZmF1bHRWaWV3RmllbGQsXHJcbiAgICAgICAgdmlzaWJsZUluZGV4OiBjb2x1bW5Db25maWcuT3JkZXIsXHJcbiAgICAgICAgYWxsb3dGaXhpbmc6IGZhbHNlLFxyXG4gICAgICAgIGFsbG93RWRpdGluZzogISF0aGlzLmhhc1Blcm1pc3Nvbihjb2x1bW5Db25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSxcclxuICAgICAgICB3aWR0aDogY29sdW1uQ29uZmlnLldpZHRoLFxyXG4gICAgICAgIGhpZGluZ1ByaW9yaXR5OiBjb2x1bW5Db25maWcuSGlkaW5nT3JkZXJcclxuICAgICAgfSA6IHtcclxuICAgICAgICBjYXB0aW9uOiB0aXRsZSxcclxuICAgICAgICBjb2x1bW5zOiBjb2x1bW5Db25maWcuQ29sdW1ucy5tYXAoKGMpID0+IHRoaXMuY29uZmlndXJlQ29sdW1uKGMpKVxyXG4gICAgICB9O1xyXG5cclxuICAgIGlmIChjb2x1bW5Db25maWcuRGlzcGxheVR5cGUpIHtcclxuICAgICAgY29uc3QgZGlzcGxheVNldHRpbmdzOiBJRGlzcGxheVR5cGVTZXR0aW5ncyA9IEpTT04ucGFyc2UoY29sdW1uQ29uZmlnLkRpc3BsYXlUeXBlKTtcclxuXHJcbiAgICAgIGlmIChkaXNwbGF5U2V0dGluZ3MudHlwZSA9PT0gRGlzcGxheVR5cGUuSWNvbnMpIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGRpc3BsYXlTZXR0aW5ncy5kYXRhLm1hcCgoaXRlbSkgPT4gKHtcclxuICAgICAgICAgIHRleHQ6IGl0ZW0udGl0bGUsXHJcbiAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZVxyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgaXRlbXMuc3BsaWNlKDAsIDAsIHtcclxuICAgICAgICAgIHRleHQ6ICdCbGFuaycsXHJcbiAgICAgICAgICB2YWx1ZTogbnVsbFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAoY29sdW1uIGFzIGFueSkuaGVhZGVyRmlsdGVyID0ge1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogaXRlbXNcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlbmRlckRpc3BsYXlUeXBlKGRpc3BsYXlTZXR0aW5ncywgY29sdW1uLCBjb2x1bW5Db25maWcuUGVybWlzc2lvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbHVtbnMoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSkge1xyXG4gICAgY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZmlsdGVyKFxyXG4gICAgICAoYykgPT4gdGhpcy5oYXNQZXJtaXNzb24oYy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5SZWFkKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25maWd1cmF0aW9uID0gdGhpcy5idWlsZFRyZWUoY29uZmlndXJhdGlvbik7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gY29uZmlndXJhdGlvbi5tYXAoKGMpID0+IHRoaXMuY29uZmlndXJlQ29sdW1uKGMpKTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyaWQoY29uZmlndXJhdGlvbjogSUFQU0NvbnRyb2xGaWVsZENvbmZpZ3VyYXRpb25bXSkge1xyXG4gICAgY29uc3QgaGFzS2V5cyA9IGNvbmZpZ3VyYXRpb24uc29tZSgoYykgPT4gYy5Jc0tleUNvbHVtbik7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWd1cmVDb2x1bW5zKGNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIGNvbnN0IGNvbHVtbkZvclN1bW1hcnkgPSBnZXRTdW1tYXJ5Q29sdW1uKGNvbHVtbnMpO1xyXG4gICAgY29uc3QgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMuY3JlYXRlTWFpbkdyaWREYXRhU291cmNlKGNvbmZpZ3VyYXRpb24pLFxyXG4gICAgICBjb2x1bW5SZXNpemluZ01vZGU6ICd3aWRnZXQnLFxyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICBlZGl0aW5nOiB7XHJcbiAgICAgICAgYWxsb3dVcGRhdGluZzogaGFzS2V5cyxcclxuICAgICAgICBhbGxvd0FkZGluZzogZmFsc2UsXHJcbiAgICAgICAgYWxsb3dEZWxldGluZzogZmFsc2UsXHJcbiAgICAgICAgbW9kZTogJ2JhdGNoJ1xyXG4gICAgICB9LFxyXG4gICAgICBzY3JvbGxpbmc6IHsgbW9kZTogJ3ZpcnR1YWwnLCBwcmVsb2FkRW5hYmxlZDogdHJ1ZSB9LFxyXG4gICAgICByZW1vdGVPcGVyYXRpb25zOiB0cnVlLFxyXG4gICAgICBwYWdlcjogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuaXNTdGFuZGFsb25lUGFnZSA/IHVuZGVmaW5lZCA6ICcxMDAlJyxcclxuICAgICAgY29sdW1uQ2hvb3Nlcjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgbW9kZTogJ2RyYWdBbmREcm9wJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5GaXhpbmc6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbHRlclBhbmVsOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICB0ZXh0czoge1xyXG4gICAgICAgICAgY3JlYXRlRmlsdGVyOiAnTm9uZScsXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBzdW1tYXJ5OiB7XHJcbiAgICAgICAgdG90YWxJdGVtczogW3sgc3VtbWFyeVR5cGU6ICdjb3VudCcsIGNvbHVtbjogY29sdW1uRm9yU3VtbWFyeSB9XVxyXG4gICAgICB9LFxyXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxyXG4gICAgICBjb2x1bW5IaWRpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaG92ZXJTdGF0ZUVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvbHVtbnMsXHJcbiAgICAgIGFsbG93Q29sdW1uUmVvcmRlcmluZzogdHJ1ZSxcclxuICAgICAgZ3JvdXBpbmc6IHtcclxuICAgICAgICBjb250ZXh0TWVudUVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgZ3JvdXBQYW5lbDoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgbWFzdGVyRGV0YWlsOiAhaGFzS2V5cyA/IHVuZGVmaW5lZCA6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHRlbXBsYXRlOiAoY29udGFpbmVyLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0ge307XHJcbiAgICAgICAgICBjb25maWd1cmF0aW9uLmZpbHRlcigoYykgPT4gYy5Jc0tleUNvbHVtbikuZm9yRWFjaCgoYykgPT4ga2V5c1tjLk5hbWVdID0gb3B0aW9ucy5kYXRhW2MuTmFtZV0pO1xyXG5cclxuICAgICAgICAgICQoJzxkaXY+JylcclxuICAgICAgICAgICAgLmR4RGF0YUdyaWQoe1xyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IHtcclxuICAgICAgICAgICAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgICAgICAgICAgICBsb2FkVXJsOiBgJHt0aGlzLmNvbnRyb2xMb2dzVXJsfT9rZXk9JHtKU09OLnN0cmluZ2lmeShrZXlzKX1gLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHNob3dCb3JkZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICAgIGNvbHVtbnM6IFt7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdVc2VyJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAyMDBcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQ6ICdDcmVhdGVkQXQnLFxyXG4gICAgICAgICAgICAgICAgY2FwdGlvbjogJ0RhdGUnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdkYXRlJyxcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ3Nob3J0RGF0ZVNob3J0VGltZScsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwXHJcbiAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkOiAnQ2hhbmdlcycsXHJcbiAgICAgICAgICAgICAgICBjZWxsVGVtcGxhdGU6IChjLCBvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBvLmRhdGEuQ2hhbmdlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaXRlbSkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgPGRpdiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nJz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdhcHMtY29udHJvbC1sb2dfX2ZpZWxkJz4ke2l0ZW0uRmllbGR9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2Fwcy1jb250cm9sLWxvZ19fb2xkLXZhbHVlJz4ke2l0ZW0uT2xkVmFsdWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHUyMTkyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nYXBzLWNvbnRyb2wtbG9nX19uZXctdmFsdWUnPiR7aXRlbS5OZXdWYWx1ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAkKGA8ZGl2IGNsYXNzPSdhcHMtY29udHJvbC1sb2dzJz4ke2NvbnRlbnR9PC9kaXY+YCkuYXBwZW5kVG8oYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfV0sXHJcbiAgICAgICAgICAgIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkNvbnRlbnRSZWFkeTogKGUpID0+IHtcclxuICAgICAgICBpZiAoIWUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXBhcmVGaWx0ZXJQYW5lbChlLmNvbXBvbmVudCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRWRpdG9yUHJlcGFyaW5nOiAoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLnBhcmVudFR5cGUgIT09ICdkYXRhUm93Jykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmllbGRDb25maWcgPSBjb25maWd1cmF0aW9uLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gZS5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICBpZiAoIWZpZWxkQ29uZmlnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXNhYmxlRWRpdGluZyA9ICF0aGlzLmhhc1Blcm1pc3NvbihmaWVsZENvbmZpZy5QZXJtaXNzaW9ucywgQ29udHJvbFJvbGVQZXJtaXNzaW9ucy5VcGRhdGUpO1xyXG5cclxuICAgICAgICBlLmVkaXRvck9wdGlvbnMucmVhZE9ubHkgPSBkaXNhYmxlRWRpdGluZztcclxuXHJcbiAgICAgICAgaWYgKCFkaXNhYmxlRWRpdGluZyAmJiBmaWVsZENvbmZpZy5UeXBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc3QgYmFzZVNldFZhbHVlID0gZS5zZXRWYWx1ZTtcclxuXHJcbiAgICAgICAgICAoZSBhcyBhbnkpLnNldFZhbHVlID0gKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgYmFzZVNldFZhbHVlKG5ld1ZhbHVlLnRyaW0oKSk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25DZWxsUHJlcGFyZWQ6IChlKSA9PiB7XHJcbiAgICAgICAgaWYgKGUucm93VHlwZSA9PT0gJ2RhdGEnKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IGNvbmZpZ3VyYXRpb24uZmluZCgoYykgPT4gYy5OYW1lID09PSBlLmNvbHVtbi5kYXRhRmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZENvbmZpZyAmJiAhdGhpcy5oYXNQZXJtaXNzb24oZmllbGRDb25maWcuUGVybWlzc2lvbnMsIENvbnRyb2xSb2xlUGVybWlzc2lvbnMuVXBkYXRlKSkge1xyXG4gICAgICAgICAgICAkKGUuY2VsbEVsZW1lbnQpLmFkZENsYXNzKCdhcHMtZ3JpZF9fZGlzYWJsZWQtY2VsbCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25Sb3dFeHBhbmRlZDogKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkZXRhaWxSb3dJbmRleCA9IGUuY29tcG9uZW50LmdldFJvd0luZGV4QnlLZXkoZS5rZXkpICsgMTtcclxuICAgICAgICBjb25zdCAkZGV0YWlsQ2VsbCA9IGUuY29tcG9uZW50LmdldENlbGxFbGVtZW50KGRldGFpbFJvd0luZGV4LCAwKS5wYXJlbnQoKS5maW5kKCcuZHgtbWFzdGVyLWRldGFpbC1jZWxsJyk7XHJcbiAgICAgICAgY29uc3QgZGF0YUdyaWQgPSAkZGV0YWlsQ2VsbC5maW5kKCcuZHgtZGF0YWdyaWQnKS5maXJzdCgpLnBhcmVudCgpLmR4RGF0YUdyaWQoJ2luc3RhbmNlJyk7XHJcblxyXG4gICAgICAgIGRhdGFHcmlkLnJlZnJlc2goKTtcclxuICAgICAgfSxcclxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9ucztcclxuXHJcbiAgICByZXR1cm4gY3JlYXRlRGVmYXVsdEdyaWQodGhpcy4kY29udGFpbmVyLCB7XHJcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxyXG4gICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNTdGFuZGFsb25lUGFnZSxcclxuICAgICAgc2V0RGVmYXVsdENvbHVtbldpZHRoOiB0cnVlLFxyXG4gICAgICBleHBvcnRGaWxlTmFtZTogdGhpcy5leHBvcnRGaWxlTmFtZSxcclxuICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxyXG4gICAgICBkaXNhYmxlU3VtbWFyeUNvbHVtbkRldGVjdGlvbjogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1haW5HcmlkRGF0YVNvdXJjZShjb25maWd1cmF0aW9uOiBJQVBTQ29udHJvbEZpZWxkQ29uZmlndXJhdGlvbltdKTogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkT3B0aW9uc1snZGF0YVNvdXJjZSddIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlOiBjcmVhdGVEeERhdGFTb3VyY2Uoe1xyXG4gICAgICAgIGtleTogY29uZmlndXJhdGlvbi5maWx0ZXIoKGMpID0+IGMuSXNLZXlDb2x1bW4pLm1hcCgoYykgPT4gYy5OYW1lKSxcclxuICAgICAgICBsb2FkVXJsOiB0aGlzLmxvYWREYXRhVXJsLFxyXG4gICAgICAgIHVwZGF0ZVVybDogdGhpcy51cGRhdGVEYXRhVXJsXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvblZpZXdBcHBsaWVkID0gKHZpZXdJZDogbnVtYmVyKSA9PiB7XHJcbiAgICB0aGlzLmNsZWFyRmlsdGVyUm93QWZ0ZXJWaWV3U3dpdGNoaW5nKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVGaWx0ZXJQYW5lbChncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQpIHtcclxuICAgIGNvbnN0ICRmaWx0ZXJQYW5lbEVsZW1lbnQgPSBncmlkLmVsZW1lbnQoKVxyXG4gICAgICAuZmluZCgnLmR4LWRhdGFncmlkLWZpbHRlci1wYW5lbCcpO1xyXG4gICAgY29uc3QgJGZpbHRlckljb25GaWx0ZXIgPSAkZmlsdGVyUGFuZWxFbGVtZW50LmZpbmQoJy5keC1pY29uLWZpbHRlcicpO1xyXG4gICAgY29uc3QgJGZpbHRlclBhbmVsVGV4dCA9ICRmaWx0ZXJQYW5lbEVsZW1lbnQuZmluZCgnLmR4LWRhdGFncmlkLWZpbHRlci1wYW5lbC10ZXh0Jyk7XHJcblxyXG4gICAgJGZpbHRlckljb25GaWx0ZXIub2ZmKCdjbGljaycpO1xyXG4gICAgJGZpbHRlclBhbmVsVGV4dC5vZmYoJ2NsaWNrJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRSb3dzQ291bnRTdW1tYXJ5KGdyaWQ6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCkge1xyXG4gICAgY29uc3QgZmlyc3RWaXNpYmxlRGF0YUNvbHVtbiA9IGdyaWQuZ2V0VmlzaWJsZUNvbHVtbnMoKS5maW5kKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcclxuICAgIGlmICghZmlyc3RWaXNpYmxlRGF0YUNvbHVtbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgcm93c0NvdW50U3VtbWFyeU5hbWUgPSAnUm93c0NvdW50JztcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBjb25zdCB0b3RhbEl0ZW1zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuUHJvcGVydGllc1snc3VtbWFyeSddWyd0b3RhbEl0ZW1zJ10gPSAoZ3JpZC5vcHRpb24oJ3N1bW1hcnkudG90YWxJdGVtcycpIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Qcm9wZXJ0aWVzWydzdW1tYXJ5J11bJ3RvdGFsSXRlbXMnXSApIHx8IFtdO1xyXG4gICAgY29uc3Qgcm93c0NvdW50U3VtbWFyeUl0ZW0gPSB0b3RhbEl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbS5uYW1lID09PSByb3dzQ291bnRTdW1tYXJ5TmFtZSk7XHJcbiAgICBpZiAocm93c0NvdW50U3VtbWFyeUl0ZW0gJiYgcm93c0NvdW50U3VtbWFyeUl0ZW0uY29sdW1uID09PSBmaXJzdFZpc2libGVEYXRhQ29sdW1uLmRhdGFGaWVsZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvd3NDb3VudFN1bW1hcnlJdGVtKSB7XHJcbiAgICAgIHJvd3NDb3VudFN1bW1hcnlJdGVtLmNvbHVtbiA9IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG90YWxJdGVtcy5wdXNoKHtcclxuICAgICAgICBuYW1lOiByb3dzQ291bnRTdW1tYXJ5TmFtZSxcclxuICAgICAgICBjb2x1bW46IGZpcnN0VmlzaWJsZURhdGFDb2x1bW4uZGF0YUZpZWxkLFxyXG4gICAgICAgIHN1bW1hcnlUeXBlOiAnY291bnQnLFxyXG4gICAgICAgIGFsaWdubWVudDogJ2xlZnQnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1haW5HcmlkLm9wdGlvbignc3VtbWFyeS50b3RhbEl0ZW1zJywgdG90YWxJdGVtcyk7XHJcbiAgfVxyXG5cclxuICAvLyBOT1RFOiBXb3JrYXJvdW5kLiBUaGUgZ3JpZCBjYW4ndCBjbGVhciB0aGUgZmlsdGVyIHJvdywgc28gd2UgY2xlYXIgdGhhdCBtYW51YWxseVxyXG4gIHByaXZhdGUgY2xlYXJGaWx0ZXJSb3dBZnRlclZpZXdTd2l0Y2hpbmcoKSB7XHJcbiAgICBjb25zdCBjbGVhckhlYWRlciA9ICgpID0+IHtcclxuICAgICAgY29uc3QgY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlczogeyBbdmlzaWJsZUluZGV4OiBudW1iZXJdOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ3JpZFZpZXdzVG9vbGJhckNvbXBvbmVudC5vcHRpb25zLmdyaWRTdGF0ZU1hbmFnZXIuY3VycmVudFNhdmVkR3JpZFN0YXRlLmNvbHVtbnNcclxuICAgICAgICB8fCB0aGlzLmdyaWRWaWV3c1Rvb2xiYXJDb21wb25lbnQub3B0aW9ucy5vd25lci5vcHRpb24oJ2NvbHVtbnMnKSBhcyBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQuQ29sdW1uW107XHJcblxyXG4gICAgICBjb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy52aXNpYmxlSW5kZXggJiYgKGMuZmlsdGVyVmFsdWUgfHwgYy5maWx0ZXJWYWx1ZXMpKVxyXG4gICAgICAgIC5mb3JFYWNoKChjKSA9PiBjb2x1bW5zV2l0aEZpbHRlcmVkVmFsdWVzW2MudmlzaWJsZUluZGV4XSA9IGMpO1xyXG5cclxuICAgICAgJCgndGQgW2FyaWEtbGFiZWwqPVwiRmlsdGVyIGNlbGxcIl0nKVxyXG4gICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiAhY29sdW1uc1dpdGhGaWx0ZXJlZFZhbHVlc1tpbmRleF0pXHJcbiAgICAgICAgLnZhbCgnJyk7XHJcbiAgICAgIHRoaXMubWFpbkdyaWQub2ZmKCdjb250ZW50UmVhZHknLCBjbGVhckhlYWRlcik7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5tYWluR3JpZC5vbignY29udGVudFJlYWR5JywgY2xlYXJIZWFkZXIpO1xyXG4gIH1cclxufVxyXG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xuaW1wb3J0IHsgY3JlYXRlRGVmYXVsdERhdGFHcmlkLCBjcmVhdGVGdWxsU2NyZWVuRGF0YUdyaWQsIElHcmlkQWRkaXRpb25hbE9wdGlvbnMgfSBmcm9tICcuLi9HcmlkL0NyZWF0ZURlZmF1bHRHcmlkJztcbmltcG9ydCBjcmVhdGVEZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xuXG5pbnRlcmZhY2UgSUFwcFVzZXIge1xuICBJZDogc3RyaW5nO1xuICBVc2VyTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSURpc3BsYXkge1xuICBJZDogbnVtYmVyO1xuICBOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJQ29udHJvbERpc3BsYXlzVXNlckFzc2lnbm1lbnQge1xuICBEaXNwbGF5SWQ6IG51bWJlcjtcbiAgVXNlcklkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJR3JpZENvbHVtbiB7XG4gIElkOiBzdHJpbmc7XG4gIENhcHRpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YSB7XG4gIFVzZXJzOiBJQXBwVXNlcltdO1xuICBEaXNwbGF5czogSURpc3BsYXlbXTtcbiAgQXNzaWdubWVudHM6IElDb250cm9sRGlzcGxheXNVc2VyQXNzaWdubWVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5TWFuYWdlck9wdGlvbnMge1xuICAkY29udGFpbmVyOiBKUXVlcnk7XG4gIGlzU3RhbmRhbG9uZVBhZ2U6IGJvb2xlYW47XG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xuICBsb2FkRGF0YVVybDogc3RyaW5nO1xuICB1cGRhdGVEYXRhVXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNwbGF5TWFuYWdlciB7XG4gIHB1YmxpYyByZWFkb25seSAkY29udGFpbmVyOiBKUXVlcnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTdGFuZGFsb25lUGFnZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRGF0YVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZURhdGFVcmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlzcGxheU1hbmFnZXJPcHRpb25zKSB7XG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xuICAgIHRoaXMuaXNTdGFuZGFsb25lUGFnZSA9IG9wdGlvbnMuaXNTdGFuZGFsb25lUGFnZTtcbiAgICB0aGlzLmxvYWREYXRhVXJsID0gb3B0aW9ucy5sb2FkRGF0YVVybDtcbiAgICB0aGlzLnVwZGF0ZURhdGFVcmwgPSBvcHRpb25zLnVwZGF0ZURhdGFVcmw7XG4gICAgdGhpcy5wYWdlVGl0bGUgPSBvcHRpb25zLnBhZ2VUaXRsZTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgbGV0IGNvbHVtbnM6IElHcmlkQ29sdW1uW10gPSBbXTtcblxuICAgIGNvbnN0IGxvYWREYXRhUHJvbWlzZSA9IHNlbmRSZXF1ZXN0PElBUFNDb250cm9sRGlzcGxheUFzc2lnbm1lbnRzRGF0YT4odGhpcy5sb2FkRGF0YVVybCwgJ2dldCcpXG4gICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGNvbHVtbnMgPSByZXMuRGlzcGxheXMubWFwKChkKSA9PiAoeyBJZDogZC5JZC50b1N0cmluZygpLCBDYXB0aW9uOiBkLk5hbWUgfSkpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgcmVzLlVzZXJzKSB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IHsgVXNlck5hbWU6IHVzZXIuVXNlck5hbWUsIFVzZXJJZDogdXNlci5JZCB9O1xuICAgICAgICAgIGNvbnN0IHVzZXJBc3NpZ25tZW50cyA9IHJlcy5Bc3NpZ25tZW50cy5maWx0ZXIoKGEpID0+IGEuVXNlcklkID09PSB1c2VyLklkKTtcblxuICAgICAgICAgIHVzZXJBc3NpZ25tZW50cy5mb3JFYWNoKChhc3NpZ25tZW50KSA9PiB7XG4gICAgICAgICAgICBpdGVtW2Fzc2lnbm1lbnQuRGlzcGxheUlkXSA9IHRydWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkYXRhLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IFtcbiAgICAgICAgICB7IGRhdGFGaWVsZDogJ1VzZXJOYW1lJywgd2lkdGg6IDMwMCwgZml4ZWQ6IHRydWUsIGZpeGVkUG9zaXRpb246ICdsZWZ0JywgYWxsb3dFZGl0aW5nOiBmYWxzZSB9LFxuICAgICAgICAgIHsgZGF0YUZpZWxkOiAnVXNlcklkJywgdmlzaWJsZTogZmFsc2UgfVxuICAgICAgICBdIGFzIERldkV4cHJlc3MudWkuZHhEYXRhR3JpZC5Db2x1bW5bXTtcblxuICAgICAgICBncmlkLm9wdGlvbignY29sdW1ucycsIGdyaWRDb2x1bW5zLmNvbmNhdChjb2x1bW5zLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGFGaWVsZDogY29sLklkLFxuICAgICAgICAgICAgY2FwdGlvbjogY29sLkNhcHRpb24sXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgY2FsY3VsYXRlQ2VsbFZhbHVlOiAocm93RGF0YSkgPT4gISFyb3dEYXRhW2NvbC5JZF1cbiAgICAgICAgICB9O1xuICAgICAgICB9KSkpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSk7XG5cbiAgICBsZXQgdXBkYXRpbmdJc0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBjb25zdCBncmlkT3B0aW9ucyA9IHtcbiAgICAgIGVsZW1lbnRBdHRyOiB7Y2xhc3M6ICdhcHMtZGlzcGxheS1tYW5hZ2VyJ30sXG4gICAgICBkYXRhU291cmNlOiB7XG4gICAgICAgIHN0b3JlOiBuZXcgRGV2RXhwcmVzcy5kYXRhLkN1c3RvbVN0b3JlKHtcbiAgICAgICAgICBrZXk6ICdVc2VySWQnLFxuICAgICAgICAgIGxvYWRNb2RlOiAncmF3JyxcbiAgICAgICAgICBsb2FkOiAoKSA9PiBsb2FkRGF0YVByb21pc2UsXG4gICAgICAgICAgdXBkYXRlOiAoa2V5LCB2YWx1ZXM6IHsgW2Rpc3BsYXlJZDogbnVtYmVyXTogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b1JlbW92ZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRvQWRkOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdGhlcmVJc0N1cnJlbnRVcGRhdGluZyA9IHVwZGF0aW5nSXNJblByb2dyZXNzO1xuXG4gICAgICAgICAgICB1cGRhdGluZ0lzSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlJZHMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xuXG4gICAgICAgICAgICBkaXNwbGF5SWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2gocGFyc2VJbnQoaWQpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIE5PVEU6IG5vdGlmeSBhYm91dCBzdWNjZXNzZnVsIHJlcXVlc3Qgb25seSBmb3IgdGhlIGZpcnN0IHJlcXVlc3QgaW4gdGhlIHF1ZXVlXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHVwZGF0aW5nSXNJblByb2dyZXNzID0gZmFsc2U7IH0sIDApO1xuXG4gICAgICAgICAgICByZXR1cm4gc2VuZFJlcXVlc3QodGhpcy51cGRhdGVEYXRhVXJsLCAncHV0Jywge1xuICAgICAgICAgICAgICB1c2VySWQ6IGtleSxcbiAgICAgICAgICAgICAgZGlzcGxheXNUb1JlbW92ZTogdG9SZW1vdmUsXG4gICAgICAgICAgICAgIGRpc3BsYXlzVG9BZGQ6IHRvQWRkXG4gICAgICAgICAgICB9LCAhdGhlcmVJc0N1cnJlbnRVcGRhdGluZykucHJvbWlzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBtb2RlOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICBhbGxvd0NvbHVtblJlc2l6aW5nOiB0cnVlLFxuICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgY29udGV4dE1lbnVFbmFibGVkOiB0cnVlXG4gICAgICB9LFxuICAgICAgZ3JvdXBQYW5lbDoge1xuICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICB9LFxuICAgICAgcmVtb3RlT3BlcmF0aW9uczogZmFsc2UsXG4gICAgICBlZGl0aW5nOiB7XG4gICAgICAgIGFsbG93VXBkYXRpbmc6IHRydWUsXG4gICAgICAgIG1vZGU6ICdjZWxsJyxcbiAgICAgICAgcmVmcmVzaE1vZGU6ICdyZXBhaW50J1xuICAgICAgfVxuICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkLlByb3BlcnRpZXM7XG5cbiAgICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICAgIGV4cG9ydEZpbGVOYW1lOiAnRGlzcGxheU1hbmFnZW1lbnQnLFxuICAgICAgc3VtbWFyeUNvbHVtbjogJ1VzZXJOYW1lJ1xuICAgIH0gYXMgSUdyaWRBZGRpdGlvbmFsT3B0aW9ucztcblxuICAgIGxldCBncmlkOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWQ7XG4gICAgaWYgKHRoaXMuaXNTdGFuZGFsb25lUGFnZSkge1xuICAgICAgZ3JpZCA9IGNyZWF0ZUZ1bGxTY3JlZW5EYXRhR3JpZCh0aGlzLiRjb250YWluZXIsIGdyaWRPcHRpb25zLCBhZGRpdGlvbmFsT3B0aW9ucywgdGhpcy5wYWdlVGl0bGUsICcnLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZCA9IGNyZWF0ZURlZmF1bHRHcmlkKHRoaXMuJGNvbnRhaW5lciwge1xuICAgICAgICBvcHRpb25zOiBncmlkT3B0aW9ucyxcbiAgICAgICAgc3VtbWFyeUNvbHVtbjogYWRkaXRpb25hbE9wdGlvbnMuc3VtbWFyeUNvbHVtbixcbiAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICBpc0Z1bGxTY3JlZW46IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiXHVGRUZGaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi9EYXRhL1JlcXVlc3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQaW5nUmVzdWx0IHtcbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXNzaW9uTm90aWZpZXJPcHRpb25zIHtcbiAgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xuICBkaXNwbGF5RHVyYXRpb25NczogbnVtYmVyO1xuICBzZXNzaW9uUGluZ1VybDogc3RyaW5nO1xuICBsb2dvdXRVcmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25Ob3RpZmllciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvbkV4cGlyZVRpbWVNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlEdXJhdGlvbk1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblBpbmdVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dvdXRVcmw6IHN0cmluZztcblxuICBwcml2YXRlIHdhdGluZ1RpbWVvdXRJZDogbnVtYmVyO1xuICBwcml2YXRlIGNvdW50ZXJJbnRlcnZhbElkOiBudW1iZXI7XG4gIHByaXZhdGUgcGluZ0ludGVydmFsSWQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBleHBpcmF0aW9uVGltZTogRGF0ZTtcbiAgcHJpdmF0ZSAkdGV4dENvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIGNvbnRpbnVlckJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcbiAgcHJpdmF0ZSBva0J1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcbiAgcHJpdmF0ZSBsb2dvdXRCdXR0b246IERldkV4cHJlc3MudWkuZHhCdXR0b247XG5cbiAgcHJpdmF0ZSBfcG9wdXA6IERldkV4cHJlc3MudWkuZHhQb3B1cDtcbiAgcHJpdmF0ZSBnZXQgcG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcbiAgICBpZiAoIXRoaXMuX3BvcHVwKSB7XG4gICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcG9wdXA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2Vzc2lvbk5vdGlmaWVyT3B0aW9ucykge1xuICAgIHRoaXMuc2Vzc2lvbkV4cGlyZVRpbWVNcyA9IG9wdGlvbnMuc2Vzc2lvbkV4cGlyZVRpbWVNcztcbiAgICB0aGlzLmRpc3BsYXlEdXJhdGlvbk1zID0gb3B0aW9ucy5kaXNwbGF5RHVyYXRpb25NcztcbiAgICB0aGlzLnNlc3Npb25QaW5nVXJsID0gb3B0aW9ucy5zZXNzaW9uUGluZ1VybDtcbiAgICB0aGlzLmxvZ291dFVybCA9IG9wdGlvbnMubG9nb3V0VXJsO1xuXG4gICAgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUgPSB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIHRoaXMuY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuXG4gICAgdGhpcy5wb3B1cD8uaGlkZSgpO1xuXG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IHRoaXMuZ2V0RXhwaXJhdGlvblRpbWUoKTtcblxuICAgIHRoaXMud2F0aW5nVGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XG4gICAgfSwgTWF0aC5tYXgodGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zIC0gdGhpcy5kaXNwbGF5RHVyYXRpb25NcywgMCkpO1xuXG4gICAgdGhpcy5waW5nSW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpO1xuICAgIH0sIDYwICogMTAwMCk7XG5cbiAgICAkKGRvY3VtZW50KS5vbigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMucGluZ1Nlc3Npb25JZlRhYklzQWN0aXZlKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Tm90aWZpY2F0aW9uKCkge1xuICAgIHRoaXMucG9wdXA/LnNob3coKTtcblxuICAgIHRoaXMuY2xlYXJUaW1lb3V0c0FuZEludGVydmFscygpO1xuXG4gICAgdGhpcy51cGRhdGVQb3B1cENvbnRlbnQoKTtcbiAgICB0aGlzLmNvdW50ZXJJbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUG9wdXBDb250ZW50KCk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyVGltZW91dHNBbmRJbnRlcnZhbHMoKSB7XG4gICAgaWYgKHRoaXMud2F0aW5nVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy53YXRpbmdUaW1lb3V0SWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb3VudGVySW50ZXJ2YWxJZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZXJJbnRlcnZhbElkKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGluZ0ludGVydmFsSWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XG4gICAgfVxuXG4gICAgJChkb2N1bWVudCkub2ZmKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5waW5nU2Vzc2lvbklmVGFiSXNBY3RpdmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeHBpcmF0aW9uVGltZSgpOiBEYXRlIHtcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgZXhwaXJhdGlvblRpbWUuc2V0TWlsbGlzZWNvbmRzKGV4cGlyYXRpb25UaW1lLmdldE1pbGxpc2Vjb25kcygpICsgdGhpcy5zZXNzaW9uRXhwaXJlVGltZU1zKTtcblxuICAgIHJldHVybiBleHBpcmF0aW9uVGltZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUG9wdXAoKTogRGV2RXhwcmVzcy51aS5keFBvcHVwIHtcbiAgICByZXR1cm4gJCgnPGRpdiAvPicpLmR4UG9wdXAoe1xuICAgICAgdGl0bGU6ICdTZXNzaW9uIEV4cGlyaW5nJyxcbiAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgcmVzaXplRW5hYmxlZDogZmFsc2UsXG4gICAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLFxuICAgICAgZHJhZ0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgbWF4SGVpZ2h0OiAxOTAsXG4gICAgICBtYXhXaWR0aDogMzcwLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBjb250ZW50VGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgdGhpcy4kdGV4dENvbnRhaW5lciA9ICQoJzxzcGFuIC8+Jyk7XG4gICAgICAgIHRoaXMuJHRleHRDb250YWluZXIuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XG4gICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHRoaXMuJHRleHRDb250YWluZXIpO1xuXG4gICAgICAgIHJldHVybiAkY29udGFpbmVyO1xuICAgICAgfSxcbiAgICAgIHRvb2xiYXJJdGVtczogW3tcbiAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxuICAgICAgICB0b29sYmFyOiAnYm90dG9tJyxcbiAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIHRleHQ6ICdDb250aW51ZSBzZXNzaW9uJyxcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5jb250aW51ZXJCdXR0b24gPSBlLmNvbXBvbmVudCxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZXNzaW9uKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuICAgICAgfSwge1xuICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXG4gICAgICAgIHRvb2xiYXI6ICdib3R0b20nLFxuICAgICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgdGV4dDogJ1JlbG9hZCBwYWdlJyxcbiAgICAgICAgICBvbkluaXRpYWxpemVkOiAoZSkgPT4gdGhpcy5va0J1dHRvbiA9IGUuY29tcG9uZW50LFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIHdpZGdldDogJ2R4QnV0dG9uJyxcbiAgICAgICAgdG9vbGJhcjogJ2JvdHRvbScsXG4gICAgICAgIGxvY2F0aW9uOiAnYWZ0ZXInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdGV4dDogJ0xvZyBPdXQnLFxuICAgICAgICAgIG9uSW5pdGlhbGl6ZWQ6IChlKSA9PiB0aGlzLmxvZ291dEJ1dHRvbiA9IGUuY29tcG9uZW50LFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nT3V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XSxcbiAgICB9KS5hcHBlbmRUbygkKGRvY3VtZW50LmJvZHkpKS5keFBvcHVwKCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudGVyVGV4dCgpOiBKUXVlcnkge1xuICAgIGNvbnN0IHJlbWFpbmVkU2Vjb25kcyA9IE1hdGgubWF4KHRoaXMuZ2V0U2Vjb25kc1RvRXhwaXJhdGlvbigpLCAwKTtcbiAgICBpZiAocmVtYWluZWRTZWNvbmRzID09PSAwKSB7XG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gaGFzIGJlZW4gZXhwaXJlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkc3RhcnRUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCdZb3VyIHNlc3Npb24gd2lsbCBleHBpcmUgaW4gJyk7XG4gICAgICBjb25zdCAkY291bnRlciA9ICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ3Nlc3Npb24tbm90aWZpZXJfX2NvdW50ZXInKS50ZXh0KHJlbWFpbmVkU2Vjb25kcy50b0ZpeGVkKDApKTtcbiAgICAgIGNvbnN0ICRmaW5pc2hUZXh0ID0gJCgnPHNwYW4gLz4nKS50ZXh0KCcgc2Vjb25kcycpO1xuXG4gICAgICByZXR1cm4gJCgnPHNwYW4gLz4nKS5hcHBlbmQoJHN0YXJ0VGV4dCwgJGNvdW50ZXIsICRmaW5pc2hUZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNlY29uZHNUb0V4cGlyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZXhwaXJhdGlvblRpbWUuZ2V0VGltZSgpIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkpIC8gMTAwMDtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFNlc3Npb24oKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuXG4gICAgc2VuZFJlcXVlc3Q8SVBpbmdSZXN1bHQ+KHRoaXMuc2Vzc2lvblBpbmdVcmwsICdHRVQnLCBudWxsLCBmYWxzZSwgeyBub3RpZnlFcnJvcjogZmFsc2UgfSkudGhlbigocmVzKSA9PiB7XG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XG4gIH1cblxuICBwcml2YXRlIHBpbmdTZXNzaW9uSWZUYWJJc0FjdGl2ZSgpIHtcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VuZFJlcXVlc3Q8SVBpbmdSZXN1bHQ+KHRoaXMuc2Vzc2lvblBpbmdVcmwsICdHRVQnLCBudWxsLCBmYWxzZSwgeyBub3RpZnlFcnJvcjogZmFsc2UgfSkudGhlbigocmVzKSA9PiB7XG4gICAgICBpZiAoIXJlcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRFeHBpcmVkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEV4cGlyZWQoKSB7XG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucGluZ0ludGVydmFsSWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nSW50ZXJ2YWxJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dPdXQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmxvZ291dFVybDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9wdXBDb250ZW50KCkge1xuICAgIGNvbnN0IGlzQWxyZWFkeUV4cGlyZWQgPSB0aGlzLmdldFNlY29uZHNUb0V4cGlyYXRpb24oKSA8PSAwO1xuXG4gICAgdGhpcy4kdGV4dENvbnRhaW5lcj8uaHRtbCgnJykuYXBwZW5kKHRoaXMuZ2V0Q291bnRlclRleHQoKSk7XG4gICAgdGhpcy5va0J1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCBpc0FscmVhZHlFeHBpcmVkKTtcbiAgICB0aGlzLmNvbnRpbnVlckJ1dHRvbi5vcHRpb24oJ3Zpc2libGUnLCAhaXNBbHJlYWR5RXhwaXJlZCk7XG4gICAgdGhpcy5sb2dvdXRCdXR0b24ub3B0aW9uKCd2aXNpYmxlJywgIWlzQWxyZWFkeUV4cGlyZWQpO1xuICB9XG59XG4iLCAiY29uc3QgR1JJRF9JTkRJQ0FUT1JfU1RBVEUgPSB7XG4gIGVkaXQ6ICdlZGl0JyxcbiAgc2F2aW5nOiAnc2F2aW5nJyxcbiAgc2F2ZWQ6ICdzYXZlZCdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdSSURfSU5ESUNBVE9SX1NUQVRFO1xuIiwgIlx1RkVGRmltcG9ydCB7IElHcmlkRGF0YUxheWVyIH0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XG5pbXBvcnQgeyBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZSwgSUdyaWRTdGF0ZSwgSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlLCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vLi4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uLy4uL1V0aWxzL0luZGV4JztcblxuaW50ZXJmYWNlIElMb2FkZWRDb2x1bW5zIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogYm9vbGVhbjsgfVxuaW50ZXJmYWNlIElHcmlkQWRkaXRpb25hbENvbHVtblNldHRpbmdzIHsgW2RhdGFGaWVsZDogc3RyaW5nXTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGU7IH1cbmludGVyZmFjZSBJQ29sdW1uV2lkdGhzIHsgW3Zpc2libGVJbmRleDogbnVtYmVyXTogbnVtYmVyIHwgc3RyaW5nOyB9XG5cbmludGVyZmFjZSBJQ29sdW1uQ2FwdGlvbiB7XG4gIGRhdGFGaWVsZDogc3RyaW5nO1xuICBjYXB0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyaWRTdGF0ZU1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwdWJsaWMgT1VUREFURV9DT0xVTU5TX0ZPVU5EX0VWRU5UID0gJ291dGRhdGVkLWNvbHVtbnMtZm91bmQtZXZlbnQnO1xuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JpZERhdGFMYXllcjogSUdyaWREYXRhTGF5ZXI7XG5cbiAgcHJpdmF0ZSBzdGF0ZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGxvYWRlZENvbHVtbnM6IElMb2FkZWRDb2x1bW5zID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nczogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU2V0dGluZ3MgPSB7fTtcblxuICBwcml2YXRlIGxhc3RDb2x1bW5TZXR0aW5nc1N0cjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGdyaWRJZDogbnVtYmVyLCBncmlkRGF0YUxheWVyOiBJR3JpZERhdGFMYXllcikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmlkID0gZ3JpZElkO1xuICAgIHRoaXMuZ3JpZERhdGFMYXllciA9IGdyaWREYXRhTGF5ZXI7XG4gIH1cblxuICBwdWJsaWMgbG9hZChjaGVja091dGRhdGVkQ29sdW1uczogYm9vbGVhbiwgb3V0ZGF0ZWRDb2x1bW5zQ2FsbGJhY2s6IChjb2x1bW5zKSA9PiB2b2lkKTogSlF1ZXJ5UHJvbWlzZTxJR3JpZFN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFMYXllci5nZXRHcmlkVmlld1NldHRpbmdzKHRoaXMuaWQpXG4gICAgICAudGhlbigoZGF0YTogSUdyaWRTdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YUxvYWRlZChkYXRhKTtcblxuICAgICAgICBpZiAoY2hlY2tPdXRkYXRlZENvbHVtbnMpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrQ29sdW1uc1JlbGV2YW5jZShkYXRhLmNvbHVtbnMsIG91dGRhdGVkQ29sdW1uc0NhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZShzdGF0ZTogSUdyaWRTdGF0ZSwgc2F2aW5nQ2FsbGJhY2s/OiAoKSA9PiB2b2lkLCBzYXZlZENhbGxiYWNrPzogKCkgPT4gdm9pZCk6IElDb2x1bW5XaWR0aHMge1xuICAgIGNvbnN0IGNvbHVtbldpZHRoczogSUNvbHVtbldpZHRocyA9IHt9O1xuXG4gICAgaWYgKCFzdGF0ZS5jb2x1bW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdGUuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGFkZFNldHRpbmdzID0gdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2NvbHVtbi5kYXRhRmllbGRdO1xuXG4gICAgICBpZiAoYWRkU2V0dGluZ3MpIHtcbiAgICAgICAgY29sdW1uLmNhcHRpb24gPSBhZGRTZXR0aW5ncy5jYXB0aW9uO1xuICAgICAgICBjb2x1bW4udG9vbHRpcCA9IGFkZFNldHRpbmdzLnRvb2x0aXA7XG4gICAgICB9XG5cbiAgICAgIC8vTk9URTogaWYgREIgdGFibGUgaGFzIG5vIGRhdGEgaW4gYSBjb2x1bW4sIGRhdGEgZ3JpZCBjYW4ndCBpbmZlciBkYXRhIHR5cGUgYW5kIGRvZXNuJ3Qgc2V0IHRoZSBkYXRhVHlwZSBmaWVsZFxuICAgICAgaWYgKCFjb2x1bW4uZGF0YVR5cGUpIHtcbiAgICAgICAgY29sdW1uLmRhdGFUeXBlID0gR3JpZERhdGFDb2x1bW5EYXRhVHlwZS5EZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoISFjb2x1bW4ud2lkdGggJiYgY29sdW1uLnZpc2libGUpIHtcbiAgICAgICAgY29sdW1uV2lkdGhzW2NvbHVtbi52aXNpYmxlSW5kZXhdID0gY29sdW1uLndpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKTtcblxuICAgIGlmICghdGhpcy5zdGF0ZUxvYWRlZCB8fCBjb2x1bW5TZXR0aW5nc1N0ciA9PT0gdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMubGFzdENvbHVtblNldHRpbmdzU3RyID0gY29sdW1uU2V0dGluZ3NTdHI7XG5cbiAgICBpZiAoc2F2aW5nQ2FsbGJhY2spIHtcbiAgICAgIHNhdmluZ0NhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmlkRGF0YUxheWVyLnVwZGF0ZUdyaWRWaWV3U2V0dGluZ3ModGhpcy5pZCwgc3RhdGUpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChzYXZlZENhbGxiYWNrKSB7XG4gICAgICAgICAgc2F2ZWRDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHJldHVybiBjb2x1bW5XaWR0aHM7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tOZXdDb2x1bW5zKHN0YXRlOiBJR3JpZFN0YXRlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5ld0NvbHVtbkZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XG4gICAgICBjb25zdCBuZXdDb2x1bW5zID0gc3RhdGUuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSAmJiBjb2x1bW4udmlzaWJsZSk7XG5cbiAgICAgIGlmIChuZXdDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgIG5ld0NvbHVtbkZpZWxkcy5wdXNoKGNvbHVtbi5kYXRhRmllbGQpO1xuICAgICAgICAgIHRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdDb2x1bW5GaWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uQ2FwdGlvbnMoKTogSUNvbHVtbkNhcHRpb25bXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5ncykubWFwKChkYXRhRmllbGQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGFGaWVsZCxcbiAgICAgICAgY2FwdGlvbjogdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvblxuICAgICAgfSBhcyBJQ29sdW1uQ2FwdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5DYXB0aW9uKGRhdGFGaWVsZDogc3RyaW5nLCBjYXB0aW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tkYXRhRmllbGRdKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXSA9IHsgY2FwdGlvbjogJycsIHRvb2x0aXA6ICcnIH07XG4gICAgfVxuXG4gICAgdGhpcy5hZGRpdGlvbmFsQ29sdW1uc1NldHRpbmdzW2RhdGFGaWVsZF0uY2FwdGlvbiA9IGNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uQWRkaXRpb25hbFNldHRpbmdzKGRhdGFGaWVsZDogc3RyaW5nKTogSUdyaWRBZGRpdGlvbmFsQ29sdW1uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxDb2x1bW5zU2V0dGluZ3NbZGF0YUZpZWxkXTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0NvbHVtbnNSZWxldmFuY2UoY29sdW1uczogSUdyaWRFeHRlbmRlZENvbHVtblN0YXRlW10sIGNhbGxiYWNrOiAob3V0ZGF0ZWRDb2x1bW5zOiBzdHJpbmdbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuZ3JpZERhdGFMYXllci5nZXRDb2x1bW5zQnlSZXBvcnRJZCh0aGlzLmlkKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgYWN0dWFsQ29sdW1ucyA9IHt9O1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoYykgPT4gYWN0dWFsQ29sdW1uc1tjLk5hbWVdID0gdHJ1ZSk7XG5cbiAgICAgICAgY29uc3Qgb3V0ZGF0ZWRDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoKGMpID0+ICFhY3R1YWxDb2x1bW5zW2MuZGF0YUZpZWxkXSkubWFwKChjKSA9PiBjLmRhdGFGaWVsZCk7XG5cbiAgICAgICAgaWYgKG91dGRhdGVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICBEZXZFeHByZXNzLnVpLmRpYWxvZy5jb25maXJtKGBHcmlkIHNldHRpbmdzIGNvbnRhaW4gc29tZSBjb2x1bm1zIHdoaWNoIGRvbid0IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0YWJsZSBhbnltb3JlOlxuXG4gICAgICAgICAgJyR7b3V0ZGF0ZWRDb2x1bW5zLmpvaW4oJywgJyl9Jy5cblxuICAgICAgICAgIERvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGVzZSBjb2x1bW5zIGZyb20gZ3JpZCBzZXR0aW5ncz9cbiAgICAgICAgICBgLCAnUmVtb3ZlIHJlZHVuZGFudCBjb2x1bW5zPycpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FsbGJhY2sob3V0ZGF0ZWRDb2x1bW5zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFNldHRpbmdzKCk6IEpRdWVyeVByb21pc2U8SUdyaWRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmdyaWREYXRhTGF5ZXIucmVzZXRTZXR0aW5ncyh0aGlzLmlkKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQoZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25EYXRhTG9hZGVkKGRhdGE6IElHcmlkU3RhdGUpIHtcbiAgICBjb25zdCBsb2FkZWRHcmlkU3RhdGVDb2x1bW5zID0gZGF0YSAmJiBkYXRhLmNvbHVtbnM7XG4gICAgbGV0IHZpc2libGVJbmRleENvdW50ZXIgPSAwO1xuXG4gICAgdGhpcy5zdGF0ZUxvYWRlZCA9IHRydWU7XG5cbiAgICBpZiAobG9hZGVkR3JpZFN0YXRlQ29sdW1ucykge1xuICAgICAgdGhpcy5sb2FkZWRDb2x1bW5zID0ge307XG5cbiAgICAgIGxvYWRlZEdyaWRTdGF0ZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVkQ29sdW1uc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHRydWU7XG5cbiAgICAgICAgLy8gTk9URTogc2V0IHZpc2libGUgaW5kZXhlcyBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0LiBJdCdzIHJlcXVpcmVkIGZvciBwcm9wZXIgZHhEYXRhR3JpZCBhcHBlYXJhbmNlLlxuICAgICAgICBpZiAoY29sdW1uLnZpc2libGUgJiYgY29sdW1uLnZpc2libGVJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbHVtbi52aXNpYmxlSW5kZXggPSB2aXNpYmxlSW5kZXhDb3VudGVyKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiByZW1vdmUgZW1wdHkgdmFsdWVzIGJlY2F1c2UgdGhleSBsZWFkIHRvIHdyb25nIGR4RGF0YUdyaWQgYmVoYXZpb3JcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uW2tleV0gPT09IG51bGwgfHwgY29sdW1uW2tleV0gPT09IHZvaWQgMCB8fCBjb2x1bW5ba2V5XSA9PT0gJycpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW5ba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXTtcblxuICAgICAgICBpZiAoIWFkZGl0aW9uYWxTZXR0aW5ncykge1xuICAgICAgICAgIHRoaXMuYWRkaXRpb25hbENvbHVtbnNTZXR0aW5nc1tjb2x1bW4uZGF0YUZpZWxkXSA9IHtcbiAgICAgICAgICAgIGNhcHRpb246IGNvbHVtbi5jYXB0aW9uLFxuICAgICAgICAgICAgdG9vbHRpcDogY29sdW1uLnRvb2x0aXBcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZGl0aW9uYWxTZXR0aW5ncy5jYXB0aW9uID0gY29sdW1uLmNhcHRpb247XG4gICAgICAgICAgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAgPSBjb2x1bW4udG9vbHRpcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IHJlbW92ZSBjb2x1bW5zIHdoaWNoIGR4RGF0YUdyaWQgZG9lc24ndCBleHBlY3QuXG4gICAgICAgIGRlbGV0ZSBjb2x1bW4uY2FwdGlvbjtcbiAgICAgICAgZGVsZXRlIGNvbHVtbi50b29sdGlwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0Q29sdW1uU2V0dGluZ3NTdHIgPSBKU09OLnN0cmluZ2lmeShkYXRhLmNvbHVtbnMpO1xuICB9XG59XG4iLCAiXHVGRUZGZW51bSBHcmlkTW9kZSB7XG4gIFZpZXcgPSAxLFxuICBFZGl0ID0gMlxufVxuXG5leHBvcnQgZGVmYXVsdCBHcmlkTW9kZTtcbiIsICJcdUZFRkZpbXBvcnQgR3JpZE1vZGUgZnJvbSAnLi4vUGFnZXMvR3JpZC9Nb2RlJztcbmltcG9ydCB7IElSZXBvcnRQYXJhbXMgfSBmcm9tICcuLi9JUmVwb3J0UGFyYW1zJztcbmltcG9ydCB7IElHcmlkU3RhdGUgfSBmcm9tICcuLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xuaW1wb3J0IHsgSUNvbHVtbk1ldGFEYXRhIH0gZnJvbSAnLi4vQ29sdW1uTWV0YURhdGEnO1xuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9EYXRhL1JlcXVlc3QnO1xuaW1wb3J0IHsgY3JlYXRlRHhEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YS9EeERhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRXhjZXB0aW9uVHlwZSB9IGZyb20gJy4uLy4uL0RhdGEvRXhjZXB0aW9uVHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyaWREYXRhTGF5ZXIge1xuICBnZXRDb2x1bW5zQnlSZXBvcnRJZChyZXBvcnRJZDogbnVtYmVyKTogSlF1ZXJ5RGVmZXJyZWQ8SUNvbHVtbk1ldGFEYXRhW10+O1xuICBnZXRHcmlkRGF0YVNvdXJjZShyZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXMsIGdyaWRNb2RlOiBHcmlkTW9kZSwgc2hvd0FsbERhdGFJbkVkaXQ6IGJvb2xlYW4pOiBEZXZFeHByZXNzLmRhdGEuQ3VzdG9tU3RvcmU8YW55LCBhbnk+O1xuICByZXNldFNldHRpbmdzKHJlcG9ydElkOiBudW1iZXIpOiBKUXVlcnlEZWZlcnJlZDxJR3JpZFN0YXRlPjtcbiAgdXBkYXRlR3JpZFZpZXdTZXR0aW5ncyhyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSk6IEpRdWVyeURlZmVycmVkPGFueT47XG4gIGdldEdyaWRWaWV3U2V0dGluZ3MocmVwb3J0SWQ6IG51bWJlcik6IEpRdWVyeURlZmVycmVkPElHcmlkU3RhdGU+O1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlR3JpZERhdGFMYXllcjogKGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpID0+IElHcmlkRGF0YUxheWVyID0gKGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdXJscyA9IHtcbiAgICBncmlkUmVzdWx0OiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR3JpZFZpZXdSZXN1bHRgLFxuICAgIGdldENvbHVtbnNCeVJlcG9ydElkOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR2V0RGJUYWJsZUZpZWxkc2AsXG4gICAgcmVzZXRHcmlkU2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9SZXNldEdyaWRWaWV3U2V0dGluZ3NgLFxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IGAke2dyaWRSZXBvcnRDb250cm9sbGVyVXJsfS9VcGRhdGVHcmlkVmlld1NldHRpbmdzYCxcbiAgICBnZXRHcmlkVmlld1NldHRpbmdzOiBgJHtncmlkUmVwb3J0Q29udHJvbGxlclVybH0vR2V0R3JpZFZpZXdTZXR0aW5nc2BcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGdldEdyaWREYXRhU291cmNlKHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcywgZ3JpZE1vZGU6IEdyaWRNb2RlLCBzaG93QWxsRGF0YUluRWRpdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUR4RGF0YVNvdXJjZSh7XG4gICAgICAgIGxvYWRQYXJhbXM6IHtcbiAgICAgICAgICBpZDogcmVwb3J0UGFyYW1zLlJlcG9ydElkLFxuICAgICAgICAgIGFwcE5hbWU6IHJlcG9ydFBhcmFtcy5BcHBOYW1lLFxuICAgICAgICAgIGdyaWRNb2RlLFxuICAgICAgICAgIHJvd3NMaW1pdDogZ3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXNob3dBbGxEYXRhSW5FZGl0ID8gMTUgOiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIGxvYWRVcmw6IHVybHMuZ3JpZFJlc3VsdCxcbiAgICAgICAgZ2V0VXNlckZyaWVuZGx5RXJyb3JNZXNzYWdlXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0Q29sdW1uc0J5UmVwb3J0SWQ6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5nZXRDb2x1bW5zQnlSZXBvcnRJZCwgJ3Bvc3QnLCB7IGlkOiByZXBvcnRJZCB9LCBmYWxzZSwge1xuICAgICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXRTZXR0aW5nczogKHJlcG9ydElkOiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiBzZW5kUmVxdWVzdCh1cmxzLnJlc2V0R3JpZFNldHRpbmdzLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSk7XG4gICAgfSxcblxuICAgIHVwZGF0ZUdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyLCBzdGF0ZTogSUdyaWRTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KHVybHMudXBkYXRlR3JpZFZpZXdTZXR0aW5ncywgJ3Bvc3QnLCB7XG4gICAgICAgIGlkOiByZXBvcnRJZCwgY29sdW1uc1NldHRpbmdzOiBKU09OLnN0cmluZ2lmeShzdGF0ZS5jb2x1bW5zKVxuICAgICAgfSwgZmFsc2UsIHtcbiAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldEdyaWRWaWV3U2V0dGluZ3M6IChyZXBvcnRJZDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gc2VuZFJlcXVlc3QodXJscy5nZXRHcmlkVmlld1NldHRpbmdzLCAncG9zdCcsIHsgaWQ6IHJlcG9ydElkIH0sIGZhbHNlLCB7XG4gICAgICAgIGRhdGFUeXBlOiAnanNvbidcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGdldFVzZXJGcmllbmRseUVycm9yTWVzc2FnZSA9IChleGNlcHRpb25UeXBlOiBFeGNlcHRpb25UeXBlKTogc3RyaW5nID0+IHtcbiAgc3dpdGNoIChleGNlcHRpb25UeXBlKSB7XG4gICAgY2FzZSBFeGNlcHRpb25UeXBlLlNxbEV4Y2VwdGlvbjpcbiAgICAgIHJldHVybiAnV2UgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgdGhlIGRhdGEgcXVlcnkgaG93ZXZlciBpdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBkYXRhIHNvdXJjZS4gUGxlYXNlIGNvbnRhY3QgdGhlIHJlcG9ydCBhdXRob3IgdG8gY29uZmlybSB0aGUgZGF0YSByZXF1aXJlbWVudHMuJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG4iLCAiZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaE9wdGlvbnMge1xuICBjYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgZWxhcHNlZENhbGxiYWNrOiAodGltZTogbnVtYmVyKSA9PiB2b2lkO1xufVxuXG5jb25zdCB1cGRhdGVUaW1lb3V0ID0gMTAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoVGltZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsYXBzZWRDYWxsYmFjazogKHRpbWU6IG51bWJlcikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBhY3RpdmVUaW1lcklkOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGN1cnJlbnRJbnRlcnZhbDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBsYXN0U3RhdGVDaGVja2VkOiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZWZyZXNoT3B0aW9ucykge1xuICAgIHRoaXMuZWxhcHNlZENhbGxiYWNrID0gb3B0aW9ucy5lbGFwc2VkQ2FsbGJhY2s7XG4gICAgdGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG4gIH1cblxuICBwdWJsaWMgc3RhcnQoaW50ZXJ2YWw6IG51bWJlcikge1xuICAgIGlmIChpbnRlcnZhbCA8PSAwKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RTdGF0ZUNoZWNrZWQgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudEludGVydmFsID0gaW50ZXJ2YWw7XG5cbiAgICBjb25zdCB0aW1lcklkID0gdGhpcy5hY3RpdmVUaW1lcklkID0gTWF0aC5yYW5kb20oKTtcbiAgICBpZiAodGhpcy5jdXJyZW50SW50ZXJ2YWwgPCAwKSB7XG4gICAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aGlzLmN1cnJlbnRJbnRlcnZhbCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLmNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICAvL0NoYW5nZSB0aW1lcklkIGZvciBicmVha2luZyByZWZyZXNoIHByb2Nlc3MgaW4gbmV4dCBzZXRUaW1lb3V0IGNhbGwuIGRrbGltYW5vdlxuICAgIHRoaXMuYWN0aXZlVGltZXJJZC0tO1xuICB9XG5cbiAgcHJpdmF0ZSB0aWNrVGltZXJGdW5jdGlvbih0aW1lcklkOiBudW1iZXIpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdGhpcy5hY3RpdmVUaW1lcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBsZXQgdGltZVRvVXBkYXRlOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRJbnRlcnZhbCAtIChuZXcgRGF0ZSgpIC0gdGhpcy5sYXN0U3RhdGVDaGVja2VkKTtcbiAgICBpZiAodGltZVRvVXBkYXRlIDw9IDApIHtcbiAgICAgIHRpbWVUb1VwZGF0ZSA9IHRoaXMuY3VycmVudEludGVydmFsICsgOTk5O1xuICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgdGhpcy5sYXN0U3RhdGVDaGVja2VkID0gbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsYXBzZWRDYWxsYmFjayh0aW1lVG9VcGRhdGUpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRpY2tUaW1lckZ1bmN0aW9uKHRpbWVySWQpLCB1cGRhdGVUaW1lb3V0KTtcbiAgfVxufVxuIiwgImltcG9ydCBSZWZyZXNoQ29tcG9uZW50IGZyb20gJy4vSW5kZXgnO1xuXG5jb25zdCBkZWZhdWx0UmVmcmVzaEVudHJpZXM6IElSZWZyZXNoRW50cnlbXSA9IFt7XG4gIHRpbWVvdXQ6IDAsXG4gIHRleHQ6ICdyZWZyZXNoIG5vdycsXG4gIHJlZnJlc2hUZW1wbGF0ZTogJycsXG59LCB7XG4gIHRpbWVvdXQ6IDE1ICogMTAwMCxcbiAgdGV4dDogJzE1IHNlYycsXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXG59LCB7XG4gIHRpbWVvdXQ6IDMwICogMTAwMCxcbiAgdGV4dDogJzMwIHNlYycsXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXG59LCB7XG4gIHRpbWVvdXQ6IDYwICogMTAwMCxcbiAgdGV4dDogJzEgbWluJyxcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcbn0sIHtcbiAgdGltZW91dDogMTgwICogMTAwMCxcbiAgdGV4dDogJzMgbWluJyxcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcbn0sIHtcbiAgdGltZW91dDogMzAwICogMTAwMCxcbiAgdGV4dDogJzUgbWluJyxcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGUgKCUpJyxcbn0sIHtcbiAgdGltZW91dDogNjAwICogMTAwMCxcbiAgdGV4dDogJzEwIG1pbicsXG4gIHJlZnJlc2hUZW1wbGF0ZTogJ0F1dG8gVXBkYXRlICglKScsXG59LCB7XG4gIHRpbWVvdXQ6IC0xLFxuICB0ZXh0OiAnb2ZmJyxcbiAgcmVmcmVzaFRlbXBsYXRlOiAnQXV0byBVcGRhdGU6IG9mZicsXG4gIGlzRGVmYXVsdDogdHJ1ZVxufV07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZnJlc2hFbnRyeSB7XG4gIHRpbWVvdXQ6IG51bWJlcixcbiAgdGV4dDogc3RyaW5nLFxuICByZWZyZXNoVGVtcGxhdGU6IHN0cmluZyxcbiAgaXNEZWZhdWx0PzogYm9vbGVhblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWZyZXNoQnV0dG9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wRG93bkJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0TWVudTogRGV2RXhwcmVzcy51aS5keENvbnRleHRNZW51O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hDb21wb25lbnQ6IFJlZnJlc2hDb21wb25lbnQ7XG4gIHByaXZhdGUgbWVudUlzT3BlbmVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0ZWRFbnRyeTogSVJlZnJlc2hFbnRyeTtcblxuICBjb25zdHJ1Y3RvcigkdGFyZ2V0OiBKUXVlcnksIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZWZyZXNoRW50cmllczogSVJlZnJlc2hFbnRyeVtdIHwgbnVsbCA9IGRlZmF1bHRSZWZyZXNoRW50cmllcykge1xuICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCA9IG5ldyBSZWZyZXNoQ29tcG9uZW50KHsgY2FsbGJhY2ssIGVsYXBzZWRDYWxsYmFjazogKGUpID0+IHRoaXMuZWxhcHNlZENhbGxiYWNrKGUpIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRFbnRyeSA9IHJlZnJlc2hFbnRyaWVzLmZpbmQoKGUpID0+IGUuaXNEZWZhdWx0KSB8fCByZWZyZXNoRW50cmllcy5maWx0ZXIoKGUpID0+ICEhZS50aW1lb3V0KVswXTtcblxuICAgIHRoaXMuY29udGV4dE1lbnUgPSAkKCc8ZGl2IC8+JykuZHhDb250ZXh0TWVudSh7XG4gICAgICBkYXRhU291cmNlOiByZWZyZXNoRW50cmllcyxcbiAgICAgIHRhcmdldDogJHRhcmdldCxcbiAgICAgIHBvc2l0aW9uOiB7IG15OiAncmlnaHQgdG9wJywgYXQ6ICdyaWdodCBib3R0b20nIH0sXG4gICAgICBvbkl0ZW1DbGljazogKGUpID0+IHtcbiAgICAgICAgaWYoIShlLml0ZW1EYXRhIGFzIGFueSkudGltZW91dCkge1xuICAgICAgICAgIGUuY29tcG9uZW50LmhpZGUoKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRW50cnkgPSBlLml0ZW1EYXRhIGFzIElSZWZyZXNoRW50cnk7XG4gICAgICAgICAgZS5jb21wb25lbnQuc2VsZWN0SXRlbSh0aGlzLnNlbGVjdGVkRW50cnkgYXMgYW55KTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQuc3RhcnQoKGUuaXRlbURhdGEgYXMgYW55KS50aW1lb3V0KTtcbiAgICAgICAgICBlLmNvbXBvbmVudC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkhpZGRlbjogKCkgPT4ge1xuICAgICAgICB0aGlzLm1lbnVJc09wZW5lZCA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIG9uU2hvd246IChlKSA9PiB7XG4gICAgICAgIHRoaXMubWVudUlzT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgKGUuY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIoKVswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzem9sZWEtdGhlbWUnKTtcbiAgICAgIH0sXG4gICAgICBpdGVtVGVtcGxhdGU6IChlbnRyeSkgPT4gZW50cnkudGV4dCxcblxuICAgICAgY3NzQ2xhc3M6ICdpc3pvbGVhLXRoZW1lJ1xuICAgIH0pLmFwcGVuZFRvKCdib2R5JykuZHhDb250ZXh0TWVudSgnaW5zdGFuY2UnKTtcbiAgICB0aGlzLmNvbnRleHRNZW51LnNlbGVjdEl0ZW0odGhpcy5zZWxlY3RlZEVudHJ5IGFzIGFueSk7XG5cbiAgICB0aGlzLmRyb3BEb3duQnV0dG9uID0gJHRhcmdldC5keEJ1dHRvbih7XG4gICAgICB0ZXh0OiB0aGlzLnNlbGVjdGVkRW50cnkudGV4dCxcbiAgICAgIHRlbXBsYXRlOiAoYnV0dG9uRGF0YSwgY29udGVudCkgPT4ge1xuICAgICAgICAkKCc8aSAvPicpLmFkZENsYXNzKCdkeC1pY29uIGR4LWljb24tcmVmcmVzaCcpLmFwcGVuZFRvKGNvbnRlbnQpO1xuICAgICAgICAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYnV0dG9uLXdpdGgtZXhwYW5kLXRleHQnKS50ZXh0KGJ1dHRvbkRhdGEudGV4dCkuYXBwZW5kVG8oY29udGVudCk7XG4gICAgICAgICQoJzxzcGFuPicpLmFkZENsYXNzKCdidXR0b24td2l0aC1leHBhbmQtaWNvbiBpc296LWljb24tMTYgaXNvei1pY29uLWFycm93LWRvd24tMTYnKS5hcHBlbmRUbyhjb250ZW50KTtcblxuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH0sXG4gICAgICBlbGVtZW50QXR0cjoge1xuICAgICAgICBjbGFzczogJ2lzem9sZWEtbWQgYnV0dG9uLXdpdGgtZXhwYW5kJ1xuICAgICAgfSxcblxuICAgICAgb25DbGljazogKGUpID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5lbGVtZW50KCkud2lkdGgoJHRhcmdldC5vdXRlcldpZHRoKCkpO1xuICAgICAgICBpZiAodGhpcy5tZW51SXNPcGVuZWQpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xuXG4gICAgKHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0ID4gMCkgJiYgdGhpcy5yZWZyZXNoQ29tcG9uZW50LnN0YXJ0KHRoaXMuc2VsZWN0ZWRFbnRyeS50aW1lb3V0KTtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaENvbXBvbmVudC50cmlnZ2VyQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVsYXBzZWRDYWxsYmFjayh0aW1lVG9VcGRhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZHJvcERvd25CdXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5zZWxlY3RlZEVudHJ5LnJlZnJlc2hUZW1wbGF0ZS5yZXBsYWNlKCclJywgTWF0aC5mbG9vcih0aW1lVG9VcGRhdGUgLyAxMDAwKS50b1N0cmluZygpKSk7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgZ3JpZENvbHVtblR5cGVzIGZyb20gJy4uLy4uL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XG5pbXBvcnQge2luaXRQb3BvdmVyfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcbmltcG9ydCB7SUdyaWRSZXBvcnRQYXJhbXMsIElSZXBvcnRQYXJhbXN9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xuaW1wb3J0IEdSSURfSU5ESUNBVE9SX1NUQVRFIGZyb20gJy4vR3JpZEluZGljYXRvclN0YXRlJztcbmltcG9ydCBkZWZhdWx0R3JpZCBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xuaW1wb3J0IEdyaWRTdGF0ZU1hbmFnZXIgZnJvbSAnLi9HcmlkU3RhdGVNYW5hZ2VyJztcbmltcG9ydCBHcmlkTW9kZSBmcm9tICcuL01vZGUnO1xuaW1wb3J0IHtjcmVhdGVHcmlkRGF0YUxheWVyLCBJR3JpZERhdGFMYXllcn0gZnJvbSAnLi4vLi4vRGF0YS9JbmRleCc7XG5pbXBvcnQge0dyaWREYXRhQ29sdW1uRGF0YVR5cGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlLCBJR3JpZFN0YXRlfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XG5cbmNvbnN0IFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUID0gMzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBJR3JpZE9wdGlvbnMge1xuICBncmlkUG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcbiAgcmVwb3J0UGFyYW1zOiBJR3JpZFJlcG9ydFBhcmFtcztcbiAgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xuICBncmlkUmVwb3J0Q29udHJvbGxlclVybDogc3RyaW5nO1xuICBzaG93SGVhZGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JpZCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRQb3NpdGlvbk1hcmtlcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlcG9ydFBhcmFtczogSUdyaWRSZXBvcnRQYXJhbXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGdyaWRSZXBvcnRDb250cm9sbGVyVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd0hlYWRlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xuXG4gIHByaXZhdGUgY3VycmVudEdyaWRNb2RlOiBHcmlkTW9kZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNob3dBbGxEYXRhSW5FZGl0ID0gZmFsc2U7XG4gIHByaXZhdGUgbG9hZGluZ1RpbWVvdXQgPSBudWxsO1xuXG4gIHByaXZhdGUgZ3JpZDogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGdyaWRTdGF0ZU1hbmFnZXI6IEdyaWRTdGF0ZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSAkZ3JpZFN0YXRlSW5kaWNhdG9yOiBKUXVlcnkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSAkZ3JpZEVycm9yUGxhY2Vob2xkZXI6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlICRncmlkVGFyZ2V0RWxlbWVudDogSlF1ZXJ5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ6IEpRdWVyeSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdyaWRTdGF0ZUluZGljYXRvclRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRhdGFMYXllcjogSUdyaWREYXRhTGF5ZXI7XG4gIHByaXZhdGUgZWRpdFdpZHRoRWRpdEJveGVzOiBEZXZFeHByZXNzLnVpLmR4VGV4dEJveFtdIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBncmlkUmVwYWludFF1ZXVlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNvbHVtbk5hbWVzVXBkYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlZnJlc2hCdXR0b246IFJlZnJlc2hCdXR0b24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR3JpZE9wdGlvbnMpIHtcbiAgICB0aGlzLmdyaWRQb3NpdGlvbk1hcmtlciA9IG9wdGlvbnMuZ3JpZFBvc2l0aW9uTWFya2VyO1xuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XG4gICAgdGhpcy5ncmlkUmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmw7XG4gICAgdGhpcy5zaG93SGVhZGVyID0gb3B0aW9ucy5zaG93SGVhZGVyO1xuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRHcmlkTW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBHcmlkTW9kZS5WaWV3O1xuICAgIH1cblxuICAgIHRoaXMuaW5pdEludGVybmFsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdyaWQ/LnJlZnJlc2goKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZD8uZGlzcG9zZSgpO1xuICAgIHRoaXMuZ3JpZCA9IG51bGw7XG5cbiAgICB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9IG51bGw7XG4gICAgdGhpcy4kcmVzZXRTZXR0aW5nVGFyZ2V0RWxlbWVudD8ucmVtb3ZlKCk7XG4gICAgdGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEludGVybmFsKCk6IERldkV4cHJlc3MudWkuZHhEYXRhR3JpZCB7XG4gICAgdGhpcy5kYXRhTGF5ZXIgPSBjcmVhdGVHcmlkRGF0YUxheWVyKHRoaXMuZ3JpZFJlcG9ydENvbnRyb2xsZXJVcmwpO1xuXG4gICAgaWYgKHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50KSB7XG4gICAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudC5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLiRncmlkVGFyZ2V0RWxlbWVudCA9ICQoJzxkaXYgLz4nKS5pbnNlcnRBZnRlcih0aGlzLmdyaWRQb3NpdGlvbk1hcmtlcik7XG5cbiAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIgPSBuZXcgR3JpZFN0YXRlTWFuYWdlcih0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCwgdGhpcy5kYXRhTGF5ZXIpO1xuXG4gICAgdGhpcy4kZ3JpZEVycm9yUGxhY2Vob2xkZXIgPSAkKCc8ZGl2IC8+JykudGV4dCgnRGF0YSBsb2FkaW5nIGZhaWxlZC4nKS5hZGRDbGFzcygnZHgtZGF0YWdyaWQtbm9kYXRhJykuY3NzKHsgekluZGV4OiAxIH0pO1xuICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmFwcGVuZFRvKHRoaXMuZ3JpZFBvc2l0aW9uTWFya2VyKTtcbiAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5oaWRlKCk7XG5cbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xuICAgICAgLy8gVE9ETzogZWxlbWVudCBzZWxlY3RvciBhcyBhIHBhcmFtXG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlcyA9IFtdO1xuICAgIGNvbnN0IGdyaWRPcHRpb25zOiBEZXZFeHByZXNzLnVpLmR4RGF0YUdyaWRPcHRpb25zID0ge1xuICAgICAgZGF0YVNvdXJjZTogdGhpcy5jcmVhdGVEYXRhU291cmNlKHRoaXMucmVwb3J0UGFyYW1zLCB0aGlzLmN1cnJlbnRHcmlkTW9kZSwgdGhpcy5zaG93QWxsRGF0YUluRWRpdCksXG4gICAgICBlbGVtZW50QXR0cjogeyBjbGFzczogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgPyAnZWRpdC1tb2RlJyA6ICd2aWV3LW1vZGUnIH0sXG4gICAgICByZXBhaW50Q2hhbmdlc09ubHk6IHRydWUsXG4gICAgICBvblRvb2xiYXJQcmVwYXJpbmc6IChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZS50b29sYmFyT3B0aW9ucy5pdGVtcztcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgJiYgdGhpcy5hbGxvd0VkaXRpbmcpIHtcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnc2VhcmNoUGFuZWwnKVswXTtcbiAgICAgICAgICBjb25zdCBzZWFyY2hQYW5lbEluZGV4ID0gaXRlbXMuaW5kZXhPZihzZWFyY2hQYW5lbCk7XG5cbiAgICAgICAgICBjb25zdCBzd2l0Y2hUb0VkaXRCdG4gPSB7XG4gICAgICAgICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgdGV4dDogJ1N3aXRjaCB0byBFZGl0IE1vZGUnLFxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnN3aXRjaFRvTW9kZShHcmlkTW9kZS5FZGl0KSxcbiAgICAgICAgICAgICAgaWNvbjogJ3N3aXRjaC10by1lZGl0LW1vZGUnLFxuICAgICAgICAgICAgICBlbGVtZW50QXR0cjoge2NsYXNzOiAnaXN6b2xlYS1tZCd9XG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhCdXR0b25PcHRpb25zXG4gICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4VG9vbGJhckl0ZW07XG5cbiAgICAgICAgICBpdGVtcy5zcGxpY2Uoc2VhcmNoUGFuZWxJbmRleCwgMSk7XG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb0VkaXRCdG4pO1xuICAgICAgICAgIGl0ZW1zLnB1c2goc2VhcmNoUGFuZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XG4gICAgICAgICAgY29uc3QgY29sdW1uQ2hvb3NlckJ0biA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAnY29sdW1uQ2hvb3NlckJ1dHRvbicpWzBdO1xuICAgICAgICAgIGNvbnN0IGNvbHVtbnRDaG9vc2VyQnRuSW5kZXggPSBpdGVtcy5pbmRleE9mKGNvbHVtbkNob29zZXJCdG4pO1xuXG4gICAgICAgICAgY29uc3Qgc2hvd0RhdGFJdGVtID0ge1xuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJCgnPGRpdiAvPicpXG4gICAgICAgICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggI2UwZTBlMCBzb2xpZCcsXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnM3B4IDZweCcsXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpXG4gICAgICAgICAgICAgICAgLmNzcyh7IG1hcmdpbjogJzAgNXB4IDAgMCcsIHdpZHRoOiAnNTRweCcgfSlcbiAgICAgICAgICAgICAgICAuZHhTd2l0Y2goe1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2hvd0FsbERhdGFJbkVkaXQsXG4gICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGxEYXRhSW5FZGl0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5vcHRpb24oJ2RhdGFTb3VyY2UnLCB0aGlzLmNyZWF0ZURhdGFTb3VyY2UodGhpcy5yZXBvcnRQYXJhbXMsIHRoaXMuY3VycmVudEdyaWRNb2RlLCB0aGlzLnNob3dBbGxEYXRhSW5FZGl0KSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS50ZXh0KCdTaG93IGFsbCBkYXRhICcpLmFwcGVuZFRvKCRjb250YWluZXIpO1xuXG4gICAgICAgICAgICAgIGNvbnN0ICRoaW50VGFyZ2V0ID0gJCgnPGEgLz4nKVxuICAgICAgICAgICAgICAgIC5jc3MoeyB0ZXh0RGVjb3JhdGlvbjogJ3VuZGVybGluZScsIGNvbG9yOiAnYmx1ZScgfSlcbiAgICAgICAgICAgICAgICAudGV4dCgnKD8pJylcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgICAgJCgnPGRpdiAvPicpXG4gICAgICAgICAgICAgICAgLnRleHQoYElmIHRoZSB0YWJsZSBjb250YWlucyBhIGxvdCBvZiBjb2x1bW5zIHNob3dpbmcgYWxsIGRhdGEgY2FuIGxlYWQgdG8gc2xvdyBwYWdlIHBlcmZvcm1hbmNlIHdoZW4geW91J3JlIGVkaXRpbmcgdGhlIGdyaWQuXG5CeSBkZWZhdWx0IGdyaWQgc2hvd3Mgb25seSBmaXJzdCAxMCByb3dzIGluIHRoZSBFZGl0IG1vZGUuYClcbiAgICAgICAgICAgICAgICAuZHhQb3BvdmVyKHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogJGhpbnRUYXJnZXQsXG4gICAgICAgICAgICAgICAgICBzaG93RXZlbnQ6ICdtb3VzZWVudGVyJyxcbiAgICAgICAgICAgICAgICAgIGhpZGVFdmVudDogJ21vdXNlbGVhdmUnLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDUwMFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRjb250YWluZXIpO1xuXG4gICAgICAgICAgICAgIHJldHVybiAkY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xuXG4gICAgICAgICAgY29uc3Qgc3dpdGNoVG9WaWV3QnRuID0ge1xuICAgICAgICAgICAgd2lkZ2V0OiAnZHhCdXR0b24nLFxuICAgICAgICAgICAgbG9jYXRpb246ICdhZnRlcicsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIHRleHQ6ICdTd2l0Y2ggdG8gVmlldyBNb2RlJyxcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zd2l0Y2hUb01vZGUoR3JpZE1vZGUuVmlldyksXG4gICAgICAgICAgICAgIGljb246ICdzd2l0Y2gtdG8tdmlldy1tb2RlJyxcbiAgICAgICAgICAgICAgZWxlbWVudEF0dHI6IHtjbGFzczogJ2lzem9sZWEtbWQnfVxuICAgICAgICAgICAgfSBhcyBEZXZFeHByZXNzLnVpLmR4QnV0dG9uT3B0aW9uc1xuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xuXG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGNvbHVtbnRDaG9vc2VyQnRuSW5kZXgsIDEpO1xuXG4gICAgICAgICAgY29uc3QgZXhwb3J0QnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdleHBvcnRCdXR0b24nKVswXTtcbiAgICAgICAgICBjb25zdCBleHBvcnRCdG5JbmRleCA9IGl0ZW1zLmluZGV4T2YoZXhwb3J0QnRuKTtcblxuICAgICAgICAgIGl0ZW1zLnNwbGljZShleHBvcnRCdG5JbmRleCwgMSk7XG5cbiAgICAgICAgICBpdGVtcy5wdXNoKHNob3dEYXRhSXRlbSk7XG4gICAgICAgICAgaXRlbXMucHVzaChzd2l0Y2hUb1ZpZXdCdG4pO1xuICAgICAgICAgIGl0ZW1zLnB1c2goY29sdW1uQ2hvb3NlckJ0bik7XG5cbiAgICAgICAgICBjb25zdCBlZGl0U3RhdHVzID0ge1xuICAgICAgICAgICAgbG9jYXRpb246ICdiZWZvcmUnLFxuICAgICAgICAgICAgdGVtcGxhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yID0gJCgnPGRpdiAvPicpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlZGl0LWdyaWQtc3RhdGUnKTtcblxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kZ3JpZFN0YXRlSW5kaWNhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRvb2xiYXJJdGVtO1xuXG4gICAgICAgICAgaXRlbXMudW5zaGlmdChlZGl0U3RhdHVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFkZFJlZnJlc2hCdXR0b24pIHtcbiAgICAgICAgICBjb25zdCByZWZyZXNoQnRuID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09ICdyZWZyZXNoJylbMF07XG4gICAgICAgICAgY29uc3QgcmVmcmVzaEJ0bkluZGV4ID0gaXRlbXMuaW5kZXhPZihyZWZyZXNoQnRuKTtcblxuICAgICAgICAgIGl0ZW1zW3JlZnJlc2hCdG5JbmRleF0gPSB7XG4gICAgICAgICAgICBsb2NhdGlvbjogJ2FmdGVyJyxcbiAgICAgICAgICAgIHRlbXBsYXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0ICRjb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XG4gICAgICAgICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCRjb250YWluZXIsICgpID0+IHRoaXMucmVmcmVzaCgpKTtcblxuICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFySXRlbTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uQ2VsbFByZXBhcmVkOiAoeyByb3dUeXBlLCBjb2x1bW4sIGNlbGxFbGVtZW50IH0pID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChyb3dUeXBlID09PSAnaGVhZGVyJyAmJiAhY29sdW1uLmNvbW1hbmQpIHtcbiAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxTZXR0aW5ncyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5nZXRDb2x1bW5BZGRpdGlvbmFsU2V0dGluZ3MoZGF0YUZpZWxkKTtcblxuICAgICAgICAgIHRoaXMuaW5pdEdyaWRIZWFkZXJDZWxsKGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRHcmlkSGVhZGVyQ2VsbEVkaXRQYW5lbChjb2x1bW4sIGNlbGxFbGVtZW50LCBhZGRpdGlvbmFsU2V0dGluZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgb25Db250ZW50UmVhZHk6IChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gZS5jb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZTogSUdyaWRTdGF0ZSA9IGN1cnJlbnRHcmlkLnN0YXRlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtaW5nKGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTk9URTogY29sdW1uIG5hbWUgdXBkYXRpbmcgdHJpZ2dlcnMgb25Db250ZW50UmVhZHkgZXZlbnQgcmFpc2luZyBhZ2Fpbi5cbiAgICAgICAgICAvLyBXZSBuZWVkIG5vdCB0byBleGV1Y3V0ZSB0aGUgc2FtZSBvbmUgbW9yZSB0aW1lLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGN1cnJlbnRHcmlkLmVuZEN1c3RvbUxvYWRpbmcoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlICE9PSBHcmlkTW9kZS5FZGl0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29sdW1ucyA9IHRoaXMuZ3JpZFN0YXRlTWFuYWdlci5jaGVja05ld0NvbHVtbnMoY3VycmVudFN0YXRlKTtcblxuICAgICAgICBuZXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbk5hbWUpID0+IGUuY29tcG9uZW50LmNvbHVtbk9wdGlvbihjb2x1bW5OYW1lLCAndmlzaWJsZScsIGZhbHNlKSk7XG5cbiAgICAgICAgY29uc3QgY29sdW1uQ2FwdGlvbnMgPSB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuZ2V0Q29sdW1uQ2FwdGlvbnMoKTtcblxuICAgICAgICBjb2x1bW5DYXB0aW9ucy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgaWYgKGMuY2FwdGlvbiAmJiBjdXJyZW50R3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYXB0aW9uJykgIT09IGMuY2FwdGlvbikge1xuICAgICAgICAgICAgY3VycmVudEdyaWQuY29sdW1uT3B0aW9uKGMuZGF0YUZpZWxkLCAnY2FwdGlvbicsIGMuY2FwdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBzdGF0ZVN0b3Jpbmc6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbUxvYWQ6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLmxvYWQodGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQsIChvdXRkYXRlZENvbHVtbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkLnN0YXRlKCk7XG5cbiAgICAgICAgICAgIHN0YXRlLmNvbHVtbnMgPSAoc3RhdGUuY29sdW1ucyBhcyBhbnlbXSkuZmlsdGVyKChjb2x1bW4pID0+IG91dGRhdGVkQ29sdW1ucy5pbmRleE9mKGNvbHVtbi5kYXRhRmllbGQpIDwgMCk7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbVNhdmU6IChzdGF0ZSkgPT4gdGhpcy5zYXZlR3JpZFN0YXRlKHN0YXRlKVxuICAgICAgfSxcblxuICAgICAgZmlsdGVyUm93OiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3LCBhcHBseUZpbHRlcjogJ29uQ2xpY2snIH0sXG4gICAgICBoZWFkZXJGaWx0ZXI6IHsgdmlzaWJsZTogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLlZpZXcgfSxcbiAgICAgIHNlYXJjaFBhbmVsOiB7IHZpc2libGU6IHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3IH0sXG4gICAgICBlcnJvclJvd0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgYWxsb3dDb2x1bW5SZXNpemluZzogdHJ1ZSxcbiAgICAgIHNvcnRpbmc6IHsgbW9kZTogJ211bHRpcGxlJyB9LFxuICAgICAgZ3JvdXBQYW5lbDogeyB2aXNpYmxlOiB0cnVlIH0sXG4gICAgICBncm91cGluZzogeyBhdXRvRXhwYW5kQWxsOiBmYWxzZSB9LFxuICAgICAgYWxsb3dDb2x1bW5SZW9yZGVyaW5nOiB0aGlzLmN1cnJlbnRHcmlkTW9kZSA9PT0gR3JpZE1vZGUuRWRpdCxcbiAgICAgIGNvbHVtbkNob29zZXI6IHsgZW5hYmxlZDogdGhpcy5jdXJyZW50R3JpZE1vZGUgPT09IEdyaWRNb2RlLkVkaXQgfSxcbiAgICAgIHNob3dDb2x1bW5IZWFkZXJzOiB0cnVlLFxuICAgICAga2V5Ym9hcmROYXZpZ2F0aW9uOiB7ZW5hYmxlZDogZmFsc2V9LFxuXG4gICAgICBzaG93Qm9yZGVyczogdHJ1ZSxcbiAgICAgIHBhZ2luZzogeyBwYWdlU2l6ZTogNTAsIGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgIHJlbW90ZU9wZXJhdGlvbnM6IHRydWUsXG5cbiAgICAgIHN1bW1hcnk6IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbiA/IHtcbiAgICAgICAgdG90YWxJdGVtczogW3tcbiAgICAgICAgICBjb2x1bW46IHRoaXMucmVwb3J0UGFyYW1zLlRvdGFsU3VtbWFyeUNvbHVtbixcbiAgICAgICAgICBzdW1tYXJ5VHlwZTogJ2NvdW50J1xuICAgICAgICB9XVxuICAgICAgfSA6IHVuZGVmaW5lZCxcblxuICAgICAgb25FZGl0b3JQcmVwYXJpbmcoZSkge1xuICAgICAgICBpZiAoZS5wYXJlbnRUeXBlID09PSAnZmlsdGVyUm93Jykge1xuICAgICAgICAgIGNvbnN0IGFwcGx5ID0gKCkgPT4gZS5lbGVtZW50LmZpbmQoJy5keC1hcHBseS1idXR0b24nKS50cmlnZ2VyKCdkeGNsaWNrJyk7XG5cbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5O1xuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUucGFyZW50VHlwZSA9PT0gJ3NlYXJjaFBhbmVsJykge1xuICAgICAgICAgIGNvbnN0IGFwcGx5U2VhcmNoOiBEZXZFeHByZXNzLnVpLmR4VGV4dEVkaXRvci5Qcm9wZXJ0aWVzWydvbkVudGVyS2V5J10gPSAoYXJncykgPT4ge1xuICAgICAgICAgICAgZS5jb21wb25lbnQuc2VhcmNoQnlUZXh0KGFyZ3MuY29tcG9uZW50Lm9wdGlvbigndmFsdWUnKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vblZhbHVlQ2hhbmdlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBlLmVkaXRvck9wdGlvbnMub25FbnRlcktleSA9IGFwcGx5U2VhcmNoO1xuICAgICAgICAgIGUuZWRpdG9yT3B0aW9ucy5vbkZvY3VzT3V0ID0gYXBwbHlTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5ncmlkID0gZGVmYXVsdEdyaWQodGhpcy4kZ3JpZFRhcmdldEVsZW1lbnQsIHtcbiAgICAgIG9wdGlvbnM6IGdyaWRPcHRpb25zLFxuICAgICAgZXhwb3J0RmlsZU5hbWU6IHRoaXMucmVwb3J0UGFyYW1zLk5hbWUsXG4gICAgICB0aXRsZTogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuTmFtZSA6IG51bGwsXG4gICAgICBoZWFkZXJEZXNjcmlwdGlvbjogdGhpcy5zaG93SGVhZGVyID8gdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyA6IG51bGxcbiAgICB9KTtcblxuICAgIHRoaXMuJHJlc2V0U2V0dGluZ1RhcmdldEVsZW1lbnQ/LnJlbW92ZSgpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBHcmlkTW9kZS5FZGl0KSB7XG4gICAgICB0aGlzLiRyZXNldFNldHRpbmdUYXJnZXRFbGVtZW50ID0gJCgnPHNwYW4gLz4nKVxuICAgICAgICAuY3NzKHtcbiAgICAgICAgICBmbG9hdDogJ3JpZ2h0JyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBib3R0b206ICc4cHgnXG4gICAgICAgIH0pXG4gICAgICAgIC5hZGRDbGFzcygnaXN6b2xlYS1tZCcpXG4gICAgICAgIC5keEJ1dHRvbih7XG4gICAgICAgICAgdGV4dDogJ1Jlc2V0IHNldHRpbmdzJyxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnJlc2V0U2V0dGluZ3MoKSxcbiAgICAgICAgICBpY29uOiAncmVzZXQtZ3JpZC1zZXR0aW5ncydcbiAgICAgICAgfSlcbiAgICAgICAgLmFwcGVuZFRvKCdmb290ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ncmlkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3Ioc3RhdGU6IHN0cmluZykge1xuICAgIE9iamVjdC5rZXlzKEdSSURfSU5ESUNBVE9SX1NUQVRFKS5mb3JFYWNoKChzKSA9PiB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IucmVtb3ZlQ2xhc3MoR1JJRF9JTkRJQ0FUT1JfU1RBVEVbc10pKTtcblxuICAgIHRoaXMuJGdyaWRTdGF0ZUluZGljYXRvci5hZGRDbGFzcyhzdGF0ZSk7XG5cbiAgICBpZiAodGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0KSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ3JpZFN0YXRlSW5kaWNhdG9yVGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlID09PSBHUklEX0lORElDQVRPUl9TVEFURS5zYXZlZCkge1xuICAgICAgdGhpcy5ncmlkU3RhdGVJbmRpY2F0b3JUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5lZGl0KTtcbiAgICAgIH0sIFJFU0VUX1NBVkVEX0lORElDQVRPUl9USU1FT1VUKTtcbiAgICB9XG5cbiAgICBsZXQgdGl0bGUgPSAnJztcblxuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuZWRpdDpcbiAgICAgICAgdGl0bGUgPSAnRWRpdCBtb2RlJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQ6XG4gICAgICAgIHRpdGxlID0gJ1NhdmVkJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2aW5nOlxuICAgICAgICB0aXRsZSA9ICdTYXZpbmcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLiRncmlkU3RhdGVJbmRpY2F0b3IuYXR0cigndGl0bGUnLCB0aXRsZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk5hbWluZyhzdGF0ZTogSUdyaWRTdGF0ZSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIEhBQ0s6IERldkV4dHJlbWUgZ3JpZCBkb2Vzbid0IHNob3cgY29sdW1ucyBkYXRhIGlmIGEgZGF0YUZpZWxkIGhhcyBzcGVjaWFsIHN5bWJvbHMuXG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LmRldmV4cHJlc3MuY29tL1N1cHBvcnQvQ2VudGVyL1F1ZXN0aW9uL0RldGFpbHMvVDYyMTgzOC9keGRhdGFncmlkLWEtY29sdW1uLWlzLWVtcHR5LWlmLWRhdGFmaWVsZC1jb250YWlucy1zcGVjaWFsLWNoYXJhY3RlcnNcbiAgICAvLyB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aFxuICAgIGlmIChzdGF0ZS5jb2x1bW5zKSB7XG4gICAgICBzdGF0ZS5jb2x1bW5zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KGMuZGF0YUZpZWxkKSkge1xuICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5PcHRpb24oYy5kYXRhRmllbGQsICdjYWxjdWxhdGVDZWxsVmFsdWUnLCAocm93RGF0YSkgPT4gcm93RGF0YVtjLmRhdGFGaWVsZF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IHRydWU7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZShyZXBvcnRQYXJhbXNEYXRhU291cmNlOiBJUmVwb3J0UGFyYW1zLCBncmlkTW9kZTogR3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5kYXRhTGF5ZXIuZ2V0R3JpZERhdGFTb3VyY2UocmVwb3J0UGFyYW1zRGF0YVNvdXJjZSwgZ3JpZE1vZGUsIHNob3dBbGxEYXRhSW5FZGl0RGF0YVNvdXJjZSk7XG4gICAgY29uc3QgZHMgPSBuZXcgRGV2RXhwcmVzcy5kYXRhLkRhdGFTb3VyY2Uoe1xuICAgICAgc3RvcmUsXG4gICAgICBvbkNoYW5nZWQ6IGdyaWRNb2RlID09PSBHcmlkTW9kZS5WaWV3ID8gdm9pZCAwIDogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZEVycm9yOiAoZSkgPT4ge1xuICAgICAgICBpZiAoIWRzLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICB0aGlzLiRncmlkRXJyb3JQbGFjZWhvbGRlci5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdyaWQuZW5kQ3VzdG9tTG9hZGluZygpO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZGluZ0NoYW5nZWQ6IChpc0xvYWRpbmcpID0+IHtcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xuICAgICAgICAgIHRoaXMuJGdyaWRFcnJvclBsYWNlaG9sZGVyLmhpZGUoKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ1BsZWFzZSB3YWl0LCBkYXRhIGxvYWRpbmcgaW4gcHJvZ3Jlc3MuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgMTAwMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmdUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkaW5nVGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ncmlkLmVuZEN1c3RvbUxvYWRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRzO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNldHRpbmdzKCkge1xuICAgIERldkV4cHJlc3MudWkuZGlhbG9nLmNvbmZpcm0oJ1Jlc2V0IGdyaWQgc2V0dGluZ3MgdG8gZGVmYXVsdCB2YWx1ZXM/JywgJ1Jlc2V0IHRvIGRlZmF1bHQ/JylcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHRoaXMuZ3JpZC5iZWdpbkN1c3RvbUxvYWRpbmcoJ0xvYWRpbmcnKTtcbiAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXJcbiAgICAgICAgICAgIC5yZXNldFNldHRpbmdzKClcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZ3JpZC5zdGF0ZShkYXRhKTtcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLm9wdGlvbignZGF0YVNvdXJjZScsIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSh0aGlzLnJlcG9ydFBhcmFtcywgdGhpcy5jdXJyZW50R3JpZE1vZGUsIHRoaXMuc2hvd0FsbERhdGFJbkVkaXQpKTtcbiAgICAgICAgICAgICAgdGhpcy5ncmlkLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9Nb2RlKG1vZGU6IEdyaWRNb2RlKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEdyaWRNb2RlID09PSBtb2RlIHx8IG1vZGUgPT09IEdyaWRNb2RlLkVkaXQgJiYgIXRoaXMuYWxsb3dFZGl0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50R3JpZE1vZGUgPSBtb2RlO1xuXG4gICAgY29uc3QgY3VycmVudFN1bW1hcnlDb2x1bW4gPSB0aGlzLmdyaWQub3B0aW9uKCdzdW1tYXJ5LnRvdGFsSXRlbXNbMF0uY29sdW1uJykgYXMgc3RyaW5nO1xuXG4gICAgY29uc3QgbmV3UmVwb3J0UGFyYW1zID0ge1xuICAgICAgLi4udGhpcy5yZXBvcnRQYXJhbXMsXG4gICAgICBUb3RhbFN1bW1hcnlDb2x1bW46IGN1cnJlbnRTdW1tYXJ5Q29sdW1uID8gY3VycmVudFN1bW1hcnlDb2x1bW4gOiB0aGlzLnJlcG9ydFBhcmFtcy5Ub3RhbFN1bW1hcnlDb2x1bW5cbiAgICB9O1xuXG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBuZXdSZXBvcnRQYXJhbXM7XG5cbiAgICB0aGlzLmdyaWQuZGlzcG9zZSgpO1xuICAgIHRoaXMuJGdyaWRUYXJnZXRFbGVtZW50LnJlbW92ZSgpO1xuICAgIHRoaXMuZ3JpZCA9IHRoaXMuaW5pdEludGVybmFsKCk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVHcmlkU3RhdGUoc3RhdGUpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50R3JpZE1vZGUgIT09IEdyaWRNb2RlLkVkaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbk5hbWVzVXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgd2lkdGhzID0gdGhpcy5ncmlkU3RhdGVNYW5hZ2VyLnNhdmUoc3RhdGUsXG4gICAgICAoKSA9PiB0aGlzLnVwZGF0ZUdyaWRTdGF0ZUluZGljYXRvcihHUklEX0lORElDQVRPUl9TVEFURS5zYXZpbmcpLFxuICAgICAgKCkgPT4gdGhpcy51cGRhdGVHcmlkU3RhdGVJbmRpY2F0b3IoR1JJRF9JTkRJQ0FUT1JfU1RBVEUuc2F2ZWQpKTtcblxuICAgIGlmICh3aWR0aHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKHdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGVkaXRXaWR0aEJveCA9IHRoaXMuZWRpdFdpZHRoRWRpdEJveGVzW2tleV07XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB3aWR0aHNba2V5XSA9PT0gJ2luaGVyaXQnID8gJycgOiB3aWR0aHNba2V5XTtcblxuICAgICAgICBpZiAoZWRpdFdpZHRoQm94ICYmIGVkaXRXaWR0aEJveC5vcHRpb24oJ3ZhbHVlJykgIT09IHZhbHVlKSB7XG4gICAgICAgICAgZWRpdFdpZHRoQm94Lm9wdGlvbigndmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEdyaWRIZWFkZXJDZWxsRWRpdFBhbmVsKFxuICAgIGNvbHVtbjogRGV2RXhwcmVzcy51aS5keERhdGFHcmlkQ29sdW1uLFxuICAgICRjZWxsOiBKUXVlcnksXG4gICAgYWRkaXRpb25hbFNldHRpbmdzOiBJR3JpZEFkZGl0aW9uYWxDb2x1bW5TdGF0ZVxuICApIHtcbiAgICBjb25zdCBkYXRhRmllbGQgPSBjb2x1bW4uZGF0YUZpZWxkO1xuICAgIGNvbnN0ICRjb2x1bW5DYXB0aW9uRWwgPSAkY2VsbC5maW5kKCcuZHgtZGF0YWdyaWQtdGV4dC1jb250ZW50Jyk7XG4gICAgY29uc3QgJGVkaXRvckFyZWEgPSAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdjb2x1bW4tZWRpdG9yLWFyZWEnKS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcblxuICAgICRjb2x1bW5DYXB0aW9uRWwuY3NzKCdtYXhXaWR0aCcsICc1NSUnKTtcblxuICAgIGNvbnN0ICRlZGl0VHlwZVBhbmVsID0gJCgnPGRpdiAvPicpXG4gICAgICAuYWRkQ2xhc3MoJ2VkaXQtdHlwZS1wYW5lbCcpXG4gICAgICAud2lkdGgoJzEwMCUnKVxuICAgICAgLmFwcGVuZFRvKCRjZWxsKTtcblxuICAgIGNvbnN0ICRlZGl0V2lkdGhQYW5lbCA9ICQoJzxkaXYgLz4nKVxuICAgICAgLmFkZENsYXNzKCdlZGl0LXdpZHRoLXBhbmVsJylcbiAgICAgIC53aWR0aCgnMTAwJScpXG4gICAgICAuYXBwZW5kVG8oJGNlbGwpO1xuXG4gICAgJGVkaXRUeXBlUGFuZWxbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3Qgc2VsZWN0Qm94ID0gJGVkaXRUeXBlQm94LmR4U2VsZWN0Qm94KCdpbnN0YW5jZScpO1xuXG4gICAgICBpZiAoc2VsZWN0Qm94Lm9wdGlvbignb3BlbmVkJykpIHtcbiAgICAgICAgc2VsZWN0Qm94LmNsb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RCb3gub3BlbigpO1xuICAgICAgfVxuICAgIH0sIHRydWUpO1xuXG4gICAgbGV0IGxhc3RDYXB0aW9uVmFsdWUgPSBjb2x1bW4uY2FwdGlvbjtcblxuICAgIGNvbnN0ICRlZGl0Q2FwdGlvbkJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xuICAgICAgaGludDogJ0VkaXQgY29sdW1uIGNhcHRpb24nLFxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtY2FwdGlvbi1idG4nKSksXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xuICAgICAgICAgIHZhbHVlOiBsYXN0Q2FwdGlvblZhbHVlLFxuICAgICAgICAgIGVsZW1lbnRBdHRyOiB7IGNsYXNzOiAnY2FwdGlvbi1lZGl0b3InIH0sXG4gICAgICAgICAgb25FbnRlcktleTogKGUpID0+IHtcbiAgICAgICAgICAgIGVkaXRCdG4uYmx1cigpO1xuICAgICAgICAgICAgZS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uS2V5RG93bjogKGUpID0+IHtcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkZvY3VzT3V0OiAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcblxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnRleHQobmV3VmFsdWUpLnNob3coKTtcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xuXG4gICAgICAgICAgICBsYXN0Q2FwdGlvblZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hbmFnZXIuc2V0Q29sdW1uQ2FwdGlvbihkYXRhRmllbGQsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUdyaWRTdGF0ZSh0aGlzLmdyaWQuc3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1zbScpXG4gICAgICAgICAgLmFwcGVuZFRvKCRlZGl0b3JBcmVhKVxuICAgICAgICAgIC5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBlZGl0QnRuID0gJGVkaXQuZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xuXG4gICAgICAgIGVkaXRCdG4uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KS5pbnNlcnRBZnRlcigkY29sdW1uQ2FwdGlvbkVsKTtcblxuICAgIGNvbnN0ICRlZGl0VG9vbHRpcEJ0biA9ICQoJzxzcGFuIC8+JykuZHhCdXR0b24oe1xuICAgICAgaGludDogJ0VkaXQgY29sdW1uIHRvb2x0aXAnLFxuICAgICAgdGVtcGxhdGU6IChkYXRhLCAkY29udGVudCkgPT4gJGNvbnRlbnQuYXBwZW5kKCQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2VkaXQtdG9vbHRpcC1idG4nKSksXG4gICAgICBvbkNsaWNrOiAoeyBldmVudCB9KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICRjb2x1bW5DYXB0aW9uRWwuaGlkZSgpO1xuICAgICAgICAkZWRpdENhcHRpb25CdG4uaGlkZSgpO1xuICAgICAgICAkZWRpdFRvb2x0aXBCdG4uaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0ICRlZGl0ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xuICAgICAgICAgIHZhbHVlOiBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXAsXG4gICAgICAgICAgdGV4dDogYWRkaXRpb25hbFNldHRpbmdzICYmIGFkZGl0aW9uYWxTZXR0aW5ncy50b29sdGlwLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgY29sdW1uIHRvb2x0aXAuLi4nLFxuICAgICAgICAgIG9uRW50ZXJLZXk6IChlKSA9PiB7XG4gICAgICAgICAgICBlZGl0QnRuLmJsdXIoKTtcbiAgICAgICAgICAgIGUuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbktleURvd246IChlKSA9PiB7XG4gICAgICAgICAgICBlLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Gb2N1c091dDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBlZGl0QnRuLm9wdGlvbigndmFsdWUnKTtcblxuICAgICAgICAgICAgJGVkaXQucmVtb3ZlKCk7XG4gICAgICAgICAgICAkY29sdW1uQ2FwdGlvbkVsLnNob3coKTtcbiAgICAgICAgICAgICRlZGl0Q2FwdGlvbkJ0bi5zaG93KCk7XG4gICAgICAgICAgICAkZWRpdFRvb2x0aXBCdG4uc2hvdygpO1xuXG4gICAgICAgICAgICBhZGRpdGlvbmFsU2V0dGluZ3MudG9vbHRpcCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgJGNlbGwuYXR0cigndGl0bGUnLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnNhdmVHcmlkU3RhdGUodGhpcy5ncmlkLnN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtc20nKVxuICAgICAgICAgIC5hcHBlbmRUbygkZWRpdG9yQXJlYSlcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZWRpdEJ0biA9ICRlZGl0LmR4VGV4dEJveCgnaW5zdGFuY2UnKTtcblxuICAgICAgICBlZGl0QnRuLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSkuaW5zZXJ0QWZ0ZXIoJGVkaXRDYXB0aW9uQnRuKTtcblxuICAgIGNvbnN0ICRlZGl0VHlwZUJveCA9ICQoJzxzcGFuIC8+JykuZHhTZWxlY3RCb3goe1xuICAgICAgZGF0YVNvdXJjZTogZ3JpZENvbHVtblR5cGVzLFxuICAgICAgdmFsdWU6IGNvbHVtbi5kYXRhVHlwZSB8fCBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlLkRlZmF1bHQsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBjb2x1bW4gdHlwZS4uLicsXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHsgdmFsdWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ2RhdGFUeXBlJywgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJykuYXBwZW5kVG8oJGVkaXRUeXBlUGFuZWwpO1xuXG4gICAgbGV0IHByZXZWYWx1ZSA9ICEhY29sdW1uLndpZHRoID8gY29sdW1uLndpZHRoLnRvU3RyaW5nKCkgOiAnJztcblxuICAgIGNvbnN0IG9uV2lkdGhWYWx1ZUNoYW5nZWQgPSAoZSkgPT4ge1xuICAgICAgbGV0IG5ld1ZhbHVlID0gZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScpO1xuXG4gICAgICBpZiAoIW5ld1ZhbHVlIHx8IG5ld1ZhbHVlID09PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgbmV3VmFsdWUgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmV2VmFsdWUgfHwgcHJldlZhbHVlID09PSAnaW5oZXJpdCcpIHtcbiAgICAgICAgcHJldlZhbHVlID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XG4gICAgICAgIHByZXZWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLmdyaWQuY29sdW1uT3B0aW9uKGRhdGFGaWVsZCwgJ3dpZHRoJywgbmV3VmFsdWUgfHwgJ2luaGVyaXQnKTtcblxuICAgICAgICBpZiAoIXRoaXMuZ3JpZFJlcGFpbnRRdWV1ZWQpIHtcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWQucmVwYWludCgpO1xuICAgICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgdGhpcy5ncmlkUmVwYWludFF1ZXVlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCAkZWRpdFdpZHRoQm94ID0gJCgnPHNwYW4gLz4nKS5keFRleHRCb3goe1xuICAgICAgdGV4dDogcHJldlZhbHVlID09PSAnaW5oZXJpdCcgPyAnJyA6IHByZXZWYWx1ZSxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2V0IHdpZHRoLi4uJyxcbiAgICAgIG9uRW50ZXJLZXk6ICgpID0+ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpLmJsdXIoKSxcbiAgICAgIG9uRm9jdXNPdXQ6IG9uV2lkdGhWYWx1ZUNoYW5nZWQsXG4gICAgICBvblZhbHVlQ2hhbmdlZDogb25XaWR0aFZhbHVlQ2hhbmdlZFxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLXNtJylcbiAgICAgIC5hcHBlbmRUbygkZWRpdFdpZHRoUGFuZWwpXG4gICAgICAub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmVkaXRXaWR0aEVkaXRCb3hlc1tjb2x1bW4udmlzaWJsZUluZGV4XSA9ICRlZGl0V2lkdGhCb3guZHhUZXh0Qm94KCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0R3JpZEhlYWRlckNlbGwoJGNlbGxFbDogSlF1ZXJ5LCBhZGRpdGlvbmFsU2V0dGluZ3M6IElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlKSB7XG4gICAgY29uc3QgJGNvbHVtbkNhcHRpb25FbCA9ICRjZWxsRWwuZmluZCgnLmR4LWRhdGFncmlkLXRleHQtY29udGVudCcpO1xuICAgIGNvbnN0IHRvb2x0aXAgPSBhZGRpdGlvbmFsU2V0dGluZ3MgJiYgYWRkaXRpb25hbFNldHRpbmdzLnRvb2x0aXA7XG4gICAgY29uc3QgY2FwdGlvbiA9IGFkZGl0aW9uYWxTZXR0aW5ncyAmJiBhZGRpdGlvbmFsU2V0dGluZ3MuY2FwdGlvbjtcblxuICAgICRjZWxsRWwuYXR0cigndGl0bGUnLCB0b29sdGlwIHx8IHZvaWQgMCk7XG5cbiAgICBpZiAoY2FwdGlvbikge1xuICAgICAgJGNvbHVtbkNhcHRpb25FbC50ZXh0KGNhcHRpb24pO1xuICAgIH1cbiAgfVxufVxuIiwgIlx1RkVGRmludGVyZmFjZSBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcbiAgc3VidmFsdWVzOiBJU3VidmFsdWVPcHRpb25zW107XG4gIHR5cGU6IHN0cmluZztcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElTdWJ2YWx1ZU9wdGlvbnMge1xuICBrZXk6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0JvdW5kOiBib29sZWFuO1xuICBtZWFzdXJlSWQ6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbiAgY29sb3I6IHN0cmluZztcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIHN1YnZhbHVlczogW10sXG4gIHR5cGU6ICd0cmlhbmdsZU1hcmtlcicsXG4gIGNvbG9yOiAnIzg3OThhNScsXG4gIHNlY29uZENvbG9yOiAnI2UxOGU5MicsXG4gIHdpZHRoOiAxMCxcbiAgaXNDdXN0b21QYWxldHRlOiBmYWxzZSxcbiAgcGFsZXR0ZTogbnVsbCxcbiAgY3VzdG9tUGFsZXR0ZTogWycjNjFhNTk1JywgJ0dyZXknLCAncmdiKDE1MywgMTAyLCAyNTUpJywgJ05hdnknXVxufSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xuXG5jb25zdCBDU1NfQ0xBU1MgPSAnaXNvei1zdWJ2YWx1ZUVkaXRvckZvcm1Hcm91cCc7XG5jb25zdCBOQU1FX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fbmFtZWA7XG5jb25zdCBJU19CT1VORF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX2lzLWJvdW5kYDtcbmNvbnN0IFZBTFVFX0lURU1fQ1NTX0NMQVNTID0gYCR7Q1NTX0NMQVNTfV9fdmFsdWVgO1xuY29uc3QgTUVBU1VSRV9JRF9JVEVNX0NTU19DTEFTUyA9IGAke0NTU19DTEFTU31fX21lYXN1cmUtaWRgO1xuY29uc3QgQ09MT1JfSVRFTV9DU1NfQ0xBU1MgPSBgJHtDU1NfQ0xBU1N9X19jb2xvcmA7XG5cbmNvbnN0IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlTmVlZGxlJywgJ3RyaWFuZ2xlTmVlZGxlJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xuY29uc3QgTElORUFSX0lORElDQVRPUl9UWVBFUyA9IFsncmVjdGFuZ2xlJywgJ2NpcmNsZScsICdyaG9tYnVzJywgJ3JhbmdlQmFyJywgJ3RyaWFuZ2xlTWFya2VyJywgJ3RleHRDbG91ZCddO1xuXG5jb25zdCBDSVJDVUxBUl9WSUVXX1RZUEVTOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZVZpZXdUeXBlW10gPSBbJ0NpcmN1bGFyRnVsbCcsICdDaXJjdWxhckhhbGYnLCAnQ2lyY3VsYXJRdWFydGVyTGVmdCcsICdDaXJjdWxhclF1YXJ0ZXJSaWdodCcsICdDaXJjdWxhclRocmVlRm91cnRoJ107XG5jb25zdCBMSU5FQVJfVklFV19UWVBFUzogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VWaWV3VHlwZVtdID0gWydMaW5lYXJIb3Jpem9udGFsJywgJ0xpbmVhclZlcnRpY2FsJ107XG5cbmNvbnN0IERFRkFVTFRfUEFMRVRURSA9IFsnIzFkYjJmNScsICcjZjU1NjRhJywgJyM5N2M5NWMnLCAnI2ZmYzcyMCcsICcjZWIzNTczJywgJyNhNjNkYjgnLCAnIzY1OTNiYycsICcjZmFhMzM1JywgJyNmZjg4N2MnXTtcblxuY29uc3QgUFJFREVGSU5FRF9QQUxFVFRFUyA9IFsnQnJpZ2h0JywgJ0hhcm1vbnkgTGlnaHQnLCAnT2NlYW4nLCAnUGFzdGVsJywgJ1NvZnQnLCAnU29mdCBQYXN0ZWwnLCAnVmludGFnZScsXG4gICdWaW9sZXQnLCAnQ2FybWluZScsICdEYXJrIE1vb24nLCAnRGFyayBWaW9sZXQnLCAnR3JlZW4gTWlzdCcsICdTb2Z0IEJsdWUnLCAnTWF0ZXJpYWwnLCAnT2ZmaWNlJ107XG5cbi8vIDEuIE1vZGVsXG5jb25zdCBwcm9wZXJ0eSA9IHtcbiAgb3duZXJUeXBlOiBEZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5HYXVnZUl0ZW0sXG4gIHByb3BlcnR5TmFtZTogJ0dhdWdlU3VidmFsdWVzU2V0dGluZ3MnLFxuICBkZWZhdWx0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRPcHRpb25zKSxcbiAgdmFsdWVUeXBlOiAnc3RyaW5nJ1xufSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5DdXN0b21Qcm9wZXJ0eU1ldGFkYXRhO1xuXG5EZXZFeHByZXNzPy5EYXNoYm9hcmQ/Lk1vZGVsPy5yZWdpc3RlckN1c3RvbVByb3BlcnR5KHByb3BlcnR5KTtcblxuLy8gMi4gVmlld2VyXG5mdW5jdGlvbiBvbkl0ZW1XaWRnZXRPcHRpb25zUHJlcGFyZWQoYXJnczogRGV2RXhwcmVzcy5EYXNoYm9hcmQuSXRlbVdpZGdldE9wdGlvbkV2ZW50QXJncykge1xuICBpZiAoYXJncy5kYXNoYm9hcmRJdGVtIGluc3RhbmNlb2YgRGV2RXhwcmVzcz8uRGFzaGJvYXJkPy5Nb2RlbD8uR2F1Z2VJdGVtKSB7XG4gICAgY29uc3Qgc3RvcmVkT3B0aW9ucyA9IGdldE9wdGlvbnMoYXJncy5kYXNoYm9hcmRJdGVtKTtcblxuICAgIGNvbnN0IGdhdWdlT3B0aW9ucyA9IGFyZ3Mub3B0aW9ucyBhcyBEZXZFeHByZXNzLnZpei5keExpbmVhckdhdWdlT3B0aW9ucyB8IERldkV4cHJlc3Mudml6LmR4Q2lyY3VsYXJHYXVnZU9wdGlvbnM7XG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlcyA9IGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZXMgfHwgW107XG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yID0gZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yIHx8IHt9O1xuXG4gICAgZ2F1Z2VPcHRpb25zLnN1YnZhbHVlSW5kaWNhdG9yLnR5cGUgPSBzdG9yZWRPcHRpb25zLnR5cGUgYXMgYW55O1xuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci53aWR0aCA9IHN0b3JlZE9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBoYXNUYXJnZXRWYWx1ZSA9ICEhYXJncy5kYXNoYm9hcmRJdGVtLmdhdWdlcygpWzBdPy50YXJnZXRWYWx1ZSgpO1xuICAgIGdhdWdlT3B0aW9ucy5zdWJ2YWx1ZUluZGljYXRvci5wYWxldHRlID0gc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzKSA9PiBoYXNUYXJnZXRWYWx1ZSB8fCBzLmtleSA+IC0xKS5tYXAoKHMpID0+IHMuY29sb3IpO1xuXG4gICAgc3RvcmVkT3B0aW9ucy5zdWJ2YWx1ZXMuZm9yRWFjaCgoc3VidmFsdWUpID0+IHtcbiAgICAgIGlmIChzdWJ2YWx1ZS5rZXkgPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSBzdWJ2YWx1ZS5pc0JvdW5kID8gYXJncy5pdGVtRGF0YS5nZXRNZWFzdXJlVmFsdWUoc3VidmFsdWUubWVhc3VyZUlkKS5nZXRWYWx1ZSgpIDogc3VidmFsdWUudmFsdWU7XG4gICAgICBnYXVnZU9wdGlvbnMuc3VidmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIDMuIERlc2lnbmVyXG5mdW5jdGlvbiBvbkN1c3RvbWl6ZVNlY3Rpb25zKGFyZ3M6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLkN1c3RvbWl6ZVNlY3Rpb25zRXZlbnRBcmdzKSB7XG4gIGNvbnN0IGdhdWdlSXRlbSA9IGFyZ3MuZGFzaGJvYXJkSXRlbTtcbiAgaWYgKGdhdWdlSXRlbSBpbnN0YW5jZW9mIERldkV4cHJlc3M/LkRhc2hib2FyZD8uTW9kZWw/LkdhdWdlSXRlbSkge1xuICAgIGFyZ3MuYWRkU2VjdGlvbih7XG4gICAgICB0aXRsZTogJ1N1YnZhbHVlcycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgZGF0YUZpZWxkOiBwcm9wZXJ0eS5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgdGVtcGxhdGUoYSwgZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBuZXcgRGV2RXhwcmVzcy51aS5keEJ1dHRvbihidXR0b25Db250YWluZXIsIHtcbiAgICAgICAgICAgICAgdGV4dDogJ0VkaXQgaW4gV2l6YXJkJyxcbiAgICAgICAgICAgICAgb25DbGljaygpIHtcbiAgICAgICAgICAgICAgICBzaG93UG9wdXAoZ2F1Z2VJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBidXR0b25Db250YWluZXI7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvd1BvcHVwKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKSB7XG4gIGNvbnN0IHBvcHVwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xuICBjb25zdCBwb3B1cE9wdGlvbnMgPSB7XG4gICAgd2lkdGg6ICc4MDBweCcsXG4gICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgbWF4SGVpZ2h0OiAnMTAwJScsXG4gICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgY29udGVudFRlbXBsYXRlKHRoaXM6IGFueSwgY29udGVudENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc3VidmFsdWVzRm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29uc3Qgc3VidmFsdWVzZm9ybU9wdGlvbnMgPSBnZXRTdWJ2YWx1ZUZvcm1PcHRpb25zKGdhdWdlSXRlbSk7XG4gICAgICB0aGlzLl9zdWJ2YWx1ZXNGb3JtID0gbmV3IERldkV4cHJlc3MudWkuZHhGb3JtKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIHN1YnZhbHVlc2Zvcm1PcHRpb25zKTtcblxuICAgICAgY29uc3QgaW5kaWNhdG9yRm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29uc3QgaW5kaWNhdG9yZm9ybU9wdGlvbnMgPSBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW0pO1xuICAgICAgdGhpcy5faW5kaWNhdG9yRm9ybSA9IG5ldyBEZXZFeHByZXNzLnVpLmR4Rm9ybShpbmRpY2F0b3JGb3JtQ29udGFpbmVyLCBpbmRpY2F0b3Jmb3JtT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKCc8ZGl2IC8+JykuYXBwZW5kKHN1YnZhbHVlc0Zvcm1Db250YWluZXIsIGluZGljYXRvckZvcm1Db250YWluZXIpO1xuXG4gICAgICBjb25zdCBzY3JvbGxWaWV3ID0gJCgnPGRpdiAvPicpO1xuICAgICAgc2Nyb2xsVmlldy5hcHBlbmQoY29udGVudCk7XG4gICAgICBzY3JvbGxWaWV3LmR4U2Nyb2xsVmlldyh7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNjcm9sbFZpZXc7XG4gICAgfSxcbiAgICBvbkhpZGRlbigpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9wdXBDb250YWluZXIpO1xuICAgIH0sXG4gICAgdGl0bGU6ICdTdWJ2YWx1ZXMgV2l6YXJkJyxcbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4UG9wdXAuUHJvcGVydGllcztcbiAgY29uc3QgcG9wdXAgPSBuZXcgRGV2RXhwcmVzcy51aS5keFBvcHVwKHBvcHVwQ29udGFpbmVyLCBwb3B1cE9wdGlvbnMpO1xuICBwb3B1cC5zaG93KCk7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvbnMoZ2FndWVJdGVtOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5HYXVnZUl0ZW0pOiBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zIHtcbiAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZ2FndWVJdGVtLmN1c3RvbVByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lKSBhcyBzdHJpbmcpIGFzIElHYXVnZVN1YnZhbHVlc09wdGlvbnM7XG4gIGNvbnN0IGhhc1RhcmdldFZhbHVlID0gISFnYWd1ZUl0ZW0uZ2F1Z2VzKClbMF0/LnRhcmdldFZhbHVlKCk7XG5cbiAgaWYgKGhhc1RhcmdldFZhbHVlICYmICghZGF0YS5zdWJ2YWx1ZXMgfHwgIWRhdGEuc3VidmFsdWVzLnNvbWUoKHMpID0+IHMua2V5ID09PSAtMSkpKSB7XG4gICAgZGF0YS5zdWJ2YWx1ZXMuc3BsaWNlKDAsIDAsIHtcbiAgICAgIGtleTogLTEsXG4gICAgICBuYW1lOiAnVGFyZ2V0IFZhbHVlJyxcbiAgICAgIGlzQm91bmQ6IGZhbHNlLFxuICAgICAgbWVhc3VyZUlkOiAnJyxcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgY29sb3I6IERFRkFVTFRfUEFMRVRURVsoZGF0YS5zdWJ2YWx1ZXM/Lmxlbmd0aCB8fCAwKSAlIChERUZBVUxUX1BBTEVUVEUubGVuZ3RoIC0gMSldLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBzZXRPcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtLCB2YWx1ZTogSUdhdWdlU3VidmFsdWVzT3B0aW9ucykge1xuICByZXR1cm4gZ2F1Z2VJdGVtLmN1c3RvbVByb3BlcnRpZXMuc2V0VmFsdWUocHJvcGVydHkucHJvcGVydHlOYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuZnVuY3Rpb24gY3JlYXRlTGlzdEFuZFRvb2xiYXIoZm9ybTogRGV2RXhwcmVzcy51aS5keEZvcm0sIGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogW0pRdWVyeSwgRGV2RXhwcmVzcy51aS5keExpc3QsIERldkV4cHJlc3MudWkuZHhUb29sYmFyXSB7XG4gIGNvbnN0ICRlbGVtZW50ID0gJCgnPGRpdiAvPicpO1xuICBjb25zdCAkdG9vbGJhckNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKTtcbiAgJGVsZW1lbnQuYXBwZW5kKCR0b29sYmFyQ29udGFpbmVyKTtcbiAgY29uc3QgZWRpdEJ1dHRvbiA9IG51bGw7XG4gIGxldCBsaXN0OiBEZXZFeHByZXNzLnVpLmR4TGlzdCA9IG51bGw7XG5cbiAgY29uc3QgdG9vbGJhck9wdGlvbnMgPSB7XG4gICAgaXRlbXM6IFt7XG4gICAgICBsb2NhdGlvbjogJ2JlZm9yZScsXG4gICAgICB3aWRnZXQ6ICdkeEJ1dHRvbicsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGljb246ICdhZGQnLFxuICAgICAgICBzdHlsaW5nTW9kZTogJ3RleHQnLFxuICAgICAgICBvbkNsaWNrKGUpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGtleSA9IG9wdGlvbnMuc3VidmFsdWVzLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiBhY2MgPCBpdGVtLmtleSA/IGl0ZW0ua2V5IDogYWNjLCAwKSArIDE7XG4gICAgICAgICAgY29uc3QgbmV3U3VidmFsdWU6IElTdWJ2YWx1ZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBuYW1lOiBgU3VidmFsdWUgJHtrZXl9YCxcbiAgICAgICAgICAgIGlzQm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgbWVhc3VyZUlkOiAnJyxcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgY29sb3I6IERFRkFVTFRfUEFMRVRURVtvcHRpb25zLnN1YnZhbHVlcy5sZW5ndGggJSAoREVGQVVMVF9QQUxFVFRFLmxlbmd0aCAtIDEpXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZvcm0ub3B0aW9uKCdmb3JtRGF0YScsIG5ld1N1YnZhbHVlKTtcblxuICAgICAgICAgIGNvbnN0IGl0ZW1JbkRhdGFTb3VyY2UgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBuZXdTdWJ2YWx1ZS5rZXkpWzBdO1xuICAgICAgICAgIGlmICghaXRlbUluRGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zdWJ2YWx1ZXMucHVzaChuZXdTdWJ2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5zdWJ2YWx1ZXMuaW5kZXhPZihpdGVtSW5EYXRhU291cmNlKTtcbiAgICAgICAgICAgIG9wdGlvbnNbaW5kZXhdID0gbmV3U3VidmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgIGxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgbGlzdC5vcHRpb24oJ3NlbGVjdGVkSXRlbScsIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XVxuICB9IGFzIERldkV4cHJlc3MudWkuZHhUb29sYmFyT3B0aW9ucztcblxuICBjb25zdCB1cGRhdGVUb29sYmFyU3RhdGUgPSAoaGFzU2VsZWN0ZWRJdGVtOiBib29sZWFuKSA9PiB7XG4gICAgZWRpdEJ1dHRvbiAmJiBlZGl0QnV0dG9uLm9wdGlvbignZGlzYWJsZWQnLCAhaGFzU2VsZWN0ZWRJdGVtKTtcbiAgfTtcblxuICBjb25zdCB0b29sYmFyID0gbmV3IERldkV4cHJlc3MudWkuZHhUb29sYmFyKCR0b29sYmFyQ29udGFpbmVyLCB0b29sYmFyT3B0aW9ucyk7XG4gIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke0NTU19DTEFTU31gKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gIGNvbnN0IGxpc3RPcHRpb25zID0ge1xuICAgIGRhdGFTb3VyY2U6IG5ldyBEZXZFeHByZXNzLmRhdGEuRGF0YVNvdXJjZSh7XG4gICAgICBsb2FkOiAoKSA9PiBnZXRPcHRpb25zKGdhdWdlSXRlbSkuc3VidmFsdWVzLFxuICAgICAgcmVtb3ZlOiAoKSA9PiB7IH1cbiAgICB9IGFzIGFueSksXG4gICAgZGlzcGxheUV4cHI6ICduYW1lJyxcbiAgICBoZWlnaHQ6ICcyMDBweCcsXG4gICAga2V5RXhwcjogJ2tleScsXG4gICAgbm9EYXRhVGV4dDogJ0FkZCBhIFN1YnZhbHVlJyxcbiAgICBhbGxvd0l0ZW1EZWxldGluZzogdHJ1ZSxcbiAgICBpdGVtRGVsZXRlTW9kZTogJ3N0YXRpYycsXG4gICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXG4gICAgb25Db250ZW50UmVhZHkoZSkgeyB1cGRhdGVUb29sYmFyU3RhdGUoISFlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpKTsgfSxcbiAgICBvbkl0ZW1SZW5kZXJlZChlKSB7XG4gICAgICBjb25zdCBpdGVtRGF0YSA9IGUuaXRlbURhdGEgYXMgSVN1YnZhbHVlT3B0aW9ucztcbiAgICAgIGlmIChpdGVtRGF0YS5rZXkgPT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnQgPSBlLml0ZW1FbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R4LWxpc3Qtc3RhdGljLWRlbGV0ZS1idXR0b24tY29udGFpbmVyJylbMF0gYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIGRlbGV0ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlZChlKSB7XG4gICAgICB1cGRhdGVUb29sYmFyU3RhdGUoISFlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSXRlbScpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuY29tcG9uZW50Lm9wdGlvbignc2VsZWN0ZWRJdGVtJyk7XG4gICAgICBmb3JtLm9wdGlvbignZm9ybURhdGEnLCBzZWxlY3RlZEl0ZW0pO1xuICAgICAgY29uc3Qgd2FzZm9ybVZpc2libGUgPSBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtDU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JykgPT09ICdibG9jayc7XG4gICAgICBjb25zdCBzaG91bGRGb3JtQmVWaXNpYmxlID0gISFzZWxlY3RlZEl0ZW07XG4gICAgICBpZiAoIXdhc2Zvcm1WaXNpYmxlICYmIHNob3VsZEZvcm1CZVZpc2libGUgfHwgd2FzZm9ybVZpc2libGUgJiYgIXNob3VsZEZvcm1CZVZpc2libGUpIHtcbiAgICAgICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7Q1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsIHNob3VsZEZvcm1CZVZpc2libGUgPyAnYmxvY2snIDogJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uSXRlbURlbGV0ZWQ6IChlKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xuICAgICAgY29uc3Qga2V5ID0gZS5pdGVtRGF0YS5rZXk7XG4gICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuc3VidmFsdWVzLmluZGV4T2Yob3B0aW9ucy5zdWJ2YWx1ZXMuZmlsdGVyKChzdWJ2YWx1ZSkgPT4gc3VidmFsdWUua2V5ID09PSBrZXkpWzBdKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIG9wdGlvbnMuc3VidmFsdWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHNldE9wdGlvbnMoZ2F1Z2VJdGVtLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGxpc3QucmVsb2FkKCk7XG4gICAgICBsaXN0Lm9wdGlvbignc2VsZWN0ZWRJdGVtJywgb3B0aW9ucy5zdWJ2YWx1ZXNbb3B0aW9ucy5zdWJ2YWx1ZXMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgfSBhcyBEZXZFeHByZXNzLnVpLmR4TGlzdE9wdGlvbnM7XG5cbiAgY29uc3QgJGxpc3RDb250YWluZXIgPSAkKCc8ZGl2IC8+Jyk7XG4gICRlbGVtZW50LmFwcGVuZCgkbGlzdENvbnRhaW5lcik7XG5cbiAgbGlzdCA9IG5ldyBEZXZFeHByZXNzLnVpLmR4TGlzdCgkbGlzdENvbnRhaW5lciwgbGlzdE9wdGlvbnMpO1xuXG4gIHJldHVybiBbJGVsZW1lbnQsIGxpc3QsIHRvb2xiYXJdO1xufVxuXG5mdW5jdGlvbiBnZXRTdWJ2YWx1ZUZvcm1PcHRpb25zKGdhdWdlSXRlbTogRGV2RXhwcmVzcy5EYXNoYm9hcmQuTW9kZWwuR2F1Z2VJdGVtKTogRGV2RXhwcmVzcy51aS5keEZvcm1PcHRpb25zIHtcbiAgbGV0IGl0ZW1zTGlzdDogRGV2RXhwcmVzcy51aS5keExpc3QgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgdXBkYXRlRm9ybVN0YXRlID0gKGZvcm06IERldkV4cHJlc3MudWkuZHhGb3JtKSA9PiB7XG4gICAgY29uc3QgdmFsdWVFZGl0b3IgPSBmb3JtLmdldEVkaXRvcigndmFsdWUnKTtcbiAgICBjb25zdCBtZWFzdXJlSWRFZGl0b3IgPSBmb3JtLmdldEVkaXRvcignbWVhc3VyZUlkJyk7XG4gICAgY29uc3QgbmFtZUVkaXRvciA9IGZvcm0uZ2V0RWRpdG9yKCduYW1lJyk7XG4gICAgY29uc3QgaXNCb3VuZCA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmlzQm91bmQ7XG4gICAgY29uc3QgaXNUYXJnZXRWYWx1ZSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpLmtleSA9PT0gLTE7XG5cbiAgICB2YWx1ZUVkaXRvciAmJiB2YWx1ZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNCb3VuZCk7XG4gICAgbWVhc3VyZUlkRWRpdG9yICYmIG1lYXN1cmVJZEVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgIWlzQm91bmQpO1xuXG4gICAgZm9ybS5lbGVtZW50KCkuZmluZChgLiR7SVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1N9YCkuY3NzKCdkaXNwbGF5JywgIWlzVGFyZ2V0VmFsdWUgPyAnZmxleCcgOiAnbm9uZScpO1xuICAgIGZvcm0uZWxlbWVudCgpLmZpbmQoYC4ke1ZBTFVFX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcbiAgICBmb3JtLmVsZW1lbnQoKS5maW5kKGAuJHtNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTfWApLmNzcygnZGlzcGxheScsICFpc1RhcmdldFZhbHVlID8gJ2ZsZXgnIDogJ25vbmUnKTtcblxuICAgIG5hbWVFZGl0b3IgJiYgbmFtZUVkaXRvci5vcHRpb24oJ2Rpc2FibGVkJywgaXNUYXJnZXRWYWx1ZSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtRGF0YTogbnVsbCxcbiAgICBjb2xDb3VudDogMixcbiAgICBpdGVtczogW1xuICAgICAge1xuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcbiAgICAgICAgY2FwdGlvbjogJ1N1YnZhbHVlcyBpdGVtcycsXG4gICAgICAgIHRlbXBsYXRlOiAoYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IFskY29udGFpbmVyLCBsaXN0XSA9IGNyZWF0ZUxpc3RBbmRUb29sYmFyKGFyZ3MuY29tcG9uZW50LCBnYXVnZUl0ZW0pO1xuICAgICAgICAgIGl0ZW1zTGlzdCA9IGxpc3Q7XG5cbiAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzdWJ2YWx1ZUVkaXRvcicsXG4gICAgICAgIGNzc0NsYXNzOiBDU1NfQ0xBU1MsXG4gICAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxuICAgICAgICBjYXB0aW9uOiAnSXRlbSBvcHRpb25zJyxcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhRmllbGQ6ICduYW1lJyxcbiAgICAgICAgICAgIGNzc0NsYXNzOiBOQU1FX0lURU1fQ1NTX0NMQVNTLFxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4VGV4dEJveCcsXG4gICAgICAgICAgICBlZGl0b3JPcHRpb25zOiB7XG4gICAgICAgICAgICAgIHZhbHVlQ2hhbmdlRXZlbnQ6ICdrZXl1cCdcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRleHRCb3guUHJvcGVydGllc1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YUZpZWxkOiAnaXNCb3VuZCcsXG4gICAgICAgICAgICBjc3NDbGFzczogSVNfQk9VTkRfSVRFTV9DU1NfQ0xBU1MsXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhSYWRpb0dyb3VwJyxcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxuICAgICAgICAgICAgICBsYXlvdXQ6ICdob3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgaXRlbXM6IFt7XG4gICAgICAgICAgICAgICAgdGV4dDogJ1VuYm91bmQnLCB2YWx1ZTogZmFsc2VcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRleHQ6ICdCb3VuZCcsIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhSYWRpb0dyb3VwLlByb3BlcnRpZXMsXG4gICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YUZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IFZBTFVFX0lURU1fQ1NTX0NMQVNTLFxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyxcbiAgICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICAgIHRleHQ6ICdWYWx1ZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhOdW1iZXJCb3guUHJvcGVydGllc1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YUZpZWxkOiAnbWVhc3VyZUlkJyxcbiAgICAgICAgICAgIGNzc0NsYXNzOiBNRUFTVVJFX0lEX0lURU1fQ1NTX0NMQVNTLFxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4U2VsZWN0Qm94JyxcbiAgICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICAgIHRleHQ6ICdIaWRkZW4gbWVhc3VyZXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVkaXRvck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxuICAgICAgICAgICAgICBpdGVtczogZ2F1Z2VJdGVtLmhpZGRlbk1lYXN1cmVzKCkubWFwKChtZWFzdXJlKSA9PiAoe1xuICAgICAgICAgICAgICAgIHRleHQ6IGdldE1lYXN1cmVEaXNhcGxheVRleHQobWVhc3VyZSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmUudW5pcXVlTmFtZSgpXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnY29sb3InLFxuICAgICAgICAgICAgY3NzQ2xhc3M6IENPTE9SX0lURU1fQ1NTX0NMQVNTLFxuICAgICAgICAgICAgZGF0YUZpZWxkOiAnY29sb3InLFxuICAgICAgICAgICAgZWRpdG9yVHlwZTogJ2R4Q29sb3JCb3gnLFxuICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgdGV4dDogJ0NvbG9yJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSxcbiAgICBvbkNvbnRlbnRSZWFkeShlKSB7IHVwZGF0ZUZvcm1TdGF0ZShlLmNvbXBvbmVudCk7IH0sXG4gICAgb25GaWVsZERhdGFDaGFuZ2VkKGUpIHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gZS5jb21wb25lbnQub3B0aW9uKCdmb3JtRGF0YScpIGFzIElTdWJ2YWx1ZU9wdGlvbnM7XG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9ucyhnYXVnZUl0ZW0pO1xuICAgICAgY29uc3QgZWRpdGVkU3VidmFsdWUgPSBvcHRpb25zLnN1YnZhbHVlcy5maWx0ZXIoKHN1YnZhbHVlKSA9PiBzdWJ2YWx1ZS5rZXkgPT09IGZvcm1EYXRhLmtleSlbMF07XG5cbiAgICAgIG9wdGlvbnMuc3VidmFsdWVzW29wdGlvbnMuc3VidmFsdWVzLmluZGV4T2YoZWRpdGVkU3VidmFsdWUpXSA9IGZvcm1EYXRhO1xuICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZWRpdGVkU3VidmFsdWUgJiYgZWRpdGVkU3VidmFsdWUubmFtZSAhPT0gZm9ybURhdGEubmFtZSAmJiBpdGVtc0xpc3QpIHtcbiAgICAgICAgaXRlbXNMaXN0LnJlcGFpbnQoKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUZvcm1TdGF0ZShlLmNvbXBvbmVudCk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TWVhc3VyZURpc2FwbGF5VGV4dChtZWFzdXJlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Nb2RlbC5NZWFzdXJlKTogc3RyaW5nIHtcbiAgaWYgKG1lYXN1cmUubmFtZSgpKSB7XG4gICAgcmV0dXJuIG1lYXN1cmUubmFtZSgpO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IG1lYXN1cmUuZGF0YU1lbWJlcigpO1xuICBpZiAobWVhc3VyZS5zdW1tYXJ5VHlwZSAmJiBtZWFzdXJlLnN1bW1hcnlUeXBlKCkpIHtcbiAgICByZXN1bHQgKz0gYCAoJHttZWFzdXJlLnN1bW1hcnlUeXBlKCl9KWA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRJbmRpY2F0b3JGb3JtT3B0aW9ucyhnYXVnZUl0ZW06IERldkV4cHJlc3MuRGFzaGJvYXJkLk1vZGVsLkdhdWdlSXRlbSk6IERldkV4cHJlc3MudWkuZHhGb3JtT3B0aW9ucyB7XG4gIGNvbnN0IGN1cnJlbnRWaWV3VHlwZSA9IGdhdWdlSXRlbS52aWV3VHlwZSgpO1xuICBjb25zdCBpbmRpY2F0b3JUeXBlcyA9IExJTkVBUl9WSUVXX1RZUEVTLnNvbWUoKHQpID0+IHQgPT09IGN1cnJlbnRWaWV3VHlwZSlcbiAgICA/IExJTkVBUl9JTkRJQ0FUT1JfVFlQRVNcbiAgICA6IENJUkNMVUFSX0lORElDQVRPUl9UWVBFUztcblxuICByZXR1cm4ge1xuICAgIGZvcm1EYXRhOiBnZXRPcHRpb25zKGdhdWdlSXRlbSkgfHwgbnVsbCxcbiAgICBpdGVtczogW1xuICAgICAge1xuICAgICAgICBjYXB0aW9uOiAnSW5kaWNhdG9yIG9wdGlvbnMnLFxuICAgICAgICBpdGVtVHlwZTogJ2dyb3VwJyxcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd0eXBlJyxcbiAgICAgICAgICAgIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsXG4gICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICB0ZXh0OiAnVHlwZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnLFxuICAgICAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXG4gICAgICAgICAgICAgIGl0ZW1zOiBpbmRpY2F0b3JUeXBlcy5tYXAoKHQpID0+ICh7IHRleHQ6IHQsIHZhbHVlOiB0IH0pKSxcbiAgICAgICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhRmllbGQ6ICd3aWR0aCcsXG4gICAgICAgICAgICBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnLFxuICAgICAgICAgICAgZWRpdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBzaG93U3BpbkJ1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICB9IGFzIERldkV4cHJlc3MudWkuZHhOdW1iZXJCb3hPcHRpb25zLFxuICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgdGV4dDogJ1dpZHRoJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIG9uRmllbGREYXRhQ2hhbmdlZChlKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGUuY29tcG9uZW50Lm9wdGlvbignZm9ybURhdGEnKSBhcyBJR2F1Z2VTdWJ2YWx1ZXNPcHRpb25zO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ2F1Z2VJdGVtKTtcblxuICAgICAgb3B0aW9ucy53aWR0aCA9IGZvcm1EYXRhLndpZHRoO1xuICAgICAgb3B0aW9ucy50eXBlID0gZm9ybURhdGEudHlwZTtcblxuICAgICAgc2V0T3B0aW9ucyhnYXVnZUl0ZW0sIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gNC4gRXZlbnQgU3Vic2NyaXB0aW9uXG5leHBvcnQgZnVuY3Rpb24gZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24odGhpczogYW55LCBkYXNoYm9hcmRDb250cm9sOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKSB7XG4gIHRoaXMubmFtZSA9ICdHYXVnZVN1YnZhbHVlcyc7XG4gIHRoaXMuc3RhcnQgPSAoKSA9PiB7XG4gICAgY29uc3Qgdmlld2VyQXBpRXh0ZW5zaW9uID0gZGFzaGJvYXJkQ29udHJvbC5maW5kRXh0ZW5zaW9uKCd2aWV3ZXItYXBpJykgYXMgRGV2RXhwcmVzcy5EYXNoYm9hcmQuVmlld2VyQXBpRXh0ZW5zaW9uO1xuICAgIGlmICh2aWV3ZXJBcGlFeHRlbnNpb24pIHtcbiAgICAgIHZpZXdlckFwaUV4dGVuc2lvbi5vbignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcbiAgICAgIG9wdGlvbnNQYW5lbEV4dGVuc2lvbi5vbignY3VzdG9taXplU2VjdGlvbnMnLCBvbkN1c3RvbWl6ZVNlY3Rpb25zKTtcbiAgICB9XG4gIH07XG4gIHRoaXMuc3RvcCA9ICgpID0+IHtcbiAgICBjb25zdCB2aWV3ZXJBcGlFeHRlbnNpb24gPSBkYXNoYm9hcmRDb250cm9sLmZpbmRFeHRlbnNpb24oJ3ZpZXdlci1hcGknKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5WaWV3ZXJBcGlFeHRlbnNpb247XG4gICAgaWYgKHZpZXdlckFwaUV4dGVuc2lvbikge1xuICAgICAgdmlld2VyQXBpRXh0ZW5zaW9uLm9mZignaXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCcsIG9uSXRlbVdpZGdldE9wdGlvbnNQcmVwYXJlZCk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnNQYW5lbEV4dGVuc2lvbiA9IGRhc2hib2FyZENvbnRyb2wuZmluZEV4dGVuc2lvbignaXRlbS1vcHRpb25zLXBhbmVsJykgYXMgYW55O1xuICAgIGlmIChvcHRpb25zUGFuZWxFeHRlbnNpb24pIHtcbiAgICAgIG9wdGlvbnNQYW5lbEV4dGVuc2lvbi5vZmYoJ2N1c3RvbWl6ZVNlY3Rpb25zJywgb25DdXN0b21pemVTZWN0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwgIlx1RkVGRmltcG9ydCB7IGluaXRQb3BvdmVyIH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50cy9SZXBvcnREZXRhaWxzUG9wb3Zlcic7XG5pbXBvcnQgeyBJRGFzaGJvYXJkUGVybWlzc2lvbnMsIElEYXNoYm9hcmRVcmxzLCBJUmVwb3J0UGFyYW1zIH0gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XG5pbXBvcnQgeyBnYXVnZVN1YnZhbHVlc0V4dGVuc2lvbiB9IGZyb20gJy4vRXh0ZW5zaW9ucy9HYXVnZVN1YnZhbHVlc0V4dGVuc2lvbic7XG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlZnJlc2hUaW1lci9CdXR0b24nO1xuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcblxuY29uc3QgREFTSEJPQVJEX01PREVfS0VZID0gJ0RBU0hCT0FSRF9NT0RFX0tFWSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhc2hib2FyZE9wdGlvbnMge1xuICAkZGFzaGJvYXJkQ29udGFpbmVyOiBKUXVlcnk7XG4gIHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcbiAgcGVybWlzc2lvbnM6IElEYXNoYm9hcmRQZXJtaXNzaW9ucztcbiAgdXJsczogSURhc2hib2FyZFVybHM7XG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZCBpbXBsZW1lbnRzIElSZXBvcnRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5ICRkYXNoYm9hcmRDb250YWluZXI6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbnM6IElEYXNoYm9hcmRQZXJtaXNzaW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxzOiBJRGFzaGJvYXJkVXJscztcbiAgcHJpdmF0ZSByZWZyZXNoQnV0dG9uOiBSZWZyZXNoQnV0dG9uIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBkYXNoYm9hcmQ6IERldkV4cHJlc3MuRGFzaGJvYXJkLkRhc2hib2FyZENvbnRyb2wgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGFzaGJvYXJkT3B0aW9ucykge1xuICAgIHRoaXMuJGRhc2hib2FyZENvbnRhaW5lciA9IG9wdGlvbnMuJGRhc2hib2FyZENvbnRhaW5lcjtcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcbiAgICB0aGlzLnJlcG9ydElkID0gb3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XG4gICAgdGhpcy51cmxzID0gb3B0aW9ucy51cmxzO1xuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgbGV0IHJlcG9ydElkU3RyID0gdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgJiYgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQudG9TdHJpbmcoKTtcblxuICAgIERldkV4cHJlc3MuRGFzaGJvYXJkLlJlc291cmNlTWFuYWdlci5lbWJlZEJ1bmRsZWRSZXNvdXJjZXMoKTtcblxuICAgIGxldCBtb2RlOiBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSA9IHRoaXMucGVybWlzc2lvbnMuQWxsb3dFZGl0aW5nXG4gICAgICA/IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpKSBhcyBEZXZFeHByZXNzLkRhc2hib2FyZC5Xb3JraW5nTW9kZSB8fCAnVmlld2VyJ1xuICAgICAgOiAnVmlld2VyJztcblxuICAgIGlmICh0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKSB7XG4gICAgICB0aGlzLnBvcG92ZXIgPSBpbml0UG9wb3ZlcignLnJlcG9ydC1kZXRhaWxzLWxpbmsnLCB0aGlzLnJlcG9ydFBhcmFtcy5EZXRhaWxzKTtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBEYXNoYm9hcmQgMTguMSBkb2Vzbid0IHN1cHBvcnQgZXhwb3J0LiBXZSBoaWRlIHRoZSBleHBvcnQgYnV0dG9uIHZpYSBzdHlsZXNcbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKHRoaXMuJGRhc2hib2FyZENvbnRhaW5lclswXSwge1xuICAgICAgd29ya2luZ01vZGU6IG1vZGUsXG4gICAgICBpbml0aWFsRGFzaGJvYXJkSWQ6IHJlcG9ydElkU3RyLFxuICAgICAgZW5kcG9pbnQ6IHRoaXMudXJscy5FbmRQb2ludCxcbiAgICAgIGFqYXhSZW1vdGVTZXJ2aWNlOiB7XG4gICAgICAgIGhlYWRlcnM6ICF0aGlzLnJlcG9ydFBhcmFtcy5Ub2tlbiA/IHVuZGVmaW5lZCA6IHtcbiAgICAgICAgICB0b2tlbjogdGhpcy5yZXBvcnRQYXJhbXMuVG9rZW5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRGFzaGJvYXJkSW5pdGlhbGl6aW5nOiAoZSkgPT4ge1xuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgZ2F1Z2VTdWJ2YWx1ZXNFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcblxuICAgICAgICBpZiAocmVwb3J0SWRTdHIgIT09IGUuZGFzaGJvYXJkSWQpIHtcbiAgICAgICAgICByZXBvcnRJZFN0ciA9IGUuZGFzaGJvYXJkSWQ7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBlbmNvZGVVUkkodGhpcy51cmxzLlByZXZpZXdVcmwgKyBlLmRhc2hib2FyZElkKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uQmVmb3JlUmVuZGVyOiAoZSkgPT4ge1xuICAgICAgICBlLmNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbihuZXcgRGV2RXhwcmVzcy5EYXNoYm9hcmQuRGVzaWduZXIuVGV4dEJveEl0ZW1FZGl0b3JFeHRlbnNpb24oZS5jb21wb25lbnQpKTtcbiAgICAgIH0sXG4gICAgICBleHRlbnNpb25zOiB7XG4gICAgICAgICdkYXRhLXNvdXJjZS13aXphcmQnOiB7XG4gICAgICAgICAgZW5hYmxlQ3VzdG9tU3FsOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgICdkYXNoYm9hcmQtZXhwb3J0Jzoge1xuICAgICAgICAgIGFsbG93RXhwb3J0RGFzaGJvYXJkSXRlbXM6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2RhdGEtaW5zcGVjdG9yJzoge1xuICAgICAgICAgIGFsbG93SW5zcGVjdEFnZ3JlZ2F0ZWREYXRhOiB0cnVlLFxuICAgICAgICAgIGFsbG93SW5zcGVjdFJhd0RhdGE6IHRydWUsXG4gICAgICAgICAgb25HcmlkSW5pdGlhbGl6ZWQ6IChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBncmlkID0gZS5jb21wb25lbnQgYXMgRGV2RXhwcmVzcy51aS5keERhdGFHcmlkO1xuICAgICAgICAgICAgZ3JpZC5vcHRpb24oJ2V4cG9ydC5lbmFibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhc2hib2FyZC5yZW5kZXIoKTtcblxuICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLkFsbG93RWRpdGluZykge1xuICAgICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcbiAgICAgICAgdGV4dDogbW9kZSA9PT0gJ1ZpZXdlcicgPyAnU3dpdGNoIHRvIERlc2lnbmVyJyA6ICdTd2l0Y2ggdG8gVmlld2VyJyxcbiAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgIG1vZGUgPSBtb2RlID09PSAnVmlld2VyJyA/ICdEZXNpZ25lcicgOiAnVmlld2VyJztcblxuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCBtb2RlKTtcblxuICAgICAgICAgIGlmIChtb2RlID09PSAnVmlld2VyJykge1xuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQuc3dpdGNoVG9WaWV3ZXIoKTtcbiAgICAgICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCAnU3dpdGNoIHRvIERlc2lnbmVyJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLnN3aXRjaFRvRGVzaWduZXIoKTtcbiAgICAgICAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCAnU3dpdGNoIHRvIFZpZXdlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcblxuICAgICAgcmVtb3ZlUmVkdW5kYW50VG9vbGJveEl0ZW1zKHRoaXMuZGFzaGJvYXJkKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gJiYgKHRoaXMucmVmcmVzaEJ1dHRvbiA9IG5ldyBSZWZyZXNoQnV0dG9uKCQoJy5yZXBvcnQtcmVmcmVzaC1idXR0b24nKSwgKCkgPT4gdGhpcy5yZWZyZXNoKCkpKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGFzaGJvYXJkPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5kYXNoYm9hcmQgPSBudWxsO1xuXG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbktleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBEQVNIQk9BUkRfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydElkO1xuICB9XG5cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmRhc2hib2FyZD8ucmVmcmVzaCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJlZHVuZGFudFRvb2xib3hJdGVtcyhjb250cm9sOiBEZXZFeHByZXNzLkRhc2hib2FyZC5EYXNoYm9hcmRDb250cm9sKSB7XG4gIGNvbnN0IGl0ZW1zVG9SZW1vdmUgPSBbJ2NyZWF0ZS1kYXNoYm9hcmQnLCAnb3Blbi1kYXNoYm9hcmQnXTtcbiAgY29uc3QgdG9vbGJveCA9IGNvbnRyb2wuZmluZEV4dGVuc2lvbigndG9vbGJveCcpIGFzIERldkV4cHJlc3MuRGFzaGJvYXJkLkRlc2lnbmVyLlRvb2xib3hFeHRlbnNpb247XG4gIGl0ZW1zVG9SZW1vdmUuZm9yRWFjaCgoaXRlbUlkKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IHRvb2xib3gubWVudUl0ZW1zKCkuZmlsdGVyKChpKSA9PiBpLmlkID09PSBpdGVtSWQpWzBdO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHRvb2xib3gucmVtb3ZlTWVudUl0ZW0oaXRlbUlkKTtcbiAgICB9XG4gIH0pO1xufVxuIiwgIlx1RkVGRmltcG9ydCB7IElSZXBvcnRQYXJhbXMsIE1vZGUgfSBmcm9tICcuLi8uLi9JUmVwb3J0UGFyYW1zJztcbmltcG9ydCB7IElSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcbmltcG9ydCB7IHNlbmRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vRGF0YS9SZXF1ZXN0JztcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9XaWRnZXRzL0lHcmlkU3RhdGUnO1xuaW1wb3J0IHsgaW5pdFBvcG92ZXIgfSBmcm9tICcuLi8uLi9Db21wb25lbnRzL1JlcG9ydERldGFpbHNQb3BvdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJR2FudHRDaGFydE9wdGlvbnMge1xuICBjaGFydFBvc2l0aW9uTWFya2VyOiBKUXVlcnk7XG4gIGFsbG93RWRpdGluZzogYm9vbGVhbjtcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xuICBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xuICBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcbiAgc2hvd0hlYWRlcjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElHYW50dFRhc2sge1xuICBJZDogbnVtYmVyO1xuICBQYXJlbnRJZDogbnVtYmVyO1xuICBUaXRsZTogc3RyaW5nO1xuICBTdGFydDogRGF0ZTtcbiAgRW5kOiBEYXRlO1xuICBQcm9ncmVzczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUdhbnR0RGVwZW5kZW5jeVxue1xuICBJZDogbnVtYmVyO1xuICBQcmVkZWNlc3NvcklkOiBudW1iZXI7XG4gIFN1Y2Nlc3NvcklkOiBudW1iZXI7XG4gIFR5cGU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElHYW50dFJlc291cmNlIHtcbiAgSWQ6IG51bWJlcjtcbiAgVGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50IHtcbiAgSWQ6IG51bWJlcjtcbiAgVGFza0lkOiBudW1iZXI7XG4gIFJlc291cmNlSWQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElHYW50dENoYXJ0RGF0YU1vZGVsIHtcbiAgVGFza3M6IElHYW50dFRhc2tbXTtcbiAgRGVwZW5kZW5jaWVzOiBJR2FudHREZXBlbmRlbmN5W107XG4gIFJlc291cmNlczogSUdhbnR0UmVzb3VyY2VbXTtcbiAgUmVzb3VyY2VBc3NpZ25tZW50czogSUdhbnR0UmVzb3VyY2VBc3NpZ25tZW50W107XG59XG5cbmludGVyZmFjZSBJR2FudHRDb2x1bW5TdGF0ZSB7XG4gIGRhdGFGaWVsZD86IHN0cmluZztcbiAgZGF0YVR5cGU/OiBHcmlkRGF0YUNvbHVtbkRhdGFUeXBlO1xuICB3aWR0aD86IHN0cmluZztcbiAgc29ydEluZGV4PzogbnVtYmVyO1xuICBzb3J0T3JkZXI/OiBzdHJpbmc7XG4gIGNhcHRpb24/OiBzdHJpbmc7XG4gIHZpc2libGU/OiBib29sZWFuO1xuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XG4gIHRhc2tDb2x1bW5UeXBlOiBHYW50dFRhc2tzQ29sdW1uVHlwZTtcbn1cblxuaW50ZXJmYWNlIElHYW50dFNldHRpbmdzIHtcbiAgVGFza0NvbHVtbnM6IElHYW50dENvbHVtblN0YXRlW10sXG4gIERiQ29ubmVjdGlvbk5hbWU6IHN0cmluZyxcbiAgVGFibGVOYW1lOiBzdHJpbmcsXG4gIFJlc291cmNlc1RhYmxlTmFtZTogc3RyaW5nLFxuICBSZXNvdXJjZXNLZXlGaWVsZDogc3RyaW5nLFxuICBSZXNvdXJjZXNUZXh0RmllbGQ6IHN0cmluZyxcbiAgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiBzdHJpbmc7XG4gIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiBzdHJpbmc7XG4gIFJlc291cmNlQXNzaWdubWVudFRhc2tJZEZpZWxkOiBzdHJpbmc7XG4gIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogc3RyaW5nO1xufVxuXG5lbnVtIEdhbnR0VGFza3NDb2x1bW5UeXBlXG57XG4gIEtleSA9IDEsXG4gIFRpdGxlID0gMixcbiAgU3RhcnQgPSAzLFxuICBFbmQgPSA0LFxuICBQYXJlbnRJZCA9IDUsXG4gIFByb2dyZXNzID0gNlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW5udENoYXJ0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fVklFV0VSX1RFWFQgPSAnU3dpdGNoIHRvIFZpZXdlcic7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfU1RPUkFHRV9NT0RFX0tFWSA9ICdDSEFSVF9TVE9SQUdFX01PREVfS0VZJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0UG9zaXRpb25NYXJrZXI6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRSZWZyZXNoQnV0dG9uOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93RWRpdGluZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBnYW50dFJlcG9ydENvbnRyb2xsZXJVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93SGVhZGVyOiBib29sZWFuO1xuICBwcml2YXRlIHBvcG92ZXI6IERldkV4cHJlc3MudWkuZHhQb3BvdmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG1vZGU6IE1vZGU7XG4gIHByaXZhdGUgaGFzRm9ybSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY2hhcnQ6IERldkV4cHJlc3MudWkuZHhHYW50dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJR2FudHRDaGFydE9wdGlvbnMpIHtcbiAgICB0aGlzLmNoYXJ0UG9zaXRpb25NYXJrZXIgPSBvcHRpb25zLmNoYXJ0UG9zaXRpb25NYXJrZXI7XG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcbiAgICB0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybCA9IG9wdGlvbnMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsO1xuICAgIHRoaXMuc2hvd0hlYWRlciA9IG9wdGlvbnMuc2hvd0hlYWRlcjtcbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIGxldCBnYW50dFNldHRpbmdzOiBJR2FudHRTZXR0aW5ncyA9IHtcbiAgICAgIERiQ29ubmVjdGlvbk5hbWU6ICcnLCBUYWJsZU5hbWU6ICcnLCBUYXNrQ29sdW1uczogW10sXG4gICAgICBSZXNvdXJjZXNUYWJsZU5hbWU6ICcnLCBSZXNvdXJjZXNUZXh0RmllbGQ6ICcnLCBSZXNvdXJjZXNLZXlGaWVsZDogJycsXG4gICAgICBSZXNvdXJjZUFzc2lnbm1lbnRUYXNrSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudFJlc291cmNlSWRGaWVsZDogJycsIFJlc291cmNlQXNzaWdubWVudEtleUZpZWxkOiAnJywgUmVzb3VyY2VBc3NpZ25tZW50VGFibGVOYW1lOiAnJ1xuICAgIH07XG5cbiAgICBjb25zdCBjb2x1bW5zOiBJR2FudHRDb2x1bW5TdGF0ZVtdID0gW107XG4gICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0U2V0dGluZ3NgLCAncG9zdCcsIHsgaWQ6IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkIH0sIGZhbHNlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcbiAgICAgIC50aGVuKChkYXRhOiBJR2FudHRTZXR0aW5ncykgPT4ge1xuICAgICAgICBnYW50dFNldHRpbmdzID0gZGF0YTtcblxuICAgICAgICBpZighZ2FudHRTZXR0aW5ncy5EYkNvbm5lY3Rpb25OYW1lIHx8ICFnYW50dFNldHRpbmdzLlRhYmxlTmFtZSB8fCAhZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyB8fCAhZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICBnYW50dFNldHRpbmdzLlRhc2tDb2x1bW5zID0gW107XG5cbiAgICAgICAgICBmb3IgKGxldCBpdGVtID0gMDsgaXRlbSA8IDY7IGl0ZW0rKykge1xuICAgICAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucy5wdXNoKHsgdGFza0NvbHVtblR5cGU6IEdhbnR0VGFza3NDb2x1bW5UeXBlW0dhbnR0VGFza3NDb2x1bW5UeXBlW2l0ZW0rMV1dIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc2V0dXBGb3JtKGdhbnR0U2V0dGluZ3MsIHRydWUpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5UYXNrQ29sdW1ucy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgY29sdW1uc1tjLnRhc2tDb2x1bW5UeXBlLTFdID0gYztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ2FudHRTZXR0aW5ncy5UYXNrQ29sdW1ucyA9IGNvbHVtbnM7XG5cbiAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHNlbmRSZXF1ZXN0KGAke3RoaXMuZ2FudHRSZXBvcnRDb250cm9sbGVyVXJsfS9HZXRHYW50dENoYXJ0RGF0YWAsICdwb3N0JywgeyBpZDogdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQgfSwgZmFsc2UsIHtcbiAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChkYXRhOiB7IERhdGE6IElHYW50dENoYXJ0RGF0YU1vZGVsIH0pID0+IHtcbiAgICAgICAgaWYoIWlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLm1vZGUgPT09IE1vZGUuRGVzaWduZXIpIHtcbiAgICAgICAgICB0aGlzLnNldHVwRm9ybShnYW50dFNldHRpbmdzLCAhaXNJbml0aWFsaXplZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwQ2hhcnQoZGF0YS5EYXRhLCBjb2x1bW5zLCBnYW50dFNldHRpbmdzKTtcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oZ2FudHRTZXR0aW5ncywgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN3aXRjaE1vZGVCdXR0b24oKSB7XG4gICAgY29uc3QgYnV0dG9uID0gJCgnLnN3aXRjaC1tb2RlLWJ0bicpLmR4QnV0dG9uKHtcbiAgICAgIHRleHQ6IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyBNb2RlLkRlc2lnbmVyIDogTW9kZS5WaWV3ZXI7XG4gICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCB0aGlzLm1vZGUpO1xuICAgICAgICBidXR0b24ub3B0aW9uKCd0ZXh0JywgdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlciA/IHRoaXMuU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgOiB0aGlzLlNXSVRDSF9UT19WSUVXRVJfVEVYVCk7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KS5hZGRDbGFzcygnaXN6b2xlYS1tZCcpLmR4QnV0dG9uKCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEZvcm0oZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MsIGluaXRpYWxTZXR1cDogYm9vbGVhbikge1xuICAgIHRoaXMuaGFzRm9ybSA9IHRydWU7XG5cbiAgICBjb25zdCBmb3JtSXRlbXM6IERldkV4cHJlc3MudWkuZHhGb3JtLkl0ZW1bXSA9IFtcbiAgICAgIHsgZGF0YUZpZWxkOiAnRGJDb25uZWN0aW9uTmFtZScsIGNhcHRpb246ICdDb25uZWN0aW9uIE5hbWUnIH0sXG4gICAgICB7IGRhdGFGaWVsZDogJ1RhYmxlTmFtZScsIGNhcHRpb246ICdUYWJsZScgfSxcbiAgICBdO1xuXG4gICAgZm9yIChsZXQgaXRlbSA9IDE7IGl0ZW0gPCA3OyBpdGVtKyspIHtcbiAgICAgIGZvcm1JdGVtcy5wdXNoKHsgaXRlbVR5cGU6ICdncm91cCcsIGNvbENvdW50OiA4LCBpdGVtczogW1xuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS50YXNrQ29sdW1uVHlwZWAsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLmRhdGFGaWVsZGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogYCR7R2FudHRUYXNrc0NvbHVtblR5cGVbaXRlbV19IERhdGEgRmllbGRgIH0gfSxcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uY2FwdGlvbmAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0NhcHRpb24nIH0gfSxcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0uZGF0YVR5cGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdEYXRhVHlwZScgfSB9LFxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS53aWR0aGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1dpZHRoJyB9LCBlZGl0b3JUeXBlOiAnZHhOdW1iZXJCb3gnIH0sXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnNvcnRJbmRleGAsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1NvcnRJbmRleCcgfSwgZWRpdG9yVHlwZTogJ2R4TnVtYmVyQm94JyB9LFxuICAgICAgICAgIHsgZGF0YUZpZWxkOiBgVGFza0NvbHVtbnNbJHtpdGVtLTF9XS5zb3J0T3JkZXJgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdTb3J0T3JkZXInIH0sIGVkaXRvclR5cGU6ICdkeFNlbGVjdEJveCcsIGVkaXRvck9wdGlvbnM6IHsgaXRlbXM6IFsnYXNjJywgJ2Rlc2MnXSwgc2hvd0NsZWFyQnV0dG9uOiB0cnVlIH0gYXMgRGV2RXhwcmVzcy51aS5keFNlbGVjdEJveC5Qcm9wZXJ0aWVzIH0sXG4gICAgICAgICAgeyBkYXRhRmllbGQ6IGBUYXNrQ29sdW1uc1ske2l0ZW0tMX1dLnZpc2libGVgLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdWaXNpYmxlJyB9LCBlZGl0b3JUeXBlOiAnZHhDaGVja0JveCcgfSxcbiAgICAgICAgICB7IGRhdGFGaWVsZDogYFRhc2tDb2x1bW5zWyR7aXRlbS0xfV0udmlzaWJsZUluZGV4YCwgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnVmlzaWJsZUluZGV4JyB9IH0sXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvcm1JdGVtcy5wdXNoKHtcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlcycsXG4gICAgICBjb2xDb3VudDogNCxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VzVGFibGVOYW1lJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnICx0ZXh0OiAnVGFibGUnIH0sIGNvbFNwYW46IDIgfSxcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZXNLZXlGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ0tleSBGaWVsZCcgfSB9LFxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlc1RleHRGaWVsZCcsIGxhYmVsOiB7IGxvY2F0aW9uOiAndG9wJywgdGV4dDogJ1RleHQgRmllbGQnIH0gfSxcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGZvcm1JdGVtcy5wdXNoKHtcbiAgICAgIGl0ZW1UeXBlOiAnZ3JvdXAnLFxuICAgICAgY2FwdGlvbjogJ1Jlc291cmNlIEFzc2lnbm1lbnRzJyxcbiAgICAgIGNvbENvdW50OiA1LFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyBkYXRhRmllbGQ6ICdSZXNvdXJjZUFzc2lnbm1lbnRUYWJsZU5hbWUnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYWJsZScgfSwgY29sU3BhbjogMiB9LFxuICAgICAgICB7IGRhdGFGaWVsZDogJ1Jlc291cmNlQXNzaWdubWVudEtleUZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnS2V5IEZpZWxkJyB9IH0sXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGQnLCBsYWJlbDogeyBsb2NhdGlvbjogJ3RvcCcsIHRleHQ6ICdUYXNrIElkIEZpZWxkJyB9IH0sXG4gICAgICAgIHsgZGF0YUZpZWxkOiAnUmVzb3VyY2VBc3NpZ25tZW50UmVzb3VyY2VJZEZpZWxkJywgbGFiZWw6IHsgbG9jYXRpb246ICd0b3AnLCB0ZXh0OiAnUmVzb3VyY2UgSWQgRmllbGQnIH0gfSxcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGZvcm1JdGVtcy5wdXNoKHtcbiAgICAgIGl0ZW1UeXBlOiAnYnV0dG9uJyxcbiAgICAgIGJ1dHRvbk9wdGlvbnM6IHtcbiAgICAgICAgdGV4dDogJ1NhdmUnLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpIGFzIElHYW50dFNldHRpbmdzO1xuXG4gICAgICAgICAgaWYoZGF0YS5UYXNrQ29sdW1ucykge1xuICAgICAgICAgICAgZGF0YS5UYXNrQ29sdW1ucyA9IGRhdGEuVGFza0NvbHVtbnMuZmlsdGVyKChjKSA9PiAhIWMuZGF0YUZpZWxkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZW5kUmVxdWVzdChgJHt0aGlzLmdhbnR0UmVwb3J0Q29udHJvbGxlclVybH0vVXBkYXRlR2FudHRDaGFydFNldHRpbmdzYCwgJ3Bvc3QnLCB7IGlkOiB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZCwgc2V0dGluZ3M6IEpTT04uc3RyaW5naWZ5KGZvcm0ub3B0aW9uKCdmb3JtRGF0YScpKSB9LCB0cnVlLCB7IGRhdGFUeXBlOiAnanNvbicgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm0gPSAkKCc8ZGl2IC8+JykuY3NzKCdwYWRkaW5nJywgMjApLmluc2VydEFmdGVyKHRoaXMuY2hhcnRQb3NpdGlvbk1hcmtlcikuZHhGb3JtKHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6IGluaXRpYWxTZXR1cCA/ICdjYWxjKDEwMCUgLSA1MHB4KScgOiAnY2FsYyg1MCUgLSA1MHB4KScsXG4gICAgICBmb3JtRGF0YTogZ2FudHRTZXR0aW5ncyxcbiAgICAgIHNjcm9sbGluZ0VuYWJsZWQ6IHRydWUsXG4gICAgICBpdGVtczogZm9ybUl0ZW1zXG4gICAgfSkuZHhGb3JtKCdpbnN0YW5jZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENoYXJ0IChkYXRhOiBJR2FudHRDaGFydERhdGFNb2RlbCwgY29sdW1uczogSUdhbnR0Q29sdW1uU3RhdGVbXSwgZ2FudHRTZXR0aW5nczogSUdhbnR0U2V0dGluZ3MpIHtcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG4gICAgbGV0IHVzZUF1dG9XaWR0aCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29sdW1uc01hcHBpbmcgPSB7fTtcblxuICAgIGNvbHVtbnMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgaWYgKGMudGFza0NvbHVtblR5cGUpIHtcbiAgICAgICAgY29sdW1uc01hcHBpbmdbYy50YXNrQ29sdW1uVHlwZV0gPSBjLmRhdGFGaWVsZDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnN0IHcgPSBwYXJzZUludChjLndpZHRoKTtcblxuICAgICAgaWYoIWlzTmFOKHcpKSB7XG4gICAgICAgIHRvdGFsV2lkdGggKz0gdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVzZUF1dG9XaWR0aCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0ID0gdGhpcy5jaGFydFBvc2l0aW9uTWFya2VyLmR4R2FudHQoe1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogdGhpcy5oYXNGb3JtID8gJzUwJScgOiAnY2FsYygxMDAlIC0gNjBweCknLFxuICAgICAgZmlyc3REYXlPZldlZWs6IDYsXG4gICAgICB0YXNrTGlzdFdpZHRoOiAoIXVzZUF1dG9XaWR0aCAmJiB0b3RhbFdpZHRoID4gMCkgPyB0b3RhbFdpZHRoIDogdm9pZCAwLFxuICAgICAgdG9vbGJhcjoge1xuICAgICAgICBpdGVtczogWyd6b29tSW4nLCAnem9vbU91dCcsICdzZXBhcmF0b3InLCAndGFza0RldGFpbHMnXVxuICAgICAgfSxcbiAgICAgIGVkaXRpbmc6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGFGaWVsZDogYy5kYXRhRmllbGQsXG4gICAgICAgICAgZGF0YVR5cGU6IGMuZGF0YVR5cGUsXG4gICAgICAgICAgd2lkdGg6IGMud2lkdGgsXG4gICAgICAgICAgdmlzaWJsZUluZGV4OiBjLnZpc2libGVJbmRleCxcbiAgICAgICAgICBzb3J0SW5kZXg6IGMuc29ydEluZGV4LFxuICAgICAgICAgIHNvcnRPcmRlcjogYy5zb3J0T3JkZXIgJiYgKGMuc29ydE9yZGVyID09PSAnYXNjJyA/ICdhc2MnIDogJ2Rlc2MnKSxcbiAgICAgICAgICBjYXB0aW9uOiBjLmNhcHRpb24gfHwgdm9pZCAwXG4gICAgICAgIH0gYXMgRGV2RXhwcmVzcy51aS5keFRyZWVMaXN0Q29sdW1uXG4gICAgICB9KSxcbiAgICAgIHRhc2tzOiB7XG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuVGFza3MsXG4gICAgICAgIGtleUV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLktleV0sXG4gICAgICAgIHN0YXJ0RXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuU3RhcnRdLFxuICAgICAgICBlbmRFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5FbmRdLFxuICAgICAgICBwYXJlbnRJZEV4cHI6IGNvbHVtbnNNYXBwaW5nW0dhbnR0VGFza3NDb2x1bW5UeXBlLlBhcmVudElkXSxcbiAgICAgICAgcHJvZ3Jlc3NFeHByOiBjb2x1bW5zTWFwcGluZ1tHYW50dFRhc2tzQ29sdW1uVHlwZS5Qcm9ncmVzc10sXG4gICAgICAgIHRpdGxlRXhwcjogY29sdW1uc01hcHBpbmdbR2FudHRUYXNrc0NvbHVtblR5cGUuVGl0bGVdXG4gICAgICB9LFxuICAgICAgZGVwZW5kZW5jaWVzOiB7XG4gICAgICAgIGRhdGFTb3VyY2U6IGRhdGEuRGVwZW5kZW5jaWVzLFxuICAgICAgICBrZXlFeHByOiAnSWQnLFxuICAgICAgICBwcmVkZWNlc3NvcklkRXhwcjogJ1ByZWRlY2Vzc29ySWQnLFxuICAgICAgICBzdWNjZXNzb3JJZEV4cHI6ICdTdWNjZXNzb3JJZCcsXG4gICAgICAgIHR5cGVFeHByOiAnVHlwZSdcbiAgICAgIH0sXG4gICAgICByZXNvdXJjZXM6IHtcbiAgICAgICAgZGF0YVNvdXJjZTogZGF0YS5SZXNvdXJjZXMsXG4gICAgICAgIGtleUV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VzS2V5RmllbGQsXG4gICAgICAgIHRleHRFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlc1RleHRGaWVsZFxuICAgICAgfSxcbiAgICAgIHJlc291cmNlQXNzaWdubWVudHM6IHtcbiAgICAgICAgZGF0YVNvdXJjZTogZGF0YS5SZXNvdXJjZUFzc2lnbm1lbnRzLFxuICAgICAgICBrZXlFeHByOiBnYW50dFNldHRpbmdzLlJlc291cmNlQXNzaWdubWVudEtleUZpZWxkLFxuICAgICAgICByZXNvdXJjZUlkRXhwcjogZ2FudHRTZXR0aW5ncy5SZXNvdXJjZUFzc2lnbm1lbnRSZXNvdXJjZUlkRmllbGQsXG4gICAgICAgIHRhc2tJZEV4cHI6IGdhbnR0U2V0dGluZ3MuUmVzb3VyY2VBc3NpZ25tZW50VGFza0lkRmllbGRcbiAgICAgIH0sXG4gICAgfSkuZHhHYW50dCgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0Py5kaXNwb3NlKCk7XG4gICAgdGhpcy5jaGFydCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5DSEFSVF9TVE9SQUdFX01PREVfS0VZICsgdGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcblxuY29uc3QgU1dJVENIX1RPX0RFU0lHTkVSX1RFWFQgPSAnU3dpdGNoIHRvIERlc2lnbmVyJztcbmNvbnN0IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcbmNvbnN0IFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSA9ICdyZXBvcnRNb2RlJztcbmNvbnN0IENVUlJFTlRfVVJMX0tFWSA9ICdjdXN0b21DdXJyZW50VXJsJztcblxuZGVjbGFyZSBjb25zdCBkeFJlcG9ydERlc2lnbmVyOiBhbnk7XG5jb25zdCBrbyA9ICh3aW5kb3cgYXMgYW55KS5rbztcblxuZXhwb3J0IGludGVyZmFjZSBJUmVwb3J0T3B0aW9ucyB7XG4gICRyZXBvcnRDb250YWluZXI6IEpRdWVyeTtcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XG4gIGRlc2lnbmVyTW9kZWxVcmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0IGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgJHJlcG9ydENvbnRhaW5lcjogSlF1ZXJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydFBhcmFtczogSVJlcG9ydFBhcmFtcztcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJNb2RlbFVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydElkOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBwb3BvdmVyOiBEZXZFeHByZXNzLnVpLmR4UG9wb3ZlciA9IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVJlcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLiRyZXBvcnRDb250YWluZXIgPSBvcHRpb25zLiRyZXBvcnRDb250YWluZXI7XG4gICAgdGhpcy5yZXBvcnRQYXJhbXMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcbiAgICB0aGlzLmFsbG93RWRpdGluZyA9IG9wdGlvbnMuYWxsb3dFZGl0aW5nO1xuICAgIHRoaXMuZGVzaWduZXJNb2RlbFVybCA9IG9wdGlvbnMuZGVzaWduZXJNb2RlbFVybDtcbiAgICB0aGlzLnJlcG9ydElkID0gb3B0aW9ucy5yZXBvcnRQYXJhbXMuUmVwb3J0SWQ7XG4gIH1cblxuICBpbml0KCk6IHZvaWQge1xuICAgIGxldCBtb2RlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5nZXRTZXNzaW9uS2V5KCkpIGFzIE1vZGUgfHwgTW9kZS5WaWV3ZXI7XG4gICAgbGV0IGJ1dHRvbiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5yZXBvcnQtZGV0YWlscy1saW5rJywgdGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nKSB7XG4gICAgICBidXR0b24gPSAkKCcuc3dpdGNoLW1vZGUtYnRuJykuZHhCdXR0b24oe1xuICAgICAgICB0ZXh0OiBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhULFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgbW9kZSA9IG1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xuICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U2Vzc2lvbktleSgpLCBtb2RlKTtcbiAgICAgICAgICB0aGlzLnN3aXRjaE1vZGUobW9kZSwgYnV0dG9uKTtcbiAgICAgICAgfVxuICAgICAgfSkuYWRkQ2xhc3MoJ2lzem9sZWEtbWQnKS5keEJ1dHRvbignaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZVJlcG9ydERlc2lnbmVyKHRoaXMuJHJlcG9ydENvbnRhaW5lciwgdGhpcy5kZXNpZ25lck1vZGVsVXJsLCAnZHhSZXBvcnREZXNpZ25lcicsIHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkLnRvU3RyaW5nKCksIChzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGUsIGJ1dHRvbik7XG4gICAgICB9KTtcbiAgICB9LCBtb2RlID09PSBNb2RlLlZpZXdlcik7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IGlzTm90U2F2ZWRSZXBvcnQgPSBkeFJlcG9ydERlc2lnbmVyICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpICYmIGR4UmVwb3J0RGVzaWduZXIuR2V0RGVzaWduZXJNb2RlbCgpLmlzRGlydHk7XG5cbiAgICAgIGlmIChpc05vdFNhdmVkUmVwb3J0KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9ICdUaGUgcmVwb3J0IGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucG9wb3Zlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMucG9wb3ZlciA9IG51bGw7XG4gIH1cblxuICByZWZyZXNoKCk6IHZvaWQge1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplUHJldmlldyhkZXNpZ25lcikge1xuICAgIGNvbnN0IHJlcG9ydFByZXZpZXcgPSBkZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3O1xuICAgIGNvbnN0IFJlcG9ydFByZXZpZXdTZXJ2aWNlID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuSW50ZXJuYWwuUmVwb3J0UHJldmlld1NlcnZpY2U7XG5cbiAgICByZXBvcnRQcmV2aWV3LmluaXRpYWxpemUoUmVwb3J0UHJldmlld1NlcnZpY2UuaW5pdGlhbGl6ZVByZXZpZXcoZGVzaWduZXIuZGVzaWduZXJNb2RlbC5tb2RlbCgpKSk7XG4gIH1cblxuICBwcml2YXRlIHN3aXRjaE1vZGUobW9kZTogTW9kZSwgYnV0dG9uOiBEZXZFeHByZXNzLnVpLmR4QnV0dG9uKSB7XG4gICAgaWYgKG1vZGUgPT09IE1vZGUuVmlld2VyKSB7XG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcucHJldmlld1Zpc2libGUgPSB0cnVlO1xuICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhkeFJlcG9ydERlc2lnbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZHhSZXBvcnREZXNpZ25lci5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gZmFsc2U7XG4gICAgICBkeFJlcG9ydERlc2lnbmVyLmRlc2lnbmVyTW9kZWwucmVwb3J0UHJldmlld01vZGVsLnJlcG9ydFByZXZpZXcuZGVhY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3dpdGNoTW9kZUJ1dHRvbihtb2RlLCBidXR0b24pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTd2l0Y2hNb2RlQnV0dG9uKG1vZGU6IE1vZGUsIGJ1dHRvbjogRGV2RXhwcmVzcy51aS5keEJ1dHRvbikge1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5vcHRpb24oJ3RleHQnLCBtb2RlID09PSBNb2RlLlZpZXdlciA/IFNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogU1dJVENIX1RPX1ZJRVdFUl9URVhUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlcG9ydERlc2lnbmVyKFxuICAgICRyZXBvcnRDb250YWluZXI6IEpRdWVyeSxcbiAgICBkZXNpZ25lck1vZGVsVXJsOiBzdHJpbmcsXG4gICAgZ2xvYmFsTmFtZTogc3RyaW5nLFxuICAgIHJlcG9ydElkU3RyOiBzdHJpbmcsXG4gICAgb25Jbml0SGFuZGxlcjogKHNlbmRlcjogYW55KSA9PiB2b2lkLFxuICAgIGlzUHJldmlld01vZGU6IGJvb2xlYW5cbiAgKTogSlF1ZXJ5PEhUTUxFbGVtZW50PiB7XG4gICAgY29uc3QgZGVzaWduZXIgPSAkcmVwb3J0Q29udGFpbmVyXG4gICAgICAuYXR0cignZGF0YS1iaW5kJywgJ2R4UmVwb3J0RGVzaWduZXI6IGRlc2lnbmVyT3B0aW9ucycpXG4gICAgICAuYWRkQ2xhc3MoJ3JlcG9ydC1kZXNpZ25lcicpO1xuXG4gICAgY29uc3QgZGVzaWduZXJPcHRpb25zID0ge1xuICAgICAgcmVwb3J0VXJsOiByZXBvcnRJZFN0cixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiB7XG4gICAgICAgIGdldERlc2lnbmVyTW9kZWxBY3Rpb246IGRlc2lnbmVyTW9kZWxVcmxcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgQmVmb3JlUmVuZGVyOiAocykgPT4ge1xuICAgICAgICAgICh3aW5kb3cgYXMgYW55KVtnbG9iYWxOYW1lXSA9IHM7XG5cbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xuICAgICAgICAgICAgcy5kZXNpZ25lck1vZGVsLnJlcG9ydFByZXZpZXdNb2RlbC5yZXBvcnRQcmV2aWV3LnByZXZpZXdWaXNpYmxlID0gdHJ1ZSA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb25Jbml0SGFuZGxlcihzKTtcbiAgICAgICAgfSxcbiAgICAgICAgQ3VzdG9taXplTWVudUFjdGlvbnM6IHRoaXMuQ3VzdG9taXplTWVudUFjdGlvbnMsXG4gICAgICAgIFByZXZpZXdDdXN0b21pemVNZW51QWN0aW9uczogdGhpcy5QcmV2aWV3Q3VzdG9taXplTWVudUFjdGlvbnMsXG4gICAgICAgIFJlcG9ydE9wZW5lZDogKHMsIGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNQcmV2aWV3TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplUHJldmlldyhzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLlJlcG9ydE9wZW5lZChzLCBlKTtcbiAgICAgICAgfSxcbiAgICAgICAgUmVwb3J0VGFiQ2xvc2VkOiB0aGlzLlJlcG9ydFRhYkNsb3NlZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBrby5hcHBseUJpbmRpbmdzKHsgZGVzaWduZXJPcHRpb25zIH0sIGRlc2lnbmVyWzBdKTtcblxuICAgIHJldHVybiBkZXNpZ25lcjtcbiAgfVxuXG4gIHByaXZhdGUgUHJldmlld0N1c3RvbWl6ZU1lbnVBY3Rpb25zKHMsIGUpIHtcbiAgICBjb25zdCBzaG93RGVzaWduZXJJdGVtID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLlZpZXdlci5BY3Rpb25JZC5EZXNpZ24pO1xuXG4gICAgaWYgKHNob3dEZXNpZ25lckl0ZW0pIHtcbiAgICAgIHNob3dEZXNpZ25lckl0ZW0udmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgQ3VzdG9taXplTWVudUFjdGlvbnMocywgZSkge1xuICAgIGNvbnN0IEFjdGlvbklkID0gKERldkV4cHJlc3MgYXMgYW55KS5SZXBvcnRpbmcuRGVzaWduZXIuQWN0aW9ucy5BY3Rpb25JZDtcbiAgICBjb25zdCBhY3Rpb25JZHNUb01vdmVJblRvb2xiYXI6IHN0cmluZ1tdID0gW0FjdGlvbklkLlNhdmVdO1xuICAgIGNvbnN0IGFjdGlvbklkc1RvSGlkZTogc3RyaW5nW10gPSBbQWN0aW9uSWQuTmV3UmVwb3J0LCBBY3Rpb25JZC5OZXdSZXBvcnRWaWFXaXphcmQsIEFjdGlvbklkLk9wZW5SZXBvcnQsXG4gICAgICBBY3Rpb25JZC5QcmV2aWV3LCBBY3Rpb25JZC5TYXZlQXMsIEFjdGlvbklkLkV4aXRdO1xuXG4gICAgYWN0aW9uSWRzVG9Nb3ZlSW5Ub29sYmFyLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcblxuICAgICAgaWYgKGl0ZW0gJiYgKGl0ZW0uY29udGFpbmVyID09PSAnbWVudScpKSB7XG4gICAgICAgIGl0ZW0uY29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWN0aW9uSWRzVG9IaWRlLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gZS5HZXRCeUlkKGlkKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzYXZlQWN0aW9uID0gZS5HZXRCeUlkKChEZXZFeHByZXNzIGFzIGFueSkuUmVwb3J0aW5nLkRlc2lnbmVyLkFjdGlvbnMuQWN0aW9uSWQuU2F2ZSk7XG4gICAgY29uc3Qgb3JpZ0NsaWNrQWN0aW9uID0gc2F2ZUFjdGlvbi5jbGlja0FjdGlvbjtcbiAgICBzYXZlQWN0aW9uLmNsaWNrQWN0aW9uID0gKCkgPT4ge1xuICAgICAgY29uc3QgdGFiID0gcy5HZXRDdXJyZW50VGFiKCk7XG4gICAgICB0YWIudXJsKGtvLnVud3JhcChzW0NVUlJFTlRfVVJMX0tFWV0pKTtcbiAgICAgIG9yaWdDbGlja0FjdGlvbigpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIFJlcG9ydE9wZW5lZChzLCBlKSB7XG4gICAgc1tDVVJSRU5UX1VSTF9LRVldID0gc1tDVVJSRU5UX1VSTF9LRVldIHx8IGtvLm9ic2VydmFibGUoKTtcbiAgICBzW0NVUlJFTlRfVVJMX0tFWV0oZS5VcmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBSZXBvcnRUYWJDbG9zZWQocywgZSkge1xuICAgIHNbQ1VSUkVOVF9VUkxfS0VZXSA9IHNbQ1VSUkVOVF9VUkxfS0VZXSB8fCBrby5vYnNlcnZhYmxlKCk7XG4gICAgc1tDVVJSRU5UX1VSTF9LRVldKG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXNzaW9uS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNFU1NJT05fU1RPUkFHRV9NT0RFX0tFWSArIHRoaXMucmVwb3J0SWQ7XG4gIH1cbn1cbiIsICJcdUZFRkZpbXBvcnQgeyBpbml0UG9wb3ZlciB9IGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVwb3J0RGV0YWlsc1BvcG92ZXInO1xuaW1wb3J0IHsgSVJlcG9ydFBhcmFtcywgTW9kZSB9IGZyb20gJy4uLy4uL0lSZXBvcnRQYXJhbXMnO1xuaW1wb3J0IHsgc2VuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9EYXRhL1JlcXVlc3QnO1xuaW1wb3J0IHtJUmVwb3J0Q29tcG9uZW50fSBmcm9tICcuLi8uLi9JUmVwb3J0Q29tcG9uZW50JztcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0J1dHRvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpYWdyYW1QYWdlT3B0aW9ucyB7XG4gICRjb250YWluZXI6IEpRdWVyeTtcbiAgcmVwb3J0UGFyYW1zOiBJUmVwb3J0UGFyYW1zO1xuICBhbGxvd0VkaXRpbmc6IGJvb2xlYW47XG4gIGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XG4gIGFkZFJlZnJlc2hCdXR0b246IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpYWdyYW1QYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA9ICdTd2l0Y2ggdG8gRGVzaWduZXInO1xuICBwcml2YXRlIHJlYWRvbmx5IFNXSVRDSF9UT19WSUVXRVJfVEVYVCA9ICdTd2l0Y2ggdG8gVmlld2VyJztcbiAgcHJpdmF0ZSByZWFkb25seSBESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgPSAnRElBR1JBTV9TVE9SQUdFX01PREVfS0VZJztcblxuICBwcml2YXRlIHJlYWRvbmx5ICRjb250YWluZXI6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRQYXJhbXM6IElSZXBvcnRQYXJhbXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dFZGl0aW5nOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpYWdyYW1Db250cm9sbGVyVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkUmVmcmVzaEJ1dHRvbjogYm9vbGVhbjtcblxuICBwcml2YXRlIG1vZGU6IE1vZGU7XG4gIHByaXZhdGUgZGlhZ3JhbTogRGV2RXhwcmVzcy51aS5keERpYWdyYW07XG4gIHByaXZhdGUgcG9wb3ZlcjogRGV2RXhwcmVzcy51aS5keFBvcG92ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVmcmVzaEJ1dHRvbjogUmVmcmVzaEJ1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRGlhZ3JhbVBhZ2VPcHRpb25zKSB7XG4gICAgdGhpcy4kY29udGFpbmVyID0gb3B0aW9ucy4kY29udGFpbmVyO1xuICAgIHRoaXMucmVwb3J0UGFyYW1zID0gb3B0aW9ucy5yZXBvcnRQYXJhbXM7XG4gICAgdGhpcy5hbGxvd0VkaXRpbmcgPSBvcHRpb25zLmFsbG93RWRpdGluZztcbiAgICB0aGlzLmFkZFJlZnJlc2hCdXR0b24gPSBvcHRpb25zLmFkZFJlZnJlc2hCdXR0b247XG4gICAgdGhpcy5kaWFncmFtQ29udHJvbGxlclVybCA9IG9wdGlvbnMuZGlhZ3JhbUNvbnRyb2xsZXJVcmw7XG5cbiAgICB0aGlzLm1vZGUgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSkgYXMgTW9kZSB8fCBNb2RlLlZpZXdlcjtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCkge1xuICAgIHRoaXMuY3JlYXRlRGlhZ3JhbUNvbnRyb2woKTtcbiAgICB0aGlzLmluaXREaWFncmFtKCk7XG5cbiAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuaW5pdFN3aXRjaE1vZGVCdXR0b24oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXBvcnRQYXJhbXMuRGV0YWlscykge1xuICAgICAgdGhpcy5wb3BvdmVyID0gaW5pdFBvcG92ZXIoJy5kaWFncmFtLWRldGFpbHMtbGluaycsIHRoaXMucmVwb3J0UGFyYW1zLkRldGFpbHMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuZGlhZ3JhbS5kaXNwb3NlKCk7XG4gICAgdGhpcy5wb3BvdmVyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5kaWFncmFtID0gbnVsbDtcbiAgfVxuXG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5kaWFncmFtICYmIHNlbmRSZXF1ZXN0KGAke3RoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmx9P2lkPSR7dGhpcy5yZXBvcnRQYXJhbXMuUmVwb3J0SWR9YCwgJ2dldCcpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZGlhZ3JhbS5pbXBvcnQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIGZhbHNlKTtcbiAgICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURpYWdyYW1Db250cm9sKCkge1xuICAgIHRoaXMuZGlhZ3JhbSA9IHRoaXMuJGNvbnRhaW5lci5keERpYWdyYW0oe1xuICAgICAgaGlzdG9yeVRvb2xiYXI6IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29tbWFuZHM6IFsnc2VwYXJhdG9yJywgJ3VuZG8nLCAncmVkbycsICdzZXBhcmF0b3InLCB7IG5hbWU6ICdzYXZlJywgdGV4dDogJ1NhdmUnLCBpY29uOiAnc2F2ZScgfV0gYXMgYW55XG4gICAgICB9LFxuICAgICAgb25DdXN0b21Db21tYW5kOiAoZSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGUubmFtZSkge1xuICAgICAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICAgICAgdGhpcy5zYXZlUmVwb3J0KGUuY29tcG9uZW50LmV4cG9ydCgpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZnVsbFNjcmVlbjogZmFsc2UsXG4gICAgICByZWFkT25seTogdGhpcy5tb2RlID09PSBNb2RlLlZpZXdlclxuICAgIH0pLmR4RGlhZ3JhbSgnaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERpYWdyYW0oKSB7XG4gICAgc2VuZFJlcXVlc3QoYCR7dGhpcy5kaWFncmFtQ29udHJvbGxlclVybH0/aWQ9JHt0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZH1gLCAnZ2V0JykudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5kaWFncmFtLmltcG9ydChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICB0aGlzLmRpYWdyYW0ub3B0aW9uKCdoYXNDaGFuZ2VzJywgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWRkUmVmcmVzaEJ1dHRvbikge1xuICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uID0gbmV3IFJlZnJlc2hCdXR0b24oJCgnLnJlcG9ydC1yZWZyZXNoLWJ1dHRvbicpLCAoKSA9PiB0aGlzLnJlZnJlc2goKSk7XG4gICAgfVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaWFncmFtLm9wdGlvbignaGFzQ2hhbmdlcycpKSB7XG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSAnVGhlIGRvY3VtZW50IGlzIG5vdCBzYXZlZC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBwYWdlPyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTd2l0Y2hNb2RlQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9ICQoJy5zd2l0Y2gtbW9kZS1idG4nKS5keEJ1dHRvbih7XG4gICAgICB0ZXh0OiB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gdGhpcy5TV0lUQ0hfVE9fREVTSUdORVJfVEVYVCA6IHRoaXMuU1dJVENIX1RPX1ZJRVdFUl9URVhULFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyID8gTW9kZS5EZXNpZ25lciA6IE1vZGUuVmlld2VyO1xuICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFNlc3Npb25LZXkoKSwgdGhpcy5tb2RlKTtcbiAgICAgICAgdGhpcy5kaWFncmFtLm9wdGlvbigncmVhZE9ubHknLCB0aGlzLm1vZGUgPT09IE1vZGUuVmlld2VyKTtcbiAgICAgICAgYnV0dG9uLm9wdGlvbigndGV4dCcsIHRoaXMubW9kZSA9PT0gTW9kZS5WaWV3ZXIgPyB0aGlzLlNXSVRDSF9UT19ERVNJR05FUl9URVhUIDogdGhpcy5TV0lUQ0hfVE9fVklFV0VSX1RFWFQpO1xuICAgICAgfVxuICAgIH0pLmFkZENsYXNzKCdpc3pvbGVhLW1kJykuZHhCdXR0b24oJ2luc3RhbmNlJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVSZXBvcnQoc291cmNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0UGFyYW1zLlJlcG9ydElkO1xuICAgIGF3YWl0IHNlbmRSZXF1ZXN0KHRoaXMuZGlhZ3JhbUNvbnRyb2xsZXJVcmwsICdwb3N0JywgeyBpZCwgc291cmNlIH0sIHRydWUpO1xuICAgIHRoaXMuZGlhZ3JhbS5vcHRpb24oJ2hhc0NoYW5nZXMnLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlc3Npb25LZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ESUFHUkFNX1NUT1JBR0VfTU9ERV9LRVkgKyB0aGlzLnJlcG9ydFBhcmFtcy5SZXBvcnRJZDtcbiAgfVxufVxuIiwgImltcG9ydCB7SVJlcG9ydENvbXBvbmVudH0gZnJvbSAnLi4vLi4vSVJlcG9ydENvbXBvbmVudCc7XG5pbXBvcnQge01lbnVJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vQnVzaW5lc3MnO1xuaW1wb3J0IHtJQ2RtUmVwb3J0UGFyYW1zLCBJR3JpZFJlcG9ydFBhcmFtcywgSVJlcG9ydFBhcmFtc30gZnJvbSAnLi4vLi4vSVJlcG9ydFBhcmFtcyc7XG5pbXBvcnQgUmVmcmVzaFRpbWVyIGZyb20gJy4uLy4uL0NvbXBvbmVudHMvUmVmcmVzaFRpbWVyL0luZGV4JztcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4uL0Rhc2hib2FyZC9JbmRleCc7XG5pbXBvcnQgR2FudHRDaGFydCBmcm9tICcuLi9HYW5udENoYXJ0L0luZGV4JztcbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuLi9HcmlkL0luZGV4JztcbmltcG9ydCBDRE1SZXBvcnRQYWdlIGZyb20gJy4uL0NETS9JbmRleCc7XG5pbXBvcnQgRFhSZXBvcnRQYWdlIGZyb20gJy4uL1JlcG9ydC9JbmRleCc7XG5pbXBvcnQgRGlhZ3JhbVJlcG9ydFBhZ2UgZnJvbSAnLi4vRGlhZ3JhbS9JbmRleCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5lc3RlZFJlcG9ydCBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xuICBUeXBlOiBNZW51SXRlbVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNsaWRlc2hvd1JlcG9ydFBhcmFtcyBleHRlbmRzIElSZXBvcnRQYXJhbXMge1xuICBSZXBvcnRzOiBJTmVzdGVkUmVwb3J0W107XG4gIERlbGF5U2VjOiBudW1iZXI7XG4gIFJlZnJlc2hTZWM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMge1xuICAkY29udGFpbmVyOiBKUXVlcnk7XG4gIHJlcG9ydFBhcmFtczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcbiAgZGVmYXVsdFJlcG9ydFNldHRpbmdzOiB7IFtrZXkgaW4gTWVudUl0ZW1UeXBlXTogYW55OyB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXNob3dSZXBvcnRQYWdlIGltcGxlbWVudHMgSVJlcG9ydENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSVNsaWRlc2hvd1JlcG9ydFBhcmFtcztcbiAgcHJpdmF0ZSByZWFkb25seSAkcm9vdEVsZW1lbnQ6IEpRdWVyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmVwb3J0U2V0dGluZ3M6IHsgW2tleSBpbiBNZW51SXRlbVR5cGVdOiBhbnk7IH07XG4gIHByaXZhdGUgcmVwb3J0czogSVJlcG9ydENvbXBvbmVudFtdID0gW107XG4gIHByaXZhdGUgZHhHYWxsZXJ5OiBEZXZFeHByZXNzLnVpLmR4R2FsbGVyeTtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJlZnJlc2hUaW1lcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJU2xpZGVzaG93UmVwb3J0UGFnZU9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zLnJlcG9ydFBhcmFtcztcbiAgICB0aGlzLiRyb290RWxlbWVudCA9IG9wdGlvbnMuJGNvbnRhaW5lcjtcbiAgICB0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5ncyA9IG9wdGlvbnMuZGVmYXVsdFJlcG9ydFNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBpZiAoISF0aGlzLnJlcG9ydHMpIHtcbiAgICAgIHRoaXMucmVwb3J0cy5mb3JFYWNoKChyZXBvcnQpID0+IHtcbiAgICAgICAgcmVwb3J0LmRpc3Bvc2UoKTtcbiAgICAgIH0pO1xuICAgICAgd2hpbGUgKHRoaXMucmVwb3J0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRzLnBvcCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXBvcnRzID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydHMgJiYgdGhpcy5yZXBvcnRzLmZvckVhY2goKHJlcG9ydCkgPT4ge1xuICAgICAgcmVwb3J0LnJlZnJlc2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29udGVudCgpIHtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICBsZXQgY3VycmVudFRpbWVvdXQgPSBudWxsO1xuICAgIGNvbnN0IG1heEluZGV4ID0gdGhpcy5vcHRpb25zLlJlcG9ydHMubGVuZ3RoO1xuXG4gICAgY29uc3Qgc2V0dXBOZXh0SXRlbVNlbGVjdCA9ICgpID0+IHtcbiAgICAgIGN1cnJlbnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcblxuICAgICAgICBpZihuZXh0SW5kZXggPj0gbWF4SW5kZXgpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5keEdhbGxlcnkuZ29Ub0l0ZW0obmV4dEluZGV4LCB0cnVlKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5EZWxheVNlYyAqIDEwMDApO1xuICAgIH07XG5cbiAgICBjb25zdCAkdmlldyA9ICQoJzxkaXYgLz4nKS5hdHRyKHsgY2xhc3M6ICdzbGlkZXNob3ctcmVwb3J0JyB9KS5hcHBlbmRUbyh0aGlzLiRyb290RWxlbWVudCk7XG4gICAgY29uc3QgJGdhbGxlcnkgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnknIH0pLmR4R2FsbGVyeSh7XG4gICAgICBsb29wOiBmYWxzZSxcbiAgICAgIGRhdGFTb3VyY2U6IHRoaXMub3B0aW9ucy5SZXBvcnRzLFxuICAgICAgc2xpZGVzaG93RGVsYXk6IDAsXG4gICAgICBzaG93TmF2QnV0dG9uczogZmFsc2UsXG4gICAgICBzaG93SW5kaWNhdG9yOiB0cnVlLFxuICAgICAgc3RyZXRjaEltYWdlczogdHJ1ZSxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgb25Jbml0aWFsaXplZDogKCkgPT4gc2V0dXBOZXh0SXRlbVNlbGVjdCgpLFxuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBlLmNvbXBvbmVudC5vcHRpb24oJ3NlbGVjdGVkSW5kZXgnKTtcblxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGN1cnJlbnRUaW1lb3V0KTtcbiAgICAgICAgc2V0dXBOZXh0SXRlbVNlbGVjdCgpO1xuICAgICAgfSxcbiAgICAgIGl0ZW1UZW1wbGF0ZTogKHJlcG9ydFBhcmFtczogSU5lc3RlZFJlcG9ydCwgaW5kZXgsIGl0ZW1FbGVtZW50KSA9PiB7XG4gICAgICAgIGl0ZW1FbGVtZW50LmF0dHIoeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dhbGxlcnktaXRlbScgfSkuaGVpZ2h0KCcxMDAlJyk7XG5cbiAgICAgICAgY29uc3QgJHNsaWRlRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fc2xpZGUtY29udGVudCcgfSkuaGVpZ2h0KCcxMDAlJyk7XG4gICAgICAgIGxldCByZXBvcnRTbGlkZTogSVJlcG9ydENvbXBvbmVudDtcblxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChyZXBvcnRQYXJhbXMuVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuRGFzaGJvYXJkOlxuICAgICAgICAgICAgICBjb25zdCAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xuICAgICAgICAgICAgICAkZGFzaGJvYXJkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERhc2hib2FyZFJlcG9ydFBhZ2Uoe1xuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuRGFzaGJvYXJkXSB8fCB7fSksXG4gICAgICAgICAgICAgICAgJGRhc2hib2FyZENvbnRhaW5lcjogJGRhc2hib2FyZFBvc2l0aW9uRWxlbWVudCxcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuZmluZCgnZGFzaGJvYXJkLXRpdGxlJykuaGlkZSgpO1xuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmZpbmQoJy5keC1kYXNoYm9hcmQtbGF5b3V0LWNvbnRhaW5lcicpLmNzcyh7IHRvcDogMCB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLkdyaWRWaWV3OlxuICAgICAgICAgICAgICBjb25zdCAkZ3JpZFBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAnc2xpZGVzaG93LXJlcG9ydF9fZ3JpZC1wb3NpdGlvbicgfSk7XG4gICAgICAgICAgICAgICRzbGlkZUVsZW1lbnQuYWRkQ2xhc3MoJ2lzem9sZWEtdGhlbWUnKS5hZGRDbGFzcygncGFuZWwtYm9keScpO1xuXG4gICAgICAgICAgICAgICRncmlkUG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBHcmlkUmVwb3J0UGFnZSh7XG4gICAgICAgICAgICAgICAgLi4uKHRoaXMuZGVmYXVsdFJlcG9ydFNldHRpbmdzW01lbnVJdGVtVHlwZS5HcmlkVmlld10gfHwge30pLFxuICAgICAgICAgICAgICAgIGdyaWRQb3NpdGlvbk1hcmtlcjogJGdyaWRQb3NpdGlvbkVsZW1lbnQsXG4gICAgICAgICAgICAgICAgcmVwb3J0UGFyYW1zOiByZXBvcnRQYXJhbXMgYXMgYW55IGFzIElHcmlkUmVwb3J0UGFyYW1zLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5DRE06XG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IENETVJlcG9ydFBhZ2Uoe1xuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuQ0RNXSB8fCB7fSksXG4gICAgICAgICAgICAgICAgJGNvbnRhaW5lcjogJHNsaWRlRWxlbWVudCxcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUNkbVJlcG9ydFBhcmFtcyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuUmVwb3J0OlxuICAgICAgICAgICAgICBjb25zdCAkcmVwb3J0UG9zaXRpb25FbGVtZW50ID0gJCgnPGRpdiAvPicsIHsgY2xhc3M6ICdyZXBvcnQtcG9zaXRpb24nIH0pO1xuICAgICAgICAgICAgICAkcmVwb3J0UG9zaXRpb25FbGVtZW50LmFwcGVuZFRvKCRzbGlkZUVsZW1lbnQpO1xuICAgICAgICAgICAgICByZXBvcnRTbGlkZSA9IG5ldyBEWFJlcG9ydFBhZ2Uoe1xuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuUmVwb3J0XSB8fCB7fSksXG4gICAgICAgICAgICAgICAgJHJlcG9ydENvbnRhaW5lcjogJHJlcG9ydFBvc2l0aW9uRWxlbWVudCxcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5EaWFncmFtOlxuICAgICAgICAgICAgICBjb25zdCAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCA9ICQoJzxkaXYgLz4nLCB7IGNsYXNzOiAncmVwb3J0LXBvc2l0aW9uJyB9KTtcbiAgICAgICAgICAgICAgJGRpYWdyYW1Qb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IERpYWdyYW1SZXBvcnRQYWdlKHtcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5kZWZhdWx0UmVwb3J0U2V0dGluZ3NbTWVudUl0ZW1UeXBlLkRpYWdyYW1dIHx8IHt9KSxcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyOiAkZGlhZ3JhbVBvc2l0aW9uRWxlbWVudCxcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBJUmVwb3J0UGFyYW1zLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE1lbnVJdGVtVHlwZS5HYW50dENoYXJ0OlxuICAgICAgICAgICAgICBjb25zdCAkZ2FudHRQb3NpdGlvbkVsZW1lbnQgPSAkKCc8ZGl2IC8+JywgeyBjbGFzczogJ3NsaWRlc2hvdy1yZXBvcnRfX2dyaWQtcG9zaXRpb24nIH0pO1xuICAgICAgICAgICAgICAkc2xpZGVFbGVtZW50LmFkZENsYXNzKCdpc3pvbGVhLXRoZW1lJykuYWRkQ2xhc3MoJ3BhbmVsLWJvZHknKTtcblxuICAgICAgICAgICAgICAkZ2FudHRQb3NpdGlvbkVsZW1lbnQuYXBwZW5kVG8oJHNsaWRlRWxlbWVudCk7XG4gICAgICAgICAgICAgIHJlcG9ydFNsaWRlID0gbmV3IEdhbnR0Q2hhcnQoe1xuICAgICAgICAgICAgICAgIC4uLih0aGlzLmRlZmF1bHRSZXBvcnRTZXR0aW5nc1tNZW51SXRlbVR5cGUuR2FudHRDaGFydF0gfHwge30pLFxuICAgICAgICAgICAgICAgIGNoYXJ0UG9zaXRpb25NYXJrZXI6ICRnYW50dFBvc2l0aW9uRWxlbWVudCxcbiAgICAgICAgICAgICAgICByZXBvcnRQYXJhbXM6IHJlcG9ydFBhcmFtcyBhcyBhbnkgYXMgSUdyaWRSZXBvcnRQYXJhbXMsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTWVudUl0ZW1UeXBlLk1lbnVOb2RlOlxuICAgICAgICAgICAgY2FzZSBNZW51SXRlbVR5cGUuU2xpZGVzaG93OlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVwb3J0U2xpZGUpIHtcbiAgICAgICAgICAgIHJlcG9ydFNsaWRlLmluaXQoKTtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0cy5wdXNoKHJlcG9ydFNsaWRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCk7XG5cbiAgICAgICAgJHNsaWRlRWxlbWVudC5hcHBlbmRUbyhpdGVtRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmR4R2FsbGVyeSA9ICRnYWxsZXJ5LmR4R2FsbGVyeSgnaW5zdGFuY2UnKTtcblxuICAgICRnYWxsZXJ5LmFwcGVuZFRvKCR2aWV3KTtcblxuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbmV3IFJlZnJlc2hUaW1lcih7Y2FsbGJhY2s6ICgpID0+IHRoaXMucmVmcmVzaCgpLCBlbGFwc2VkQ2FsbGJhY2s6IChlKSA9PiB7fX0pO1xuICAgIHRoaXMucmVmcmVzaFRpbWVyLnN0YXJ0KHRoaXMub3B0aW9ucy5SZWZyZXNoU2VjICogMTAwMCk7XG4gIH1cbn1cbiIsICJcdUZFRkYvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVmVuZG9yL0RldkV4dHJlbWUvZHguYWxsLmQudHNcIiAvPlxuXG5leHBvcnQgeyBJTGljZW5jZSwgTWVudUl0ZW1UeXBlLCBMaWNlbmNlU3RhdHVzIH0gZnJvbSAnLi9CdXNpbmVzcyc7XG5leHBvcnQgeyBJQXBpUmVzcG9uc2UsIElEeERhdGFTb3VyY2VPcHRpb25zLCBJRXJyb3JJbmZvLCBJTG9nb1NldHRpbmdzLCBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuL0RhdGEnO1xuZXhwb3J0IHtcbiAgSGVhZGVyLCBOYXZpZ2F0aW9uTWVudSwgVXNlck1lbnUsIE1lbnVTd2l0Y2hlcixcbiAgSGVhZGVyVGhlbWVzLCBJSGVhZGVyT3B0aW9ucywgSUFwcE1lbnVNb2RlbCwgSU1lbnVTZXR0aW5ncywgSU5hdmlnYXRpb25NZW51SXRlbU1vZGVsLFxuICBJVXNlck1lbnVJdGVtLCBJVXNlck1lbnVJdGVtTW9kZWwsXG59IGZyb20gJy4vSGVhZGVyJztcbmV4cG9ydCB7IElIaWVyYXJjaGljYWwsIElSZXBvcnRCYXNlLCBJQXBwTWVudUl0ZW1CYXNlTW9kZWwsIGdyaWRDb2x1bW5UeXBlcyB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XG5leHBvcnQge1xuICBJR3JpZEV4dGVuZGVkQ29sdW1uU3RhdGUsIEdyaWREYXRhQ29sdW1uRGF0YVR5cGUsIElHcmlkU3RhdGUsXG4gIElHcmlkQ29sdW1uU3RhdGUsIElHcmlkQWRkaXRpb25hbENvbHVtblN0YXRlXG59IGZyb20gJy4vV2lkZ2V0cy9JR3JpZFN0YXRlJztcbmV4cG9ydCB7IElHcmlkRGF0YSwgSVYyR3JpZENvbHVtblN0YXRlIH0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0dyaWQvSUdyaWREYXRhJztcbmV4cG9ydCB7IElDb2x1bW5NZXRhRGF0YSB9IGZyb20gJy4vUmVwb3J0cy9Db2x1bW5NZXRhRGF0YSc7XG5leHBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XG5cbmltcG9ydCB7IHNob3cgYXMgYmFja2dyb3VuZEltYWdlVmlld2VyIH0gZnJvbSAnLi9XaWRnZXRzL0JhY2tncm91bmRJbWFnZVZpZXdlcic7XG5pbXBvcnQgeyBMaWNlbmNlU3RhdHVzLCBNZW51SXRlbVR5cGUgfSBmcm9tICcuL0J1c2luZXNzJztcbmltcG9ydCB7IEdyaWREYXRhQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuL1dpZGdldHMvSUdyaWRTdGF0ZSc7XG5pbXBvcnQgZGF0YSBmcm9tICcuL0RhdGEnO1xuaW1wb3J0IEZvb3RlciwgeyBGb290ZXJJbmRpY2F0b3JTdGF0dXMgfSBmcm9tICcuL0Zvb3Rlci9JbmRleCc7XG5pbXBvcnQge1xuICBIZWFkZXIsXG4gIE5hdmlnYXRpb25NZW51LFxuICBVc2VyTWVudSxcbiAgTWVudVN3aXRjaGVyXG59IGZyb20gJy4vSGVhZGVyJztcblxuZXhwb3J0IHtcbiAgRm9vdGVyLFxufTtcblxuaW1wb3J0IG5vdGlmeSBmcm9tICcuL1dpZGdldHMvTm90aWZ5JztcbmltcG9ydCBmdWxsU2NyZWVuIGZyb20gJy4vV2lkZ2V0cy9GdWxsU2NyZWVuJztcbmltcG9ydCBkZWZhdWx0VG9vbGJhciBmcm9tICcuL1dpZGdldHMvRGVmYXVsdFRvb2xiYXInO1xuaW1wb3J0IGRlZmF1bHRHcmlkT2Jzb2xldGUgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWRPYnNvbGV0ZSc7XG5pbXBvcnQgZGVmYXVsdFRyZWVMaXN0IGZyb20gJy4vV2lkZ2V0cy9HcmlkL0RlZmF1bHRUcmVlTGlzdCc7XG5pbXBvcnQgZGVmYXVsdEdyaWQgZnJvbSAnLi9XaWRnZXRzL0dyaWQvRGVmYXVsdEdyaWQnO1xuaW1wb3J0ICogYXMgaW1hZ2VDcm9wRGlhbG9nIGZyb20gJy4vV2lkZ2V0cy9JbWFnZUNyb3BEaWFsb2cnO1xuaW1wb3J0IHsgQWNjb3VudFNldHRpbmdzUGFnZSB9IGZyb20gJy4vUGFnZXMvQWNjb3VudFNldHRpbmdzJztcbmltcG9ydCAqIGFzIHN0eWxpbmcgZnJvbSAnLi9TdHlsaW5nL0luZGV4JztcbmltcG9ydCAqIGFzIHBvcHVwIGZyb20gJy4vV2lkZ2V0cy9Qb3B1cCc7XG5pbXBvcnQgKiBhcyBjb25maXJtIGZyb20gJy4vV2lkZ2V0cy9Db25maXJtJztcbmltcG9ydCAqIGFzIGxhbmRpbmcgZnJvbSAnLi9XaWRnZXRzL0xhbmRpbmcnO1xuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tICcuL0hlbHBlcnMvSW5kZXgnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9VdGlscy9JbmRleCc7XG5pbXBvcnQgKiBhcyBhY2Nlc3NEZW5pZWQgZnJvbSAnLi9XaWRnZXRzL0FjY2Vzc0RlbmllZFRvUmVwb3J0JztcbmltcG9ydCBncmlkQ29sdW1uVHlwZXMgZnJvbSAnLi9SZXBvcnRzL0J1c2luZXNzL0dyaWRDb2x1bW5UeXBlcyc7XG5pbXBvcnQgKiBhcyBDRE0gZnJvbSAnLi9SZXBvcnRzL1BhZ2VzL0NETS9JbmRleCc7XG5pbXBvcnQgeyBTZXNzaW9uTm90aWZpZXIgfSBmcm9tICcuL0NvbXBvbmVudHMvU2Vzc2lvbk5vdGlmaWVyJztcbmltcG9ydCB7IEZpbGVJbXBvcnRlciB9IGZyb20gJy4vQ29tcG9uZW50cy9GaWxlSW1wb3J0ZXIvSW5kZXgnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9Db21wb25lbnRzL0ZpbGVVcGxvYWRlci9JbmRleCc7XG5pbXBvcnQgeyBDZG1JbXBvcnRGaWxlTW9kZSB9IGZyb20gJy4vUmVwb3J0cy9CdXNpbmVzcyc7XG5cbmltcG9ydCBHcmlkUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR3JpZC9JbmRleCc7XG5pbXBvcnQgU2xpZGVzaG93UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvU2xpZGVzaG93L0luZGV4JztcbmltcG9ydCBEYXNoYm9hcmRSZXBvcnRQYWdlIGZyb20gJy4vUmVwb3J0cy9QYWdlcy9EYXNoYm9hcmQvSW5kZXgnO1xuaW1wb3J0IERYUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvUmVwb3J0L0luZGV4JztcbmltcG9ydCBEaWFncmFtUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvRGlhZ3JhbS9JbmRleCc7XG5pbXBvcnQgQ0RNUmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvQ0RNL0luZGV4JztcbmltcG9ydCBHYW50dENoYXJ0UmVwb3J0UGFnZSBmcm9tICcuL1JlcG9ydHMvUGFnZXMvR2FubnRDaGFydC9JbmRleCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL0NvbmZpZy9JbmRleCc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuY29uc3QgSXN6b2xlYVVJID0ge1xuICBjb25maWcsXG5cbiAgSGVhZGVyLFxuICBGb290ZXIsXG4gIE5hdmlnYXRpb25NZW51LFxuICBVc2VyTWVudSxcbiAgTWVudVN3aXRjaGVyLFxuXG4gIGRhdGEsXG5cbiAgd2lkZ2V0czoge1xuICAgIG5vdGlmeSxcbiAgICBmdWxsU2NyZWVuLFxuICAgIHBvcHVwLFxuICAgIGNvbmZpcm0sXG4gICAgbGFuZGluZyxcbiAgICBhY2Nlc3NEZW5pZWQsXG4gICAgZGVmYXVsdEdyaWRPYnNvbGV0ZSxcbiAgICBkZWZhdWx0VHJlZUxpc3QsXG4gICAgZGVmYXVsdEdyaWQsXG4gICAgZGVmYXVsdFRvb2xiYXIsXG4gICAgYmFja2dyb3VuZEltYWdlVmlld2VyLFxuICAgIGltYWdlQ3JvcERpYWxvZ1xuICB9LFxuICBwYWdlczoge1xuICAgIEFjY291bnRTZXR0aW5nc1BhZ2VcbiAgfSxcbiAgY29tcG9uZW50czoge1xuICAgIENETSxcbiAgICBTZXNzaW9uTm90aWZpZXIsXG4gICAgRmlsZUltcG9ydGVyLFxuICAgIEZpbGVVcGxvYWRlcixcbiAgfSxcblxuICBzdHlsaW5nLFxuICBoZWxwZXJzLFxuICB1dGlscyxcblxuICByZXBvcnRzOiB7XG4gICAgQ0RNUmVwb3J0UGFnZSxcbiAgICBEaWFncmFtUmVwb3J0UGFnZSxcbiAgICBHcmlkUmVwb3J0UGFnZSxcbiAgICBEYXNoYm9hcmRSZXBvcnRQYWdlLFxuICAgIERYUmVwb3J0UGFnZSxcbiAgICBTbGlkZXNob3dSZXBvcnRQYWdlLFxuICAgIEdhbnR0Q2hhcnRSZXBvcnRQYWdlLFxuICAgIGdyaWRDb2x1bW5UeXBlcyxcbiAgfSxcbiAgYnVzaW5lc3M6IHtcbiAgICBMaWNlbmNlU3RhdHVzLFxuICAgIE1lbnVJdGVtVHlwZSxcbiAgICBDZG1JbXBvcnRGaWxlTW9kZSxcbiAgICBGb290ZXJJbmRpY2F0b3JTdGF0dXMsXG4gICAgR3JpZERhdGFDb2x1bW5EYXRhVHlwZVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJc3pvbGVhVUk7XG5cbih3aW5kb3cgYXMgYW55KS5Jc3pvbGVhVUkgPSBJc3pvbGVhVUk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLG1CQUFjLElBQU0sSUFBTTtBQUFBLGlCQUNKLEFBQWhCLE9BQU8sTUFBUyxjQUFhLEtBQU8sRUFBRSxTQUFPLFVBQ3hCLEFBQWhCLE9BQU8sTUFBUyxZQUN2QixTQUFRLEtBQUssdURBQ2IsS0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUtqQixHQUFLLFdBQVcsNkVBQTZFLEtBQUssR0FBSyxRQUNsRyxJQUFJLEtBQUssQ0FBQSxVQUE4QixLQUFPLEVBQUUsTUFBTSxHQUFLLFVBRTdEOztBQUdULG1CQUFtQixJQUFLLElBQU0sSUFBTTtBQUNsQyxjQUFJLEtBQU0sSUFBSTtBQUNkLGFBQUksS0FBSyxPQUFPLEtBQ2hCLEdBQUksZUFBZSxRQUNuQixHQUFJLFNBQVMsV0FBWTtBQUN2QixjQUFPLEdBQUksVUFBVSxJQUFNO2FBRTdCLEdBQUksVUFBVSxXQUFZO0FBQ3hCLG9CQUFRLE1BQU07YUFFaEIsR0FBSTs7QUFHTixtQkFBc0IsSUFBSztBQUN6QixjQUFJLEtBQU0sSUFBSTtBQUVkLGFBQUksS0FBSyxRQUFRLElBQWpCO0FBQ0EsY0FBSTtB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
|