ids-enterprise-ng 18.2.3 → 18.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/datagrid/soho-datagrid.component.mjs +11 -2
- package/esm2022/lib/version/version-initializer.service.mjs +2 -2
- package/fesm2022/ids-enterprise-ng.mjs +11 -2
- package/fesm2022/ids-enterprise-ng.mjs.map +1 -1
- package/lib/datagrid/soho-datagrid.component.d.ts +3 -1
- package/package.json +3 -3
|
@@ -1325,6 +1325,7 @@ export class SohoDataGridComponent {
|
|
|
1325
1325
|
this.afterPaging = new EventEmitter();
|
|
1326
1326
|
this.beforeRowActivated = new EventEmitter();
|
|
1327
1327
|
this.rowActivated = new EventEmitter();
|
|
1328
|
+
this.columnChange = new EventEmitter();
|
|
1328
1329
|
this.rowDeactivated = new EventEmitter();
|
|
1329
1330
|
this.rowClicked = new EventEmitter();
|
|
1330
1331
|
this.rowDoubleClicked = new EventEmitter();
|
|
@@ -2362,6 +2363,11 @@ export class SohoDataGridComponent {
|
|
|
2362
2363
|
this.rowActivated.next(args);
|
|
2363
2364
|
});
|
|
2364
2365
|
}
|
|
2366
|
+
onColumnChange(args) {
|
|
2367
|
+
this.ngZone.run(() => {
|
|
2368
|
+
this.columnChange.next(args);
|
|
2369
|
+
});
|
|
2370
|
+
}
|
|
2365
2371
|
/**
|
|
2366
2372
|
* Event fired when a row is deactivated.
|
|
2367
2373
|
*/
|
|
@@ -2713,6 +2719,7 @@ export class SohoDataGridComponent {
|
|
|
2713
2719
|
.on('rowactivated', (_e, args) => this.onRowActivated(args))
|
|
2714
2720
|
.on('rowdeactivated', (_e, args) => this.onRowDeactivated(args))
|
|
2715
2721
|
.on('rowreorder', (_e, args) => this.onRowReordered(args))
|
|
2722
|
+
.on('columnchange', (_e, args) => this.onColumnChange(args))
|
|
2716
2723
|
.on('selected', (e, args, type, rowData) => this.onSelected({ e, rows: args, type, rowData }))
|
|
2717
2724
|
.on('settingschanged', (_e, args) => this.onSettingsChanged(args))
|
|
2718
2725
|
.on('sorted', (_e, args) => this.onSorted(args))
|
|
@@ -2868,7 +2875,7 @@ export class SohoDataGridComponent {
|
|
|
2868
2875
|
}
|
|
2869
2876
|
}
|
|
2870
2877
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: SohoDataGridComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: i1.SohoDataGridService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2871
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: SohoDataGridComponent, selector: "[soho-datagrid]", inputs: { gridOptions: "gridOptions", idProperty: "idProperty", frozenColumns: "frozenColumns", cellNavigation: "cellNavigation", rowNavigation: "rowNavigation", alternateRowShading: "alternateRowShading", dataset: "dataset", columnReorder: "columnReorder", disableClientSort: "disableClientSort", disableClientFilter: "disableClientFilter", resultsText: "resultsText", showFilterTotal: "showFilterTotal", editable: "editable", isRowDisabled: "isRowDisabled", allowOneExpandedRow: "allowOneExpandedRow", rowTemplate: "rowTemplate", rowTemplateComponent: "rowTemplateComponent", rowTemplateComponentInputs: "rowTemplateComponentInputs", rowTemplateField: "rowTemplateField", selectOnEdit: "selectOnEdit", isList: "isList", menuId: "menuId", menuBeforeOpen: "menuBeforeOpen", rowHeight: "rowHeight", fixedRowHeight: "fixedRowHeight", selectable: "selectable", showSelectAllCheckBox: "showSelectAllCheckBox", clickToSelect: "clickToSelect", toolbar: "toolbar", initializeToolbar: "initializeToolbar", saveUserSettings: "saveUserSettings", paging: "paging", pagesize: "pagesize", pagesizes: "pagesizes", indeterminate: "indeterminate", actionableMode: "actionableMode", saveColumns: "saveColumns", source: "source", filterable: "filterable", filterWhenTyping: "filterWhenTyping", treeGrid: "treeGrid", uniqueId: "uniqueId", rowReorder: "rowReorder", showDirty: "showDirty", addCellLayoutClass: "addCellLayoutClass", resizeMode: "resizeMode", headerBackgroundColor: "headerBackgroundColor", headerMenuId: "headerMenuId", headerMenuSelected: "headerMenuSelected", headerMenuBeforeOpen: "headerMenuBeforeOpen", disableRowDeactivation: "disableRowDeactivation", disableRowDeselection: "disableRowDeselection", userObject: "userObject", groupable: "groupable", data: "data", columns: "columns", summaryRowColumns: "summaryRowColumns", spacerColumn: "spacerColumn", sizeColumnsEqually: "sizeColumnsEqually", expandableRow: "expandableRow", redrawOnResize: "redrawOnResize", exportConvertNegative: "exportConvertNegative", overrideTabbing: "overrideTabbing", showEditorIcons: "showEditorIcons", stickyHeader: "stickyHeader", attributes: "attributes", columnSizing: "columnSizing", stretchColumn: "stretchColumn", stretchColumnOnChange: "stretchColumnOnChange", showPageSizeSelector: "showPageSizeSelector", hidePagerOnOnePage: "hidePagerOnOnePage", columnGroup: "columnGroup", emptyMessage: "emptyMessage", enableTooltips: "enableTooltips", selectChildren: "selectChildren", allowChildExpandOnMatch: "allowChildExpandOnMatch", sohoDatagrid: ["soho-datagrid", "sohoDatagrid"], onBeforeSelect: "onBeforeSelect", allowSelectAcrossPages: "allowSelectAcrossPages", selectAllCurrentPage: "selectAllCurrentPage", columnIds: "columnIds", showNewRowIndicator: "showNewRowIndicator", onExpandChildren: "onExpandChildren", onCollapseChildren: "onCollapseChildren", onPostRenderCell: "onPostRenderCell", onDestroyCell: "onDestroyCell", onEditCell: "onEditCell", onKeyDown: "onKeyDown", onExpandRow: "onExpandRow", fallbackImage: "fallbackImage", fallbackTooltip: "fallbackTooltip" }, outputs: { selected: "selected", cellchange: "cellchange", rowRemove: "rowRemove", rowAdd: "rowAdd", filtered: "filtered", expandrow: "expandrow", keydown: "keydown", exiteditmode: "exiteditmode", beforeentereditmode: "beforeentereditmode", entereditmode: "entereditmode", collapserow: "collapserow", sorted: "sorted", searched: "searched", nextPage: "nextPage", previousPage: "previousPage", firstPage: "firstPage", lastPage: "lastPage", pageSizeChange: "pageSizeChange", beforePaging: "beforePaging", afterPaging: "afterPaging", beforeRowActivated: "beforeRowActivated", rowActivated: "rowActivated", rowDeactivated: "rowDeactivated", rowClicked: "rowClicked", rowDoubleClicked: "rowDoubleClicked", contextMenu: "contextMenu", rowReordered: "rowReordered", openFilterRow: "openFilterRow", closeFilterRow: "closeFilterRow", settingsChanged: "settingsChanged", rendered: "rendered", afterRender: "afterRender", verticalScroll: "verticalScroll", filteroperatorchanged: "filteroperatorchanged" }, host: { properties: { "class.is-disabled": "this.isDisabled", "attr.role": "this.datagridRole" } }, ngImport: i0, template: ' <ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2878
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: SohoDataGridComponent, selector: "[soho-datagrid]", inputs: { gridOptions: "gridOptions", idProperty: "idProperty", frozenColumns: "frozenColumns", cellNavigation: "cellNavigation", rowNavigation: "rowNavigation", alternateRowShading: "alternateRowShading", dataset: "dataset", columnReorder: "columnReorder", disableClientSort: "disableClientSort", disableClientFilter: "disableClientFilter", resultsText: "resultsText", showFilterTotal: "showFilterTotal", editable: "editable", isRowDisabled: "isRowDisabled", allowOneExpandedRow: "allowOneExpandedRow", rowTemplate: "rowTemplate", rowTemplateComponent: "rowTemplateComponent", rowTemplateComponentInputs: "rowTemplateComponentInputs", rowTemplateField: "rowTemplateField", selectOnEdit: "selectOnEdit", isList: "isList", menuId: "menuId", menuBeforeOpen: "menuBeforeOpen", rowHeight: "rowHeight", fixedRowHeight: "fixedRowHeight", selectable: "selectable", showSelectAllCheckBox: "showSelectAllCheckBox", clickToSelect: "clickToSelect", toolbar: "toolbar", initializeToolbar: "initializeToolbar", saveUserSettings: "saveUserSettings", paging: "paging", pagesize: "pagesize", pagesizes: "pagesizes", indeterminate: "indeterminate", actionableMode: "actionableMode", saveColumns: "saveColumns", source: "source", filterable: "filterable", filterWhenTyping: "filterWhenTyping", treeGrid: "treeGrid", uniqueId: "uniqueId", rowReorder: "rowReorder", showDirty: "showDirty", addCellLayoutClass: "addCellLayoutClass", resizeMode: "resizeMode", headerBackgroundColor: "headerBackgroundColor", headerMenuId: "headerMenuId", headerMenuSelected: "headerMenuSelected", headerMenuBeforeOpen: "headerMenuBeforeOpen", disableRowDeactivation: "disableRowDeactivation", disableRowDeselection: "disableRowDeselection", userObject: "userObject", groupable: "groupable", data: "data", columns: "columns", summaryRowColumns: "summaryRowColumns", spacerColumn: "spacerColumn", sizeColumnsEqually: "sizeColumnsEqually", expandableRow: "expandableRow", redrawOnResize: "redrawOnResize", exportConvertNegative: "exportConvertNegative", overrideTabbing: "overrideTabbing", showEditorIcons: "showEditorIcons", stickyHeader: "stickyHeader", attributes: "attributes", columnSizing: "columnSizing", stretchColumn: "stretchColumn", stretchColumnOnChange: "stretchColumnOnChange", showPageSizeSelector: "showPageSizeSelector", hidePagerOnOnePage: "hidePagerOnOnePage", columnGroup: "columnGroup", emptyMessage: "emptyMessage", enableTooltips: "enableTooltips", selectChildren: "selectChildren", allowChildExpandOnMatch: "allowChildExpandOnMatch", sohoDatagrid: ["soho-datagrid", "sohoDatagrid"], onBeforeSelect: "onBeforeSelect", allowSelectAcrossPages: "allowSelectAcrossPages", selectAllCurrentPage: "selectAllCurrentPage", columnIds: "columnIds", showNewRowIndicator: "showNewRowIndicator", onExpandChildren: "onExpandChildren", onCollapseChildren: "onCollapseChildren", onPostRenderCell: "onPostRenderCell", onDestroyCell: "onDestroyCell", onEditCell: "onEditCell", onKeyDown: "onKeyDown", onExpandRow: "onExpandRow", fallbackImage: "fallbackImage", fallbackTooltip: "fallbackTooltip" }, outputs: { selected: "selected", cellchange: "cellchange", rowRemove: "rowRemove", rowAdd: "rowAdd", filtered: "filtered", expandrow: "expandrow", keydown: "keydown", exiteditmode: "exiteditmode", beforeentereditmode: "beforeentereditmode", entereditmode: "entereditmode", collapserow: "collapserow", sorted: "sorted", searched: "searched", nextPage: "nextPage", previousPage: "previousPage", firstPage: "firstPage", lastPage: "lastPage", pageSizeChange: "pageSizeChange", beforePaging: "beforePaging", afterPaging: "afterPaging", beforeRowActivated: "beforeRowActivated", rowActivated: "rowActivated", columnChange: "columnChange", rowDeactivated: "rowDeactivated", rowClicked: "rowClicked", rowDoubleClicked: "rowDoubleClicked", contextMenu: "contextMenu", rowReordered: "rowReordered", openFilterRow: "openFilterRow", closeFilterRow: "closeFilterRow", settingsChanged: "settingsChanged", rendered: "rendered", afterRender: "afterRender", verticalScroll: "verticalScroll", filteroperatorchanged: "filteroperatorchanged" }, host: { properties: { "class.is-disabled": "this.isDisabled", "attr.role": "this.datagridRole" } }, ngImport: i0, template: ' <ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2872
2879
|
}
|
|
2873
2880
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: SohoDataGridComponent, decorators: [{
|
|
2874
2881
|
type: Component,
|
|
@@ -3078,6 +3085,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
|
|
|
3078
3085
|
type: Output
|
|
3079
3086
|
}], rowActivated: [{
|
|
3080
3087
|
type: Output
|
|
3088
|
+
}], columnChange: [{
|
|
3089
|
+
type: Output
|
|
3081
3090
|
}], rowDeactivated: [{
|
|
3082
3091
|
type: Output
|
|
3083
3092
|
}], rowClicked: [{
|
|
@@ -3137,4 +3146,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
|
|
|
3137
3146
|
}], fallbackTooltip: [{
|
|
3138
3147
|
type: Input
|
|
3139
3148
|
}] } });
|
|
3140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29oby1kYXRhZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZHMtZW50ZXJwcmlzZS1uZy9zcmMvbGliL2RhdGFncmlkL3NvaG8tZGF0YWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBSVIsUUFBUSxFQUtULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBb0MxRCxNQUFNLE9BQU8sd0JBQXdCO0lBV25DLFlBQ1MsU0FBdUMsRUFDdkMsSUFBc0M7UUFEdEMsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBa0M7UUFSL0MsK0RBQStEO1FBQy9ELGFBQVEsR0FBRyxJQUFJLENBQUM7SUFRaEIsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFrRDtRQUNyRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsZ0ZBQWdGO1FBQ2hGLGtCQUFrQjtRQUNsQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2VBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7SUFF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YixNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsa0JBQWtCO3NCQURqQixNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNO2dCQUlQLGdCQUFnQjtzQkFEZixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAscUJBQXFCO3NCQURwQixNQUFNO2dCQVFQLFVBQVU7c0JBRFQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBTzVCLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyxXQUFXO2dCQWkwQlgsY0FBYztzQkFBMUIsS0FBSztnQkFrQk8sc0JBQXNCO3NCQUFsQyxLQUFLO2dCQWlCTyxvQkFBb0I7c0JBQWhDLEtBQUs7Z0JBaUJPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUJPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFjTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBZU8sa0JBQWtCO3NCQUE5QixLQUFLO2dCQWVPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFhTyxhQUFhO3NCQUF6QixLQUFLO2dCQWFPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBYU8sU0FBUztzQkFBckIsS0FBSztnQkFhTyxXQUFXO3NCQUF2QixLQUFLO2dCQVNPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBZ0JPLGVBQWU7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgRWxlbWVudFJlZixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3B0aW9uYWwsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIEluamVjdG9yLFxuICBBcHBsaWNhdGlvblJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBUeXBlLFxuICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFyZ3VtZW50SGVscGVyIH0gZnJvbSAnLi4vdXRpbHMvYXJndW1lbnQuaGVscGVyJztcbmltcG9ydCB7IFNvaG9EYXRhR3JpZFNlcnZpY2UgfSBmcm9tICcuL3NvaG8tZGF0YWdyaWQuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIFNvaG9EYXRhR3JpZFR5cGUgPSAnYXV0bycgfCAnY29udGVudC1vbmx5JztcblxuLyoqXG4gKiBDb250cmFjdCBmb3IgY2VsbCBlZGl0b3JzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuZGVkU29ob0RhdGFHcmlkQ2VsbEVkaXRvciBleHRlbmRzIFNvaG9EYXRhR3JpZENlbGxFZGl0b3Ige1xuICAvLyBUaGUgdHlwZSBvZiB0aGUgY29tcG9uZW50LlxuICBjb21wb25lbnQ6IFR5cGU8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj47XG5cbiAgLy8gVGhlIGFyZ3MgcGFzc2VkIHRvIHRoZSBlZGl0b3JcbiAgYXJnczogU29ob0RhdGFHcmlkRWRpdENlbGxGdW5jdGlvbkFyZ3M7XG5cbiAgLy8gVGhpcyBpcyB0aGUgaW5wdXQgZWxlbWVudCAoc2luZ2xlKSB3aXRoaW4gdGhlIGZpZWxkXG4gIGlucHV0PzogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcblxuICAvLyBVc2UgdGhlIGRpcmVjdCB2YWx1ZSBmcm9tIHRoZSBkYXRhc2V0IHZzIHRoZSBmb3JtYXR0ZWQgdmFsdWVcbiAgdXNlVmFsdWU6IGJvb2xlYW47XG5cbiAgLy8gVGhlIHBhcmVudCBjbGFzcyBvZiB0aGUgaW5uZXIgZWRpdG9yLiBVc2VkIHRvIGRldGVybWluZSBpZiBvcGVuIG9yIG5vdC5cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHRoZSBlZGl0IGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gY29tcG9uZW50LiAgVGhlIGNvbnRyb2xcbiAgICogbWlzdCBjb25mb3JtIHRvIHRoZSBTb2hvRGF0YUdyaWRDZWxsRWRpdG9yIGNvbnRyYWN0LlxuICAgKi9cbiAgaW5pdChjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGVkaXRvci5cbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFNvaG9Bbmd1bGFyRWRpdG9yQWRhcHRlciBpbXBsZW1lbnRzIEV4dGVuZGVkU29ob0RhdGFHcmlkQ2VsbEVkaXRvciB7XG4gIGNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPiB8IG51bGw7XG5cbiAgaW5wdXQ/OiBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIFVzZSB0aGUgZGlyZWN0IHZhbHVlIGZyb20gdGhlIGRhdGFzZXQgdnMgdGhlIGZvcm1hdHRlZCB2YWx1ZVxuICB1c2VWYWx1ZSA9IHRydWU7XG5cbiAgLy8gVGhlIHBhcmVudCBjbGFzcyBvZiB0aGUgaW5uZXIgZWRpdG9yLiBVc2VkIHRvIGRldGVybWluZSBpZiBvcGVuIG9yIG5vdC5cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb21wb25lbnQ6IFR5cGU8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4sXG4gICAgcHVibGljIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRDZWxsRnVuY3Rpb25BcmdzKSB7XG4gIH1cblxuICBpbml0KGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+KSB7XG4gICAgLy8gU3RvcmUgdGhlIGNvbXBvbmVudC5cbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcblxuICAgIC8vIFRoZSBTb2hvIGRhdGFncmlkIHdhbnRzIGFuIGlucHV0IGNvbnRyb2wsIG90aGVyd2lzZSBpdCB3b250IGFjY2VwdCB0aGUgZWRpdG9yXG4gICAgLy8gYXMgYSBjb21wb25lbnQuXG4gICAgLy8gQHRvZG8gdGFsayB0byBUaW0gYWJvdXQgcmVtb3ZpbmcgdGhpcyByZXF1aXJlbWVudC5cbiAgICB0aGlzLmlucHV0ID0gJCh0aGlzLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dDpmaXJzdCcpO1xuICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2VcbiAgICAgICYmIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmNsYXNzTmFtZVxuICAgICAgPyB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jbGFzc05hbWUgOiAnLmVkaXRvcic7XG4gIH1cblxuICB2YWwodmFsdWU/OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UudmFsKHZhbHVlKTtcbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50UmVmPy5pbnN0YW5jZS5mb2N1cygpO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCByZWZyZXNoIGhpbnRzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBcInJlZnJlc2hcIiBpc1xuICogcmVxdWlyZWQgYWZ0ZXIgdGhlIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2VzcyBoYXMgY29tcGxldGVkIGFuZCB0aGVcbiAqIEFmdGVyVmlld0NoZWNrZWQgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBAdG9kbyByZXNvbHZlIG5vLXNoYWRvd1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG5lbnVtIFJlZnJlc2hIaW50RmxhZ3Mge1xuICAvLyBObyByZWZyZXNoIHJlcXVpcmVkLlxuICBOb25lID0gMCxcbiAgLy8gVGhlIHJvd3MgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXG4gIFJlbmRlclJvd3MgPSAxLFxuICAvLyBUaGUgaGVhZGVyIG5lZWRzIHRvIGJlIHJlLXJlbmVuZGVyZWQuXG4gIFJlbmRlckhlYWRlciA9IDIsXG4gIC8vIEEgZnVsbCByZWJ1aWxkIGlzIHJlcXVpcmVkLlxuICBSZWJ1aWxkID0gNFxufVxuXG4vKipcbiAqIEFuZ3VsYXIgV3JhcHBlciBmb3IgdGhlIFNvaG8gRGF0YSBHcmlkIENvbXBvbmVudC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBzZWFyY2hlcyBmb3IgYW4gZWxlbWVudCB3aXRoIHRoZSBhdHRyaWJ1dGVcbiAqICdzb2hvLWRhdGFncmlkJyBpbiB0aGUgcGFyZW50J3MgRE9NIHRyZWUsIGluaXRpYWxpc2luZyBpdCB3aXRoXG4gKiB0aGUgU29obyBkYXRhZ3JpZCBjb250cm9sLlxuICpcbiAqIFRoZSBkYXRhIGlzIHByb3ZpZGVkIGVpdGhlciBieSBhIGNvbXBvbmVudCBpbnB1dCBvciBhbiBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIERhdGFHcmlkU2VydmljZSBpbnRlcmZhY2UsIGJ5IHNwZWNpZnlpbmcgYW4gaW1wbGVtZW50YXRpb25cbiAqIG9uIHRoZSBob3N0aW5nIGNvbXBvbmVudCwgaS5lLlxuICpcbiAqIHByb3ZpZGVyczogWyBwcm92aWRlOiBEYXRhR3JpZFNlcnZpY2UsIHVzZUNsYXNzOiBEYXRhR3JpZERlbW9TZXJ2aWNlfSBdXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1tzb2hvLWRhdGFncmlkXScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgdGVtcGxhdGU6ICcgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFNvaG9EYXRhR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkIHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNvaG8gRGF0YSBHcmlkIFR5cGVzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBcImF1dG9cIiB3aGVyZSBjb2x1bW5zIGFuZCByb3dzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBpbmplY3RlZCBzZXJ2aWNlXG4gIC8vIChpZiBkZWZpbmVkKSBvciB2aWEgdGhlIElucHV0cywgb3RoZXJ3aXNlLlxuICBzdGF0aWMgQVVUTzogU29ob0RhdGFHcmlkVHlwZSA9ICdhdXRvJztcblxuICAvLyAnY29udGVudC1vbmx5JyB3aGVyZSB0YWJsZSBlbGVtZW50cyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlXG4gIC8vIGNvbHVtbnMgYW5kIHJvd3MuXG4gIHN0YXRpYyBDT05URU5UX09OTFk6IFNvaG9EYXRhR3JpZFR5cGUgPSAnY29udGVudC1vbmx5JztcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENvbXBvbmVudCBJbnB1dHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBncmlkIG9wdGlvbnMgZm9yIHRoZSBkYXRhIGdyaWQsIG1hcmtpbmcgdGhpcyBjb21wb25lbnRzXG4gICAqIGFzIHJlcXVpcmluZyBhIGZ1bGwgcmVidWlsZCBhdCB0aGUgZW5kIG9mIHRoZSBjaGFuZ2UgbGlmZWN5Y2xlLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JpZE9wdGlvbnMgLSBub3QgbnVsbCBncmlkIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZ3JpZE9wdGlvbnMoZ3JpZE9wdGlvbnM6IFNvaG9EYXRhR3JpZE9wdGlvbnMpIHtcbiAgICBBcmd1bWVudEhlbHBlci5jaGVja05vdE51bGwoJ2dyaWRPcHRpb25zJywgZ3JpZE9wdGlvbnMpO1xuXG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMgPSBncmlkT3B0aW9ucztcblxuICAgIHRoaXMuY2hlY2tGb3JDb21wb25lbnRFZGl0b3JzKCk7XG4gICAgdGhpcy5jaGVja0ZvclN1bW1hcnlSb3dTZXR0aW5ncygpO1xuXG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlICdzZXR0aW5ncycgYXMgdGhlIFJlYnVpbGQgd2lsbCBjcmVhdGVcbiAgICAgIC8vIGEgbmV3IGNvbnRyb2wgd2l0aCB0aGUgX2dyaWRPcHRpb25zLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZ3JpZE9wdGlvbnMnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuICBnZXQgZ3JpZE9wdGlvbnMoKTogU29ob0RhdGFHcmlkT3B0aW9ucyB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgd2hpY2ggcHJvcGVydHkgaW4gdGhlIGRhdGEgcm93cyBpcyB0byBiZSB1c2VkIGFzIHRoZSBpZCBvZiBlYWNoXG4gICAqIHJvdyBvZiB0aGUgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGlkUHJvcGVydHkgc3RyaW5nIGlkXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaWRQcm9wZXJ0eShpZFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5pZFByb3BlcnR5ID0gaWRQcm9wZXJ0eTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pZFByb3BlcnR5ID0gaWRQcm9wZXJ0eTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2lkUHJvcGVydHknLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpZFByb3BlcnR5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmlkUHJvcGVydHk7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZyb3plbkNvbHVtbnMgb3B0aW9uIC0gcmV0dXJucyB0aGUgcmVxdWVzdGVkXG4gICAqIHZhbHVlIGlmIHRoZSBjb250cm9sIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5cbiAgICovXG4gIGdldCBmcm96ZW5Db2x1bW5zKCk6IFNvaG9EYXRhR3JpZEZyb3plbkNvbHVtbnMgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5mcm96ZW5Db2x1bW5zO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmZyb3plbkNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZnJvemVuQ29sdW1ucyBzZXR0aW5ncyAtIHdpbGwgZm9yY2UgYSBncmlkIHJlYnVpbGQgaWYgdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmcm96ZW5Db2x1bW5zIC0gdGhlIGZyb3plbkNvbHVtbnMgc2V0dGluZ3MuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZnJvemVuQ29sdW1ucyhmcm96ZW5Db2x1bW5zOiBTb2hvRGF0YUdyaWRGcm96ZW5Db2x1bW5zIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZnJvemVuQ29sdW1ucyA9IGZyb3plbkNvbHVtbnM7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZnJvemVuQ29sdW1ucyA9IGZyb3plbkNvbHVtbnM7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2Zyb3plbkNvbHVtbnMnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlIGFsbG93c1xuICAgKi9cbiAgQElucHV0KCkgc2V0IGNlbGxOYXZpZ2F0aW9uKGNlbGxOYXZpZ2F0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY2VsbE5hdmlnYXRpb24gPSBjZWxsTmF2aWdhdGlvbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNlbGxOYXZpZ2F0aW9uID0gY2VsbE5hdmlnYXRpb247XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjZWxsTmF2aWdhdGlvbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNlbGxOYXZpZ2F0aW9uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jZWxsTmF2aWdhdGlvbjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5jZWxsTmF2aWdhdGlvbjtcbiAgfVxuXG4gIGdldCBpc1ZlcnRpY2FsU2Nyb2xsVG9FbmQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmlzVmVydGljYWxTY3JvbGxUb0VuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgcm93IG5hdmlnYXRpb24gc2V0dGluZyBvZiB0aGUgZGF0YSBncmlkLiBJZiByb3dOYXZpZ2F0aW9uXG4gICAqIGlzIFwiZmFsc2XigJ0gdGhlbiBhIGJvcmRlciBpcyBub3QgZGlzcGxheWVkIGFyb3VuZCB0aGUgcm93LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gcm93bE5hdmlnYXRpb24gaSBcImZhbHNl4oCdIHRoZW4gZ3JpZCB3aWxsIE5PVCBzaG93IGEgYm9yZGVyIGFyb3VuZCB0aGUgcm93LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHJvd05hdmlnYXRpb24ocm93TmF2aWdhdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd05hdmlnYXRpb24gPSByb3dOYXZpZ2F0aW9uO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mucm93TmF2aWdhdGlvbiA9IHJvd05hdmlnYXRpb247XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdyb3dOYXZpZ2F0aW9uJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcm93TmF2aWdhdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93TmF2aWdhdGlvbjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc3BsYXlzIHRoZSByb3dzIGluIHRoZSBncmlkIHVzaW5nIGFsdGVybmF0ZSBzaGFkaW5nLCBvdGhlcndpc2VcbiAgICogYWxsIHRoZSByb3dzIHVzZSB0aGUgc2FtZSBzaGFkaW5nLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGFsdGVybmF0ZVJvd1NoYWRpbmcoYWx0ZXJuYXRlUm93U2hhZGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmFsdGVybmF0ZVJvd1NoYWRpbmcgPSBhbHRlcm5hdGVSb3dTaGFkaW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuYWx0ZXJuYXRlUm93U2hhZGluZyA9IGFsdGVybmF0ZVJvd1NoYWRpbmc7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdhbHRlcm5hdGVSb3dTaGFkaW5nJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWx0ZXJuYXRlUm93U2hhZGluZygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93TmF2aWdhdGlvbjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5hbHRlcm5hdGVSb3dTaGFkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRvIGJlIGRpc3BsYXllZCBwcm92aWRlZCBhcyBhbiBhcnJheVxuICAgKiBvZiBqc29uIG9iamVjdHMgY29tcGF0aWJsZSB3aXRoIHRoZSBjb2x1bW4gbWV0YVxuICAgKiBkYXRhIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YXNldCAtIGFycmF5IG9mIGpzb24gb2JqZWN0c1xuICAgKi9cbiAgQElucHV0KCkgc2V0IGRhdGFzZXQoZGF0YXNldDogQXJyYXk8YW55PiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmRhdGFzZXQgPSBkYXRhc2V0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHBhZ2VySW5mbzogU29ob1BhZ2VyUGFnaW5nSW5mbyA9IHt9O1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5kYXRhc2V0ID0gZGF0YXNldDtcblxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAvLyBAdG9kbyBkbyB3ZSBuZWVkIGhpbnRzIGFzIHRoaXMgbWF5IGJlIGJ1bmRsZWQgdXAgd2l0aCBvdGhlciBjaGFuZ2VzLlxuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnVwZGF0ZURhdGFzZXQoKGRhdGFzZXQgYXMgYW55KSwgcGFnZXJJbmZvKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRhdGFzZXQgY3VycmVudGx5IGRpc3BsYXllZCBieSB0aGUgZGF0YWdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygb2JqZWN0cy5cbiAgICovXG4gIGdldCBkYXRhc2V0KCk6IGFueVtdIHwgdW5kZWZpbmVkIHtcblxuICAgIC8vIElmIHRoZSBTb2hvIGNvbnRyb2wgaGFzIGJlZW4gY3JlYXRlZCwgdGhlbiB0aGUgZGF0YXNldFxuICAgIC8vIGluIHRoZSBzZXR0aW5ncyBvYmplY3Qgd2lsbCBjb250YWluIHRoZSByb3dzIGN1cnJlbnRseVxuICAgIC8vIG9uIGRpc3BsYXkuXG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRhdGFzZXQ7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gbm8gZGF0YSBoYXMgYmVlbiBzZXQgKG9yIHBvdGVudGlhbGx5XG4gICAgLy8gcmV0cmlldmVkIGZyb20gYSBzZXJ2aWNlKSwgc28gdGhlIG9ubHkgb3B0aW9uIGlzIHRoZVxuICAgIC8vIElucHV0IGRhdGFzZXQsIHdoaWNoIG1heSBiZSB1bmRlZmluZWQuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRhdGFzZXQgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSB0aGUgY29sdW1ucyBjYW4gYmUgcmVvcmRlcnM7IG90aGVyd2lzZSBpZiBmYWxzZSB0aGV5IGFyZSBmaXhlZC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5SZW9yZGVyKGNvbHVtblJlb3JkZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5SZW9yZGVyID0gY29sdW1uUmVvcmRlcjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jb2x1bW5SZW9yZGVyID0gY29sdW1uUmVvcmRlcjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2NvbHVtblJlb3JkZXInLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlckhlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbHVtblJlb3JkZXIoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmNvbHVtblJlb3JkZXI7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uUmVvcmRlcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlQ2xpZW50U29ydChkaXNhYmxlQ2xpZW50U29ydDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVDbGllbnRTb3J0ID0gZGlzYWJsZUNsaWVudFNvcnQ7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZUNsaWVudFNvcnQgPSBkaXNhYmxlQ2xpZW50U29ydDtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZUNsaWVudFNvcnQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVDbGllbnRTb3J0O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVDbGllbnRTb3J0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRpc2FibGVDbGllbnRGaWx0ZXIoZGlzYWJsZUNsaWVudEZpbHRlcjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVDbGllbnRGaWx0ZXIgPSBkaXNhYmxlQ2xpZW50RmlsdGVyO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVDbGllbnRGaWx0ZXIgPSBkaXNhYmxlQ2xpZW50RmlsdGVyO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNhYmxlQ2xpZW50RmlsdGVyKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50RmlsdGVyO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVDbGllbnRGaWx0ZXI7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVzdWx0c1RleHQocmVzdWx0c1RleHQ6IFNvaG9EYXRhR3JpZFJlc3VsdHNUZXh0RnVuY3Rpb24pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yZXN1bHRzVGV4dCA9IHJlc3VsdHNUZXh0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yZXN1bHRzVGV4dCA9IHJlc3VsdHNUZXh0O1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzaG93RmlsdGVyVG90YWwoc2hvd0ZpbHRlclRvdGFsOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd0ZpbHRlclRvdGFsID0gc2hvd0ZpbHRlclRvdGFsO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dGaWx0ZXJUb3RhbCA9IHNob3dGaWx0ZXJUb3RhbDtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd0ZpbHRlclRvdGFsKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaG93RmlsdGVyVG90YWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNob3dGaWx0ZXJUb3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgZ3JpZCBhbGxvd3MgZWRpdHMsIG90aGVyd2lzZSBpZiBmYWxzZSBlZGl0cyBhcmUgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZWRpdGFibGUoZWRpdGFibGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5lZGl0YWJsZSA9IGVkaXRhYmxlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmVkaXRhYmxlID0gZWRpdGFibGU7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdlZGl0YWJsZScsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVkaXRhYmxlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5lZGl0YWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5lZGl0YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnB1dCB0aGF0IGRlZmluZXMgYSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBkaXNhYmxlZCwgb3Igbm90LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGlzUm93RGlzYWJsZWQoaXNSb3dEaXNhYmxlZDogU29ob0lzUm93RGlzYWJsZWRGdW5jdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmlzUm93RGlzYWJsZWQgPSBpc1Jvd0Rpc2FibGVkO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmlzUm93RGlzYWJsZWQgPSBpc1Jvd0Rpc2FibGVkO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaXNSb3dEaXNhYmxlZCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzUm93RGlzYWJsZWQoKTogU29ob0lzUm93RGlzYWJsZWRGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmlzUm93RGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaXNSb3dEaXNhYmxlZDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhbGxvd09uZUV4cGFuZGVkUm93KGFsbG93T25lRXhwYW5kZWRSb3c6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd09uZUV4cGFuZGVkUm93ID0gYWxsb3dPbmVFeHBhbmRlZFJvdztcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5hbGxvd09uZUV4cGFuZGVkUm93ID0gYWxsb3dPbmVFeHBhbmRlZFJvdztcbiAgICB9XG4gIH1cblxuICBnZXQgYWxsb3dPbmVFeHBhbmRlZFJvdygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWxsb3dPbmVFeHBhbmRlZFJvdztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWxsb3dPbmVFeHBhbmRlZFJvdztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByb3dUZW1wbGF0ZShyb3dUZW1wbGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dUZW1wbGF0ZSA9IHJvd1RlbXBsYXRlO1xuICAgIH1cbiAgfVxuXG4gIGdldCByb3dUZW1wbGF0ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93VGVtcGxhdGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcm93VGVtcGxhdGVDb21wb25lbnQocm93VGVtcGxhdGVDb21wb25lbnQ6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50ID0gcm93VGVtcGxhdGVDb21wb25lbnQ7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93VGVtcGxhdGVDb21wb25lbnQgPSByb3dUZW1wbGF0ZUNvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICBnZXQgcm93VGVtcGxhdGVDb21wb25lbnQoKTogYW55IHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93VGVtcGxhdGVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzKHJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzOiBhbnkpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cyA9IHJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzID0gcm93VGVtcGxhdGVDb21wb25lbnRJbnB1dHM7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByb3dUZW1wbGF0ZUZpZWxkKHJvd1RlbXBsYXRlRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd1RlbXBsYXRlRmllbGQgPSByb3dUZW1wbGF0ZUZpZWxkO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1RlbXBsYXRlRmllbGQgPSByb3dUZW1wbGF0ZUZpZWxkO1xuICAgIH1cbiAgfVxuXG4gIGdldCByb3dUZW1wbGF0ZUZpZWxkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1RlbXBsYXRlRmllbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnJvd1RlbXBsYXRlRmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBzZWxlY3QgdGhlIGNlbGwgdGV4dCBzb29uIGFzIGVudGVyaW5nIGVkaXQgbW9kZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNlbGVjdE9uRWRpdChzZWxlY3RPbkVkaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RPbkVkaXQgPSBzZWxlY3RPbkVkaXQ7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2VsZWN0T25FZGl0ID0gc2VsZWN0T25FZGl0O1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZWRpdGFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3RPbkVkaXQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdE9uRWRpdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdE9uRWRpdDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpc0xpc3QoaXNMaXN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaXNMaXN0ID0gaXNMaXN0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuaXNMaXN0ID0gaXNMaXN0O1xuXG4gICAgICAvLyBjYWxsaW5nIHJlYnVpbGQgYXMgYSBicnV0ZSBmb3JjZSB3YXkgb2YgdWRwYXRpbmcgdGhlIHZpZXcuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpc0xpc3QnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0xpc3QoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmlzTGlzdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5pc0xpc3Q7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbWVudUlkKG1lbnVJZDogYW55KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMubWVudUlkID0gbWVudUlkO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MubWVudUlkID0gbWVudUlkO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnbWVudUlkJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKiogYmVmb3JlT3BlbiAtIGFqYXggY2FsbGJhY2sgZm9yIG9wZW4gZXZlbnQgKi9cbiAgQElucHV0KCkgc2V0IG1lbnVCZWZvcmVPcGVuKG1lbnVCZWZvcmVPcGVuOiBTb2hvUG9wdXBNZW51U291cmNlRnVuY3Rpb24pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5tZW51QmVmb3JlT3BlbiA9IG1lbnVCZWZvcmVPcGVuO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MubWVudUJlZm9yZU9wZW4gPSBtZW51QmVmb3JlT3BlbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ21lbnVCZWZvcmVPcGVuJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbWVudUJlZm9yZU9wZW4oKTogU29ob1BvcHVwTWVudVNvdXJjZUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuc2V0dGluZ3MubWVudUJlZm9yZU9wZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcm93IGhlaWdodCBmb3IgdGhlIGdyaWQsIHRvIGJlIG9uZSBvZiB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSByb3dIZWlnaHQgLSAnZXh0cmEtc21hbGwnIHwgJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJ1xuICAgKi9cbiAgQElucHV0KCkgc2V0IHJvd0hlaWdodChyb3dIZWlnaHQ6IFNvaG9EYXRhR3JpZFJvd0hlaWdodCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcblxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnJvd0hlaWdodChyb3dIZWlnaHQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcm93IHRvIHNvbWV0aGluZyBvdGhlciB0aGVuIHRoZSB0aHJlZSBidWlsdCBpbiByb3dIZWlnaHRzLlxuICAgKlxuICAgKiBAcGFyYW0gZml4ZWRSb3dIZWlnaHQgQW55IGludGVnZXJcbiAgICovXG4gIEBJbnB1dCgpIHNldCBmaXhlZFJvd0hlaWdodChmaXhlZFJvd0hlaWdodDogbnVtYmVyIHwgc3RyaW5nIHwgRnVuY3Rpb24pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5maXhlZFJvd0hlaWdodCA9IGZpeGVkUm93SGVpZ2h0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZml4ZWRSb3dIZWlnaHQgPSBmaXhlZFJvd0hlaWdodDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZpeGVkUm93SGVpZ2h0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzZWxlY3Rpb24gaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdGFibGUgdmFsaWQgdmFsdWVzIGFyZTogJ211bHRpcGxlJywgJ3NpbmdsZScsICdtaXhlZCcsICdzaWJsaW5ncycgYW5kIGZhbHNlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNlbGVjdGFibGUoc2VsZWN0YWJsZTogYW55KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgLy8gSnVzdCBjaGFuZ2luZyB0aGUgZGF0YWdyaWQuc2V0dGluZ3Muc2VsZWN0YWJsZSB1cGRhdGVzIHRoZSBkYXRhZ3JpZCB2aWV3LlxuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zZWxlY3RhYmxlID0gc2VsZWN0YWJsZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3NlbGVjdGFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3RhYmxlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdGFibGU7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0YWJsZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzaG93U2VsZWN0QWxsQ2hlY2tCb3goc2hvd1NlbGVjdEFsbENoZWNrQm94OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd1NlbGVjdEFsbENoZWNrQm94ID0gc2hvd1NlbGVjdEFsbENoZWNrQm94O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIEp1c3QgY2hhbmdpbmcgdGhlIGRhdGFncmlkLnNldHRpbmdzLnNlbGVjdGFibGUgdXBkYXRlcyB0aGUgZGF0YWdyaWQgdmlldy5cbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2hvd1NlbGVjdEFsbENoZWNrQm94ID0gc2hvd1NlbGVjdEFsbENoZWNrQm94O1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd1NlbGVjdEFsbENoZWNrQm94JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd1NlbGVjdEFsbENoZWNrQm94KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zaG93U2VsZWN0QWxsQ2hlY2tCb3g7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgY2xpY2tUb1NlbGVjdChjbGlja1RvU2VsZWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY2xpY2tUb1NlbGVjdCA9IGNsaWNrVG9TZWxlY3Q7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jbGlja1RvU2VsZWN0ID0gY2xpY2tUb1NlbGVjdDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2NsaWNrVG9TZWxlY3QnLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjbGlja1RvU2VsZWN0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jbGlja1RvU2VsZWN0O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNsaWNrVG9TZWxlY3Q7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdG9vbGJhcih0b29sYmFyOiBTb2hvVG9vbGJhck9wdGlvbnMpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy50b29sYmFyID0gdG9vbGJhcjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnRvb2xiYXIgPSB0b29sYmFyO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgndG9vbGJhcicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGluaXRpYWxpemVUb29sYmFyKGluaXRpYWxpemVUb29sYmFyOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaW5pdGlhbGl6ZVRvb2xiYXIgPSBpbml0aWFsaXplVG9vbGJhcjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaW5pdGlhbGl6ZVRvb2xiYXIgPSBpbml0aWFsaXplVG9vbGJhcjtcbiAgICB9XG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZVRvb2xiYXIoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmluaXRpYWxpemVUb29sYmFyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5pbml0aWFsaXplVG9vbGJhcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzYXZlVXNlclNldHRpbmdzKHNldHRpbmdzRm9yU2F2ZTogU29ob0RhdGFHcmlkU2F2ZVVzZXJTZXR0aW5ncykge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNhdmVVc2VyU2V0dGluZ3MgPSBzZXR0aW5nc0ZvclNhdmU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zYXZlVXNlclNldHRpbmdzID0gc2V0dGluZ3NGb3JTYXZlO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmcocGFnaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucGFnaW5nID0gcGFnaW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnaW5nID0gcGFnaW5nO1xuXG4gICAgICAvLyB0b2RvOiB1cGRhdGUgc29obyBkYXRhIGdyaWRzIHZpZXcgLSB0aGlzLnVwZGF0ZVBhZ2luZ0luZm8oKT9cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3BhZ2luZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG4gIGdldCBwYWdpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnBhZ2luZztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5wYWdpbmc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcGFnZXNpemUocGFnZXNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnBhZ2VzaXplID0gcGFnZXNpemU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5wYWdlc2l6ZSA9IHBhZ2VzaXplO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncGFnZXNpemUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdlc2l6ZXMocGFnZXNpemVzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucGFnZXNpemVzID0gcGFnZXNpemVzO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnZXNpemVzID0gcGFnZXNpemVzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncGFnZXNpemVzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaW5kZXRlcm1pbmF0ZShpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2luZGV0ZXJtaW5hdGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhY3Rpb25hYmxlTW9kZShhY3Rpb25hYmxlTW9kZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmFjdGlvbmFibGVNb2RlID0gYWN0aW9uYWJsZU1vZGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5hY3Rpb25hYmxlTW9kZSA9IGFjdGlvbmFibGVNb2RlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWN0aW9uYWJsZU1vZGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3Rpb25hYmxlTW9kZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWN0aW9uYWJsZU1vZGU7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWN0aW9uYWJsZU1vZGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2F2ZUNvbHVtbnMoc2F2ZUNvbHVtbnM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zYXZlQ29sdW1ucyA9IHNhdmVDb2x1bW5zO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2F2ZUNvbHVtbnMgPSBzYXZlQ29sdW1ucztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3NhdmVDb2x1bW5zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5wdXQgZm9yIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgdGhlIGRhdGFzZXQncyBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc291cmNlKHNvdXJjZTogU29ob0RhdGFHcmlkU291cmNlRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZSgoc291cmNlIGFzIGFueSkpO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc291cmNlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZmlsdGVyIGJhciBvbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcmFibGUgaWYgdHJ1ZSwgdGhlIGZpbHRlciBiYXIgaXMgZGlzcGxheWVkOyBvdGhlcndpc2Ugbm8gZmlsdGVyIGJhciBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyYWJsZShmaWx0ZXJhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZSA9IGZpbHRlcmFibGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5maWx0ZXJhYmxlID0gZmlsdGVyYWJsZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZpbHRlcmFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuICBnZXQgZmlsdGVyYWJsZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmlsdGVyYWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5maWx0ZXJhYmxlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlcldoZW5UeXBpbmcoZmlsdGVyV2hlblR5cGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZpbHRlcldoZW5UeXBpbmcgPSBmaWx0ZXJXaGVuVHlwaW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5maWx0ZXJXaGVuVHlwaW5nID0gZmlsdGVyV2hlblR5cGluZztcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsdGVyV2hlblR5cGluZygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmlsdGVyV2hlblR5cGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZmlsdGVyV2hlblR5cGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlIHRoZSBkYXRhZ3JpZCBpcyBkaXNwbGF5ZWQgYXMgYSB0cmVlLCBvdGhlcndpc2VcbiAgICogdGhlIGdyaWQgaXMgZGlzcGxheWVkIGFzIGZsYXQgcm93cy5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBkeW5hbWljLCBhbmQgd2lsbCBjYXVzZSB0aGUgZ3JpZCB0byBiZSByZWJ1aWx0XG4gICAqIGlmIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB0cmVlR3JpZCAtIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBkYXRhIGlzIGhpZXJhcmNoaWNhbC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCB0cmVlR3JpZCh0cmVlR3JpZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0cmVlR3JpZCAhPT0gdGhpcy5fZ3JpZE9wdGlvbnMudHJlZUdyaWQpIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLnRyZWVHcmlkID0gdHJlZUdyaWQ7XG5cbiAgICAgIC8vIElmIHRoZSBqUXVlcnkgY29udHJvbCBoYXMgYmVlbiBpbml0aWFsaXNlZCwgdXBkYXRlIGl0LlxuICAgICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnRyZWVHcmlkID0gdHJlZUdyaWQ7XG4gICAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3RyZWVHcmlkJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgdHJlZUdyaWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnRyZWVHcmlkO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnRyZWVHcmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHVucWl1ZSBpZGVudGlmaWVyOyB3aGljaCBtYXkgYmUgdW5kZWZpbmVkLlxuICAgKi9cbiAgZ2V0IHVuaXF1ZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnVuaXF1ZUlkO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnVuaXF1ZUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHVucWl1ZUlkIC0gd2lsbCBmb3JjZSBhIGdyaWQgcmVidWlsZCBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW5cbiAgICogY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHVucWl1ZUlkIC0gdGhlIG5ldyBpZC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCB1bmlxdWVJZCh1bmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCd1bmlxdWVJZCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgcm93UmVvcmRlciBmbGFnIC0gcmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlIGlmIHRoZSBjb250cm9sIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5cbiAgICovXG4gIGdldCByb3dSZW9yZGVyKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dSZW9yZGVyO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnJvd1Jlb3JkZXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcm93UmVvcmRlciBmbGFnIC0gd2lsbCBmb3JjZSBhIGdyaWQgcmVidWlsZCBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW5cbiAgICogY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHJvd1Jlb3JkZXIgLSBpZiB0cnVlIHRoZSByb3dzIHdpbGwgYmUgcmVvcmRlcmFibGU7IG90aGVyd2lzZSB0aGV5IHdpbGwgbm90LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHJvd1Jlb3JkZXIodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dSZW9yZGVyID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93UmVvcmRlciA9IHZhbHVlO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdyb3dSZW9yZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBzaG93RGlydHkgZmxhZyAtIHJldHVybnMgdGhlIHJlcXVlc3RlZCB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgc2hvd0RpcnR5KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaG93RGlydHk7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd0RpcnR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNob3dEaXJ0eSBmbGFnIC0gd2lsbCBmb3JjZSBhIGdyaWQgcmVidWlsZCBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW5cbiAgICogY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHNob3dEaXJ0eSAtIGlmIHRydWUgdGhlbiBkaXJ0eSByb3dzIHdpbGwgYmUgaGlnaGxpZ2h0ZWQ7IG90aGVyd2lzZSB0aGV5IHdpbGwgbm90LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNob3dEaXJ0eSh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dEaXJ0eSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dEaXJ0eSA9IHZhbHVlO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzaG93RGlydHknLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGFkZENlbGxMYXlvdXRDbGFzcyBmbGFnLlxuICAgKi9cbiAgZ2V0IGFkZENlbGxMYXlvdXRDbGFzcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWRkQ2VsbExheW91dENsYXNzO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFkZENlbGxMYXlvdXRDbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhZGRDZWxsTGF5b3V0Q2xhc3MgZmxhZyAtIElmIHNldCBmYWxzZSwgd2lsbCByZW1vdmUgZGF0YWdyaWQtY2VsbC1sYXlvdXQgY2xhc3MgZnJvbSBleHBhbmRhYmxlIHJvd3MuXG4gICAqIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhZGRDZWxsTGF5b3V0Q2xhc3MgLSBpZiB0cnVlIHRoZW4gZGlydHkgcm93cyB3aWxsIGJlIGhpZ2hsaWdodGVkOyBvdGhlcndpc2UgdGhleSB3aWxsIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBhZGRDZWxsTGF5b3V0Q2xhc3ModmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hZGRDZWxsTGF5b3V0Q2xhc3MgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5hZGRDZWxsTGF5b3V0Q2xhc3MgPSB2YWx1ZTtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWRkQ2VsbExheW91dENsYXNzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmVzaXplTW9kZSBvcHRpb24gdG8gY2hhbmdlcyB0aGUgY29sdW1uIHJlc2l6ZSBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIHJlc2l6ZU1vZGUgLSBpZiB0cnVlIHRoZW4gZGlydHkgcm93cyB3aWxsIGJlIGhpZ2hsaWdodGVkOyBvdGhlcndpc2UgdGhleSB3aWxsIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCByZXNpemVNb2RlKHZhbHVlOiBTb2hvRGF0YUdyaWRSZXNpemVNb2RlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucmVzaXplTW9kZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJlc2l6ZU1vZGUgPSB2YWx1ZTtcblxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncmVzaXplTW9kZScsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRhdGFncmlkIGhlYWRlciBiYWNrZ3JvdW5kIGNvbG9yLCBlaXRoZXIgZGFyayBvciBsaWdodC5cbiAgICogQHBhcmFtIGhlYWRlckJhY2tncm91bmRDb2xvciAtIGRlZmF1bHQgdmFsdWUgaXMgJ2RhcmsnXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaGVhZGVyQmFja2dyb3VuZENvbG9yKHZhbHVlOiBTb2hvRGF0YWdyaWRIZWFkZXJCYWNrZ3JvdW5kQ29sb3IgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5oZWFkZXJCYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5oZWFkZXJCYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaGVhZGVyTWVudUlkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5oZWFkZXJNZW51SWQgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5oZWFkZXJNZW51SWQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgaGVhZGVyTWVudUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmhlYWRlck1lbnVJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaGVhZGVyTWVudUlkO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGhlYWRlck1lbnVTZWxlY3RlZChoZWFkZXJNZW51U2VsZWN0ZWQ6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaGVhZGVyTWVudVNlbGVjdGVkID0gaGVhZGVyTWVudVNlbGVjdGVkO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5oZWFkZXJNZW51U2VsZWN0ZWQgPSBoZWFkZXJNZW51U2VsZWN0ZWQ7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGhlYWRlck1lbnVCZWZvcmVPcGVuKGhlYWRlck1lbnVCZWZvcmVPcGVuOiBGdW5jdGlvbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmhlYWRlck1lbnVCZWZvcmVPcGVuID0gaGVhZGVyTWVudUJlZm9yZU9wZW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCAmJiB0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmhlYWRlck1lbnVCZWZvcmVPcGVuID0gaGVhZGVyTWVudUJlZm9yZU9wZW47XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVSb3dEZWFjdGl2YXRpb24oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVSb3dEZWFjdGl2YXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZGlzYWJsZVJvd0RlYWN0aXZhdGlvbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlUm93RGVhY3RpdmF0aW9uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZGlzYWJsZVJvd0RlYWN0aXZhdGlvbiA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVSb3dEZWFjdGl2YXRpb24gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZVJvd0Rlc2VsZWN0aW9uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVzZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZXNlbGVjdGlvbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlUm93RGVzZWxlY3Rpb24odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlUm93RGVzZWxlY3Rpb24gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVzZWxlY3Rpb24gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZWQgdG8gaG9sZCBhbiBvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBmb3JtYXR0ZXJzXG4gICAqIGFuZCBlZGl0b3JzIG9yIGFueXdoZXJlIGVsc2UgYSBkYXRhZ3JpZCByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdXNlck9iamVjdCh1c2VyT2JqZWN0OiBhbnkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy51c2VyT2JqZWN0ID0gdXNlck9iamVjdDtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy51c2VyT2JqZWN0ID0gdXNlck9iamVjdDtcbiAgICB9XG4gIH1cblxuICBnZXQgdXNlck9iamVjdCgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy51c2VyT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnVzZXJPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBncm91cGFibGUgb3B0aW9uIC0gcmV0dXJucyB0aGUgcmVxdWVzdGVkXG4gICAqIHZhbHVlIGlmIHRoZSBjb250cm9sIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5cbiAgICovXG4gIGdldCBncm91cGFibGUoKTogU29ob0RhdGFHcmlkR3JvdXBhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZ3JvdXBhYmxlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmdyb3VwYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBncm91cGFibGUgc2V0dGluZ3MgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JvdXBhYmxlIC0gdGhlIGdyb3VwYWJsZSBzZXR0aW5ncy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBncm91cGFibGUodmFsdWU6IFNvaG9EYXRhR3JpZEdyb3VwYWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmdyb3VwYWJsZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmdyb3VwYWJsZSA9IHZhbHVlO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdncm91cGFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgZGF0YSB0byBkaXNwbGF5IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gYW4gYXJyYXkgb2Ygb2JqZWN0cyBtYXRjaGluZyB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEFzIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjb250cm9sIGlzXG4gICAqIGluaXRpYWxpc2VkLCBzdGFzaCB0aGUgZGF0YSBmb3IgbGF0ZXIsIGFuZCBvbmx5XG4gICAqIGNhbGwgbG9hZERhdGEgb24gdGhlIGNvbnRyb2wgYXBpIGlmIHJlYWR5LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGRhdGEoZGF0YTogYW55W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmdyaWREYXRhID0gZGF0YTtcbiAgICBpZiAoZGF0YSAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcblxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAvLyBAdG9kbyBhZGQgaGludHMgZm9yIHRoaXMgdG9vLCBhcyBvdGhlciBjaGFuZ2VzIG1heSBmb3JjZSBhIHJlYnVpbGQ/XG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LmxvYWREYXRhKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhcnJheSBvZiBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQuXG4gICAqXG4gICAqIEFzIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjb250cm9sIGlzXG4gICAqIGluaXRpYWxpc2VkLCBzdGFzaCB0aGUgZGF0YSBmb3IgbGF0ZXIsIGFuZCBvbmx5XG4gICAqIGNhbGwgbG9hZERhdGEgb24gdGhlIGNvbnRyb2wgYXBpIGlmIHJlYWR5LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNvbHVtbnMoY29sdW1uczogU29ob0RhdGFHcmlkQ29sdW1uW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTtcblxuICAgIHRoaXMuY2hlY2tGb3JDb21wb25lbnRFZGl0b3JzKCk7XG5cbiAgICBpZiAoY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcblxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy51cGRhdGVDb2x1bW5zKCh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLmNvbHVtbnMsICh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLmNvbHVtbkdyb3Vwcyk7XG4gICAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0T3JpZ2luYWxDb2x1bW5zKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogU3VtbWFyeSByb3cgY29sdW1ucyBzZXR0aW5nc3NcbiAgICovXG4gIEBJbnB1dCgpIHNldCBzdW1tYXJ5Um93Q29sdW1ucyhzdW1tYXJ5Um93Q29sdW1uczogU29ob0RhdGFHcmlkU3VtbWFyeVJvd0NvbHVtblNldHRpbmdzW10pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zdW1tYXJ5Um93Q29sdW1ucyA9IHN1bW1hcnlSb3dDb2x1bW5zO1xuICAgIHRoaXMuY2hlY2tGb3JTdW1tYXJ5Um93U2V0dGluZ3MoKTtcblxuICAgIGlmICh0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5zICYmIHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucygodGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyBhcyBhbnkpLCAodGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uR3JvdXBzIGFzIGFueSkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSBhbiBleHRyYSBjb2x1bW4gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIHRoYXQgZmlsbHMgdGhlIHNwYWNlLlxuICAgKiBUaGlzIGFsbG93cyBjb2x1bW5zIHRvIG5vdCBzdHJldGNoIHRvIGZpbGwgc28gdGhleSBhcmUgYSBjb25zdGFudCBzaXplLlxuICAgKiBUaGlzIHNldHRpbmcgY2Fubm90IGJlIHVzZWQgd2l0aCBwZXJjZW50IGNvbHVtbnMuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc3BhY2VyQ29sdW1uKHNwYWNlckNvbHVtbjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNwYWNlckNvbHVtbiA9IHNwYWNlckNvbHVtbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNwYWNlckNvbHVtbiA9IHNwYWNlckNvbHVtbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3NwYWNlckNvbHVtbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogSWYgdHJ1ZSBhbiBleHRyYSBjb2x1bW4gaXMgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBlbmQgdGhhdCBmaWxscyB0aGUgc3BhY2UuXG4gICAqL1xuICBnZXQgc3BhY2VyQ29sdW1uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucz8uc3BhY2VyQ29sdW1uO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNpemVDb2x1bW5zRXF1YWxseShzaXplQ29sdW1uc0VxdWFsbHk6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaXplQ29sdW1uc0VxdWFsbHkgPSBzaXplQ29sdW1uc0VxdWFsbHk7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCAmJiB0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNpemVDb2x1bW5zRXF1YWxseSA9IHNpemVDb2x1bW5zRXF1YWxseTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2l6ZUNvbHVtbnNFcXVhbGx5KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaXplQ29sdW1uc0VxdWFsbHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNpemVDb2x1bW5zRXF1YWxseTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBleHBhbmRhYmxlUm93KGV4cGFuZGFibGVSb3c6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5leHBhbmRhYmxlUm93ID0gZXhwYW5kYWJsZVJvdztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZXhwYW5kYWJsZVJvdyA9IGV4cGFuZGFibGVSb3c7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGV4cGFuZGFibGVSb3coKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmV4cGFuZGFibGVSb3c7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmV4cGFuZGFibGVSb3c7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVkcmF3T25SZXNpemUocmVkcmF3T25SZXNpemU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yZWRyYXdPblJlc2l6ZSA9IHJlZHJhd09uUmVzaXplO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yZWRyYXdPblJlc2l6ZSA9IHJlZHJhd09uUmVzaXplO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZWRyYXdPblJlc2l6ZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MucmVkcmF3T25SZXNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnJlZHJhd09uUmVzaXplO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGV4cG9ydENvbnZlcnROZWdhdGl2ZShleHBvcnRDb252ZXJ0TmVnYXRpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5leHBvcnRDb252ZXJ0TmVnYXRpdmUgPSBleHBvcnRDb252ZXJ0TmVnYXRpdmU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCAmJiB0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmV4cG9ydENvbnZlcnROZWdhdGl2ZSA9IGV4cG9ydENvbnZlcnROZWdhdGl2ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgZXhwb3J0Q29udmVydE5lZ2F0aXZlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5leHBvcnRDb252ZXJ0TmVnYXRpdmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmV4cG9ydENvbnZlcnROZWdhdGl2ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvdmVycmlkZVRhYmJpbmcob3ZlcnJpZGVUYWJiaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMub3ZlcnJpZGVUYWJiaW5nID0gb3ZlcnJpZGVUYWJiaW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vdmVycmlkZVRhYmJpbmcgPSBvdmVycmlkZVRhYmJpbmc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG92ZXJyaWRlVGFiYmluZygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub3ZlcnJpZGVUYWJiaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5vdmVycmlkZVRhYmJpbmc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2hvd0VkaXRvckljb25zKHNob3dFZGl0b3JJY29uczogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dFZGl0b3JJY29ucyA9IHNob3dFZGl0b3JJY29ucztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2hvd0VkaXRvckljb25zID0gc2hvd0VkaXRvckljb25zO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaG93RWRpdG9ySWNvbnMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dFZGl0b3JJY29ucztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd0VkaXRvckljb25zO1xuICB9XG5cbiAgLyogRXhwZXJpbWVudGFsIEZlYXR1cmUgdG8gc3RpY2sgb24gdGhlIHRvcCBvZiB0aGUgcGFnZS4gVGhpcyBmZWF0dXJlIGhhcyBudW1lcm91cyBsaW1pdGF0aW9ucy4gKi9cbiAgQElucHV0KCkgc2V0IHN0aWNreUhlYWRlcihzdGlja3lIZWFkZXI6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zdGlja3lIZWFkZXIgPSBzdGlja3lIZWFkZXI7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zdGlja3lIZWFkZXIgPSBzdGlja3lIZWFkZXI7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzdGlja3lIZWFkZXInLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEV4cGVyaW1lbnRhbCBGZWF0dXJlIHRvIHN0aWNrIG9uIHRoZSB0b3Agb2YgdGhlIHBhZ2UuIFRoaXMgZmVhdHVyZSBoYXMgbnVtZXJvdXMgbGltaXRhdGlvbnMuICovXG4gIEBJbnB1dCgpIHNldCBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXM6IEFycmF5PE9iamVjdD4gfCBPYmplY3QpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYXR0cmlidXRlcycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHNpemluZyBtZXRob2QgZm9yIHRoZSBhdXRvIHNpemluZyBjb2x1bW5zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNvbHVtblNpemluZyhjb2x1bW5TaXppbmc6ICdib3RoJyB8ICdkYXRhJyB8ICdoZWFkZXInIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uU2l6aW5nID0gY29sdW1uU2l6aW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1uU2l6aW5nID0gY29sdW1uU2l6aW5nO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY29sdW1uU2l6aW5nJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgc2l6aW5nIG1ldGhvZCBmb3IgdGhlIGF1dG8gc2l6aW5nIGNvbHVtbnMuXG4gICAqL1xuICBnZXQgY29sdW1uU2l6aW5nKCk6ICdib3RoJyB8ICdkYXRhJyB8ICdoZWFkZXInIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uU2l6aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gc3RyZXRjaGVkIHRvIGZpbGwgdGhlIHdpZHRoIG9mIHRoZSBkYXRhZ3JpZCxcbiAgICogb3IgJ2xhc3QnIHdoZXJlIHRoZSBsYXN0IGNvbHVtbiB3aWxsIGJlIHN0cmV0Y2hlZCB0byBmaWxsIHRoZVxuICAgKiByZW1haW5pbmcgc3BhY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJldGNoQ29sdW1uIC0gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBzdHJldGNoOyBvciAnbGFzdCcsXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc3RyZXRjaENvbHVtbihzdHJldGNoQ29sdW1uOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zdHJldGNoQ29sdW1uID0gc3RyZXRjaENvbHVtbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnN0cmV0Y2hDb2x1bW4gPSBzdHJldGNoQ29sdW1uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RyZXRjaENvbHVtbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gc3RyZXRjaCwgb3IgJ2xhc3QnIGlmIHRoZVxuICAgKiBsYXN0IGNvbHVtbiBpcyBzdHJldGNoZWQuXG4gICAqL1xuICBnZXQgc3RyZXRjaENvbHVtbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zdHJldGNoQ29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGNvbHVtbiB3aWxsIHJlY2FsY3VsYXRlIGl0cyB3aWR0aCBhbmQgc3RyZXRjaCBpZiByZXF1aXJlZCBvbiBjb2x1bW4gY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlIC0gSWYgZmFsc2Ugc3RyZXRjaCBsb2dpYyB3b250IHJ1biBvbiBjb2x1bW4gY2hhbmdlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0cmV0Y2hDb2x1bW5PbkNoYW5nZShzdHJldGNoQ29sdW1uT25DaGFuZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zdHJldGNoQ29sdW1uT25DaGFuZ2UgPSBzdHJldGNoQ29sdW1uT25DaGFuZ2U7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zdHJldGNoQ29sdW1uT25DaGFuZ2UgPSBzdHJldGNoQ29sdW1uT25DaGFuZ2U7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzdHJldGNoQ29sdW1uT25DaGFuZ2UnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2Ygc3RyZXRjaENvbHVtbk9uQ2hhbmdlLlxuICAgKi9cbiAgZ2V0IHN0cmV0Y2hDb2x1bW5PbkNoYW5nZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgcGFnZSBzaXplIHNlbGVjdG9yIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzaG93UGFnZVNpemVTZWxlY3RvcihzaG93UGFnZVNpemVTZWxlY3RvcjogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dQYWdlU2l6ZVNlbGVjdG9yID0gc2hvd1BhZ2VTaXplU2VsZWN0b3I7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zaG93UGFnZVNpemVTZWxlY3RvciA9IHNob3dQYWdlU2l6ZVNlbGVjdG9yO1xuXG4gICAgICAvLyB0b2RvOiBuZWVkIGEgZnVuY3Rpb24gaW4gZGF0YWdyaWQuanMgdGhhdCBhbGxvd3MgdG9nZ2xpbmcgb2YgdGhlIHBhZ2Ugc2l6ZSBzZWxlY3Rvci4gZm9yIG5vdyBJIGhhdmUgdG8gcmVidWlsZCB0aGUgZGF0YWdyaWQuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzaG93UGFnZVNpemVTZWxlY3RvcicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGhpZGVzIHRoZSBwYWdlciBpZiB0aGVyZSdzIG9ubHkgb25lIHBhZ2Ugd29ydGggb2YgcmVzdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBoaWRlUGFnZXJPbk9uZVBhZ2UoaGlkZVBhZ2VyT25PbmVQYWdlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaGlkZVBhZ2VyT25PbmVQYWdlID0gaGlkZVBhZ2VyT25PbmVQYWdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuaGlkZVBhZ2VyT25PbmVQYWdlID0gaGlkZVBhZ2VyT25PbmVQYWdlO1xuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdoaWRlUGFnZXJPbk9uZVBhZ2UnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGdyb3Vwc1xuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5Hcm91cChjb2x1bW5Hcm91cHM6IFNvaG9EYXRhR3JpZENvbHVtbkdyb3VwW10pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5Hcm91cHMgPSBjb2x1bW5Hcm91cHMgfHwgW107XG4gICAgaWYgKGNvbHVtbkdyb3VwcyAmJiB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5zICYmIHRoaXMualF1ZXJ5RWxlbWVudCkge1xuXG4gICAgICAvLyBAdG9kbyBhZGQgaGludHMgZm9yIHRoaXMgdG9vLCBhcyBvdGhlciBjaGFuZ2VzIG1heSBmb3JjZSBhIHJlYnVpbGQ/XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnVwZGF0ZUNvbHVtbnModGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucywgY29sdW1uR3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29sdW1uR3JvdXAoKTogU29ob0RhdGFHcmlkQ29sdW1uR3JvdXBbXSB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmNvbHVtbkdyb3VwcyB8fCBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uR3JvdXBzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZW1wdHlNZXNzYWdlYCBkYXRhIGdyaWQgb3B0aW9uLlxuICAgKiBVc2UgbnVsbCBvciB1bmRlZmluZWQgdG8gcmVtb3ZlIGFueSBlbXB0eSBtZXNzYWdlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVtcHR5TWVzc2FnZShlbXB0eU1lc3NhZ2U6IFNvaG9FbXB0eU1lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIC8vIENoZWNrIGZvciB1bmRlZmluZWQvbnVsbCBhbmQgcmVzZXQgdG8gdGhlIGRlZmF1bHQgbWVzc2FnZVxuICAgIGlmICghZW1wdHlNZXNzYWdlKSB7XG4gICAgICAvLyBzb2hvIG9ubHkgdGFrZXMgYSBudWxsIGhlcmUgc28gbWFraW5nIGl0IHNvIGFueSAhZW1wdHlNZXNzYWdlIGdldHMgc2V0IHRvIG51bGxcbiAgICAgIGVtcHR5TWVzc2FnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZW1wdHlNZXNzYWdlID0gZW1wdHlNZXNzYWdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZW1wdHlNZXNzYWdlID0gZW1wdHlNZXNzYWdlO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5zZXRFbXB0eU1lc3NhZ2UoZW1wdHlNZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbXB0eU1lc3NhZ2UoKTogU29ob0VtcHR5TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZW1wdHlNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0b29saXBzIG9uIHRoZSBjZWxsIHZhbHVlcywgYXQgYSBjb3N0IG9mIHBlcmZvcm1hbmNlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVuYWJsZVRvb2x0aXBzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZW5hYmxlVG9vbHRpcHMgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmVuYWJsZVRvb2x0aXBzID0gdmFsdWU7XG5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VuYWJsZVRvb2x0aXBzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZW5hYmxlVG9vbHRpcHMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmVuYWJsZVRvb2x0aXBzO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdENoaWxkcmVuKHNlbGVjdENoaWxkcmVuOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0Q2hpbGRyZW4gPSBzZWxlY3RDaGlsZHJlbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNlbGVjdENoaWxkcmVuID0gc2VsZWN0Q2hpbGRyZW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RDaGlsZHJlbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNlbGVjdENoaWxkcmVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RDaGlsZHJlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0Q2hpbGRyZW47XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWxsb3dDaGlsZEV4cGFuZE9uTWF0Y2goYWxsb3dDaGlsZEV4cGFuZE9uTWF0Y2g6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd0NoaWxkRXhwYW5kT25NYXRjaCA9IGFsbG93Q2hpbGRFeHBhbmRPbk1hdGNoO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5hbGxvd0NoaWxkRXhwYW5kT25NYXRjaCA9IGFsbG93Q2hpbGRFeHBhbmRPbk1hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxvd0NoaWxkRXhwYW5kT25NYXRjaCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWxsb3dDaGlsZEV4cGFuZE9uTWF0Y2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFsbG93Q2hpbGRFeHBhbmRPbk1hdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHNvdXJjZSB0eXBlIG9mIHRoZSBncmlkLCBlaXRoZXI6XG4gICAqXG4gICAqIC0gXCJjb250ZW50LW9ubHlcIiB3aGVyZSB0YWJsZSBlbGVtZW50cyBhcmUgcHJvdmlkZWQgaW4gdGhlIGJvZHkuXG4gICAqIC0gXCJhdXRvXCIgd2hlcmUgY29sdW1ucyBhbmQgcm93cyBhcmUgb2J0YWluZWQgZm9yIGFuXG4gICAqICAgaW5qZWN0ZWQgc2VydmljZSAoaWYgZGVmaW5lZCkgb3IgdmlhIHRoZSBJbnB1dHMgaWYgbm90LlxuICAgKlxuICAgKiBBbGxvdyB0aGUgaW5wdXQgdG8gYmUgb3ZlcnJpZGVuLCB0byBtYXRjaCB0aGUgY29tcG9uZW50IHNlbGVjdG9yLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdzb2hvLWRhdGFncmlkJykgc2V0IHNvaG9EYXRhZ3JpZChkYXRhZ3JpZFR5cGU6IFNvaG9EYXRhR3JpZFR5cGUgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgdGhpcy5kYXRhZ3JpZFR5cGUgPSBkYXRhZ3JpZFR5cGUgJiYgZGF0YWdyaWRUeXBlLnRvU3RyaW5nKCkgIT0gJycgPyBkYXRhZ3JpZFR5cGUgOiBTb2hvRGF0YUdyaWRDb21wb25lbnQuQVVUTztcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ29tcG9uZW50IE91dHB1dFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgcm93IChvciByb3dzKSBhcmUgc2VsZWN0ZWQuXG4gIEBPdXRwdXQoKVxuICBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkU2VsZWN0ZWRFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjZWxsIGlzIGNoYW5nZWQuXG4gIEBPdXRwdXQoKVxuICBjZWxsY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRDZWxsQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgcm93IGlzIHJlbW92ZWQuXG4gIEBPdXRwdXQoKVxuICByb3dSZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd1JlbW92ZUV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHJvdyBpcyBhZGRlZC5cbiAgQE91dHB1dCgpXG4gIHJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkQWRkUm93RXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBncmlkIGlzIGZpbHRlcmVkLlxuICBAT3V0cHV0KClcbiAgZmlsdGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEZpbHRlcmVkRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgcm93IGluIHRoZSBncmlkIGlzIGV4cGFuZGVkLlxuICBAT3V0cHV0KClcbiAgZXhwYW5kcm93ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRUb2dnbGVSb3dFdmVudD4oKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEga2V5IGlzIHByZXNzZWRcbiAgICpcbiAgICogQHRvZG8gcmVtb3ZlIG92ZXJyaWRlIG9mIG5hdGl2ZSBhdHRyaWJ1dGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KClcbiAga2V5ZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkS2V5RG93bkV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBlZGl0IG1vZGUgaXMgZXhpdGVkLlxuICBAT3V0cHV0KClcbiAgZXhpdGVkaXRtb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGVkaXQgbW9kZSBpcyBzdGFydGVkLlxuICBAT3V0cHV0KClcbiAgYmVmb3JlZW50ZXJlZGl0bW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudD4oKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGVkaXQgbW9kZSBpcyBlbnRlcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGVudGVyZWRpdG1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgcm93IGluIHRoZSBncmlkIGlzIGNvbGxhcHNlZC5cbiAgQE91dHB1dCgpXG4gIGNvbGxhcHNlcm93ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRUb2dnbGVSb3dFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgc29ydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRTb3J0ZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgc2VhcmNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIEBPdXRwdXQoKVxuICBuZXh0UGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob1BhZ2VyUGFnaW5nSW5mbz4oKTtcblxuICBAT3V0cHV0KClcbiAgcHJldmlvdXNQYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvUGFnZXJQYWdpbmdJbmZvPigpO1xuXG4gIEBPdXRwdXQoKVxuICBmaXJzdFBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9QYWdlclBhZ2luZ0luZm8+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGxhc3RQYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvUGFnZXJQYWdpbmdJbmZvPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob1BhZ2VyUGFnaW5nSW5mbz4oKTtcblxuICBAT3V0cHV0KClcbiAgYmVmb3JlUGFnaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvUGFnZXJQYWdpbmdJbmZvPigpO1xuXG4gIEBPdXRwdXQoKVxuICBhZnRlclBhZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob1BhZ2VyUGFnaW5nSW5mbz4oKTtcblxuICBAT3V0cHV0KClcbiAgYmVmb3JlUm93QWN0aXZhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0FjdGl2YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93QWN0aXZhdGVkPigpO1xuXG4gIEBPdXRwdXQoKVxuICByb3dEZWFjdGl2YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93QWN0aXZhdGVkPigpO1xuXG4gIEBPdXRwdXQoKVxuICByb3dDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dDbGlja2VkPigpO1xuXG4gIEBPdXRwdXQoKVxuICByb3dEb3VibGVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dDbGlja2VkPigpO1xuXG4gIEBPdXRwdXQoKVxuICBjb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93Q2xpY2tlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgcm93UmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dSZW9yZGVyZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgb3BlbkZpbHRlclJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkT3BlbkZpbHRlclJvd0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBjbG9zZUZpbHRlclJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkQ2xvc2VGaWx0ZXJSb3dFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgc2V0dGluZ3NDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRTZXR0aW5nc0NoYW5nZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJlbmRlcmVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFmdGVyUmVuZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRBZnRlclJlbmRlckV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICB2ZXJ0aWNhbFNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkU2Nyb2xsRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGZpbHRlcm9wZXJhdG9yY2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRmlsdGVyT3BlcmF0b3JDaGFuZ2VkRXZlbnQ+KCk7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gSG9zdCBCaW5kaW5nc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gU2V0IHRoZSBlbmFibGUgLyBkaXNhYmxlZCBjbGFzcyAobm90IHdvcmtpbmcpXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtZGlzYWJsZWQnKVxuICBpc0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJvbGUgZm9yIHRoZSBncmlkLlxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICBnZXQgZGF0YWdyaWRSb2xlKCkge1xuICAgIGlmICh0aGlzLl9ncmlkT3B0aW9ucy50cmVlR3JpZCkge1xuICAgICAgcmV0dXJuICd0cmVlZ3JpZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZGF0YWdyaWQnO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJpdmF0ZSBNZW1iZXIgRGF0YVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBqUXVlcnkgY29udHJvbC5cbiAgcHJpdmF0ZSBqUXVlcnlFbGVtZW50PzogSlF1ZXJ5O1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgU29obyBkYXRhZ3JpZCBjb250cm9sIGFwaS5cbiAgcHJpdmF0ZSBkYXRhZ3JpZD86IFNvaG9EYXRhR3JpZFN0YXRpYyB8IG51bGw7XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBncmlkJ3MgZGF0YS5cbiAgcHJpdmF0ZSBncmlkRGF0YT86IGFueVtdO1xuXG4gIC8vIFRoZSBzb3VyY2UgdHlwZSBmb3IgdGhlIGdyaWQuXG4gIHByaXZhdGUgZGF0YWdyaWRUeXBlPzogc3RyaW5nO1xuXG4gIC8vIEFuIGludGVybmFsIGdyaWRPcHRpb25zIG9iamVjdCB0aGF0IGdldHMgdXBkYXRlZCBieSB1c2luZ1xuICAvLyB0aGUgY29tcG9uZW50J3MgSW5wdXRzKClcbiAgcHJpdmF0ZSBfZ3JpZE9wdGlvbnM6IFNvaG9EYXRhR3JpZE9wdGlvbnMgPSB7XG4gICAgc3RyZXRjaENvbHVtbjogJ2xhc3QnLFxuICAgIGVuYWJsZVRvb2x0aXBzOiBmYWxzZVxuICB9O1xuXG4gIC8vIFByb3ZpZGVzIGhpbnRzIHRvIHRoZSBjb21wb25lbnQgYWZ0ZXIgdGhlIG5leHQgcmVmcmVzaC5cbiAgcHJpdmF0ZSByZWZyZXNoSGludDogUmVmcmVzaEhpbnRGbGFncyA9IFJlZnJlc2hIaW50RmxhZ3MuTm9uZTtcblxuICAvLyBMaXN0IG9mIG9wdGlvbiBuYW1lcyBjaGFuZ2VkIChmb3IgZGVidWdnaW5nKS5cbiAgcHJpdmF0ZSBjaGFuZ2VkT3B0aW9uczogYW55W10gPSBbXTtcblxuICAvLyBMaXN0IG9mIGR5bmFtaWMgZm9ybWF0dGVyIGNvbXBvbmVudHMgLSBrZXllZCBieSB0aGUgb3JpZ2luYWwgYXJncy5cbiAgcHJpdmF0ZSBjZWxsQ29tcG9uZW50czogYW55W10gPSBbXTtcblxuICAvLyBMaXN0IG9mIGR5bmFtaWMgcm93dGVtcGxhdGUgY29tcG9uZW50cyAtIGtleWVkIGJ5IHRoZSBvcmlnaW5hbCBhcmdzLlxuICBwcml2YXRlIHJvd1RlbXBsYXRlQ29tcG9uZW50czogYW55W10gPSBbXTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBuZ1pvbmUgLSB0aGUgYW5ndWxhciB6b25lIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGVsZW1lbnRSZWYgLSB0aGUgZWxlbWVudCBtYXRjaGluZyB0aGUgY29tcG9uZW50J3Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvciAtIHRoZSBjb21wb25lbnQncyBjaGFuZ2UgZGV0ZWN0b3IuXG4gICAqIEBwYXJhbSByZXNvbHZlciAtIGNvbXBvbmVudCBmYWN0b3J5IHJlc29sdmVyIChmb3IgZWRpdG9ycy9mb3JtYXR0ZXJzKS5cbiAgICogQHBhcmFtIGluamVjdG9yIC0gZHluYW1pYyBjb21wb25lbnQgaW5qZWN0b3IgKGZvciBlZGl0b3JzL2Zvcm1hdHRlcnMpLlxuICAgKiBAcGFyYW0gZGF0YWdyaWRTZXJ2aWNlIC0gc2VydmljZSBmb3Igb2J0YWluaW5nIGRhdGEgKG9wdGlvbmFsKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgYXBwOiBBcHBsaWNhdGlvblJlZixcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgZGF0YWdyaWRTZXJ2aWNlOiBTb2hvRGF0YUdyaWRTZXJ2aWNlKSB7XG5cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHVibGljIEFQSVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgZ2V0Q29sdW1uR3JvdXAoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmdldENvbHVtbkdyb3VwKGlkeCk7XG4gIH1cblxuICBnZXRDb2x1bW5CeUlkKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5nZXRDb2x1bW5Hcm91cChpZHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgc29ydCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBkYXRhZ3JpZCxcbiAgICogY2FuIG9ubHkgYmUgdXNlZCBvbmNlIHRoZSBncmlkIGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqXG4gICAqIEB0b2RvIHRoaXMgc2hvdWxkIG1hZGUgbGF6eS5cbiAgICovXG4gIHNldFNvcnRGdW5jdGlvbihzb3J0RnVuY3Rpb246IFNvaG9EYXRhR3JpZFNvcnRGdW5jdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNvcnRGdW5jdGlvbiA9IHNvcnRGdW5jdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhZ3JpZCBub3QgaW5pdGlhbGl6ZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbHVtbiBhbmQgZGlyZWN0aW9uIHRvIHNvcnQgdGhlIGRhdGFzZXQgb24uXG4gICAqXG4gICAqIENhbiBvbmx5IGJlIHVzZWQgb25jZSB0aGUgZ3JpZCBoYXMgYmVlbiBpbml0aWFsaXNlZCwgb3RoZXJ3aXNlXG4gICAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbklkIHRoZSBpZCBvZiB0aGUgY29sdW1uIHRvIHNvcnQgb247IG11c3QgYmUgbm9uLW51bGwuXG4gICAqIEBwYXJhbSBhc2NlbmRpbmcgaWYgdHJ1ZSBzb3J0IGFzY2VuZGluZywgb3RoZXJ3aXNlIGRlc2NlbmRpbmcuICBJZiBub3Qgc3VwcGxpZWQgdGhlIHNldHRpbmcgaXMgdG9nZ2xlZC5cbiAgICovXG4gIHNldFNvcnRDb2x1bW4oY29sdW1uSWQ6IHN0cmluZywgYXNjZW5kaW5nPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0U29ydENvbHVtbihjb2x1bW5JZCwgYXNjZW5kaW5nKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGFncmlkIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgc29ydCBpbmRpY2F0b3Igb24gYSBjb2x1bW4gd2hlbiBkaXNhYmxlQ2xpZW50U29ydCBpcyBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIHNldFNvcnRJbmRpY2F0b3IoY29sdW1uSWQ6IHN0cmluZywgYXNjZW5kaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0U29ydEluZGljYXRvcihjb2x1bW5JZCwgYXNjZW5kaW5nKTtcbiAgICB9KTtcbiAgfVxuXG4gIHBhZ2VTaXplKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQ/LnBhZ2VyQVBJLnNldHRpbmdzLnBhZ2VzaXplO1xuICB9XG5cbiAgdXBkYXRlUGFnaW5nSW5mbyhwYWdlSW5mbzogU29ob1BhZ2VyUGFnaW5nSW5mbyk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnBhZ2VyQVBJLnVwZGF0ZVBhZ2luZ0luZm8ocGFnZUluZm8pO1xuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgdXBkYXRlUm93KGlkeDogbnVtYmVyLCByb3c6IGFueSk6IHZvaWQge1xuICAgIEFyZ3VtZW50SGVscGVyLmNoZWNrTm90TnVsbCgncm93Jywgcm93KTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZVJvdyhpZHgsIHJvdyk7XG4gICAgfSk7XG4gIH1cblxuICBoaWRlQ29sdW1uKGlkOiBhbnkpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5oaWRlQ29sdW1uKGlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNob3dDb2x1bW4oaWQ6IGFueSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNob3dDb2x1bW4oaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgY29sdW1uQnlJZChpZDogc3RyaW5nKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuY29sdW1uQnlJZChpZCk7XG4gIH1cblxuICBnZXRDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNvbHVtbnM7XG4gIH1cblxuICBnZXRDb2x1bW5Hcm91cHMoKTogU29ob0RhdGFHcmlkQ29sdW1uR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1uR3JvdXBzO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY29sdW1uIGluZGV4IGZyb20gdGhlIGNvbCdzIGlkICovXG4gIGNvbHVtbklkeEJ5SWQoY29sdW1uSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuY29sdW1uSWR4QnlJZChjb2x1bW5JZCk7XG4gIH1cblxuICBnZXRIZWFkZXJSb3dDb2x1bW4oZmxkOiBhbnkpIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5nZXRIZWFkZXJSb3dDb2x1bW4oZmxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcm93IG9mIGRhdGEgdG8gdGhlIGRhdGFncmlkIGF0IHRoZSBnaXZlbiBvcHRpb25hbCBsb2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgdGhlIHJvdyBvZiBkYXRhIHRvIGFkZC5cbiAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBvcHRpb25hbCBsb2NhdGlvbiwgJ3RvcCcgb3IgJ2JvdHRvbScgb3IgYSBudW1iZXIuXG4gICAqL1xuICBhZGRSb3coZGF0YTogYW55LCBsb2NhdGlvbj86ICd0b3AnIHwgJ2JvdHRvbScgfCBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmFkZFJvdyhkYXRhLCBsb2NhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSByb3dzIG9mIGRhdGEgdG8gdGhlIGRhdGFncmlkIGF0IHRoZSBnaXZlbiBvcHRpb25hbCBsb2NhdGlvbi5cbiAgICogQHBhcmFtIGRhdGEgQXJyYXkgb2YgZGF0YSB0byBhZGQuXG4gICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgb3B0aW9uYWwgbG9jYXRpb24sICd0b3AnIG9yICdib3R0b20nIG9yIGEgbnVtYmVyLlxuICAgKi9cbiAgYWRkUm93cyhkYXRhOiBhbnlbXSwgbG9jYXRpb24/OiAndG9wJyB8ICdib3R0b20nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5hZGRSb3dzKGRhdGEsIGxvY2F0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcm93IG1hdGNoaW5nIHRoZSByb3dJbmRleCBwYXNzZWQgaW4gZnJvbSB0aGUgZGF0YSBhbmQgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIHJvd0luZGV4IHRoZSBpbmRleCBvZiB0aGUgcm93IHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZVJvdyhyb3dJbmRleDogbnVtYmVyLCBub1N5bmM/OiBib29sZWFuLCBub1RyaWdnZXI/OiBib29sZWFuKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVtb3ZlUm93KHJvd0luZGV4LCBub1N5bmMsIG5vVHJpZ2dlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZGlydHkgcm93cyBpbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgZGlydHkgcm93cyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIGRpcnR5Um93cygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZGlydHlSb3dzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZGlydHkgY2VsbHMgaW4gdGhlIGdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGRpcnR5IGNlbGxzIGluIHRoZSBncmlkLlxuICAgKi9cbiAgZGlydHlDZWxscygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZGlydHlDZWxscygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBkaXJ0eSBjZWxscy5cbiAgICovXG4gIGNsZWFyRGlydHkoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNsZWFyRGlydHkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgdGhlIGNlbGwgdGhhdCdzIGN1cnJlbnRseSBpbiBlZGl0IG1vZGUuXG4gICAqL1xuICBjb21taXRDZWxsRWRpdCgpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uY29tbWl0Q2VsbEVkaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZGlydHkgY2VsbHMgaW4gZ2l2ZW4gcm93LlxuICAgKlxuICAgKiBAcGFyYW0gcm93IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvdy5cbiAgICovXG4gIGNsZWFyRGlydHlSb3cocm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uY2xlYXJEaXJ0eVJvdyhyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGRpcnR5IG9uIGdpdmVuIGNlbGwuXG4gICAqXG4gICAqIEBwYXJhbSByb3cgLSB0aGUgcm93IG51bWJlciAoaWR4KSBvZiB0aGUgcm93XG4gICAqIEBwYXJhbSBjZWxsIC0gdGhlIGNlbGwgbnVtYmVyIChpZHgpIG9mIHRoZSBjZWxsXG4gICAqL1xuICBjbGVhckRpcnR5Q2VsbChyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNsZWFyRGlydHlDZWxsKHJvdywgY2VsbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGVycm9yIGZvciBhIGdpdmVuIGNlbGwgaW4gYSByb3dcbiAgICpcbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IGluZGV4LlxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCBpbmRleC5cbiAgICovXG4gIGNsZWFyQWxsQ2VsbEVycm9yKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhckFsbENlbGxFcnJvcihyb3csIGNlbGwpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhIGNlbGwgd2l0aCBhbiBlcnJvciBvZiBhIGdpdmVuIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IGluZGV4LlxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCBpbmRleC5cbiAgICogQHBhcmFtIHR5cGUgb2YgZXJyb3IuXG4gICAqL1xuICBjbGVhckNlbGxFcnJvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyLCB0eXBlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhckNlbGxFcnJvcihyb3csIGNlbGwsIHR5cGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhIHJvdyBsZXZlbCBhbGwgZXJyb3JzLCBhbGVydHMsIGluZm8gbWVzc2FnZXNcbiAgICpcbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IGluZGV4LlxuICAgKi9cbiAgY2xlYXJSb3dFcnJvcihyb3c6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZGF0YWdyaWQ/LmNsZWFyUm93RXJyb3Iocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGVycm9ycywgYWxlcnRzIGFuZCBpbmZvIG1lc3NhZ2VzIGluIGVudGlyZSBkYXRhZ3JpZC5cbiAgICovXG4gIGNsZWFyQWxsRXJyb3JzKCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZGF0YWdyaWQ/LmNsZWFyQWxsRXJyb3JzKCkpO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlIGFsbCByb3dzIGFuZCBjZWxscyBpbiB0aGUgZW50aXJlIGdyaWQgaWYgdGhleSBoYXZlIHZhbGlkYXRpb24gb24gdGhlIGNvbHVtbiAqL1xuICBzaG93Um93RXJyb3Iocm93OiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZywgdHlwZTogU29ob0FsZXJ0VHlwZSk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZGF0YWdyaWQ/LnNob3dSb3dFcnJvcihyb3csIG1lc3NhZ2UsIHR5cGUpKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBhbGwgY2VsbHMgaW4gYSBzcGVjaWZpYyByb3cgKi9cbiAgdmFsaWRhdGVSb3cocm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy52YWxpZGF0ZVJvdyhyb3cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW5kIHNob3cgYSBtZXNzYWdlL2Vycm9yIG9uIHRoZSBnaXZlbiByb3cuXG4gICAqL1xuICB2YWxpZGF0ZUFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy52YWxpZGF0ZUFsbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdGF0dXMgb2YgYSBnaXZlbiByb3cgaW4gdGhlIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggLSB0aGUgcm93IG51bWJlciAoaWR4KSBvZiB0aGUgcm93XG4gICAqIEBwYXJhbSBzdGF0dXMgLSBzdGF0dXMgY2xhc3MgbmFtZSBlLmcuICdlcnJvcidcbiAgICogQHBhcmFtIHRvb2x0aXAgLSBzdHJpbmcgdmFsdWUgZm9yIHRvb2x0aXAgbWVzc2FnZSBlLmcuICdFcnJvcidcbiAgICovXG4gIHJvd1N0YXR1cyhpZHg6IG51bWJlciwgc3RhdHVzOiBzdHJpbmcsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5yb3dTdGF0dXMoaWR4LCBzdGF0dXMsIHRvb2x0aXApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgY3VycmVudGx5IG1vZGlmaWVkIHJvd3MsIHRoZSB0eXBlIG9mIG1vZGlmaWNhdGlvblxuICAgKiBhbmQgdGhlIGNlbGxzIHRoYXQgYXJlIGRpcnR5IGFuZCB0aGUgZGF0YS5cbiAgICpcbiAgICogQHJldHVybnMgQW4ga2V5ZWQgb2JqZWN0IHNob3dpbmcgdGhlIGRpcnR5IHJvdyBpbmZvLlxuICAgKi9cbiAgZ2V0TW9kaWZpZWRSb3dzKCk6IFNvaG9EYXRhR3JpZE1vZGlmaWVkUm93cyB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmdldE1vZGlmaWVkUm93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGNlbGwgdG8gZGlydHkgYW5kIGFkZCB0aGUgZGlydHkgaWNvbiB2aXN1YWxseS5cbiAgICpcbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IGluZGV4XG4gICAqIEBwYXJhbSBjZWxsIFRoZSBjZWxsIGluZGV4XG4gICAqIEBwYXJhbSB0b2dnbGUgVHJ1ZSB0byBzZXQgaXQgYW5kIGZhbHNlIHRvIHJlbW92ZSBpdFxuICAgKiBAcGFyYW0gZGF0YSBBZGRzIGRpcnR5IGRhdGEgdG8gdGhlIGludGVybmFsIHRyYWNrZXJcbiAgICovXG4gIHNldERpcnR5SW5kaWNhdG9yKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIsIHRvZ2dsZTogYm9vbGVhbiwgZGF0YT86IG9iamVjdCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNldERpcnR5SW5kaWNhdG9yKHJvdywgY2VsbCwgdG9nZ2xlLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBzZWxlY3RlZCByb3dzXG4gICAqL1xuICByZW1vdmVTZWxlY3RlZCgpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGRpc3BsYXkgb2YgdGhlIGZpbHRlciByb3cuXG4gICAqL1xuICB0b2dnbGVGaWx0ZXJSb3coKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udG9nZ2xlRmlsdGVyUm93KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGNvbmRpdGlvbnMgZnJvbSBvdXRzaWRlIG9yIHB1bGwgZnJvbSBmaWx0ZXIgcm93XG4gICAqL1xuICBhcHBseUZpbHRlcihjb25kaXRpb25zPzogQXJyYXk8U29ob0RhdGFHcmlkRmlsdGVyQ29uZGl0aW9uPik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmFwcGx5RmlsdGVyKGNvbmRpdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmlsdGVyIHJvdyBmcm9tIHBhc3NlZCBkYXRhIC8gc2V0dGluZ3NcbiAgICovXG4gIHNldEZpbHRlckNvbmRpdGlvbnMoY29uZGl0aW9uczogQXJyYXk8U29ob0RhdGFHcmlkRmlsdGVyQ29uZGl0aW9uPik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNldEZpbHRlckNvbmRpdGlvbnMoY29uZGl0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbHRlciBjb25kaXRpb25zIGluIGFycmF5IGZvcm0gZnJvbSB0aGUgVUlcbiAgICovXG4gIGZpbHRlckNvbmRpdGlvbnMoKTogQXJyYXk8U29ob0RhdGFHcmlkRmlsdGVyQ29uZGl0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmZpbHRlckNvbmRpdGlvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW55IGZpbHRlciBkZWZpbmVkLCBmb3IgdGhpcyBkYXRhZ3JpZC5cbiAgICovXG4gIGNsZWFyRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICAgIHRoaXMuZGF0YWdyaWQuY2xlYXJGaWx0ZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY29udGV4dHVhbCB0b29sYmFyLlxuICAgKi9cbiAgaGlkZUNvbnRleHR1YWxUb29sYmFyKCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICAgIHRoaXMuZGF0YWdyaWQuaGlkZUNvbnRleHR1YWxUb29sYmFyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93cyBjdXJyZW50bHkgc2VsZWN0ZWQgb24gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdyBpbnN0YW5jZXMuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZWxlY3RlZFJvd3MgaW5zdGVhZC5cbiAgICovXG4gIGdldFNlbGVjdGVkUm93cygpOiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5zZWxlY3RlZFJvd3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93cyBjdXJyZW50bHkgc2VsZWN0ZWQgb24gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdyBpbnN0YW5jZXMuXG4gICAqL1xuICBzZWxlY3RlZFJvd3MoKTogU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3dbXSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNlbGVjdGVkUm93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYWxsIHRoZSByb3dzIGluIHRoZSBncmlkLlxuICAgKi9cbiAgc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RBbGxSb3dzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zZWxlY3RzIGFsbCB0aGUgcm93cyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIHVuU2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy51blNlbGVjdEFsbFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCByb3cgaW4gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGlkeCAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cgdG8gc2VsZWN0LlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBzZWxlY3RSb3dzIGluc3RlYWQuXG4gICAqL1xuICBzZWxlY3RSb3coaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3coaWR4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdHMgdGhlIHNwZWNpZmllZCByb3cgaW4gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGlkeCAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cgdG8gZGVzZWxlY3QuXG4gICAqL1xuICB1bnNlbGVjdFJvdyhpZHg6IG51bWJlcikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnVuc2VsZWN0Um93KGlkeCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHJhbmdlIG9mIHJvd3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHJvdyBpbmRleGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgLSB0aGUgc3RhcnQgaW5kZXhcbiAgICogQHBhcmFtIGVuZCAtIHRoZW4gZW5kIGluZGV4XG4gICAqL1xuICBzZWxlY3RSYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIGNvbnN0IHJhbmdlOiBudW1iZXJbXSA9IFtzdGFydCwgZW5kXTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3dzQmV0d2VlbkluZGV4ZXMocmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc2VsZWN0ZWQgcm93cyBieSBwYXNzaW5nIHRoZSByb3cgaW5kZXggb3IgYW4gYXJyYXkgb2Ygcm93IGluZGV4ZXNcbiAgICovXG4gIHNlbGVjdFJvd3Mocm93OiBudW1iZXIgfCBudW1iZXJbXSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNlbGVjdFJvd3Mocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgY2hlY2tib3ggb24gdGhlIGhlYWRlci5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlICdhbGwnLCAncGFydGlhbCcgb3IgJ2FsbCcuXG4gICAqL1xuICBwdWJsaWMgc2V0SGVhZGVyQ2hlY2tib3hTdGF0ZShzdGF0ZTogU29ob0RhdGFHcmlkSGVhZGVyQ2hlY2tib3hTdGF0ZSkge1xuICAgIGNvbnN0IGhlYWRlckNoZWNrYm94ID0gdGhpcy5qUXVlcnlFbGVtZW50Py5maW5kKCcuZGF0YWdyaWQtaGVhZGVyJykuZmluZCgnLmRhdGFncmlkLWNoZWNrYm94Jyk7XG4gICAgaWYgKGhlYWRlckNoZWNrYm94KSB7XG4gICAgICBpZiAoc3RhdGUgPT09ICdwYXJ0aWFsJykge1xuICAgICAgICBoZWFkZXJDaGVja2JveC5kYXRhKCdzZWxlY3RlZCcsICdwYXJ0aWFsJylcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLWNoZWNrZWQgaXMtcGFydGlhbCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09ICdhbGwnKSB7XG4gICAgICAgIGhlYWRlckNoZWNrYm94LmRhdGEoJ3NlbGVjdGVkJywgJ2FsbCcpXG4gICAgICAgICAgLmFkZENsYXNzKCdpcy1jaGVja2VkJykucmVtb3ZlQ2xhc3MoJ2lzLXBhcnRpYWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSAnbm9uZScpIHtcbiAgICAgICAgaGVhZGVyQ2hlY2tib3guZGF0YSgnc2VsZWN0ZWQnLCAnbm9uZScpXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1jaGVja2VkIGlzLXBhcnRpYWwnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHJvdyBvZiB0aGUgcGFzc2VkLWluIGlkeC5cbiAgICogTk9URTogdmFsaWQgb25seSB3aGVuIHNlbGVjdGlvbiBtb2RlIGlzICdtaXhlZCdcbiAgICovXG4gIGFjdGl2YXRlUm93KGlkeDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uYWN0aXZhdGVSb3coaWR4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIHRoZSBjdXJyZW50bHkgYWN0aXZhdGVkIHJvdy5cbiAgICpcbiAgICogTk9URTogdmFsaWQgb25seSB3aGVuIHNlbGVjdGlvbiBtb2RlIGlzICdtaXhlZCdcbiAgICovXG4gIGRlYWN0aXZhdGVSb3coKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZGVhY3RpdmF0ZVJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2YXRlZCByb3cuXG4gICAqIE5PVEU6IHZhbGlkIG9ubHkgd2hlbiBzZWxlY3Rpb24gbW9kZSBpcyAnbWl4ZWQnXG4gICAqL1xuICBhY3RpdmF0ZWRSb3coKTogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuYWN0aXZhdGVkUm93KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIGNlbGwuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggVGhlIGluZGV4IG9mIHRoZSByb3cgb2YgdGhlIGNlbGwgdG8gc2V0IGFjdGl2ZS5cbiAgICogQHBhcmFtIGlkeDIgVGhlIGluZGV4IG9mIHRoZSBjZWxsIHRvIHNldCBhY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgc2V0QWN0aXZlQ2VsbChpZHg6IG51bWJlciwgaWR4MjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2V0QWN0aXZlQ2VsbChpZHgsIGlkeDIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGFjdGl2ZSBjZWxsIGluZm9cbiAgICovXG4gIHB1YmxpYyBnZXRBY3RpdmVDZWxsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5hY3RpdmVDZWxsO1xuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgcm93IGF0IDxiPmlkeDwvYj4gaW50byB2aWV3IGluIHRoZSB2aWV3IHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggVGhlIGluZGV4IG9mIHRoZSByb3cgdG8gc2Nyb2xsIGludG8gdmlldy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxSb3dJbnRvVmlldyhpZHg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNldEFjdGl2ZUNlbGwoaWR4LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJvdyBudW1iZXJzIGZvciB0aGUgcm93cyBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgZmllbGQgbmFtZSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdXNlIGluIHNlYXJjaC5cbiAgICovXG4gIGZpbmRSb3dzQnlWYWx1ZShmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZmluZFJvd3NCeVZhbHVlKGZpZWxkTmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2dyYW1tYXRpY2FsbHkgdHJpZ2dlciBhIGNhbGwgdG8gdGhlIGRhdGFncmlkLnNldHRpbmdzLnNvdXJjZVxuICAgKiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBwYWdlclR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYWdlclR5cGUgLSBhIHZhbGlkIHBhZ2VyIHR5cGUuXG4gICAqL1xuICB0cmlnZ2VyU291cmNlKHBhZ2VyVHlwZTogU29ob0RhdGFHcmlkVHJpZ2dlclNvdXJjZVBhZ2VyVHlwZSwgY2FsbGJhY2s/OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnRyaWdnZXJTb3VyY2UocGFnZXJUeXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBleHBvcnQgb2YgZ3JpZCBkYXRhIHRvIEV4Y2VsLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHByZWZpeCBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgKiBAcGFyYW0gd29ya3NoZWV0TmFtZSBUaGUgbmFtZSB0byBiZSB1c2VkIGZvciB0aGUgd29ya3NoZWV0LlxuICAgKiBAcGFyYW0gY3VzdG9tRHMgQSBkYXRhc291cmNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IChkZXByZWNhdGVkKVxuICAgKi9cbiAgZXhwb3J0VG9FeGNlbChmaWxlTmFtZTogc3RyaW5nLCB3b3Jrc2hlZXROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBjdXN0b21Ecz86IE9iamVjdFtdKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZXhwb3J0VG9FeGNlbChmaWxlTmFtZSwgKHdvcmtzaGVldE5hbWUgYXMgYW55KSwgKGN1c3RvbURzIGFzIGFueSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgZXhwb3J0IG9mIGdyaWQgZGF0YSB0byBDU1YgZm9ybWF0dGVkIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcHJlZml4IG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIGV4cG9ydGVkIGZpbGUuXG4gICAqIEBwYXJhbSBjdXN0b21EcyBBIGRhdGFzb3VyY2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuXG4gICAqIEBwYXJhbSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciB0byB1c2UgaW4gdGhlIGN2cyBmaWxlLCBkZWZhdWx0cyB0byAnc2VwPSwnXG4gICAqIEBwYXJhbSBmb3JtYXQgaWYgdHJ1ZSwgZGF0ZSBhbmQgbnVtYmVyIHZhbHVlcyB3aWxsIGJlIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgbG9jYWxlXG4gICAqL1xuICBleHBvcnRUb0NzdihmaWxlTmFtZTogc3RyaW5nLCBjdXN0b21Ecz86IE9iamVjdFtdLCBzZXBhcmF0b3I6IHN0cmluZyA9ICdzZXA9LCcsIGZvcm1hdD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5leHBvcnRUb0NzdihmaWxlTmFtZSwgKGN1c3RvbURzIGFzIGFueSksIHNlcGFyYXRvciwgZm9ybWF0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb2x1bW5zIGFuZCBjb2x1bW5Hcm91cHMgZGlzcGxheWVkIG9uIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1ucyBUaGUgZGF0YWdyaWQgY29sdW1ucyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBjb2x1bW5Hcm91cHMgVGhlIGNvbHVtbiBncm91cHMgdG8gdXBkYXRlLlxuICAgKi9cbiAgdXBkYXRlQ29sdW1ucyhjb2x1bW5zOiBTb2hvRGF0YUdyaWRDb2x1bW5bXSwgY29sdW1uR3JvdXBzOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucyhjb2x1bW5zLCBjb2x1bW5Hcm91cHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgSlNPTiBhcnJheSB3aXRoIGNvbHVtbnMgYW5kIHJldHVybiB0aGUgY29sdW1uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtblN0ciBUaGUganNvbiByZXByZXNudGF0aW9uIG9mIHRoZSBjb2x1bW4gb2JqZWN0LlxuICAgKiBAcmV0dXJuICBUaGUgYXJyYXkgb2YgY29sdW1ucy5cbiAgICovXG4gIGNvbHVtbnNGcm9tU3RyaW5nKGNvbHVtbnM6IHN0cmluZyk6IE9iamVjdCB7IC8vIEB0b2RvIHR5cGluZ3MgZm9yIHJldHVybiB2YWx1ZVxuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5zRnJvbVN0cmluZyhjb2x1bW5zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBjb2x1bW5zIHRvIHRoZWlyIGRlZmF1bHRzICh1c2VkIG9uIHJlc3RvcmUgbWVudSBpdGVtKS5cbiAgICovXG4gIHJlc2V0Q29sdW1ucygpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVzZXRDb2x1bW5zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgcGVyc29uYWxpemUgZGlhbG9nLlxuICAgKi9cbiAgcGVyc29uYWxpemVDb2x1bW5zKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5wZXJzb25hbGl6ZUNvbHVtbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSB1c2VyIHNldHRpbmdzIGZyb20gbG9jYWwgU3RvcmFnZSBvciBhcyBwYXNzZWQgaW4uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNldHRpbmdzIHRvIHVzZS5cbiAgICovXG4gIHJlc3RvcmVVc2VyU2V0dGluZ3Moc2V0dGluZ3M6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlc3RvcmVVc2VyU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBhIHRlcm0gYWNyb3NzIGFsbCBjb2x1bW5zIGFuZCBoaWdobGlnaHQgaXRcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgc2VhcmNoIHRlcm1cbiAgICovXG4gIGtleXdvcmRTZWFyY2godmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmtleXdvcmRTZWFyY2godmFsdWUpXG4gICAgfSlcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRXZlbnQgSGFuZGxlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSByZXF1ZXN0IHRvIGxvYWQgdGhlIGRhdGEgZm9yIHRoZSBncmlkIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIEB0b2RvIHBhZ2luZyAtIG5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQ/XG4gICAqL1xuICBwcml2YXRlIG9uRGF0YVJlcXVlc3QocmVxdWVzdDogU29ob0RhdGFHcmlkU291cmNlUmVxdWVzdCwgcmVzcG9uc2U6IFNvaG9EYXRhR3JpZFJlc3BvbnNlRnVuY3Rpb24pIHtcbiAgICAvLyBUaGUgcmVxdWVzdCBmb3IgZGF0YSBpcyBtYWRlIGJ5IHRoZSBkYXRhZ3JpZCwgc28ganVtcCBiYWNrIGludG8gdGhlIGFuZ3VsYXIgem9uZSAuLi5cbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cbiAgICAgIC8vIC4uLiByZXF1ZXN0IHRoZSBkYXRhIGZyb20gdGhlIHNlcnZpY2UgLi4uXG4gICAgICB0aGlzLmRhdGFncmlkU2VydmljZS5nZXREYXRhKHJlcXVlc3QpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdHM6IE9iamVjdFtdKSA9PiB7XG4gICAgICAgICAgLy8gLi4gb24gcmVjZWlwdCwgcGFzcyB0aGUgZGF0YSBiYWNrIHRvIHRoZSBkYXRhZ3JpZCBidXRcbiAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBhbmd1bGFyIHpvbmUuXG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gcmVzcG9uc2UocmVzdWx0cywgcmVxdWVzdCkpO1xuICAgICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjaGlsZCByb3cgaGFzIGJlZW4gZXhwYW5kZWQuXG4gICAqL1xuICBwcml2YXRlIG9uRXhwYW5kUm93SGFuZGxlcihhcmdzOiBTb2hvRGF0YUdyaWRSb3dFeHBhbmRFdmVudCkge1xuICAgIGNvbnN0IGV2ZW50ID0geyBncmlkOiB0aGlzLCAuLi5hcmdzIH07XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuYnVpbGRSb3dUZW1wbGF0ZUNvbXBvbmVudChldmVudCk7XG4gICAgfVxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmV4cGFuZHJvdy5uZXh0KGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBjb21wb25lbnQgZm9yIHJvd1RlbXBsYXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUm93VGVtcGxhdGVDb21wb25lbnQoZXZlbnQ6IGFueSkge1xuXG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50XG4gICAgKTtcblxuICAgIC8vIFJlbW92ZSBjb21wb25lbnQgaWYgaXQgZXhpc3RzXG4gICAgY29uc3QgaWR4ID0gdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMuZmluZEluZGV4KChjKSA9PiBldmVudC5yb3cgPT09IGMucm93KTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzW2lkeF0uY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLnNwbGljZShpZHgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lclBhcmVudCA9IGV2ZW50LmRldGFpbFswXS5xdWVyeVNlbGVjdG9yKCcuZGF0YWdyaWQtcm93LWRldGFpbC1wYWRkaW5nJyk7XG4gICAgY29udGFpbmVyUGFyZW50LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiZGF0YWdyaWQtY2VsbC1sYXlvdXRcIj48L2Rpdj4nO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclBhcmVudC5xdWVyeVNlbGVjdG9yKCcuZGF0YWdyaWQtY2VsbC1sYXlvdXQnKTtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBsZXQgZGF0YUNvbXBvbmVudDogYW55O1xuICAgIGlmIChldmVudC5pdGVtLmhhc093blByb3BlcnR5KHRoaXMuZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVGaWVsZCkpIHtcbiAgICAgIGRhdGFDb21wb25lbnQgPSBldmVudC5pdGVtWyh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlRmllbGQgYXMgYW55KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiAnYXJncycsXG4gICAgICAgICAgdXNlVmFsdWU6IHsgaW5wdXRzRGF0YTogdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cywgZGF0YTogZGF0YUNvbXBvbmVudCwgLi4uZXZlbnQgfSxcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50LCBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGluamVjdG9yLCBbXSwgY29udGFpbmVyKTtcbiAgICBldmVudFsncm93VGVtcGxhdGVDb21wb25lbnQnXSA9IGNvbXBvbmVudDtcblxuICAgIC8vIC4uLiBhdHRhY2ggdG8gdGhlIGFwcCAuLi5cbiAgICB0aGlzLmFwcC5hdHRhY2hWaWV3KGNvbXBvbmVudC5ob3N0Vmlldyk7XG5cbiAgICAvLyAuLi4gdXBkYXRlIGZvciBjaGFuZ2VzIC4uLlxuICAgIGNvbXBvbmVudC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAvLyAuLi4gZmluYWxseSBzdG9yZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgZm9yIGxhdGVyLCB3ZSdsbCBkZWxldGUgaXQgd2hlblxuICAgIC8vIHJlcXVlc3RlZCwgb3Igd2hlbiB0aGUgZ3JpZCBpcyBkZXN0cm95ZWQuXG4gICAgdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMucHVzaCh7IHJvdzogZXZlbnQucm93LCBjb21wb25lbnQgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBhZnRlciBhIGNvbnRleHQgbWVudSBpcyBvcGVuZWRcbiAgICovXG4gIHByaXZhdGUgb25LZXlEb3duSGFuZGxlcihlOiBKUXVlcnkuRXZlbnQsIGFyZ3M6IFNvaG9EYXRhR3JpZEtleURvd25BcmdzLCByZXNwb25zZTogRnVuY3Rpb24pIHtcbiAgICBjb25zdCBldmVudCA9IHsgZSwgYXJncywgcmVzcG9uc2UgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5rZXlkb3duLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGUua2V5ID09PSAnRjEwJyAmJiBlLnNoaWZ0S2V5KSB7XG4gICAgICAkKChlIGFzIGFueSkuY3VycmVudFRhcmdldCkudHJpZ2dlcignY29udGV4dG1lbnUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjaGlsZCByb3cgaGFzIGJlZW4gZXhwYW5kZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByb3BlcnR5IHN0cmluZyBpZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IG9uQmVmb3JlU2VsZWN0KGJlZm9yZVNlbGVjdEZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRCZWZvcmVTZWxlY3RGdW5jdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uQmVmb3JlU2VsZWN0ID0gYmVmb3JlU2VsZWN0RnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25CZWZvcmVTZWxlY3QgPSBiZWZvcmVTZWxlY3RGdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uQmVmb3JlU2VsZWN0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IG9uQmVmb3JlU2VsZWN0KCk6IFNvaG9EYXRhR3JpZEJlZm9yZVNlbGVjdEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25CZWZvcmVTZWxlY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5vbkJlZm9yZVNlbGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgTWFrZXMgaXQgcG9zc2libGUgdG8gc2F2ZSBzZWxlY3Rpb25zIHdoZW4gY2hhbmdpbmcgcGFnZXMgb24gc2VydmVyIHNpZGUgcGFnaW5nLlxuICAgKiAgWW91IG1heSB3YW50IHRvIGFsc28gdXNlIHNob3dTZWxlY3RBbGxDaGVja0JveDogZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHNldCBhbGxvd1NlbGVjdEFjcm9zc1BhZ2VzKGFsbG93U2VsZWN0QWNyb3NzUGFnZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzID0gYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzID0gYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2FsbG93U2VsZWN0QWNyb3NzUGFnZXMnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuICBnZXQgYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFsbG93U2VsZWN0QWNyb3NzUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogIFNlbGVjdCBhbGwgd2lsbCBlZmZlY3Qgb25seSBvbiBjdXJyZW50IHBhZ2UgYW5kIGl0cyBmb3IgY2xpZW50IHNpZGUgcGFnaW5nIG9ubHkuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2VsZWN0QWxsQ3VycmVudFBhZ2Uoc2VsZWN0QWxsQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RBbGxDdXJyZW50UGFnZSA9IHNlbGVjdEFsbEN1cnJlbnRQYWdlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdEFsbEN1cnJlbnRQYWdlID0gc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RBbGxDdXJyZW50UGFnZScsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBzZWxlY3RBbGxDdXJyZW50UGFnZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RBbGxDdXJyZW50UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjb2x1bW4gSURzIHVzZWQgdG8gZGVmaW5lIGFyaWEgZGVzY3JpcHRvcnMgZm9yIHNlbGVjdGlvbiBjaGVja2JveGVzLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNvbHVtbklkcyhjb2x1bW5JZHM6IEFycmF5PFN0cmluZyB8IE51bWJlcj4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5JZHMgPSBjb2x1bW5JZHM7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY29sdW1uSWRzID0gY29sdW1uSWRzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY29sdW1uSWRzJywgUmVmcmVzaEhpbnRGbGFncy5Ob25lKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbHVtbklkcygpOiBBcnJheTxTdHJpbmcgfCBOdW1iZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1uSWRzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uSWRzO1xuICB9XG5cbiAgLyoqXG4gICAqSWYgdHJ1ZSwgdGhlIG5ldyByb3cgaW5kaWNhdG9yIHdpbGwgZGlzcGxheSBhZnRlciBhZGRpbmcgYSByb3dcbiAgICpcbiAgICogQHBhcmFtIHNob3dOZXdSb3dJbmRpY2F0b3IgYm9vbGVhbiBzaG93IG5ldyBpbmRpY2F0b3Igc2V0dGluZ1xuICAgKi9cbiAgQElucHV0KCkgc2V0IHNob3dOZXdSb3dJbmRpY2F0b3Ioc2hvd05ld1Jvd0luZGljYXRvcjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dOZXdSb3dJbmRpY2F0b3IgPSBzaG93TmV3Um93SW5kaWNhdG9yO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dOZXdSb3dJbmRpY2F0b3IgPSBzaG93TmV3Um93SW5kaWNhdG9yO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd05ld1Jvd0luZGljYXRvcicsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBzaG93TmV3Um93SW5kaWNhdG9yKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zaG93TmV3Um93SW5kaWNhdG9yO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd05ld1Jvd0luZGljYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkV4cGFuZENoaWxkcmVuKGV4cGFuZENoaWxkcmVuRnVuY3Rpb246IFNvaG9EYXRhR3JpZEV4cGFuZENoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkV4cGFuZENoaWxkcmVuID0gZXhwYW5kQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vbkV4cGFuZENoaWxkcmVuID0gZXhwYW5kQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uRXhwYW5kQ2hpbGRyZW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBvbkV4cGFuZENoaWxkcmVuKCk6IFNvaG9EYXRhR3JpZEV4cGFuZENoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5vbkV4cGFuZENoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMub25FeHBhbmRDaGlsZHJlbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkNvbGxhcHNlQ2hpbGRyZW4oY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRDb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkNvbGxhcHNlQ2hpbGRyZW4gPSBjb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25Db2xsYXBzZUNoaWxkcmVuID0gY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnb25Db2xsYXBzZUNoaWxkcmVuJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb25Db2xsYXBzZUNoaWxkcmVuKCk6IFNvaG9EYXRhR3JpZENvbGxhcHNlQ2hpbGRyZW5GdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm9uQ29sbGFwc2VDaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLm9uQ29sbGFwc2VDaGlsZHJlbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvblBvc3RSZW5kZXJDZWxsKG9uUG9zdFJlbmRlckNlbGw6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsRnVuY3Rpb24pIHtcbiAgICBjb25zdCBwb3N0UmVuZGVyQ2VsbCA9IChlOiBKUXVlcnk8SFRNTEVsZW1lbnQ+LCBhcmdzOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEFyZ3MpID0+IHtcbiAgICAgIHRoaXMub25Qb3N0UmVuZGVyQ2VsbEhhbmRsZXIoZSwgYXJncyk7XG4gICAgICBvblBvc3RSZW5kZXJDZWxsKGUsIGFyZ3MpO1xuICAgIH07XG5cbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vblBvc3RSZW5kZXJDZWxsID0gcG9zdFJlbmRlckNlbGw7XG5cbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vblBvc3RSZW5kZXJDZWxsID0gcG9zdFJlbmRlckNlbGw7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IG9uRGVzdHJveUNlbGwob25EZXN0cm95Q2VsbDogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxGdW5jdGlvbikge1xuICAgIGNvbnN0IGRlc3Ryb3lDZWxsID0gKGU6IEpRdWVyeTxIVE1MRWxlbWVudD4sIGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykgPT4ge1xuICAgICAgdGhpcy5vbkRlc3Ryb3lDZWxsSGFuZGxlcihhcmdzKTtcbiAgICAgIG9uRGVzdHJveUNlbGwoZSwgYXJncyk7XG4gICAgfTtcblxuICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uRGVzdHJveUNlbGwgPSBkZXN0cm95Q2VsbDtcblxuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLm9uRGVzdHJveUNlbGwgPSBkZXN0cm95Q2VsbDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb25FZGl0Q2VsbChvbkVkaXRDZWxsOiBTb2hvRGF0YUdyaWRFZGl0Q2VsbEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgZWRpdENlbGwgPSAoZWRpdG9yOiBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3IpID0+IHtcbiAgICAgIHRoaXMub25FZGl0Q2VsbEhhbmRsZXIoZWRpdG9yKTtcbiAgICAgIG9uRWRpdENlbGwoZWRpdG9yKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMub25FZGl0Q2VsbCA9IGVkaXRDZWxsO1xuXG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25FZGl0Q2VsbCA9IGVkaXRDZWxsO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbktleURvd24ob25LZXlEb3duOiBTb2hvRGF0YUdyaWRLZXlEb3duRnVuY3Rpb24pIHtcbiAgICBjb25zdCBrZXlEb3duID0gKGU6IEpRdWVyeS5FdmVudCwgYXJnczogU29ob0RhdGFHcmlkS2V5RG93bkFyZ3MsIHJlc3BvbnNlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5vbktleURvd25IYW5kbGVyKGUsIGFyZ3MsIHJlc3BvbnNlKTtcbiAgICAgIG9uS2V5RG93bihlLCBhcmdzLCByZXNwb25zZSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uS2V5RG93biA9IGtleURvd247XG5cbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vbktleURvd24gPSBrZXlEb3duO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkV4cGFuZFJvdyhvbkV4cGFuZFJvdzogU29ob0RhdGFHcmlkRXhwYW5kUm93RnVuY3Rpb24pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkV4cGFuZFJvdyA9IG9uRXhwYW5kUm93O1xuXG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25FeHBhbmRSb3cgPSBvbkV4cGFuZFJvdztcbiAgICB9XG4gIH1cblxuICAvKiBJY29uIG5hbWUgZm9yIGZhbGxiYWNrcyBpZiB0aGUgaW1hZ2UgZG9lcyBub3QgbG9hZCAqL1xuICBASW5wdXQoKSBzZXQgZmFsbGJhY2tJbWFnZShmYWxsYmFja0ltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5mYWxsYmFja0ltYWdlID0gZmFsbGJhY2tJbWFnZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5mYWxsYmFja0ltYWdlID0gZmFsbGJhY2tJbWFnZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZhbGxiYWNrSW1hZ2UnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmYWxsYmFja0ltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmZhbGxiYWNrSW1hZ2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5mYWxsYmFja0ltYWdlO1xuICB9XG5cbiAgLyogVG9vbHRpcCB0byBzaG93IGlmIGl0IHRoZSBmYWxsYmFjayBhcHBlYXJzICovXG4gIEBJbnB1dCgpIHNldCBmYWxsYmFja1Rvb2x0aXAoZmFsbGJhY2tUb29sdGlwOiBTb2hvRmFsbGJhY2tUb29sdGlwT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrVG9vbHRpcCA9IGZhbGxiYWNrVG9vbHRpcDtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5mYWxsYmFja1Rvb2x0aXAgPSBmYWxsYmFja1Rvb2x0aXA7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmYWxsYmFja1Rvb2x0aXAnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmYWxsYmFja1Rvb2x0aXAoKTogU29ob0ZhbGxiYWNrVG9vbHRpcE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5mYWxsYmFja1Rvb2x0aXA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5mYWxsYmFja1Rvb2x0aXA7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgZWRpdCBtb2RlIGlzIGFjdGl2YXRlZCBvbiBhbiBlZGl0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBldmVudCBhcmd1bWVudHNcbiAgICovXG4gIHByaXZhdGUgb25FeGl0RWRpdE1vZGUoYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkge1xuICAgIGNvbnN0IGV2ZW50ID0geyBncmlkOiB0aGlzLCAuLi5hcmdzIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuZXhpdGVkaXRtb2RlLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGJlZm9yZSBlZGl0IG1vZGUgaXMgYWN0aXZhdGVkIG9uIGFuIGVkaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgdGhlIGV2ZW50IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBvbkJlZm9yZUVudGVyRWRpdE1vZGUoYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkge1xuICAgIGNvbnN0IGV2ZW50ID0geyBncmlkOiB0aGlzLCAuLi5hcmdzIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuYmVmb3JlZW50ZXJlZGl0bW9kZS5uZXh0KGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGVkaXQgbW9kZSBpcyBhY3RpdmF0ZWQgb24gYW4gZWRpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyB0aGUgZXZlbnQgYXJndW1lbnRzXG4gICAqL1xuICBwcml2YXRlIG9uRW50ZXJFZGl0TW9kZShhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGdyaWQ6IHRoaXMsIC4uLmFyZ3MgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5lbnRlcmVkaXRtb2RlLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIGEgY2hpbGQgcm93IGhhcyBiZWVuIGNvbGxhcHNlZC5cbiAgICovXG4gIHByaXZhdGUgb25Db2xsYXBzZVJvdyhhcmdzOiBTb2hvRGF0YUdyaWRSb3dDb2xsYXBzZUV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGdyaWQ6IHRoaXMsIC4uLmFyZ3MgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsYXBzZXJvdy5uZXh0KGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGhhcyBiZWVuIGFkZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0FkZChhcmdzOiBTb2hvRGF0YUdyaWRBZGRSb3dFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd0FkZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSBjZWxsIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkNlbGxDaGFuZ2UoYXJnczogU29ob0RhdGFHcmlkQ2VsbENoYW5nZUV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuY2VsbGNoYW5nZS5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaGFzIGJlZW4gY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dDbGlja2VkKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dDbGlja2VkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiB0aGUgZmlsdGVyIHJvdyBpcyBjbG9zZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQ2xvc2VGaWx0ZXJSb3coYXJnczogU29ob0RhdGFHcmlkQ2xvc2VGaWx0ZXJSb3dFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmNsb3NlRmlsdGVyUm93Lm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIGNvbnRleHQgbWVudSBpcyBpcyBjbGlja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkNvbnRleHRNZW51KGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0TWVudT8ubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgY29udGV4dCBtZW51IGlzIGlzIGNsaWNrZWQuXG4gICAqL1xuICBwcml2YXRlIG9uRG91YmxlQ2xpY2soYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd0RvdWJsZUNsaWNrZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBkYXRhIGlzIGZpbHRlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkZpbHRlcmVkKGFyZ3M6IFNvaG9EYXRhR3JpZEZpbHRlcmVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5maWx0ZXJlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gZmlsdGVyIHJvdyBvcGVuZWQuXG4gICAqL1xuICBwcml2YXRlIG9uT3BlbkZpbHRlclJvdyhhcmdzOiBTb2hvRGF0YUdyaWRPcGVuRmlsdGVyUm93RXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5vcGVuRmlsdGVyUm93Lm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIHJvdyBpcyByZW1vdmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd1JlbW92ZShhcmdzOiBTb2hvRGF0YUdyaWRSb3dSZW1vdmVFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd1JlbW92ZS5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgcmVuZGVyZWRcbiAgICovXG4gIHByaXZhdGUgb25SZW5kZXJlZChhcmdzOiBTb2hvRGF0YUdyaWRSZW5kZXJlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBkYXRhIGlzIGZpbHRlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkFmdGVyUmVuZGVyKGFyZ3M6IFNvaG9EYXRhR3JpZEFmdGVyUmVuZGVyRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclJlbmRlci5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGJlZm9yZSBhIHJvdyBpcyBhY3RpdmF0ZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQmVmb3JlUm93QWN0aXZhdGVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuYmVmb3JlUm93QWN0aXZhdGVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIHJvdyBpcyBhY3RpdmF0ZWQuXG4gICAqL1xuICBwcml2YXRlIG9uUm93QWN0aXZhdGVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93QWN0aXZhdGVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIHJvdyBpcyBkZWFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dEZWFjdGl2YXRlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dEZWFjdGl2YXRlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93RGVhY3RpdmF0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIHJlb3JkZXJlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dSZW9yZGVyZWQoYXJnczogU29ob0RhdGFHcmlkUm93UmVvcmRlcmVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dSZW9yZGVyZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIHNlbGVjdGVkIG9yIGRlc2VsZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIG9uU2VsZWN0ZWQoYXJnczogU29ob0RhdGFHcmlkU2VsZWN0ZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBzZXR0aW5ncyBhcmUgY2hhbmdlZCBvbiB0aGUgZ3JpZC5cbiAgICovXG4gIHByaXZhdGUgb25TZXR0aW5nc0NoYW5nZWQoYXJnczogU29ob0RhdGFHcmlkU2V0dGluZ3NDaGFuZ2VkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc0NoYW5nZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBkYXRhIGlzIHNvcnRlZC5cbiAgICovXG4gIHByaXZhdGUgb25Tb3J0ZWQoYXJnczogU29ob0RhdGFHcmlkU29ydGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5zb3J0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHNlYXJjaCBpbiB0b29sYmFyIGlzIHRyaWdnZXJlZFxuICAgKiBAcGFyYW0gYXJncyBTZWFyY2hlZCBkYXRhXG4gICAqL1xuICBwcml2YXRlIG9uU2VhcmNoZWQoYXJnczogYW55W10pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdXNpbmcgYnVpbHQtaW4gcGFnZXIgdG8gbmV4dCBwYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBvbk5leHRQYWdlKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5uZXh0UGFnZS5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgd2hlbiB1c2luZyBidWlsdC1pbiBwYWdlciB0byBwcmV2aW91cyBwYWdlLlxuICAgICAqL1xuICBwcml2YXRlIG9uUHJldmlvdXNQYWdlKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5wcmV2aW91c1BhZ2UubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdXNpbmcgYnVpbHQtaW4gcGFnZXIgdG8gZmlyc3QgcGFnZS5cbiAgICAgKi9cbiAgcHJpdmF0ZSBvbkZpcnN0UGFnZShhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuZmlyc3RQYWdlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCB3aGVuIHVzaW5nIGJ1aWx0LWluIHBhZ2VyIHRvIGxhc3QgcGFnZS5cbiAgICAgKi9cbiAgcHJpdmF0ZSBvbkxhc3RQYWdlKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5sYXN0UGFnZS5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIG9uIHBhZ2luZyBzaXplIGNoYW5nZVxuICAgKi9cbiAgcHJpdmF0ZSBvblBhZ2VTaXplQ2hhbmdlKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5wYWdlU2l6ZUNoYW5nZS5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGJlZm9yZSBwYWdpbmdcbiAgICovXG4gIHByaXZhdGUgb25CZWZvcmVQYWdpbmcoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmJlZm9yZVBhZ2luZy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHBhZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBvbkFmdGVyUGFnaW5nKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclBhZ2luZy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHZlcnRpY2FsIHNjcm9sbFxuICAgKi9cbiAgcHJpdmF0ZSBvblZlcnRpY2FsU2Nyb2xsKGFyZ3M6IFNvaG9EYXRhR3JpZFNjcm9sbEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMudmVydGljYWxTY3JvbGwubmV4dChhcmdzKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHZlcnRpY2FsIHNjcm9sbFxuICAgKi9cbiAgcHJpdmF0ZSBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlZChhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZpbHRlcm9wZXJhdG9yY2hhbmdlZC5uZXh0KGFyZ3MpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IGRvbSBqUXVlcnkgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtICBpbmNsdWRlR3JvdXBzIElmIHRydWUgZ3JvdXBzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAqIEByZXR1cm4gVGhlIGRvbSBqUXVlcnkgbm9kZVxuICAgKi9cbiAgcm93Tm9kZShyb3c6IG51bWJlciwgaW5jbHVkZUdyb3VwczogYm9vbGVhbik6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5yb3dOb2RlKHJvdywgaW5jbHVkZUdyb3Vwcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2VsbCBkb20gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtICBjZWxsIFRoZSBjZWxsIGluZGV4LlxuICAgKiBAcGFyYW0gIGluY2x1ZGVHcm91cHMgSWYgdHJ1ZSBncm91cHMgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICogQHJldHVybiBUaGUgZG9tIG5vZGVcbiAgICovXG4gIGNlbGxOb2RlKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIsIGluY2x1ZGVHcm91cHM6IGJvb2xlYW4pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8uY2VsbE5vZGUocm93LCBjZWxsLCBpbmNsdWRlR3JvdXBzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgRGV0YWlsIFJvdyBPciBUcmVlIFJvd1xuICAgKiBAcGFyYW0ge251bWJlcn0gZGF0YVJvd0luZGV4IFRoZSByb3cgdG8gdG9nZ2xlXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IGV4cGFuZE9ubHkgU2V0IHRoZSB0b2dnbGUgdG8gZXhwYW5kIG9ubHlcbiAgICovXG4gIHRvZ2dsZVJvd0RldGFpbChkYXRhUm93SW5kZXg6IG51bWJlciwgZXhwYW5kT25seT86IGJvb2xlYW4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQ/LnRvZ2dsZVJvd0RldGFpbChkYXRhUm93SW5kZXgsIGV4cGFuZE9ubHkpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlU3VtbWFyeVJvdyhjb2w6IG9iamVjdCwgY2VsbDogbnVtYmVyKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy51cGRhdGVTdW1tYXJ5Um93KGNvbCwgY2VsbCk7XG4gICAgfSlcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGUgRXZlbnRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBpbml0aWFsaXplcyB0aGUgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVTb3VyY2UodGhpcy5fZ3JpZE9wdGlvbnMuc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgQW5ndWxhciBwcm9qZWN0cyBleHRlcm5hbCBjb250ZW50IGludG8gaXRzIHZpZXcuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gT25jZSB0aGUgdmlldyBpcyBjcmVhdGVkIGFuZCByZWFkeSwgaW5pdGlhaXNlIHRoZSBkYXRhIGdyaWQgY29tcG9uZW50LlxuICAgIHRoaXMuYnVpbGREYXRhR3JpZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMucmVmcmVzaEhpbnQgIT09IFJlZnJlc2hIaW50RmxhZ3MuTm9uZSkge1xuICAgICAgdGhpcy51cGRhdGVkKHRoaXMuX2dyaWRPcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIGp1c3QgYmVmb3JlIEFuZ3VsYXIgZGVzdHJveXMgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogVW5zdWJzY3JpYmUgb2JzZXJ2YWJsZXMsIGRldGFjaCBldmVudCBoYW5kbGVycyBhbmQgcmVtb3ZlIG90aGVyIHJlc291cmNlcyB0byBhdm9pZCBtZW1vcnkgbGVha3MuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lEYXRhR3JpZCgpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YXRlIE1lbWJlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgalF1ZXJ5IGNvbnRyb2wgKGFuZCBhbnkgb3RoZXIgcmVzb3VyY2VzKVxuICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGRlc3Ryb3lEYXRhR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBkeW5hbWljIGNvbXBvbmVudHMuXG4gICAgdGhpcy5jZWxsQ29tcG9uZW50cy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICBjLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciB0aGUgY2FjaGUuXG4gICAgdGhpcy5jZWxsQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgLy8gUmVtb3ZlIHJvd1RlbXBsYXRlIGR5bmFtaWMgY29tcG9uZW50cy5cbiAgICBpZiAodGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMgJiYgdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICBjLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzID0gW107XG4gICAgfVxuXG4gICAgLy8gTm93IGRlc3Ryb3kgdGhlIGdyaWQuXG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFncmlkLmRlc3Ryb3kpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YWdyaWQ/LmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFncmlkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgJ3Bvc3RDZWxsUmVuZGVyJyBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyIHRvIGhvc3QgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBmb3JtYXR0ZXIgYXJndW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBvblBvc3RSZW5kZXJDZWxsSGFuZGxlcihjb250YWluZXI6IEpRdWVyeSwgYXJnczogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxBcmdzKSB7XG4gICAgLy8gUHJlLWNvbmRpdGlvbnNcbiAgICBpZiAoIWFyZ3MuY29sLmNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuOyAvLyB0aHJvdyBFcnJvcihgTWlzc2luZyAnY29tcG9uZW50JyBpbiBjb2x1bW4gJHthcmdzLmNvbC5pZH1gKTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBmYWN0b3J5IGZvciB0aGUgY29tcG9uZW50IHNwZWNpZmllZCBvbiB0aGUgY29sdW1uLlxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGFyZ3MuY29sLmNvbXBvbmVudCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5qZWN0b3IgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGFyZ3VtZW50cyBmb3IgdGhlXG4gICAgLy8gY29tcG9uZW50LlxuICAgIC8vIGNvbnN0IGluamVjdG9yID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW3sgcHJvdmlkZTogJ2FyZ3MnLCB1c2VWYWx1ZTogYXJncyB9XSwgdGhpcy5pbmplY3Rvcik7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IFt7IHByb3ZpZGU6ICdhcmdzJywgdXNlVmFsdWU6IGFyZ3MgfV0sIHBhcmVudDogdGhpcy5pbmplY3RvciB9KTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50LCBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGZhY3RvcnkuY3JlYXRlKGluamVjdG9yLCBbXSwgY29udGFpbmVyKTtcblxuICAgIC8vIENvcHkgaW50byBpdCBhbnkgY29sdW1uIGxldmVsIElucHV0cywgdGhlc2UgYXJlIG9wdGlvbmFsIGJ1dCBhbGxvd1xuICAgIC8vIGNvbHVtbiBzcGVjaWZpYyBvdmVycmlkZXMgdG8gYmUgZGVmaW5lZC5cbiAgICBPYmplY3QuYXNzaWduKChjb21wb25lbnQgYXMgYW55KS5pbnN0YW5jZSwgYXJncy5jb2wuY29tcG9uZW50SW5wdXRzKTtcblxuICAgIC8vIC4uLiBhdHRhY2ggdG8gdGhlIGFwcCAuLi5cbiAgICB0aGlzLmFwcC5hdHRhY2hWaWV3KGNvbXBvbmVudC5ob3N0Vmlldyk7XG5cbiAgICAvLyAuLi4gdXBkYXRlIGZvciBjaGFuZ2VzIC4uLlxuICAgIGNvbXBvbmVudC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAvLyBEbyB0aGlzIGF0IHRoZSBlbmQ/XG5cbiAgICAvLyAuLi4gZmluYWxseSBzdG9yZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgZm9yIGxhdGVyLCB3ZSdsbCBkZWxldGUgaXQgd2hlblxuICAgIC8vIHJlcXVlc3RlZCwgb3Igd2hlbiB0aGUgZ3JpZCBpcyBkZXN0cm95ZWQuXG4gICAgdGhpcy5jZWxsQ29tcG9uZW50cy5wdXNoKFxuICAgICAgeyByb3c6IGFyZ3Mucm93LCBjZWxsOiBhcmdzLmNlbGwsIGNvbXBvbmVudCB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSAnZGVzdHJveUNlbGwnIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBhcmdzXG4gICAqL1xuICBwcml2YXRlIG9uRGVzdHJveUNlbGxIYW5kbGVyKGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuY2VsbENvbXBvbmVudHMuZmluZEluZGV4KChjKSA9PiBhcmdzLnJvdyA9PT0gYy5yb3cgJiYgYXJncy5jZWxsID09PSBjLmNlbGwpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5jZWxsQ29tcG9uZW50c1tpZHhdLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB0aGlzLmNlbGxDb21wb25lbnRzLnNwbGljZShpZHgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25FZGl0Q2VsbEhhbmRsZXIoZWRpdG9yOiBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3IpIHtcbiAgICAvLyBQcmUtY29uZGl0aW9uc1xuICAgIGlmICghZWRpdG9yLmNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuOyAvLyB0aHJvdyBFcnJvcihgTWlzc2luZyAnY29tcG9uZW50JyBpbiBjb2x1bW4gJHthcmdzLmNvbC5pZH1gKTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBmYWN0b3J5IGZvciB0aGUgY29tcG9uZW50IHNwZWNpZmllZCBvbiB0aGUgY29sdW1uLlxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGVkaXRvci5jb21wb25lbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGluamVjdG9yIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBhcmd1bWVudHMgZm9yIHRoZVxuICAgIC8vIGNvbXBvbmVudC5cbiAgICAvLyBjb25zdCBpID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW3sgcHJvdmlkZTogJ2FyZ3MnLCB1c2VWYWx1ZTogZWRpdG9yLmFyZ3MgfV0sIHRoaXMuaW5qZWN0b3IpO1xuICAgIGNvbnN0IGkgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBlZGl0b3IuYXJncyB9XSxcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvclxuICAgIH0pO1xuXG4gICAgLy8gV2FybmluZyEhIHRoZSBkeW5hbWljIGNvbXBvbmVudCBpcyBub3QgYWRkZWQgaW5zaWRlIHRoZSBjb250YWluZXIsXG4gICAgLy8gYnV0IGFzIGEgc2libGluZywgc28gd2hlbiBpdCdzIGRlc3Ryb3llZCBpdCB0YWtlcyBhbnkgc2libGluZ3MgIHdpdGhcbiAgICAvLyBpdC4gIEl0IGlzIG5vdCBjbGVhciB3aHkgdGhpcyAtIHNvIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUsIGFkZFxuICAgIC8vIGEgc2luZ2xlIGNoaWxkIHRvIHRoZSBjZWxsIGNvbnRhaW5lci5cbiAgICBjb25zdCB0cmFuc2llbnRDb250YWluZXIgPSAkKCc8ZGl2PjwvZGl2PicpLmFwcGVuZFRvKGVkaXRvci5hcmdzLmNvbnRhaW5lcik7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCwgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBmYWN0b3J5LmNyZWF0ZShpLCBbXSwgdHJhbnNpZW50Q29udGFpbmVyWzBdKSBhcyBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj47XG5cbiAgICAvLyBDb3B5IGludG8gaXQgYW55IGNvbHVtbiBsZXZlbCBJbnB1dHMsIHRoZXNlIGFyZSBvcHRpb25hbCBidXQgYWxsb3dcbiAgICAvLyBjb2x1bW4gc3BlY2lmaWMgb3ZlcnJpZGVzIHRvIGJlIGRlZmluZWQuXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2UsIGVkaXRvci5hcmdzLmNvbC5lZGl0b3JDb21wb25lbnRJbnB1dHMpO1xuXG4gICAgLy8gLi4uIGF0dGFjaCB0byB0aGUgYXBwIC4uLlxuICAgIHRoaXMuYXBwLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgIC8vIC4uLiB1cGRhdGUgZm9yIGNoYW5nZXMgLi4uXG4gICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0byB0aGUgZWRpdG9yLlxuICAgIGVkaXRvci5pbml0KGNvbXBvbmVudFJlZik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGF0YUdyaWQoKTogdm9pZCB7XG4gICAgLy8gY2FsbCBvdXRzaWRlIHRoZSBhbmd1bGFyIHpvbmUgc28gY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIGlzbid0IHRyaWdnZXJlZCBieSB0aGUgc29obyBjb21wb25lbnQuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gV3JhcCB0aGUgZWxlbWVudCBpbiBhIGpRdWVyeSBzZWxlY3Rvci5cbiAgICAgIHRoaXMualF1ZXJ5RWxlbWVudCA9IGpRdWVyeSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgIC8vIEFkZCB0aGUgb25Qb3N0Q2VsbFJlbmRlcmVyXG4gICAgICBpZiAoIXRoaXMuX2dyaWRPcHRpb25zLm9uUG9zdFJlbmRlckNlbGwpIHtcbiAgICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25Qb3N0UmVuZGVyQ2VsbCA9IChjLCBhcmdzOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEFyZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLm9uUG9zdFJlbmRlckNlbGxIYW5kbGVyKGMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdGhlIGRlc3Ryb3kgY2VsbCBjYWxsYmFjay5cbiAgICAgIGlmICghdGhpcy5fZ3JpZE9wdGlvbnMub25EZXN0cm95Q2VsbCkge1xuICAgICAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkRlc3Ryb3lDZWxsID0gKF8sIGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykgPT4ge1xuICAgICAgICAgIHRoaXMub25EZXN0cm95Q2VsbEhhbmRsZXIoYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgZWRpdCBjZWxsIGNhbGxiYWNrLlxuICAgICAgaWYgKCF0aGlzLl9ncmlkT3B0aW9ucy5vbkVkaXRDZWxsKSB7XG4gICAgICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uRWRpdENlbGwgPSAoZWRpdG9yOiBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3IpID0+IHtcbiAgICAgICAgICB0aGlzLm9uRWRpdENlbGxIYW5kbGVyKGVkaXRvcik7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUga2V5ZG93biBjYWxsYmFjay5cbiAgICAgIGlmICghdGhpcy5fZ3JpZE9wdGlvbnMub25LZXlEb3duKSB7XG4gICAgICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uS2V5RG93biA9IChlOiBKUXVlcnkuRXZlbnQsIGFyZ3M6IFNvaG9EYXRhR3JpZEtleURvd25BcmdzLCByZXNwb25zZTogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgICB0aGlzLm9uS2V5RG93bkhhbmRsZXIoZSwgYXJncywgcmVzcG9uc2UpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXNlIGFueSBldmVudCBoYW5kbGVycy5cbiAgICAgIHRoaXMualF1ZXJ5RWxlbWVudFxuICAgICAgICAub24oJ2FkZHJvdycsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRBZGRSb3dFdmVudCkgPT4gdGhpcy5vblJvd0FkZChhcmdzKSlcbiAgICAgICAgLm9uKCdjZWxsY2hhbmdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZENlbGxDaGFuZ2VFdmVudCkgPT4gdGhpcy5vbkNlbGxDaGFuZ2UoYXJncykpXG4gICAgICAgIC5vbignY2xpY2snLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkgPT4gdGhpcy5vblJvd0NsaWNrZWQoYXJncykpXG4gICAgICAgIC5vbignY2xvc2VmaWx0ZXJyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkQ2xvc2VGaWx0ZXJSb3dFdmVudCkgPT4gdGhpcy5vbkNsb3NlRmlsdGVyUm93KGFyZ3MpKVxuICAgICAgICAub24oJ2NvbGxhcHNlcm93JywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NvbGxhcHNlRXZlbnQpID0+IHRoaXMub25Db2xsYXBzZVJvdyhhcmdzKSlcbiAgICAgICAgLm9uKCdjb250ZXh0bWVudScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSA9PiB0aGlzLm9uQ29udGV4dE1lbnUoYXJncykpXG4gICAgICAgIC5vbignZGJsY2xpY2snLCAoX2U6IEpRdWVyeS5UcmlnZ2VyZWRFdmVudCwgYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkgPT4gdGhpcy5vbkRvdWJsZUNsaWNrKGFyZ3MpKVxuICAgICAgICAub24oJ2JlZm9yZWVudGVyZWRpdG1vZGUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkgPT4gdGhpcy5vbkJlZm9yZUVudGVyRWRpdE1vZGUoYXJncykpXG4gICAgICAgIC5vbignZXhpdGVkaXRtb2RlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpID0+IHRoaXMub25FeGl0RWRpdE1vZGUoYXJncykpXG4gICAgICAgIC5vbignZW50ZXJlZGl0bW9kZScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSA9PiB0aGlzLm9uRW50ZXJFZGl0TW9kZShhcmdzKSlcbiAgICAgICAgLm9uKCdleHBhbmRyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQpID0+IHRoaXMub25FeHBhbmRSb3dIYW5kbGVyKGFyZ3MpKVxuICAgICAgICAub24oJ2ZpbHRlcmVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEZpbHRlcmVkRXZlbnQpID0+IHRoaXMub25GaWx0ZXJlZChhcmdzKSlcbiAgICAgICAgLm9uKCdvcGVuZmlsdGVycm93JywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZE9wZW5GaWx0ZXJSb3dFdmVudCkgPT4gdGhpcy5vbk9wZW5GaWx0ZXJSb3coYXJncykpXG4gICAgICAgIC5vbigncm93cmVtb3ZlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd1JlbW92ZUV2ZW50KSA9PiB0aGlzLm9uUm93UmVtb3ZlKGFyZ3MpKVxuICAgICAgICAub24oJ3JlbmRlcmVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJlbmRlcmVkRXZlbnQpID0+IHRoaXMub25SZW5kZXJlZChhcmdzKSlcbiAgICAgICAgLm9uKCdhZnRlcnJlbmRlcicsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRBZnRlclJlbmRlckV2ZW50KSA9PiB0aGlzLm9uQWZ0ZXJSZW5kZXIoYXJncykpXG4gICAgICAgIC5vbignYmVmb3Jlcm93YWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZEV2ZW50KSA9PiB0aGlzLm9uQmVmb3JlUm93QWN0aXZhdGVkKGFyZ3MpKVxuICAgICAgICAub24oJ3Jvd2FjdGl2YXRlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWRFdmVudCkgPT4gdGhpcy5vblJvd0FjdGl2YXRlZChhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dkZWFjdGl2YXRlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dEZWFjdGl2YXRlZEV2ZW50KSA9PiB0aGlzLm9uUm93RGVhY3RpdmF0ZWQoYXJncykpXG4gICAgICAgIC5vbigncm93cmVvcmRlcicsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dSZW9yZGVyZWRFdmVudCkgPT4gdGhpcy5vblJvd1Jlb3JkZXJlZChhcmdzKSlcbiAgICAgICAgLm9uKCdzZWxlY3RlZCcsXG4gICAgICAgICAgKGU6IGFueSwgYXJnczogU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3dbXSwgdHlwZT86IFNvaG9EYXRhR3JpZFNlbGVjdGVkRXZlbnRUeXBlLCByb3dEYXRhPzogU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3dbXSB8IFNvaG9EYXRhR3JpZFNlbGVjdGVkUm93KSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkKHsgZSwgcm93czogYXJncywgdHlwZSwgcm93RGF0YSB9KSlcbiAgICAgICAgLm9uKCdzZXR0aW5nc2NoYW5nZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkU2V0dGluZ3NDaGFuZ2VkRXZlbnQpID0+IHRoaXMub25TZXR0aW5nc0NoYW5nZWQoYXJncykpXG4gICAgICAgIC5vbignc29ydGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFNvcnRlZEV2ZW50KSA9PiB0aGlzLm9uU29ydGVkKGFyZ3MpKVxuICAgICAgICAub24oJ3NlYXJjaGVkJywgKF9lOiBhbnksIGFyZ3M6IGFueVtdKSA9PiB0aGlzLm9uU2VhcmNoZWQoYXJncykpXG4gICAgICAgIC5vbignYmVmb3JlcGFnaW5nJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25CZWZvcmVQYWdpbmcoYXJncykpXG4gICAgICAgIC5vbignYWZ0ZXJwYWdpbmcnLCAoX2U6IGFueSwgYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykgPT4gdGhpcy5vbkFmdGVyUGFnaW5nKGFyZ3MpKVxuICAgICAgICAub24oJ3Njcm9sbCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTY3JvbGxFdmVudCkgPT4gdGhpcy5vblZlcnRpY2FsU2Nyb2xsKGFyZ3MpKVxuICAgICAgICAub24oJ2ZpbHRlcm9wZXJhdG9yY2hhbmdlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudCkgPT4gdGhpcy5vbkZpbHRlck9wZXJhdG9yQ2hhbmdlZChhcmdzKSlcbiAgICAgICAgLm9uKCduZXh0cGFnZScsIChfZTogYW55LCBhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSA9PiB0aGlzLm9uTmV4dFBhZ2UoYXJncykpXG4gICAgICAgIC5vbigncHJldmlvdXNwYWdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25QcmV2aW91c1BhZ2UoYXJncykpXG4gICAgICAgIC5vbignZmlyc3RwYWdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25GaXJzdFBhZ2UoYXJncykpXG4gICAgICAgIC5vbignbGFzdHBhZ2UnLCAoX2U6IGFueSwgYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykgPT4gdGhpcy5vbkxhc3RQYWdlKGFyZ3MpKVxuICAgICAgICAub24oJ3BhZ2VzaXplY2hhbmdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25QYWdlU2l6ZUNoYW5nZShhcmdzKSlcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpc2UgdGhlIFNvaG9YaSBjb250cm9sLlxuICAgIHRoaXMualF1ZXJ5RWxlbWVudD8uZGF0YWdyaWQodGhpcy5fZ3JpZE9wdGlvbnMpO1xuICAgIHRoaXMualF1ZXJ5RWxlbWVudD8ucmVtb3ZlQXR0cigncm9sZScpO1xuXG4gICAgLy8gT25jZSB0aGUgY29udHJvbCBpcyBpbml0aWFsaXNlZCwgZXh0cmFjdCB0aGUgY29udHJvbFxuICAgIC8vIHBsdWctaW4gZnJvbSB0aGUgZWxlbWVudC4gIFRoZSBlbGVtZW50IG5hbWUgaXNcbiAgICAvLyBkZWZpbmVkIGJ5IHRoZSBwbHVnLWluLCBidXQgaW4gdGhpcyBjYXNlIGlzICdkYXRhZ3JpZCcuXG4gICAgdGhpcy5kYXRhZ3JpZCA9IHRoaXMualF1ZXJ5RWxlbWVudD8uZGF0YSgnZGF0YWdyaWQnKTtcblxuICAgIC8vIElmIFwiYXV0b1wiIGFuZCB0aGVyZSdzIGEgc2VydmljZSwgZ2V0IHRoZSBjb2x1bW5zIGZyb20gaXQuXG4gICAgLy8gKG1heSB3YW50IHRvIGNoZWNrIGlmIGNvbHVtbnMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0PyBFcnJvcj8pXG4gICAgaWYgKHRoaXMuZGF0YWdyaWRUeXBlID09PSBTb2hvRGF0YUdyaWRDb21wb25lbnQuQVVUTyAmJiB0aGlzLmRhdGFncmlkU2VydmljZSkge1xuICAgICAgLy8gQm9vdHN0cmFwIGZyb20gc2VydmljZSwgbm90ZSB0aGlzIGlzIG5vdCBhc3luYy5cbiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldENvbHVtbnMoKTtcbiAgICAgIC8vIE9uY2UgdGhlIGNvbHVtbnMgYXJlIHNldCwgcmVxdWVzdCB0aGUgZGF0YSAocGFnaW5nPylcbiAgICAgIHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldERhdGEobnVsbClcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55W10pID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFncmlkPy5sb2FkRGF0YShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWREYXRhKSB7XG4gICAgICAvLyBOb3QgdXNpbmcgYSBzZXJ2aWNlLCBzbyB1c2UgdGhlIHByZS1sb2FkZWQgZGF0YS5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8ubG9hZERhdGEoKHRoaXMuZ3JpZERhdGEgYXMgYW55KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIGNvbXBvbmVudHMgYXMgcmVxdWlyaW5nIGEgcmVidWlsZCBhZnRlciB0aGUgbmV4dCB1cGRhdGUuXG4gICAqXG4gICAqIEB0b2RvIHBvc3NpYmxlIGFkZCBoaW50cz8gUmVidWlsZCwgVXBkYXRlLCBTZXRPcHRpb25cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbk5hbWUgLSB0aGUgb3B0aW9uIHRoYXQgd2FzIHVwZGF0ZWQsIChhbGxvd2luZyBzcGVjaWZpYyBoYW5kbGluZylcbiAgICogQHBhcmFtIGhpbnQgLSB0aGUgdHlwZSBvZiByZWZyZXNoIHJlcXVpcmVkLCB1cGRhdGU/LlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrRm9yUmVmcmVzaChvcHRpb25OYW1lOiBzdHJpbmcsIGhpbnQ6IFJlZnJlc2hIaW50RmxhZ3MpIHtcblxuICAgIC8vIE1lcmdlIGluIHRoZSBoaW50LlxuICAgIHRoaXMucmVmcmVzaEhpbnQgfD0gaGludDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgLy8gLi4uIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXJcbiAgICB0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2gob3B0aW9uTmFtZSk7XG5cbiAgICAvLyAuLi4gbWFrZSBzdXJlIHRoZSBjaGFuZ2UgZGV0ZWN0b3Iga2lja3MgaW4sIG90aGVyd2lzZSBpZiB0aGUgaW5wdXRzXG4gICAgLy8gd2VyZSBjaGFuZ2UgcHJvZ3JhbW1hdGlhbGx5IHRoZSBjb21wb25lbnQgbWF5IG5vdCBiZSBlbGlnaWJsZSBmb3JcbiAgICAvLyB1cGRhdGluZy5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgZ2FwIG1ldGhvZCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgZGF0YWdyaWQgYW5kIHJlYnVpbGQgaXQgYWdhaW4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgd2hpbHN0IHRoZXJlIGlzIG5vIG1ldGhvZCBmb3VuZCB0aGF0IGNhbiB1cGRhdGUgdGhlIHZpZXdcbiAgICogZm9yIGEgcGFydGljdWxhciBpbnB1dC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVkKHNldHRpbmdzPzogU29ob0RhdGFHcmlkT3B0aW9ucykge1xuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMgPSBTb2hvLnV0aWxzLm1lcmdlU2V0dGluZ3MoKHRoaXMuZWxlbWVudFJlZiBhcyBhbnkpWzBdLCBzZXR0aW5ncywgdGhpcy5fZ3JpZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5yZWZyZXNoSGludCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy51cGRhdGVkKHRoaXMuX2dyaWRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MgJiYgdGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy51cGRhdGVkKHRoaXMuX2dyaWRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5yZW5kZXJIZWFkZXIoKTtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVuZGVyUm93cygpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlZnJlc2hIaW50ICYgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJIZWFkZXIpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICB0aGlzLmRhdGFncmlkPy5yZW5kZXJIZWFkZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlbmRlclJvd3MoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBSZXNldCB0aGUgZmxhZ3MuXG4gICAgdGhpcy5yZWZyZXNoSGludCA9IFJlZnJlc2hIaW50RmxhZ3MuTm9uZTtcbiAgICB0aGlzLmNoYW5nZWRPcHRpb25zID0gW107XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBkYXRhc2V0IG9mIGRhdGFncmlkXG4gICAqIEBwYXJhbSBkYXRhc2V0IE5ldyBkYXRhc2V0IHRvIGJlIHVzZWRcbiAgICogQHBhcmFtIHBhZ2VySW5mbyBQYWdlciBpbmZvIGlmIG5lZWRlZFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURhdGFzZXQoZGF0YXNldDogQXJyYXk8YW55PiwgcGFnZXJJbmZvPzogb2JqZWN0IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlRGF0YXNldChkYXRhc2V0LCBwYWdlckluZm8pO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc291cmNlIHNldHRpbmcvZnVuY3Rpb24gdG8gdXNlIHNvdXJjZSBpbnB1dCBpZiBzZXQuXG4gICAqIE90aGVyd2lzZSB1c2UgZGF0YUdyaWRTZXJ2aWNlIGlmIHRoYXQgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2Uoc291cmNlOiBTb2hvRGF0YUdyaWRTb3VyY2VGdW5jdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIElmIGEgc291cmNlIHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWZpbmVkLCBhbmQgYSBzZXJ2aWNlIGhhc1xuICAgIC8vIHVzZSB0aGUgZGF0YSBzZXJ2aWNlIHRvIGxvYWQgdGhlIGRhdGEgZHluYW1pY2FsbHkgZm9yIHBhZ2luZy5cbiAgICBpZiAoIXNvdXJjZSAmJiB0aGlzLmRhdGFncmlkU2VydmljZSkge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMuc291cmNlID0gKHJlcXVlc3Q6IFNvaG9EYXRhR3JpZFNvdXJjZVJlcXVlc3QsIHJlc3BvbnNlOiBTb2hvRGF0YUdyaWRSZXNwb25zZUZ1bmN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLnNvdXJjZSA9IChyZXF1ZXN0OiBTb2hvRGF0YUdyaWRTb3VyY2VSZXF1ZXN0LCByZXNwb25zZTogU29ob0RhdGFHcmlkUmVzcG9uc2VGdW5jdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gc291cmNlKHJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JDb21wb25lbnRFZGl0b3JzKCkge1xuICAgIC8vIEFkZCBhbiBhZGFwdGVyIGZvciBhbGwgdGhlIGNvbHVtbnMgdXNpbmcgYW4gY29tcG9uZW50IGFzIGFuIGVkaXRvci5cbiAgICAodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5zLmZvckVhY2goKGM6IGFueSkgPT4ge1xuICAgICAgaWYgKGMuZWRpdG9yQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIFVzZSBhIGBmdW5jdGlvbiBleHByZXNzaW9uYCByYXRoZXIgdGhhbiBhbiBgYXJyb3cgZnVuY3Rpb25gIGFzIHRoZSBlZGl0b3IgaXMgdXNlZFxuICAgICAgICAvLyBhcyBjb25zdHJ1Y3Rvci5cbiAgICAgICAgLy8gdGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGMuZWRpdG9yID0gZnVuY3Rpb24gKHJvdz86IGFueSwgY2VsbD86IGFueSwgdmFsdWU/OiBhbnksIGNvbnRhaW5lcj86IEpRdWVyeSwgY29sPzogU29ob0RhdGFHcmlkQ29sdW1uIHwgdW5kZWZpbmVkLCBlPzogYW55LCBhcGk/OiBhbnksIGl0ZW0/OiBhbnkpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgcmV0dXJuIG5ldyBTb2hvQW5ndWxhckVkaXRvckFkYXB0ZXIoYy5lZGl0b3JDb21wb25lbnQsIHsgcm93LCBjZWxsLCB2YWx1ZSwgY29udGFpbmVyOiAoY29udGFpbmVyIGFzIGFueSlbMF0sIGNvbCwgZSwgYXBpLCBpdGVtIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvclN1bW1hcnlSb3dTZXR0aW5ncygpIHtcbiAgICBpZiAoIXRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zIHx8IHRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgICAgYy5zdW1tYXJ5Um93Rm9ybWF0dGVyID0gdW5kZWZpbmVkO1xuICAgICAgICBjLnN1bW1hcnlUZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBjLmFnZ3JlZ2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGMuc3VtbWFyeVRleHRQbGFjZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3VtbWFyeVJvd0NvbHVtbnMuZm9yRWFjaCgoc2MpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5maW5kKChjOiBhbnkpID0+IGMuZmllbGQgPT09IHNjLmZpZWxkKTtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLnN1bW1hcnlSb3dGb3JtYXR0ZXIgPSBzYy5zdW1tYXJ5Um93Rm9ybWF0dGVyO1xuICAgICAgICAoY29sdW1uIGFzIGFueSkuc3VtbWFyeVRleHQgPSBzYy5zdW1tYXJ5VGV4dDtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLmFnZ3JlZ2F0b3IgPSBzYy5hZ2dyZWdhdG9yO1xuICAgICAgICAoY29sdW1uIGFzIGFueSkuc3VtbWFyeVRleHRQbGFjZW1lbnQgPSBzYy5zdW1tYXJ5VGV4dFBsYWNlbWVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgJ2V4cGFuZHJvdycgYW5kICdjb2xsYXBzZXJvdycgZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50IGV4dGVuZHMgU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQge1xuICAvLyBUaGUgZGF0YSBncmlkIGNvbXBvbmVudCBvcmlnaW5hdGluZyB0aGUgY2FsbC5cbiAgZ3JpZDogU29ob0RhdGFHcmlkQ29tcG9uZW50O1xuICBhcmdzPzogYW55O1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlICdrZXlkb3duJyBldmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvaG9EYXRhR3JpZEtleURvd25FdmVudCB7XG4gIC8vIFRoZSBkYXRhIGdyaWQgY29tcG9uZW50IG9yaWdpbmF0aW5nIHRoZSBjYWxsLlxuICBlOiBKUXVlcnkuRXZlbnQ7XG4gIGFyZ3M/OiBTb2hvRGF0YUdyaWRLZXlEb3duQXJncztcbiAgcmVzcG9uc2U/OiBGdW5jdGlvbjtcbn1cbiJdfQ==
|
|
3149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29oby1kYXRhZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZHMtZW50ZXJwcmlzZS1uZy9zcmMvbGliL2RhdGFncmlkL3NvaG8tZGF0YWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBSVIsUUFBUSxFQUtULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBb0MxRCxNQUFNLE9BQU8sd0JBQXdCO0lBV25DLFlBQ1MsU0FBdUMsRUFDdkMsSUFBc0M7UUFEdEMsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBa0M7UUFSL0MsK0RBQStEO1FBQy9ELGFBQVEsR0FBRyxJQUFJLENBQUM7SUFRaEIsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFrRDtRQUNyRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsZ0ZBQWdGO1FBQ2hGLGtCQUFrQjtRQUNsQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2VBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7SUFF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LGtCQUFrQjtzQkFBOUIsS0FBSztnQkFlTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBYU8sYUFBYTtzQkFBekIsS0FBSztnQkFhTyxVQUFVO3NCQUF0QixLQUFLO2dCQWFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBYU8sV0FBVztzQkFBdkIsS0FBSztnQkFTTyxhQUFhO3NCQUF6QixLQUFLO2dCQWdCTyxlQUFlO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEVsZW1lbnRSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBJbmplY3RvcixcbiAgQXBwbGljYXRpb25SZWYsXG4gIENvbXBvbmVudFJlZixcbiAgVHlwZSxcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcmd1bWVudEhlbHBlciB9IGZyb20gJy4uL3V0aWxzL2FyZ3VtZW50LmhlbHBlcic7XG5pbXBvcnQgeyBTb2hvRGF0YUdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zb2hvLWRhdGFncmlkLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBTb2hvRGF0YUdyaWRUeXBlID0gJ2F1dG8nIHwgJ2NvbnRlbnQtb25seSc7XG5cbi8qKlxuICogQ29udHJhY3QgZm9yIGNlbGwgZWRpdG9ycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3IgZXh0ZW5kcyBTb2hvRGF0YUdyaWRDZWxsRWRpdG9yIHtcbiAgLy8gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cbiAgY29tcG9uZW50OiBUeXBlPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+O1xuXG4gIC8vIFRoZSBhcmdzIHBhc3NlZCB0byB0aGUgZWRpdG9yXG4gIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRDZWxsRnVuY3Rpb25BcmdzO1xuXG4gIC8vIFRoaXMgaXMgdGhlIGlucHV0IGVsZW1lbnQgKHNpbmdsZSkgd2l0aGluIHRoZSBmaWVsZFxuICBpbnB1dD86IEpRdWVyeTxIVE1MRWxlbWVudD47XG5cbiAgLy8gVXNlIHRoZSBkaXJlY3QgdmFsdWUgZnJvbSB0aGUgZGF0YXNldCB2cyB0aGUgZm9ybWF0dGVkIHZhbHVlXG4gIHVzZVZhbHVlOiBib29sZWFuO1xuXG4gIC8vIFRoZSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGlubmVyIGVkaXRvci4gVXNlZCB0byBkZXRlcm1pbmUgaWYgb3BlbiBvciBub3QuXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5pdGlhbGlzZSB0aGUgZWRpdCBjb250cm9sIHdpdGggdGhlIGdpdmVuIGNvbXBvbmVudC4gIFRoZSBjb250cm9sXG4gICAqIG1pc3QgY29uZm9ybSB0byB0aGUgU29ob0RhdGFHcmlkQ2VsbEVkaXRvciBjb250cmFjdC5cbiAgICovXG4gIGluaXQoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBlZGl0b3IuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTb2hvQW5ndWxhckVkaXRvckFkYXB0ZXIgaW1wbGVtZW50cyBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3Ige1xuICBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4gfCBudWxsO1xuXG4gIGlucHV0PzogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcblxuICAvLyBVc2UgdGhlIGRpcmVjdCB2YWx1ZSBmcm9tIHRoZSBkYXRhc2V0IHZzIHRoZSBmb3JtYXR0ZWQgdmFsdWVcbiAgdXNlVmFsdWUgPSB0cnVlO1xuXG4gIC8vIFRoZSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGlubmVyIGVkaXRvci4gVXNlZCB0byBkZXRlcm1pbmUgaWYgb3BlbiBvciBub3QuXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tcG9uZW50OiBUeXBlPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+LFxuICAgIHB1YmxpYyBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0Q2VsbEZ1bmN0aW9uQXJncykge1xuICB9XG5cbiAgaW5pdChjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPikge1xuICAgIC8vIFN0b3JlIHRoZSBjb21wb25lbnQuXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG5cbiAgICAvLyBUaGUgU29obyBkYXRhZ3JpZCB3YW50cyBhbiBpbnB1dCBjb250cm9sLCBvdGhlcndpc2UgaXQgd29udCBhY2NlcHQgdGhlIGVkaXRvclxuICAgIC8vIGFzIGEgY29tcG9uZW50LlxuICAgIC8vIEB0b2RvIHRhbGsgdG8gVGltIGFib3V0IHJlbW92aW5nIHRoaXMgcmVxdWlyZW1lbnQuXG4gICAgdGhpcy5pbnB1dCA9ICQodGhpcy5jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCkuZmluZCgnaW5wdXQ6Zmlyc3QnKTtcbiAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlXG4gICAgICAmJiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jbGFzc05hbWVcbiAgICAgID8gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuY2xhc3NOYW1lIDogJy5lZGl0b3InO1xuICB9XG5cbiAgdmFsKHZhbHVlPzogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWY/Lmluc3RhbmNlLnZhbCh2YWx1ZSk7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UuZm9jdXMoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgcmVmcmVzaCBoaW50cyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgXCJyZWZyZXNoXCIgaXNcbiAqIHJlcXVpcmVkIGFmdGVyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCBhbmQgdGhlXG4gKiBBZnRlclZpZXdDaGVja2VkIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHRvZG8gcmVzb2x2ZSBuby1zaGFkb3dcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuZW51bSBSZWZyZXNoSGludEZsYWdzIHtcbiAgLy8gTm8gcmVmcmVzaCByZXF1aXJlZC5cbiAgTm9uZSA9IDAsXG4gIC8vIFRoZSByb3dzIG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkLlxuICBSZW5kZXJSb3dzID0gMSxcbiAgLy8gVGhlIGhlYWRlciBuZWVkcyB0byBiZSByZS1yZW5lbmRlcmVkLlxuICBSZW5kZXJIZWFkZXIgPSAyLFxuICAvLyBBIGZ1bGwgcmVidWlsZCBpcyByZXF1aXJlZC5cbiAgUmVidWlsZCA9IDRcbn1cblxuLyoqXG4gKiBBbmd1bGFyIFdyYXBwZXIgZm9yIHRoZSBTb2hvIERhdGEgR3JpZCBDb21wb25lbnQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgc2VhcmNoZXMgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGUgYXR0cmlidXRlXG4gKiAnc29oby1kYXRhZ3JpZCcgaW4gdGhlIHBhcmVudCdzIERPTSB0cmVlLCBpbml0aWFsaXNpbmcgaXQgd2l0aFxuICogdGhlIFNvaG8gZGF0YWdyaWQgY29udHJvbC5cbiAqXG4gKiBUaGUgZGF0YSBpcyBwcm92aWRlZCBlaXRoZXIgYnkgYSBjb21wb25lbnQgaW5wdXQgb3IgYW4gaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBEYXRhR3JpZFNlcnZpY2UgaW50ZXJmYWNlLCBieSBzcGVjaWZ5aW5nIGFuIGltcGxlbWVudGF0aW9uXG4gKiBvbiB0aGUgaG9zdGluZyBjb21wb25lbnQsIGkuZS5cbiAqXG4gKiBwcm92aWRlcnM6IFsgcHJvdmlkZTogRGF0YUdyaWRTZXJ2aWNlLCB1c2VDbGFzczogRGF0YUdyaWREZW1vU2VydmljZX0gXVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbc29oby1kYXRhZ3JpZF0nLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIHRlbXBsYXRlOiAnIDxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTb2hvRGF0YUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTb2hvIERhdGEgR3JpZCBUeXBlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gXCJhdXRvXCIgd2hlcmUgY29sdW1ucyBhbmQgcm93cyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgaW5qZWN0ZWQgc2VydmljZVxuICAvLyAoaWYgZGVmaW5lZCkgb3IgdmlhIHRoZSBJbnB1dHMsIG90aGVyd2lzZS5cbiAgc3RhdGljIEFVVE86IFNvaG9EYXRhR3JpZFR5cGUgPSAnYXV0byc7XG5cbiAgLy8gJ2NvbnRlbnQtb25seScgd2hlcmUgdGFibGUgZWxlbWVudHMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZVxuICAvLyBjb2x1bW5zIGFuZCByb3dzLlxuICBzdGF0aWMgQ09OVEVOVF9PTkxZOiBTb2hvRGF0YUdyaWRUeXBlID0gJ2NvbnRlbnQtb25seSc7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDb21wb25lbnQgSW5wdXRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ3JpZCBvcHRpb25zIGZvciB0aGUgZGF0YSBncmlkLCBtYXJraW5nIHRoaXMgY29tcG9uZW50c1xuICAgKiBhcyByZXF1aXJpbmcgYSBmdWxsIHJlYnVpbGQgYXQgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGxpZmVjeWNsZS5cbiAgICpcbiAgICogQHBhcmFtIGdyaWRPcHRpb25zIC0gbm90IG51bGwgZ3JpZCBvcHRpb25zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBTb2hvRGF0YUdyaWRPcHRpb25zKSB7XG4gICAgQXJndW1lbnRIZWxwZXIuY2hlY2tOb3ROdWxsKCdncmlkT3B0aW9ucycsIGdyaWRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dyaWRPcHRpb25zID0gZ3JpZE9wdGlvbnM7XG5cbiAgICB0aGlzLmNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpO1xuICAgIHRoaXMuY2hlY2tGb3JTdW1tYXJ5Um93U2V0dGluZ3MoKTtcblxuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSAnc2V0dGluZ3MnIGFzIHRoZSBSZWJ1aWxkIHdpbGwgY3JlYXRlXG4gICAgICAvLyBhIG5ldyBjb250cm9sIHdpdGggdGhlIF9ncmlkT3B0aW9ucy5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2dyaWRPcHRpb25zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGdyaWRPcHRpb25zKCk6IFNvaG9EYXRhR3JpZE9wdGlvbnMge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoaWNoIHByb3BlcnR5IGluIHRoZSBkYXRhIHJvd3MgaXMgdG8gYmUgdXNlZCBhcyB0aGUgaWQgb2YgZWFjaFxuICAgKiByb3cgb2YgdGhlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByb3BlcnR5IHN0cmluZyBpZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGlkUHJvcGVydHkoaWRQcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eSA9IGlkUHJvcGVydHk7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaWRQcm9wZXJ0eSA9IGlkUHJvcGVydHk7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpZFByb3BlcnR5JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaWRQcm9wZXJ0eSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pZFByb3BlcnR5O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmlkUHJvcGVydHk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBmcm96ZW5Db2x1bW5zIG9wdGlvbiAtIHJldHVybnMgdGhlIHJlcXVlc3RlZFxuICAgKiB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgZnJvemVuQ29sdW1ucygpOiBTb2hvRGF0YUdyaWRGcm96ZW5Db2x1bW5zIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZnJvemVuQ29sdW1ucztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZyb3plbkNvbHVtbnMgc2V0dGluZ3MgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvemVuQ29sdW1ucyAtIHRoZSBmcm96ZW5Db2x1bW5zIHNldHRpbmdzLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGZyb3plbkNvbHVtbnMoZnJvemVuQ29sdW1uczogU29ob0RhdGFHcmlkRnJvemVuQ29sdW1ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZyb3plbkNvbHVtbnMgPSBmcm96ZW5Db2x1bW5zO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZyb3plbkNvbHVtbnMgPSBmcm96ZW5Db2x1bW5zO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmcm96ZW5Db2x1bW5zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSBhbGxvd3NcbiAgICovXG4gIEBJbnB1dCgpIHNldCBjZWxsTmF2aWdhdGlvbihjZWxsTmF2aWdhdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNlbGxOYXZpZ2F0aW9uID0gY2VsbE5hdmlnYXRpb247XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jZWxsTmF2aWdhdGlvbiA9IGNlbGxOYXZpZ2F0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY2VsbE5hdmlnYXRpb24nLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjZWxsTmF2aWdhdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY2VsbE5hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY2VsbE5hdmlnYXRpb247XG4gIH1cblxuICBnZXQgaXNWZXJ0aWNhbFNjcm9sbFRvRW5kKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5pc1ZlcnRpY2FsU2Nyb2xsVG9FbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHJvdyBuYXZpZ2F0aW9uIHNldHRpbmcgb2YgdGhlIGRhdGEgZ3JpZC4gSWYgcm93TmF2aWdhdGlvblxuICAgKiBpcyBcImZhbHNl4oCdIHRoZW4gYSBib3JkZXIgaXMgbm90IGRpc3BsYXllZCBhcm91bmQgdGhlIHJvdy5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIHJvd2xOYXZpZ2F0aW9uIGkgXCJmYWxzZeKAnSB0aGVuIGdyaWQgd2lsbCBOT1Qgc2hvdyBhIGJvcmRlciBhcm91bmQgdGhlIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dOYXZpZ2F0aW9uKHJvd05hdmlnYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uID0gcm93TmF2aWdhdGlvbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnJvd05hdmlnYXRpb24gPSByb3dOYXZpZ2F0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncm93TmF2aWdhdGlvbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvd05hdmlnYXRpb24oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd05hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93TmF2aWdhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNwbGF5cyB0aGUgcm93cyBpbiB0aGUgZ3JpZCB1c2luZyBhbHRlcm5hdGUgc2hhZGluZywgb3RoZXJ3aXNlXG4gICAqIGFsbCB0aGUgcm93cyB1c2UgdGhlIHNhbWUgc2hhZGluZy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBhbHRlcm5hdGVSb3dTaGFkaW5nKGFsdGVybmF0ZVJvd1NoYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbHRlcm5hdGVSb3dTaGFkaW5nID0gYWx0ZXJuYXRlUm93U2hhZGluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmFsdGVybmF0ZVJvd1NoYWRpbmcgPSBhbHRlcm5hdGVSb3dTaGFkaW5nO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWx0ZXJuYXRlUm93U2hhZGluZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsdGVybmF0ZVJvd1NoYWRpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd05hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWx0ZXJuYXRlUm93U2hhZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgcHJvdmlkZWQgYXMgYW4gYXJyYXlcbiAgICogb2YganNvbiBvYmplY3RzIGNvbXBhdGlibGUgd2l0aCB0aGUgY29sdW1uIG1ldGFcbiAgICogZGF0YSBwcm92aWRlZC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFzZXQgLSBhcnJheSBvZiBqc29uIG9iamVjdHNcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhc2V0KGRhdGFzZXQ6IEFycmF5PGFueT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kYXRhc2V0ID0gZGF0YXNldDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICBjb25zdCBwYWdlckluZm86IFNvaG9QYWdlclBhZ2luZ0luZm8gPSB7fTtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZGF0YXNldCA9IGRhdGFzZXQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gQHRvZG8gZG8gd2UgbmVlZCBoaW50cyBhcyB0aGlzIG1heSBiZSBidW5kbGVkIHVwIHdpdGggb3RoZXIgY2hhbmdlcy5cbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS51cGRhdGVEYXRhc2V0KChkYXRhc2V0IGFzIGFueSksIHBhZ2VySW5mbyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkYXRhc2V0IGN1cnJlbnRseSBkaXNwbGF5ZWQgYnkgdGhlIGRhdGFncmlkLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBnZXQgZGF0YXNldCgpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG5cbiAgICAvLyBJZiB0aGUgU29obyBjb250cm9sIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZW4gdGhlIGRhdGFzZXRcbiAgICAvLyBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdpbGwgY29udGFpbiB0aGUgcm93cyBjdXJyZW50bHlcbiAgICAvLyBvbiBkaXNwbGF5LlxuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kYXRhc2V0O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIG5vIGRhdGEgaGFzIGJlZW4gc2V0IChvciBwb3RlbnRpYWxseVxuICAgIC8vIHJldHJpZXZlZCBmcm9tIGEgc2VydmljZSksIHNvIHRoZSBvbmx5IG9wdGlvbiBpcyB0aGVcbiAgICAvLyBJbnB1dCBkYXRhc2V0LCB3aGljaCBtYXkgYmUgdW5kZWZpbmVkLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kYXRhc2V0IHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgdGhlIGNvbHVtbnMgY2FuIGJlIHJlb3JkZXJzOyBvdGhlcndpc2UgaWYgZmFsc2UgdGhleSBhcmUgZml4ZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY29sdW1uUmVvcmRlcihjb2x1bW5SZW9yZGVyOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uUmVvcmRlciA9IGNvbHVtblJlb3JkZXI7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY29sdW1uUmVvcmRlciA9IGNvbHVtblJlb3JkZXI7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjb2x1bW5SZW9yZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2x1bW5SZW9yZGVyKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jb2x1bW5SZW9yZGVyO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblJlb3JkZXI7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZUNsaWVudFNvcnQoZGlzYWJsZUNsaWVudFNvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50U29ydCA9IGRpc2FibGVDbGllbnRTb3J0O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVDbGllbnRTb3J0ID0gZGlzYWJsZUNsaWVudFNvcnQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVDbGllbnRTb3J0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50U29ydDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50U29ydDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlQ2xpZW50RmlsdGVyKGRpc2FibGVDbGllbnRGaWx0ZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50RmlsdGVyID0gZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50RmlsdGVyID0gZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZUNsaWVudEZpbHRlcigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50RmlsdGVyO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJlc3VsdHNUZXh0KHJlc3VsdHNUZXh0OiBTb2hvRGF0YUdyaWRSZXN1bHRzVGV4dEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucmVzdWx0c1RleHQgPSByZXN1bHRzVGV4dDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MucmVzdWx0c1RleHQgPSByZXN1bHRzVGV4dDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2hvd0ZpbHRlclRvdGFsKHNob3dGaWx0ZXJUb3RhbDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dGaWx0ZXJUb3RhbCA9IHNob3dGaWx0ZXJUb3RhbDtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaG93RmlsdGVyVG90YWwgPSBzaG93RmlsdGVyVG90YWw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dGaWx0ZXJUb3RhbCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2hvd0ZpbHRlclRvdGFsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zaG93RmlsdGVyVG90YWw7XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSwgdGhlIGdyaWQgYWxsb3dzIGVkaXRzLCBvdGhlcndpc2UgaWYgZmFsc2UgZWRpdHMgYXJlIGRpc2FibGVkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVkaXRhYmxlKGVkaXRhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZWRpdGFibGUgPSBlZGl0YWJsZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5lZGl0YWJsZSA9IGVkaXRhYmxlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZWRpdGFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZWRpdGFibGU7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZWRpdGFibGU7XG4gIH1cblxuICAvKipcbiAgICogSW5wdXQgdGhhdCBkZWZpbmVzIGEgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSByb3cgaXMgZGlzYWJsZWQsIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBpc1Jvd0Rpc2FibGVkKGlzUm93RGlzYWJsZWQ6IFNvaG9Jc1Jvd0Rpc2FibGVkRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5pc1Jvd0Rpc2FibGVkID0gaXNSb3dEaXNhYmxlZDtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pc1Jvd0Rpc2FibGVkID0gaXNSb3dEaXNhYmxlZDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2lzUm93RGlzYWJsZWQnLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc1Jvd0Rpc2FibGVkKCk6IFNvaG9Jc1Jvd0Rpc2FibGVkRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pc1Jvd0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmlzUm93RGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWxsb3dPbmVFeHBhbmRlZFJvdyhhbGxvd09uZUV4cGFuZGVkUm93OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYWxsb3dPbmVFeHBhbmRlZFJvdyA9IGFsbG93T25lRXhwYW5kZWRSb3c7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWxsb3dPbmVFeHBhbmRlZFJvdyA9IGFsbG93T25lRXhwYW5kZWRSb3c7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsbG93T25lRXhwYW5kZWRSb3coKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmFsbG93T25lRXhwYW5kZWRSb3c7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFsbG93T25lRXhwYW5kZWRSb3c7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcm93VGVtcGxhdGUocm93VGVtcGxhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd1RlbXBsYXRlID0gcm93VGVtcGxhdGU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgcm93VGVtcGxhdGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnJvd1RlbXBsYXRlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJvd1RlbXBsYXRlQ29tcG9uZW50KHJvd1RlbXBsYXRlQ29tcG9uZW50OiBhbnkpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudCA9IHJvd1RlbXBsYXRlQ29tcG9uZW50O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1RlbXBsYXRlQ29tcG9uZW50ID0gcm93VGVtcGxhdGVDb21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvd1RlbXBsYXRlQ29tcG9uZW50KCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1RlbXBsYXRlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cyhyb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0czogYW55KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVDb21wb25lbnRJbnB1dHMgPSByb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cztcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cyA9IHJvd1RlbXBsYXRlQ29tcG9uZW50SW5wdXRzO1xuICAgIH1cbiAgfVxuXG4gIGdldCByb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cygpOiBhbnkge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dUZW1wbGF0ZUNvbXBvbmVudElucHV0cztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVDb21wb25lbnRJbnB1dHM7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcm93VGVtcGxhdGVGaWVsZChyb3dUZW1wbGF0ZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUZpZWxkID0gcm93VGVtcGxhdGVGaWVsZDtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dUZW1wbGF0ZUZpZWxkID0gcm93VGVtcGxhdGVGaWVsZDtcbiAgICB9XG4gIH1cblxuICBnZXQgcm93VGVtcGxhdGVGaWVsZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dUZW1wbGF0ZUZpZWxkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUZpZWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgc2VsZWN0IHRoZSBjZWxsIHRleHQgc29vbiBhcyBlbnRlcmluZyBlZGl0IG1vZGVcbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RPbkVkaXQoc2VsZWN0T25FZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0T25FZGl0ID0gc2VsZWN0T25FZGl0O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdE9uRWRpdCA9IHNlbGVjdE9uRWRpdDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VkaXRhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0T25FZGl0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RPbkVkaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RPbkVkaXQ7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaXNMaXN0KGlzTGlzdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmlzTGlzdCA9IGlzTGlzdDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmlzTGlzdCA9IGlzTGlzdDtcblxuICAgICAgLy8gY2FsbGluZyByZWJ1aWxkIGFzIGEgYnJ1dGUgZm9yY2Ugd2F5IG9mIHVkcGF0aW5nIHRoZSB2aWV3LlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaXNMaXN0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNMaXN0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pc0xpc3Q7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaXNMaXN0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1lbnVJZChtZW51SWQ6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm1lbnVJZCA9IG1lbnVJZDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm1lbnVJZCA9IG1lbnVJZDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ21lbnVJZCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGJlZm9yZU9wZW4gLSBhamF4IGNhbGxiYWNrIGZvciBvcGVuIGV2ZW50ICovXG4gIEBJbnB1dCgpIHNldCBtZW51QmVmb3JlT3BlbihtZW51QmVmb3JlT3BlbjogU29ob1BvcHVwTWVudVNvdXJjZUZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMubWVudUJlZm9yZU9wZW4gPSBtZW51QmVmb3JlT3BlbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm1lbnVCZWZvcmVPcGVuID0gbWVudUJlZm9yZU9wZW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdtZW51QmVmb3JlT3BlbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1lbnVCZWZvcmVPcGVuKCk6IFNvaG9Qb3B1cE1lbnVTb3VyY2VGdW5jdGlvbiB7XG4gICAgcmV0dXJuICh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLnNldHRpbmdzLm1lbnVCZWZvcmVPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJvdyBoZWlnaHQgZm9yIHRoZSBncmlkLCB0byBiZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcm93SGVpZ2h0IC0gJ2V4dHJhLXNtYWxsJyB8ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSdcbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dIZWlnaHQocm93SGVpZ2h0OiBTb2hvRGF0YUdyaWRSb3dIZWlnaHQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5yb3dIZWlnaHQocm93SGVpZ2h0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byBzb21ldGhpbmcgb3RoZXIgdGhlbiB0aGUgdGhyZWUgYnVpbHQgaW4gcm93SGVpZ2h0cy5cbiAgICpcbiAgICogQHBhcmFtIGZpeGVkUm93SGVpZ2h0IEFueSBpbnRlZ2VyXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZml4ZWRSb3dIZWlnaHQoZml4ZWRSb3dIZWlnaHQ6IG51bWJlciB8IHN0cmluZyB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZml4ZWRSb3dIZWlnaHQgPSBmaXhlZFJvd0hlaWdodDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmZpeGVkUm93SGVpZ2h0ID0gZml4ZWRSb3dIZWlnaHQ7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmaXhlZFJvd0hlaWdodCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2VsZWN0aW9uIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHZhbGlkIHZhbHVlcyBhcmU6ICdtdWx0aXBsZScsICdzaW5nbGUnLCAnbWl4ZWQnLCAnc2libGluZ3MnIGFuZCBmYWxzZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RhYmxlKHNlbGVjdGFibGU6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdGFibGUgPSBzZWxlY3RhYmxlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIEp1c3QgY2hhbmdpbmcgdGhlIGRhdGFncmlkLnNldHRpbmdzLnNlbGVjdGFibGUgdXBkYXRlcyB0aGUgZGF0YWdyaWQgdmlldy5cbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RhYmxlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdGFibGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2hvd1NlbGVjdEFsbENoZWNrQm94KHNob3dTZWxlY3RBbGxDaGVja0JveDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dTZWxlY3RBbGxDaGVja0JveCA9IHNob3dTZWxlY3RBbGxDaGVja0JveDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAvLyBKdXN0IGNoYW5naW5nIHRoZSBkYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RhYmxlIHVwZGF0ZXMgdGhlIGRhdGFncmlkIHZpZXcuXG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNob3dTZWxlY3RBbGxDaGVja0JveCA9IHNob3dTZWxlY3RBbGxDaGVja0JveDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Nob3dTZWxlY3RBbGxDaGVja0JveCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dTZWxlY3RBbGxDaGVja0JveCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd1NlbGVjdEFsbENoZWNrQm94O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNsaWNrVG9TZWxlY3QoY2xpY2tUb1NlbGVjdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNsaWNrVG9TZWxlY3QgPSBjbGlja1RvU2VsZWN0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY2xpY2tUb1NlbGVjdCA9IGNsaWNrVG9TZWxlY3Q7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjbGlja1RvU2VsZWN0JywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2xpY2tUb1NlbGVjdCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY2xpY2tUb1NlbGVjdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5jbGlja1RvU2VsZWN0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRvb2xiYXIodG9vbGJhcjogU29ob1Rvb2xiYXJPcHRpb25zKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudG9vbGJhciA9IHRvb2xiYXI7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy50b29sYmFyID0gdG9vbGJhcjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Rvb2xiYXInLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpbml0aWFsaXplVG9vbGJhcihpbml0aWFsaXplVG9vbGJhcjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmluaXRpYWxpemVUb29sYmFyID0gaW5pdGlhbGl6ZVRvb2xiYXI7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCAmJiB0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmluaXRpYWxpemVUb29sYmFyID0gaW5pdGlhbGl6ZVRvb2xiYXI7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGluaXRpYWxpemVUb29sYmFyKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pbml0aWFsaXplVG9vbGJhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaW5pdGlhbGl6ZVRvb2xiYXI7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2F2ZVVzZXJTZXR0aW5ncyhzZXR0aW5nc0ZvclNhdmU6IFNvaG9EYXRhR3JpZFNhdmVVc2VyU2V0dGluZ3MpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zYXZlVXNlclNldHRpbmdzID0gc2V0dGluZ3NGb3JTYXZlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2F2ZVVzZXJTZXR0aW5ncyA9IHNldHRpbmdzRm9yU2F2ZTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcGFnaW5nKHBhZ2luZzogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnBhZ2luZyA9IHBhZ2luZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnBhZ2luZyA9IHBhZ2luZztcblxuICAgICAgLy8gdG9kbzogdXBkYXRlIHNvaG8gZGF0YSBncmlkcyB2aWV3IC0gdGhpcy51cGRhdGVQYWdpbmdJbmZvKCk/XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdwYWdpbmcnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuICBnZXQgcGFnaW5nKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5wYWdpbmc7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucGFnaW5nO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2VzaXplKHBhZ2VzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5wYWdlc2l6ZSA9IHBhZ2VzaXplO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnZXNpemUgPSBwYWdlc2l6ZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3BhZ2VzaXplJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcGFnZXNpemVzKHBhZ2VzaXplczogQXJyYXk8bnVtYmVyPikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnBhZ2VzaXplcyA9IHBhZ2VzaXplcztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnBhZ2VzaXplcyA9IHBhZ2VzaXplcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3BhZ2VzaXplcycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGluZGV0ZXJtaW5hdGUoaW5kZXRlcm1pbmF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpbmRldGVybWluYXRlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWN0aW9uYWJsZU1vZGUoYWN0aW9uYWJsZU1vZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hY3Rpb25hYmxlTW9kZSA9IGFjdGlvbmFibGVNb2RlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuYWN0aW9uYWJsZU1vZGUgPSBhY3Rpb25hYmxlTW9kZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2FjdGlvbmFibGVNb2RlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWN0aW9uYWJsZU1vZGUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmFjdGlvbmFibGVNb2RlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFjdGlvbmFibGVNb2RlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNhdmVDb2x1bW5zKHNhdmVDb2x1bW5zOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2F2ZUNvbHVtbnMgPSBzYXZlQ29sdW1ucztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNhdmVDb2x1bW5zID0gc2F2ZUNvbHVtbnM7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzYXZlQ29sdW1ucycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElucHV0IGZvciB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlIHRoZSBkYXRhc2V0J3Mgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNvdXJjZShzb3VyY2U6IFNvaG9EYXRhR3JpZFNvdXJjZUZ1bmN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy51cGRhdGVTb3VyY2UoKHNvdXJjZSBhcyBhbnkpKTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3NvdXJjZScsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZpbHRlciBiYXIgb24gdGhlIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXJhYmxlIGlmIHRydWUsIHRoZSBmaWx0ZXIgYmFyIGlzIGRpc3BsYXllZDsgb3RoZXJ3aXNlIG5vIGZpbHRlciBiYXIgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGZpbHRlcmFibGUoZmlsdGVyYWJsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZpbHRlcmFibGUgPSBmaWx0ZXJhYmxlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZmlsdGVyYWJsZSA9IGZpbHRlcmFibGU7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmaWx0ZXJhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGZpbHRlcmFibGUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZpbHRlcmFibGU7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJXaGVuVHlwaW5nKGZpbHRlcldoZW5UeXBpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5maWx0ZXJXaGVuVHlwaW5nID0gZmlsdGVyV2hlblR5cGluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmlsdGVyV2hlblR5cGluZyA9IGZpbHRlcldoZW5UeXBpbmc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlcldoZW5UeXBpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZpbHRlcldoZW5UeXBpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmZpbHRlcldoZW5UeXBpbmc7XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSB0aGUgZGF0YWdyaWQgaXMgZGlzcGxheWVkIGFzIGEgdHJlZSwgb3RoZXJ3aXNlXG4gICAqIHRoZSBncmlkIGlzIGRpc3BsYXllZCBhcyBmbGF0IHJvd3MuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgaXMgZHluYW1pYywgYW5kIHdpbGwgY2F1c2UgdGhlIGdyaWQgdG8gYmUgcmVidWlsdFxuICAgKiBpZiBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdHJlZUdyaWQgLSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgZGF0YSBpcyBoaWVyYXJjaGljYWwuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdHJlZUdyaWQodHJlZUdyaWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHJlZUdyaWQgIT09IHRoaXMuX2dyaWRPcHRpb25zLnRyZWVHcmlkKSB7XG4gICAgICB0aGlzLl9ncmlkT3B0aW9ucy50cmVlR3JpZCA9IHRyZWVHcmlkO1xuXG4gICAgICAvLyBJZiB0aGUgalF1ZXJ5IGNvbnRyb2wgaGFzIGJlZW4gaW5pdGlhbGlzZWQsIHVwZGF0ZSBpdC5cbiAgICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy50cmVlR3JpZCA9IHRyZWVHcmlkO1xuICAgICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCd0cmVlR3JpZCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRyZWVHcmlkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy50cmVlR3JpZDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy50cmVlR3JpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB1bnFpdWUgaWRlbnRpZmllcjsgd2hpY2ggbWF5IGJlIHVuZGVmaW5lZC5cbiAgICovXG4gIGdldCB1bmlxdWVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy51bmlxdWVJZDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy51bmlxdWVJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB1bnFpdWVJZCAtIHdpbGwgZm9yY2UgYSBncmlkIHJlYnVpbGQgaWYgdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB1bnFpdWVJZCAtIHRoZSBuZXcgaWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgdW5pcXVlSWQodW5pcXVlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudW5pcXVlSWQgPSB1bmlxdWVJZDtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgndW5pcXVlSWQnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJvd1Jlb3JkZXIgZmxhZyAtIHJldHVybnMgdGhlIHJlcXVlc3RlZCB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgcm93UmVvcmRlcigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mucm93UmVvcmRlcjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5yb3dSZW9yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJvd1Jlb3JkZXIgZmxhZyAtIHdpbGwgZm9yY2UgYSBncmlkIHJlYnVpbGQgaWYgdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dSZW9yZGVyIC0gaWYgdHJ1ZSB0aGUgcm93cyB3aWxsIGJlIHJlb3JkZXJhYmxlOyBvdGhlcndpc2UgdGhleSB3aWxsIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dSZW9yZGVyKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucm93UmVvcmRlciA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1Jlb3JkZXIgPSB2YWx1ZTtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncm93UmVvcmRlcicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgc2hvd0RpcnR5IGZsYWcgLSByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgdGhlIGNvbnRyb2wgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LlxuICAgKi9cbiAgZ2V0IHNob3dEaXJ0eSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2hvd0RpcnR5O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNob3dEaXJ0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzaG93RGlydHkgZmxhZyAtIHdpbGwgZm9yY2UgYSBncmlkIHJlYnVpbGQgaWYgdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzaG93RGlydHkgLSBpZiB0cnVlIHRoZW4gZGlydHkgcm93cyB3aWxsIGJlIGhpZ2hsaWdodGVkOyBvdGhlcndpc2UgdGhleSB3aWxsIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzaG93RGlydHkodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaG93RGlydHkgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaG93RGlydHkgPSB2YWx1ZTtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd0RpcnR5JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBhZGRDZWxsTGF5b3V0Q2xhc3MgZmxhZy5cbiAgICovXG4gIGdldCBhZGRDZWxsTGF5b3V0Q2xhc3MoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmFkZENlbGxMYXlvdXRDbGFzcztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5hZGRDZWxsTGF5b3V0Q2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWRkQ2VsbExheW91dENsYXNzIGZsYWcgLSBJZiBzZXQgZmFsc2UsIHdpbGwgcmVtb3ZlIGRhdGFncmlkLWNlbGwtbGF5b3V0IGNsYXNzIGZyb20gZXhwYW5kYWJsZSByb3dzLlxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkQ2VsbExheW91dENsYXNzIC0gaWYgdHJ1ZSB0aGVuIGRpcnR5IHJvd3Mgd2lsbCBiZSBoaWdobGlnaHRlZDsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWRkQ2VsbExheW91dENsYXNzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYWRkQ2VsbExheW91dENsYXNzID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWRkQ2VsbExheW91dENsYXNzID0gdmFsdWU7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2FkZENlbGxMYXlvdXRDbGFzcycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlc2l6ZU1vZGUgb3B0aW9uIHRvIGNoYW5nZXMgdGhlIGNvbHVtbiByZXNpemUgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSByZXNpemVNb2RlIC0gaWYgdHJ1ZSB0aGVuIGRpcnR5IHJvd3Mgd2lsbCBiZSBoaWdobGlnaHRlZDsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcmVzaXplTW9kZSh2YWx1ZTogU29ob0RhdGFHcmlkUmVzaXplTW9kZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJlc2l6ZU1vZGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yZXNpemVNb2RlID0gdmFsdWU7XG5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Jlc2l6ZU1vZGUnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXRhZ3JpZCBoZWFkZXIgYmFja2dyb3VuZCBjb2xvciwgZWl0aGVyIGRhcmsgb3IgbGlnaHQuXG4gICAqIEBwYXJhbSBoZWFkZXJCYWNrZ3JvdW5kQ29sb3IgLSBkZWZhdWx0IHZhbHVlIGlzICdkYXJrJ1xuICAgKi9cbiAgQElucHV0KCkgc2V0IGhlYWRlckJhY2tncm91bmRDb2xvcih2YWx1ZTogU29ob0RhdGFncmlkSGVhZGVyQmFja2dyb3VuZENvbG9yIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaGVhZGVyQmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaGVhZGVyQmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGhlYWRlck1lbnVJZCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaGVhZGVyTWVudUlkID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaGVhZGVyTWVudUlkID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGhlYWRlck1lbnVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5oZWFkZXJNZW51SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmhlYWRlck1lbnVJZDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBoZWFkZXJNZW51U2VsZWN0ZWQoaGVhZGVyTWVudVNlbGVjdGVkOiBGdW5jdGlvbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmhlYWRlck1lbnVTZWxlY3RlZCA9IGhlYWRlck1lbnVTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaGVhZGVyTWVudVNlbGVjdGVkID0gaGVhZGVyTWVudVNlbGVjdGVkO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBoZWFkZXJNZW51QmVmb3JlT3BlbihoZWFkZXJNZW51QmVmb3JlT3BlbjogRnVuY3Rpb24pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5oZWFkZXJNZW51QmVmb3JlT3BlbiA9IGhlYWRlck1lbnVCZWZvcmVPcGVuO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5oZWFkZXJNZW51QmVmb3JlT3BlbiA9IGhlYWRlck1lbnVCZWZvcmVPcGVuO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNhYmxlUm93RGVhY3RpdmF0aW9uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVhY3RpdmF0aW9uO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZWFjdGl2YXRpb247XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZVJvd0RlYWN0aXZhdGlvbih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZWFjdGl2YXRpb24gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVhY3RpdmF0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVSb3dEZXNlbGVjdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlUm93RGVzZWxlY3Rpb247XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZVJvd0Rlc2VsZWN0aW9uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2VkIHRvIGhvbGQgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgaW4gZm9ybWF0dGVyc1xuICAgKiBhbmQgZWRpdG9ycyBvciBhbnl3aGVyZSBlbHNlIGEgZGF0YWdyaWQgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHVzZXJPYmplY3QodXNlck9iamVjdDogYW55IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVzZXJPYmplY3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudXNlck9iamVjdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy51c2VyT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXBhYmxlIG9wdGlvbiAtIHJldHVybnMgdGhlIHJlcXVlc3RlZFxuICAgKiB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgZ3JvdXBhYmxlKCk6IFNvaG9EYXRhR3JpZEdyb3VwYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmdyb3VwYWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5ncm91cGFibGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ3JvdXBhYmxlIHNldHRpbmdzIC0gd2lsbCBmb3JjZSBhIGdyaWQgcmVidWlsZCBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW5cbiAgICogY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwYWJsZSAtIHRoZSBncm91cGFibGUgc2V0dGluZ3MuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZ3JvdXBhYmxlKHZhbHVlOiBTb2hvRGF0YUdyaWRHcm91cGFibGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5ncm91cGFibGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5ncm91cGFibGUgPSB2YWx1ZTtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZ3JvdXBhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGFuIGFycmF5IG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhKGRhdGE6IGFueVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5ncmlkRGF0YSA9IGRhdGE7XG4gICAgaWYgKGRhdGEgJiYgdGhpcy5qUXVlcnlFbGVtZW50KSB7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gQHRvZG8gYWRkIGhpbnRzIGZvciB0aGlzIHRvbywgYXMgb3RoZXIgY2hhbmdlcyBtYXkgZm9yY2UgYSByZWJ1aWxkP1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5sb2FkRGF0YShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5zKGNvbHVtbnM6IFNvaG9EYXRhR3JpZENvbHVtbltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG5cbiAgICB0aGlzLmNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpO1xuXG4gICAgaWYgKGNvbHVtbnMgJiYgdGhpcy5qUXVlcnlFbGVtZW50KSB7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucygodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5zLCAodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5Hcm91cHMpO1xuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldE9yaWdpbmFsQ29sdW1ucygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFN1bW1hcnkgcm93IGNvbHVtbnMgc2V0dGluZ3NzXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc3VtbWFyeVJvd0NvbHVtbnMoc3VtbWFyeVJvd0NvbHVtbnM6IFNvaG9EYXRhR3JpZFN1bW1hcnlSb3dDb2x1bW5TZXR0aW5nc1tdKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3VtbWFyeVJvd0NvbHVtbnMgPSBzdW1tYXJ5Um93Q29sdW1ucztcbiAgICB0aGlzLmNoZWNrRm9yU3VtbWFyeVJvd1NldHRpbmdzKCk7XG5cbiAgICBpZiAodGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZUNvbHVtbnMoKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbnMgYXMgYW55KSwgKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbkdyb3VwcyBhcyBhbnkpKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgYW4gZXh0cmEgY29sdW1uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCB0aGF0IGZpbGxzIHRoZSBzcGFjZS5cbiAgICogVGhpcyBhbGxvd3MgY29sdW1ucyB0byBub3Qgc3RyZXRjaCB0byBmaWxsIHNvIHRoZXkgYXJlIGEgY29uc3RhbnQgc2l6ZS5cbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSB1c2VkIHdpdGggcGVyY2VudCBjb2x1bW5zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNwYWNlckNvbHVtbihzcGFjZXJDb2x1bW46IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zcGFjZXJDb2x1bW4gPSBzcGFjZXJDb2x1bW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zcGFjZXJDb2x1bW4gPSBzcGFjZXJDb2x1bW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzcGFjZXJDb2x1bW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIElmIHRydWUgYW4gZXh0cmEgY29sdW1uIGlzIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgZW5kIHRoYXQgZmlsbHMgdGhlIHNwYWNlLlxuICAgKi9cbiAgZ2V0IHNwYWNlckNvbHVtbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnM/LnNwYWNlckNvbHVtbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzaXplQ29sdW1uc0VxdWFsbHkoc2l6ZUNvbHVtbnNFcXVhbGx5OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2l6ZUNvbHVtbnNFcXVhbGx5ID0gc2l6ZUNvbHVtbnNFcXVhbGx5O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaXplQ29sdW1uc0VxdWFsbHkgPSBzaXplQ29sdW1uc0VxdWFsbHk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNpemVDb2x1bW5zRXF1YWxseSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2l6ZUNvbHVtbnNFcXVhbGx5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zaXplQ29sdW1uc0VxdWFsbHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZXhwYW5kYWJsZVJvdyhleHBhbmRhYmxlUm93OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZXhwYW5kYWJsZVJvdyA9IGV4cGFuZGFibGVSb3c7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCAmJiB0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmV4cGFuZGFibGVSb3cgPSBleHBhbmRhYmxlUm93O1xuICAgIH1cbiAgfVxuXG4gIGdldCBleHBhbmRhYmxlUm93KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5leHBhbmRhYmxlUm93O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5leHBhbmRhYmxlUm93O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJlZHJhd09uUmVzaXplKHJlZHJhd09uUmVzaXplOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucmVkcmF3T25SZXNpemUgPSByZWRyYXdPblJlc2l6ZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MucmVkcmF3T25SZXNpemUgPSByZWRyYXdPblJlc2l6ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgcmVkcmF3T25SZXNpemUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJlZHJhd09uUmVzaXplO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5yZWRyYXdPblJlc2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBleHBvcnRDb252ZXJ0TmVnYXRpdmUoZXhwb3J0Q29udmVydE5lZ2F0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZXhwb3J0Q29udmVydE5lZ2F0aXZlID0gZXhwb3J0Q29udmVydE5lZ2F0aXZlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQgJiYgdGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5leHBvcnRDb252ZXJ0TmVnYXRpdmUgPSBleHBvcnRDb252ZXJ0TmVnYXRpdmU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGV4cG9ydENvbnZlcnROZWdhdGl2ZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZXhwb3J0Q29udmVydE5lZ2F0aXZlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5leHBvcnRDb252ZXJ0TmVnYXRpdmU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb3ZlcnJpZGVUYWJiaW5nKG92ZXJyaWRlVGFiYmluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm92ZXJyaWRlVGFiYmluZyA9IG92ZXJyaWRlVGFiYmluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub3ZlcnJpZGVUYWJiaW5nID0gb3ZlcnJpZGVUYWJiaW5nO1xuICAgIH1cbiAgfVxuXG4gIGdldCBvdmVycmlkZVRhYmJpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLm92ZXJyaWRlVGFiYmluZztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMub3ZlcnJpZGVUYWJiaW5nO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNob3dFZGl0b3JJY29ucyhzaG93RWRpdG9ySWNvbnM6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaG93RWRpdG9ySWNvbnMgPSBzaG93RWRpdG9ySWNvbnM7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCAmJiB0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dFZGl0b3JJY29ucyA9IHNob3dFZGl0b3JJY29ucztcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd0VkaXRvckljb25zKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaG93RWRpdG9ySWNvbnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNob3dFZGl0b3JJY29ucztcbiAgfVxuXG4gIC8qIEV4cGVyaW1lbnRhbCBGZWF0dXJlIHRvIHN0aWNrIG9uIHRoZSB0b3Agb2YgdGhlIHBhZ2UuIFRoaXMgZmVhdHVyZSBoYXMgbnVtZXJvdXMgbGltaXRhdGlvbnMuICovXG4gIEBJbnB1dCgpIHNldCBzdGlja3lIZWFkZXIoc3RpY2t5SGVhZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RpY2t5SGVhZGVyID0gc3RpY2t5SGVhZGVyO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc3RpY2t5SGVhZGVyID0gc3RpY2t5SGVhZGVyO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RpY2t5SGVhZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKiBFeHBlcmltZW50YWwgRmVhdHVyZSB0byBzdGljayBvbiB0aGUgdG9wIG9mIHRoZSBwYWdlLiBUaGlzIGZlYXR1cmUgaGFzIG51bWVyb3VzIGxpbWl0YXRpb25zLiAqL1xuICBASW5wdXQoKSBzZXQgYXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBBcnJheTxPYmplY3Q+IHwgT2JqZWN0KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2F0dHJpYnV0ZXMnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBzaXppbmcgbWV0aG9kIGZvciB0aGUgYXV0byBzaXppbmcgY29sdW1ucy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5TaXppbmcoY29sdW1uU2l6aW5nOiAnYm90aCcgfCAnZGF0YScgfCAnaGVhZGVyJyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblNpemluZyA9IGNvbHVtblNpemluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNvbHVtblNpemluZyA9IGNvbHVtblNpemluZztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2NvbHVtblNpemluZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHNpemluZyBtZXRob2QgZm9yIHRoZSBhdXRvIHNpemluZyBjb2x1bW5zLlxuICAgKi9cbiAgZ2V0IGNvbHVtblNpemluZygpOiAnYm90aCcgfCAnZGF0YScgfCAnaGVhZGVyJyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblNpemluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB3aWR0aCBvZiB0aGUgZGF0YWdyaWQsXG4gICAqIG9yICdsYXN0JyB3aGVyZSB0aGUgbGFzdCBjb2x1bW4gd2lsbCBiZSBzdHJldGNoZWQgdG8gZmlsbCB0aGVcbiAgICogcmVtYWluaW5nIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyZXRjaENvbHVtbiAtIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gc3RyZXRjaDsgb3IgJ2xhc3QnLFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0cmV0Y2hDb2x1bW4oc3RyZXRjaENvbHVtbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbiA9IHN0cmV0Y2hDb2x1bW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zdHJldGNoQ29sdW1uID0gc3RyZXRjaENvbHVtbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3N0cmV0Y2hDb2x1bW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHN0cmV0Y2gsIG9yICdsYXN0JyBpZiB0aGVcbiAgICogbGFzdCBjb2x1bW4gaXMgc3RyZXRjaGVkLlxuICAgKi9cbiAgZ2V0IHN0cmV0Y2hDb2x1bW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjb2x1bW4gd2lsbCByZWNhbGN1bGF0ZSBpdHMgd2lkdGggYW5kIHN0cmV0Y2ggaWYgcmVxdWlyZWQgb24gY29sdW1uIGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmV0Y2hDb2x1bW5PbkNoYW5nZSAtIElmIGZhbHNlIHN0cmV0Y2ggbG9naWMgd29udCBydW4gb24gY29sdW1uIGNoYW5nZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzdHJldGNoQ29sdW1uT25DaGFuZ2Uoc3RyZXRjaENvbHVtbk9uQ2hhbmdlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbk9uQ2hhbmdlID0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc3RyZXRjaENvbHVtbk9uQ2hhbmdlID0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RyZXRjaENvbHVtbk9uQ2hhbmdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHN0cmV0Y2hDb2x1bW5PbkNoYW5nZS5cbiAgICovXG4gIGdldCBzdHJldGNoQ29sdW1uT25DaGFuZ2UoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnN0cmV0Y2hDb2x1bW5PbkNoYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBhZ2Ugc2l6ZSBzZWxlY3RvciBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2hvd1BhZ2VTaXplU2VsZWN0b3Ioc2hvd1BhZ2VTaXplU2VsZWN0b3I6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaG93UGFnZVNpemVTZWxlY3RvciA9IHNob3dQYWdlU2l6ZVNlbGVjdG9yO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2hvd1BhZ2VTaXplU2VsZWN0b3IgPSBzaG93UGFnZVNpemVTZWxlY3RvcjtcblxuICAgICAgLy8gdG9kbzogbmVlZCBhIGZ1bmN0aW9uIGluIGRhdGFncmlkLmpzIHRoYXQgYWxsb3dzIHRvZ2dsaW5nIG9mIHRoZSBwYWdlIHNpemUgc2VsZWN0b3IuIGZvciBub3cgSSBoYXZlIHRvIHJlYnVpbGQgdGhlIGRhdGFncmlkLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd1BhZ2VTaXplU2VsZWN0b3InLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBoaWRlcyB0aGUgcGFnZXIgaWYgdGhlcmUncyBvbmx5IG9uZSBwYWdlIHdvcnRoIG9mIHJlc3VsdHMuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaGlkZVBhZ2VyT25PbmVQYWdlKGhpZGVQYWdlck9uT25lUGFnZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmhpZGVQYWdlck9uT25lUGFnZSA9IGhpZGVQYWdlck9uT25lUGFnZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmhpZGVQYWdlck9uT25lUGFnZSA9IGhpZGVQYWdlck9uT25lUGFnZTtcblxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaGlkZVBhZ2VyT25PbmVQYWdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBncm91cHNcbiAgICpcbiAgICogQXMgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRyb2wgaXNcbiAgICogaW5pdGlhbGlzZWQsIHN0YXNoIHRoZSBkYXRhIGZvciBsYXRlciwgYW5kIG9ubHlcbiAgICogY2FsbCBsb2FkRGF0YSBvbiB0aGUgY29udHJvbCBhcGkgaWYgcmVhZHkuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY29sdW1uR3JvdXAoY29sdW1uR3JvdXBzOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uR3JvdXBzID0gY29sdW1uR3JvdXBzIHx8IFtdO1xuICAgIGlmIChjb2x1bW5Hcm91cHMgJiYgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcblxuICAgICAgLy8gQHRvZG8gYWRkIGhpbnRzIGZvciB0aGlzIHRvbywgYXMgb3RoZXIgY2hhbmdlcyBtYXkgZm9yY2UgYSByZWJ1aWxkP1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS51cGRhdGVDb2x1bW5zKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbnMsIGNvbHVtbkdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbHVtbkdyb3VwKCk6IFNvaG9EYXRhR3JpZENvbHVtbkdyb3VwW10ge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jb2x1bW5Hcm91cHMgfHwgW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbkdyb3VwcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYGVtcHR5TWVzc2FnZWAgZGF0YSBncmlkIG9wdGlvbi5cbiAgICogVXNlIG51bGwgb3IgdW5kZWZpbmVkIHRvIHJlbW92ZSBhbnkgZW1wdHkgbWVzc2FnZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBlbXB0eU1lc3NhZ2UoZW1wdHlNZXNzYWdlOiBTb2hvRW1wdHlNZXNzYWdlT3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICAvLyBDaGVjayBmb3IgdW5kZWZpbmVkL251bGwgYW5kIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG1lc3NhZ2VcbiAgICBpZiAoIWVtcHR5TWVzc2FnZSkge1xuICAgICAgLy8gc29obyBvbmx5IHRha2VzIGEgbnVsbCBoZXJlIHNvIG1ha2luZyBpdCBzbyBhbnkgIWVtcHR5TWVzc2FnZSBnZXRzIHNldCB0byBudWxsXG4gICAgICBlbXB0eU1lc3NhZ2UgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2dyaWRPcHRpb25zLmVtcHR5TWVzc2FnZSA9IGVtcHR5TWVzc2FnZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmVtcHR5TWVzc2FnZSA9IGVtcHR5TWVzc2FnZTtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8uc2V0RW1wdHlNZXNzYWdlKGVtcHR5TWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgZW1wdHlNZXNzYWdlKCk6IFNvaG9FbXB0eU1lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmVtcHR5TWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdG9vbGlwcyBvbiB0aGUgY2VsbCB2YWx1ZXMsIGF0IGEgY29zdCBvZiBwZXJmb3JtYW5jZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBlbmFibGVUb29sdGlwcyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmVuYWJsZVRvb2x0aXBzID0gdmFsdWU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5lbmFibGVUb29sdGlwcyA9IHZhbHVlO1xuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdlbmFibGVUb29sdGlwcycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVuYWJsZVRvb2x0aXBzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5lbmFibGVUb29sdGlwcztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RDaGlsZHJlbihzZWxlY3RDaGlsZHJlbjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdENoaWxkcmVuID0gc2VsZWN0Q2hpbGRyZW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zZWxlY3RDaGlsZHJlbiA9IHNlbGVjdENoaWxkcmVuO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2VsZWN0Q2hpbGRyZW4nLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3RDaGlsZHJlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2VsZWN0Q2hpbGRyZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdENoaWxkcmVuO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGFsbG93Q2hpbGRFeHBhbmRPbk1hdGNoKGFsbG93Q2hpbGRFeHBhbmRPbk1hdGNoOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYWxsb3dDaGlsZEV4cGFuZE9uTWF0Y2ggPSBhbGxvd0NoaWxkRXhwYW5kT25NYXRjaDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50ICYmIHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWxsb3dDaGlsZEV4cGFuZE9uTWF0Y2ggPSBhbGxvd0NoaWxkRXhwYW5kT25NYXRjaDtcbiAgICB9XG4gIH1cblxuICBnZXQgYWxsb3dDaGlsZEV4cGFuZE9uTWF0Y2goKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmFsbG93Q2hpbGRFeHBhbmRPbk1hdGNoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd0NoaWxkRXhwYW5kT25NYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBzb3VyY2UgdHlwZSBvZiB0aGUgZ3JpZCwgZWl0aGVyOlxuICAgKlxuICAgKiAtIFwiY29udGVudC1vbmx5XCIgd2hlcmUgdGFibGUgZWxlbWVudHMgYXJlIHByb3ZpZGVkIGluIHRoZSBib2R5LlxuICAgKiAtIFwiYXV0b1wiIHdoZXJlIGNvbHVtbnMgYW5kIHJvd3MgYXJlIG9idGFpbmVkIGZvciBhblxuICAgKiAgIGluamVjdGVkIHNlcnZpY2UgKGlmIGRlZmluZWQpIG9yIHZpYSB0aGUgSW5wdXRzIGlmIG5vdC5cbiAgICpcbiAgICogQWxsb3cgdGhlIGlucHV0IHRvIGJlIG92ZXJyaWRlbiwgdG8gbWF0Y2ggdGhlIGNvbXBvbmVudCBzZWxlY3Rvci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnc29oby1kYXRhZ3JpZCcpIHNldCBzb2hvRGF0YWdyaWQoZGF0YWdyaWRUeXBlOiBTb2hvRGF0YUdyaWRUeXBlIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIHRoaXMuZGF0YWdyaWRUeXBlID0gZGF0YWdyaWRUeXBlICYmIGRhdGFncmlkVHlwZS50b1N0cmluZygpICE9ICcnID8gZGF0YWdyaWRUeXBlIDogU29ob0RhdGFHcmlkQ29tcG9uZW50LkFVVE87XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENvbXBvbmVudCBPdXRwdXRcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHJvdyAob3Igcm93cykgYXJlIHNlbGVjdGVkLlxuICBAT3V0cHV0KClcbiAgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFNlbGVjdGVkRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgY2VsbCBpcyBjaGFuZ2VkLlxuICBAT3V0cHV0KClcbiAgY2VsbGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkQ2VsbENoYW5nZUV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHJvdyBpcyByZW1vdmVkLlxuICBAT3V0cHV0KClcbiAgcm93UmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dSZW1vdmVFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaXMgYWRkZWQuXG4gIEBPdXRwdXQoKVxuICByb3dBZGQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEFkZFJvd0V2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgQE91dHB1dCgpXG4gIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRGaWx0ZXJlZEV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHJvdyBpbiB0aGUgZ3JpZCBpcyBleHBhbmRlZC5cbiAgQE91dHB1dCgpXG4gIGV4cGFuZHJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkVG9nZ2xlUm93RXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGtleSBpcyBwcmVzc2VkXG4gICAqXG4gICAqIEB0b2RvIHJlbW92ZSBvdmVycmlkZSBvZiBuYXRpdmUgYXR0cmlidXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpXG4gIGtleWRvd24gPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEtleURvd25FdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gZWRpdCBtb2RlIGlzIGV4aXRlZC5cbiAgQE91dHB1dCgpXG4gIGV4aXRlZGl0bW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBlZGl0IG1vZGUgaXMgc3RhcnRlZC5cbiAgQE91dHB1dCgpXG4gIGJlZm9yZWVudGVyZWRpdG1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBlZGl0IG1vZGUgaXMgZW50ZXJlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBlbnRlcmVkaXRtb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHJvdyBpbiB0aGUgZ3JpZCBpcyBjb2xsYXBzZWQuXG4gIEBPdXRwdXQoKVxuICBjb2xsYXBzZXJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkVG9nZ2xlUm93RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNvcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkU29ydGVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNlYXJjaGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICBAT3V0cHV0KClcbiAgbmV4dFBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9QYWdlclBhZ2luZ0luZm8+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHByZXZpb3VzUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob1BhZ2VyUGFnaW5nSW5mbz4oKTtcblxuICBAT3V0cHV0KClcbiAgZmlyc3RQYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvUGFnZXJQYWdpbmdJbmZvPigpO1xuXG4gIEBPdXRwdXQoKVxuICBsYXN0UGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob1BhZ2VyUGFnaW5nSW5mbz4oKTtcblxuICBAT3V0cHV0KClcbiAgcGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9QYWdlclBhZ2luZ0luZm8+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGJlZm9yZVBhZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob1BhZ2VyUGFnaW5nSW5mbz4oKTtcblxuICBAT3V0cHV0KClcbiAgYWZ0ZXJQYWdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9QYWdlclBhZ2luZ0luZm8+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGJlZm9yZVJvd0FjdGl2YXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93QWN0aXZhdGVkPigpO1xuXG4gIEBPdXRwdXQoKVxuICByb3dBY3RpdmF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgY29sdW1uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRDb2x1bW5DaGFuZ2U+KClcblxuICBAT3V0cHV0KClcbiAgcm93RGVhY3RpdmF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgcm93Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93Q2xpY2tlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgcm93RG91YmxlQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93Q2xpY2tlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgY29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd1Jlb3JkZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93UmVvcmRlcmVkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9wZW5GaWx0ZXJSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZE9wZW5GaWx0ZXJSb3dFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgY2xvc2VGaWx0ZXJSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZENsb3NlRmlsdGVyUm93RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNldHRpbmdzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkU2V0dGluZ3NDaGFuZ2VkRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlbmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSZW5kZXJlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBhZnRlclJlbmRlciA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkQWZ0ZXJSZW5kZXJFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgdmVydGljYWxTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFNjcm9sbEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBmaWx0ZXJvcGVyYXRvcmNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEZpbHRlck9wZXJhdG9yQ2hhbmdlZEV2ZW50PigpO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEhvc3QgQmluZGluZ3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFNldCB0aGUgZW5hYmxlIC8gZGlzYWJsZWQgY2xhc3MgKG5vdCB3b3JraW5nKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLWRpc2FibGVkJylcbiAgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByb2xlIGZvciB0aGUgZ3JpZC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGRhdGFncmlkUm9sZSgpIHtcbiAgICBpZiAodGhpcy5fZ3JpZE9wdGlvbnMudHJlZUdyaWQpIHtcbiAgICAgIHJldHVybiAndHJlZWdyaWQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2RhdGFncmlkJztcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGUgTWVtYmVyIERhdGFcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgalF1ZXJ5IGNvbnRyb2wuXG4gIHByaXZhdGUgalF1ZXJ5RWxlbWVudD86IEpRdWVyeTtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIFNvaG8gZGF0YWdyaWQgY29udHJvbCBhcGkuXG4gIHByaXZhdGUgZGF0YWdyaWQ/OiBTb2hvRGF0YUdyaWRTdGF0aWMgfCBudWxsO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgZ3JpZCdzIGRhdGEuXG4gIHByaXZhdGUgZ3JpZERhdGE/OiBhbnlbXTtcblxuICAvLyBUaGUgc291cmNlIHR5cGUgZm9yIHRoZSBncmlkLlxuICBwcml2YXRlIGRhdGFncmlkVHlwZT86IHN0cmluZztcblxuICAvLyBBbiBpbnRlcm5hbCBncmlkT3B0aW9ucyBvYmplY3QgdGhhdCBnZXRzIHVwZGF0ZWQgYnkgdXNpbmdcbiAgLy8gdGhlIGNvbXBvbmVudCdzIElucHV0cygpXG4gIHByaXZhdGUgX2dyaWRPcHRpb25zOiBTb2hvRGF0YUdyaWRPcHRpb25zID0ge1xuICAgIHN0cmV0Y2hDb2x1bW46ICdsYXN0JyxcbiAgICBlbmFibGVUb29sdGlwczogZmFsc2VcbiAgfTtcblxuICAvLyBQcm92aWRlcyBoaW50cyB0byB0aGUgY29tcG9uZW50IGFmdGVyIHRoZSBuZXh0IHJlZnJlc2guXG4gIHByaXZhdGUgcmVmcmVzaEhpbnQ6IFJlZnJlc2hIaW50RmxhZ3MgPSBSZWZyZXNoSGludEZsYWdzLk5vbmU7XG5cbiAgLy8gTGlzdCBvZiBvcHRpb24gbmFtZXMgY2hhbmdlZCAoZm9yIGRlYnVnZ2luZykuXG4gIHByaXZhdGUgY2hhbmdlZE9wdGlvbnM6IGFueVtdID0gW107XG5cbiAgLy8gTGlzdCBvZiBkeW5hbWljIGZvcm1hdHRlciBjb21wb25lbnRzIC0ga2V5ZWQgYnkgdGhlIG9yaWdpbmFsIGFyZ3MuXG4gIHByaXZhdGUgY2VsbENvbXBvbmVudHM6IGFueVtdID0gW107XG5cbiAgLy8gTGlzdCBvZiBkeW5hbWljIHJvd3RlbXBsYXRlIGNvbXBvbmVudHMgLSBrZXllZCBieSB0aGUgb3JpZ2luYWwgYXJncy5cbiAgcHJpdmF0ZSByb3dUZW1wbGF0ZUNvbXBvbmVudHM6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gbmdab25lIC0gdGhlIGFuZ3VsYXIgem9uZSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBlbGVtZW50UmVmIC0gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGNvbXBvbmVudCdzIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3IgLSB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yLlxuICAgKiBAcGFyYW0gcmVzb2x2ZXIgLSBjb21wb25lbnQgZmFjdG9yeSByZXNvbHZlciAoZm9yIGVkaXRvcnMvZm9ybWF0dGVycykuXG4gICAqIEBwYXJhbSBpbmplY3RvciAtIGR5bmFtaWMgY29tcG9uZW50IGluamVjdG9yIChmb3IgZWRpdG9ycy9mb3JtYXR0ZXJzKS5cbiAgICogQHBhcmFtIGRhdGFncmlkU2VydmljZSAtIHNlcnZpY2UgZm9yIG9idGFpbmluZyBkYXRhIChvcHRpb25hbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGFwcDogQXBwbGljYXRpb25SZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGRhdGFncmlkU2VydmljZTogU29ob0RhdGFHcmlkU2VydmljZSkge1xuXG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFB1YmxpYyBBUElcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGdldENvbHVtbkdyb3VwKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5nZXRDb2x1bW5Hcm91cChpZHgpO1xuICB9XG5cbiAgZ2V0Q29sdW1uQnlJZChpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZ2V0Q29sdW1uR3JvdXAoaWR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIHNvcnQgZnVuY3Rpb24gdXNlZCBieSB0aGUgZGF0YWdyaWQsXG4gICAqIGNhbiBvbmx5IGJlIHVzZWQgb25jZSB0aGUgZ3JpZCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgKlxuICAgKiBAdG9kbyB0aGlzIHNob3VsZCBtYWRlIGxhenkuXG4gICAqL1xuICBzZXRTb3J0RnVuY3Rpb24oc29ydEZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRTb3J0RnVuY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zb3J0RnVuY3Rpb24gPSBzb3J0RnVuY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YWdyaWQgbm90IGluaXRpYWxpemVkLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb2x1bW4gYW5kIGRpcmVjdGlvbiB0byBzb3J0IHRoZSBkYXRhc2V0IG9uLlxuICAgKlxuICAgKiBDYW4gb25seSBiZSB1c2VkIG9uY2UgdGhlIGdyaWQgaGFzIGJlZW4gaW5pdGlhbGlzZWQsIG90aGVyd2lzZVxuICAgKiBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5JZCB0aGUgaWQgb2YgdGhlIGNvbHVtbiB0byBzb3J0IG9uOyBtdXN0IGJlIG5vbi1udWxsLlxuICAgKiBAcGFyYW0gYXNjZW5kaW5nIGlmIHRydWUgc29ydCBhc2NlbmRpbmcsIG90aGVyd2lzZSBkZXNjZW5kaW5nLiAgSWYgbm90IHN1cHBsaWVkIHRoZSBzZXR0aW5nIGlzIHRvZ2dsZWQuXG4gICAqL1xuICBzZXRTb3J0Q29sdW1uKGNvbHVtbklkOiBzdHJpbmcsIGFzY2VuZGluZz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldFNvcnRDb2x1bW4oY29sdW1uSWQsIGFzY2VuZGluZyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhZ3JpZCBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBzZXQgdGhlIHNvcnQgaW5kaWNhdG9yIG9uIGEgY29sdW1uIHdoZW4gZGlzYWJsZUNsaWVudFNvcnQgaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICBzZXRTb3J0SW5kaWNhdG9yKGNvbHVtbklkOiBzdHJpbmcsIGFzY2VuZGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldFNvcnRJbmRpY2F0b3IoY29sdW1uSWQsIGFzY2VuZGluZyk7XG4gICAgfSk7XG4gIH1cblxuICBwYWdlU2l6ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5wYWdlckFQSS5zZXR0aW5ncy5wYWdlc2l6ZTtcbiAgfVxuXG4gIHVwZGF0ZVBhZ2luZ0luZm8ocGFnZUluZm86IFNvaG9QYWdlclBhZ2luZ0luZm8pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5wYWdlckFQSS51cGRhdGVQYWdpbmdJbmZvKHBhZ2VJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHVwZGF0ZVJvdyhpZHg6IG51bWJlciwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBBcmd1bWVudEhlbHBlci5jaGVja05vdE51bGwoJ3JvdycsIHJvdyk7XG5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy51cGRhdGVSb3coaWR4LCByb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgaGlkZUNvbHVtbihpZDogYW55KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uaGlkZUNvbHVtbihpZCk7XG4gICAgfSk7XG4gIH1cblxuICBzaG93Q29sdW1uKGlkOiBhbnkpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zaG93Q29sdW1uKGlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbHVtbkJ5SWQoaWQ6IHN0cmluZyk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmNvbHVtbkJ5SWQoaWQpO1xuICB9XG5cbiAgZ2V0Q29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jb2x1bW5zO1xuICB9XG5cbiAgZ2V0Q29sdW1uR3JvdXBzKCk6IFNvaG9EYXRhR3JpZENvbHVtbkdyb3VwW10ge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNvbHVtbkdyb3VwcztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNvbHVtbiBpbmRleCBmcm9tIHRoZSBjb2wncyBpZCAqL1xuICBjb2x1bW5JZHhCeUlkKGNvbHVtbklkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmNvbHVtbklkeEJ5SWQoY29sdW1uSWQpO1xuICB9XG5cbiAgZ2V0SGVhZGVyUm93Q29sdW1uKGZsZDogYW55KSB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZ2V0SGVhZGVyUm93Q29sdW1uKGZsZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJvdyBvZiBkYXRhIHRvIHRoZSBkYXRhZ3JpZCBhdCB0aGUgZ2l2ZW4gb3B0aW9uYWwgbG9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIHRoZSByb3cgb2YgZGF0YSB0byBhZGQuXG4gICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgb3B0aW9uYWwgbG9jYXRpb24sICd0b3AnIG9yICdib3R0b20nIG9yIGEgbnVtYmVyLlxuICAgKi9cbiAgYWRkUm93KGRhdGE6IGFueSwgbG9jYXRpb24/OiAndG9wJyB8ICdib3R0b20nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5hZGRSb3coZGF0YSwgbG9jYXRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgcm93cyBvZiBkYXRhIHRvIHRoZSBkYXRhZ3JpZCBhdCB0aGUgZ2l2ZW4gb3B0aW9uYWwgbG9jYXRpb24uXG4gICAqIEBwYXJhbSBkYXRhIEFycmF5IG9mIGRhdGEgdG8gYWRkLlxuICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIG9wdGlvbmFsIGxvY2F0aW9uLCAndG9wJyBvciAnYm90dG9tJyBvciBhIG51bWJlci5cbiAgICovXG4gIGFkZFJvd3MoZGF0YTogYW55W10sIGxvY2F0aW9uPzogJ3RvcCcgfCAnYm90dG9tJyB8IG51bWJlcikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuYWRkUm93cyhkYXRhLCBsb2NhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBtYXRjaGluZyB0aGUgcm93SW5kZXggcGFzc2VkIGluIGZyb20gdGhlIGRhdGEgYW5kIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dJbmRleCB0aGUgaW5kZXggb2YgdGhlIHJvdyB0byByZW1vdmUuXG4gICAqL1xuICByZW1vdmVSb3cocm93SW5kZXg6IG51bWJlciwgbm9TeW5jPzogYm9vbGVhbiwgbm9UcmlnZ2VyPzogYm9vbGVhbikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlbW92ZVJvdyhyb3dJbmRleCwgbm9TeW5jLCBub1RyaWdnZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRpcnR5IHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGRpcnR5IHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqL1xuICBkaXJ0eVJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmRpcnR5Um93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRpcnR5IGNlbGxzIGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBkaXJ0eSBjZWxscyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIGRpcnR5Q2VsbHMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmRpcnR5Q2VsbHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZGlydHkgY2VsbHMuXG4gICAqL1xuICBjbGVhckRpcnR5KCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5jbGVhckRpcnR5KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IHRoZSBjZWxsIHRoYXQncyBjdXJyZW50bHkgaW4gZWRpdCBtb2RlLlxuICAgKi9cbiAgY29tbWl0Q2VsbEVkaXQoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNvbW1pdENlbGxFZGl0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGRpcnR5IGNlbGxzIGluIGdpdmVuIHJvdy5cbiAgICpcbiAgICogQHBhcmFtIHJvdyAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cuXG4gICAqL1xuICBjbGVhckRpcnR5Um93KHJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNsZWFyRGlydHlSb3cocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBkaXJ0eSBvbiBnaXZlbiBjZWxsLlxuICAgKlxuICAgKiBAcGFyYW0gcm93IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvd1xuICAgKiBAcGFyYW0gY2VsbCAtIHRoZSBjZWxsIG51bWJlciAoaWR4KSBvZiB0aGUgY2VsbFxuICAgKi9cbiAgY2xlYXJEaXJ0eUNlbGwocm93OiBudW1iZXIsIGNlbGw6IG51bWJlcik6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5jbGVhckRpcnR5Q2VsbChyb3csIGNlbGwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlcnJvciBmb3IgYSBnaXZlbiBjZWxsIGluIGEgcm93XG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqL1xuICBjbGVhckFsbENlbGxFcnJvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8uY2xlYXJBbGxDZWxsRXJyb3Iocm93LCBjZWxsKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYSBjZWxsIHdpdGggYW4gZXJyb3Igb2YgYSBnaXZlbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqIEBwYXJhbSB0eXBlIG9mIGVycm9yLlxuICAgKi9cbiAgY2xlYXJDZWxsRXJyb3Iocm93OiBudW1iZXIsIGNlbGw6IG51bWJlciwgdHlwZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8uY2xlYXJDZWxsRXJyb3Iocm93LCBjZWxsLCB0eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYSByb3cgbGV2ZWwgYWxsIGVycm9ycywgYWxlcnRzLCBpbmZvIG1lc3NhZ2VzXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICovXG4gIGNsZWFyUm93RXJyb3Iocm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhclJvd0Vycm9yKHJvdykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlcnJvcnMsIGFsZXJ0cyBhbmQgaW5mbyBtZXNzYWdlcyBpbiBlbnRpcmUgZGF0YWdyaWQuXG4gICAqL1xuICBjbGVhckFsbEVycm9ycygpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhckFsbEVycm9ycygpKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBhbGwgcm93cyBhbmQgY2VsbHMgaW4gdGhlIGVudGlyZSBncmlkIGlmIHRoZXkgaGF2ZSB2YWxpZGF0aW9uIG9uIHRoZSBjb2x1bW4gKi9cbiAgc2hvd1Jvd0Vycm9yKHJvdzogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IFNvaG9BbGVydFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5zaG93Um93RXJyb3Iocm93LCBtZXNzYWdlLCB0eXBlKSk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgYWxsIGNlbGxzIGluIGEgc3BlY2lmaWMgcm93ICovXG4gIHZhbGlkYXRlUm93KHJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8udmFsaWRhdGVSb3cocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuZCBzaG93IGEgbWVzc2FnZS9lcnJvciBvbiB0aGUgZ2l2ZW4gcm93LlxuICAgKi9cbiAgdmFsaWRhdGVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8udmFsaWRhdGVBbGwoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gcm93IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gaWR4IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvd1xuICAgKiBAcGFyYW0gc3RhdHVzIC0gc3RhdHVzIGNsYXNzIG5hbWUgZS5nLiAnZXJyb3InXG4gICAqIEBwYXJhbSB0b29sdGlwIC0gc3RyaW5nIHZhbHVlIGZvciB0b29sdGlwIG1lc3NhZ2UgZS5nLiAnRXJyb3InXG4gICAqL1xuICByb3dTdGF0dXMoaWR4OiBudW1iZXIsIHN0YXR1czogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucm93U3RhdHVzKGlkeCwgc3RhdHVzLCB0b29sdGlwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGN1cnJlbnRseSBtb2RpZmllZCByb3dzLCB0aGUgdHlwZSBvZiBtb2RpZmljYXRpb25cbiAgICogYW5kIHRoZSBjZWxscyB0aGF0IGFyZSBkaXJ0eSBhbmQgdGhlIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGtleWVkIG9iamVjdCBzaG93aW5nIHRoZSBkaXJ0eSByb3cgaW5mby5cbiAgICovXG4gIGdldE1vZGlmaWVkUm93cygpOiBTb2hvRGF0YUdyaWRNb2RpZmllZFJvd3Mge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5nZXRNb2RpZmllZFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjZWxsIHRvIGRpcnR5IGFuZCBhZGQgdGhlIGRpcnR5IGljb24gdmlzdWFsbHkuXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleFxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCBpbmRleFxuICAgKiBAcGFyYW0gdG9nZ2xlIFRydWUgdG8gc2V0IGl0IGFuZCBmYWxzZSB0byByZW1vdmUgaXRcbiAgICogQHBhcmFtIGRhdGEgQWRkcyBkaXJ0eSBkYXRhIHRvIHRoZSBpbnRlcm5hbCB0cmFja2VyXG4gICAqL1xuICBzZXREaXJ0eUluZGljYXRvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyLCB0b2dnbGU6IGJvb2xlYW4sIGRhdGE/OiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXREaXJ0eUluZGljYXRvcihyb3csIGNlbGwsIHRvZ2dsZSwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcm93c1xuICAgKi9cbiAgcmVtb3ZlU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBmaWx0ZXIgcm93LlxuICAgKi9cbiAgdG9nZ2xlRmlsdGVyUm93KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnRvZ2dsZUZpbHRlclJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBjb25kaXRpb25zIGZyb20gb3V0c2lkZSBvciBwdWxsIGZyb20gZmlsdGVyIHJvd1xuICAgKi9cbiAgYXBwbHlGaWx0ZXIoY29uZGl0aW9ucz86IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5hcHBseUZpbHRlcihjb25kaXRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZpbHRlciByb3cgZnJvbSBwYXNzZWQgZGF0YSAvIHNldHRpbmdzXG4gICAqL1xuICBzZXRGaWx0ZXJDb25kaXRpb25zKGNvbmRpdGlvbnM6IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXRGaWx0ZXJDb25kaXRpb25zKGNvbmRpdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWx0ZXIgY29uZGl0aW9ucyBpbiBhcnJheSBmb3JtIGZyb20gdGhlIFVJXG4gICAqL1xuICBmaWx0ZXJDb25kaXRpb25zKCk6IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5maWx0ZXJDb25kaXRpb25zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFueSBmaWx0ZXIgZGVmaW5lZCwgZm9yIHRoaXMgZGF0YWdyaWQuXG4gICAqL1xuICBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkLmNsZWFyRmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGNvbnRleHR1YWwgdG9vbGJhci5cbiAgICovXG4gIGhpZGVDb250ZXh0dWFsVG9vbGJhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkLmhpZGVDb250ZXh0dWFsVG9vbGJhcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvd3MgY3VycmVudGx5IHNlbGVjdGVkIG9uIHRoZSBkYXRhIGdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3cgaW5zdGFuY2VzLlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2VsZWN0ZWRSb3dzIGluc3RlYWQuXG4gICAqL1xuICBnZXRTZWxlY3RlZFJvd3MoKTogU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3dbXSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuc2VsZWN0ZWRSb3dzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvd3MgY3VycmVudGx5IHNlbGVjdGVkIG9uIHRoZSBkYXRhIGdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3cgaW5zdGFuY2VzLlxuICAgKi9cbiAgc2VsZWN0ZWRSb3dzKCk6IFNvaG9EYXRhR3JpZFNlbGVjdGVkUm93W10ge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZWxlY3RlZFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCB0aGUgcm93cyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIHNlbGVjdEFsbFJvd3MoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2VsZWN0QWxsUm93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc2VsZWN0cyBhbGwgdGhlIHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqL1xuICB1blNlbGVjdEFsbFJvd3MoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udW5TZWxlY3RBbGxSb3dzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2VsZWN0ZWQgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgcm93IGluIHRoZSBkYXRhIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggLSB0aGUgcm93IG51bWJlciAoaWR4KSBvZiB0aGUgcm93IHRvIHNlbGVjdC5cbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Ugc2VsZWN0Um93cyBpbnN0ZWFkLlxuICAgKi9cbiAgc2VsZWN0Um93KGlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2VsZWN0Um93KGlkeCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3RzIHRoZSBzcGVjaWZpZWQgcm93IGluIHRoZSBkYXRhIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggLSB0aGUgcm93IG51bWJlciAoaWR4KSBvZiB0aGUgcm93IHRvIGRlc2VsZWN0LlxuICAgKi9cbiAgdW5zZWxlY3RSb3coaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy51bnNlbGVjdFJvdyhpZHgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSByYW5nZSBvZiByb3dzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCByb3cgaW5kZXhlcy5cbiAgICpcbiAgICogQHBhcmFtIHN0YXJ0IC0gdGhlIHN0YXJ0IGluZGV4XG4gICAqIEBwYXJhbSBlbmQgLSB0aGVuIGVuZCBpbmRleFxuICAgKi9cbiAgc2VsZWN0UmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICBjb25zdCByYW5nZTogbnVtYmVyW10gPSBbc3RhcnQsIGVuZF07XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2VsZWN0Um93c0JldHdlZW5JbmRleGVzKHJhbmdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNlbGVjdGVkIHJvd3MgYnkgcGFzc2luZyB0aGUgcm93IGluZGV4IG9yIGFuIGFycmF5IG9mIHJvdyBpbmRleGVzXG4gICAqL1xuICBzZWxlY3RSb3dzKHJvdzogbnVtYmVyIHwgbnVtYmVyW10pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3dzKHJvdyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdGF0dXMgb2YgdGhlIGNoZWNrYm94IG9uIHRoZSBoZWFkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzdGF0ZSAnYWxsJywgJ3BhcnRpYWwnIG9yICdhbGwnLlxuICAgKi9cbiAgcHVibGljIHNldEhlYWRlckNoZWNrYm94U3RhdGUoc3RhdGU6IFNvaG9EYXRhR3JpZEhlYWRlckNoZWNrYm94U3RhdGUpIHtcbiAgICBjb25zdCBoZWFkZXJDaGVja2JveCA9IHRoaXMualF1ZXJ5RWxlbWVudD8uZmluZCgnLmRhdGFncmlkLWhlYWRlcicpLmZpbmQoJy5kYXRhZ3JpZC1jaGVja2JveCcpO1xuICAgIGlmIChoZWFkZXJDaGVja2JveCkge1xuICAgICAgaWYgKHN0YXRlID09PSAncGFydGlhbCcpIHtcbiAgICAgICAgaGVhZGVyQ2hlY2tib3guZGF0YSgnc2VsZWN0ZWQnLCAncGFydGlhbCcpXG4gICAgICAgICAgLmFkZENsYXNzKCdpcy1jaGVja2VkIGlzLXBhcnRpYWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSAnYWxsJykge1xuICAgICAgICBoZWFkZXJDaGVja2JveC5kYXRhKCdzZWxlY3RlZCcsICdhbGwnKVxuICAgICAgICAgIC5hZGRDbGFzcygnaXMtY2hlY2tlZCcpLnJlbW92ZUNsYXNzKCdpcy1wYXJ0aWFsJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGhlYWRlckNoZWNrYm94LmRhdGEoJ3NlbGVjdGVkJywgJ25vbmUnKVxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnaXMtY2hlY2tlZCBpcy1wYXJ0aWFsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSByb3cgb2YgdGhlIHBhc3NlZC1pbiBpZHguXG4gICAqIE5PVEU6IHZhbGlkIG9ubHkgd2hlbiBzZWxlY3Rpb24gbW9kZSBpcyAnbWl4ZWQnXG4gICAqL1xuICBhY3RpdmF0ZVJvdyhpZHg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmFjdGl2YXRlUm93KGlkeCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSB0aGUgY3VycmVudGx5IGFjdGl2YXRlZCByb3cuXG4gICAqXG4gICAqIE5PVEU6IHZhbGlkIG9ubHkgd2hlbiBzZWxlY3Rpb24gbW9kZSBpcyAnbWl4ZWQnXG4gICAqL1xuICBkZWFjdGl2YXRlUm93KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmRlYWN0aXZhdGVSb3coKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmF0ZWQgcm93LlxuICAgKiBOT1RFOiB2YWxpZCBvbmx5IHdoZW4gc2VsZWN0aW9uIG1vZGUgaXMgJ21peGVkJ1xuICAgKi9cbiAgYWN0aXZhdGVkUm93KCk6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmFjdGl2YXRlZFJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFjdGl2ZSBjZWxsLlxuICAgKlxuICAgKiBAcGFyYW0gaWR4IFRoZSBpbmRleCBvZiB0aGUgcm93IG9mIHRoZSBjZWxsIHRvIHNldCBhY3RpdmUuXG4gICAqIEBwYXJhbSBpZHgyIFRoZSBpbmRleCBvZiB0aGUgY2VsbCB0byBzZXQgYWN0aXZlLlxuICAgKi9cbiAgcHVibGljIHNldEFjdGl2ZUNlbGwoaWR4OiBudW1iZXIsIGlkeDI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNldEFjdGl2ZUNlbGwoaWR4LCBpZHgyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhY3RpdmUgY2VsbCBpbmZvXG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZlQ2VsbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8uYWN0aXZlQ2VsbDtcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHJvdyBhdCA8Yj5pZHg8L2I+IGludG8gdmlldyBpbiB0aGUgdmlldyBwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gaWR4IFRoZSBpbmRleCBvZiB0aGUgcm93IHRvIHNjcm9sbCBpbnRvIHZpZXcuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsUm93SW50b1ZpZXcoaWR4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXRBY3RpdmVDZWxsKGlkeCwgMCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiByb3cgbnVtYmVycyBmb3IgdGhlIHJvd3MgY29udGFpbmluZyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIGZpZWxkIG5hbWUgdG8gc2VhcmNoLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHVzZSBpbiBzZWFyY2guXG4gICAqL1xuICBmaW5kUm93c0J5VmFsdWUoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmZpbmRSb3dzQnlWYWx1ZShmaWVsZE5hbWUsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9ncmFtbWF0aWNhbGx5IHRyaWdnZXIgYSBjYWxsIHRvIHRoZSBkYXRhZ3JpZC5zZXR0aW5ncy5zb3VyY2VcbiAgICogZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcGFnZXJUeXBlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFnZXJUeXBlIC0gYSB2YWxpZCBwYWdlciB0eXBlLlxuICAgKi9cbiAgdHJpZ2dlclNvdXJjZShwYWdlclR5cGU6IFNvaG9EYXRhR3JpZFRyaWdnZXJTb3VyY2VQYWdlclR5cGUsIGNhbGxiYWNrPzogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy50cmlnZ2VyU291cmNlKHBhZ2VyVHlwZSwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgZXhwb3J0IG9mIGdyaWQgZGF0YSB0byBFeGNlbC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwcmVmaXggbmFtZSB0byBiZSB1c2VkIGZvciB0aGUgZXhwb3J0ZWQgZmlsZS5cbiAgICogQHBhcmFtIHdvcmtzaGVldE5hbWUgVGhlIG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHdvcmtzaGVldC5cbiAgICogQHBhcmFtIGN1c3RvbURzIEEgZGF0YXNvdXJjZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAoZGVwcmVjYXRlZClcbiAgICovXG4gIGV4cG9ydFRvRXhjZWwoZmlsZU5hbWU6IHN0cmluZywgd29ya3NoZWV0TmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgY3VzdG9tRHM/OiBPYmplY3RbXSk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmV4cG9ydFRvRXhjZWwoZmlsZU5hbWUsICh3b3Jrc2hlZXROYW1lIGFzIGFueSksIChjdXN0b21EcyBhcyBhbnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGV4cG9ydCBvZiBncmlkIGRhdGEgdG8gQ1NWIGZvcm1hdHRlZCBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHByZWZpeCBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgKiBAcGFyYW0gY3VzdG9tRHMgQSBkYXRhc291cmNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0LlxuICAgKiBAcGFyYW0gc2VwYXJhdG9yIFRoZSBzZXBhcmF0b3IgdG8gdXNlIGluIHRoZSBjdnMgZmlsZSwgZGVmYXVsdHMgdG8gJ3NlcD0sJ1xuICAgKiBAcGFyYW0gZm9ybWF0IGlmIHRydWUsIGRhdGUgYW5kIG51bWJlciB2YWx1ZXMgd2lsbCBiZSBmb3JtYXR0ZWQgYmFzZWQgb24gdGhlIGxvY2FsZVxuICAgKi9cbiAgZXhwb3J0VG9Dc3YoZmlsZU5hbWU6IHN0cmluZywgY3VzdG9tRHM/OiBPYmplY3RbXSwgc2VwYXJhdG9yOiBzdHJpbmcgPSAnc2VwPSwnLCBmb3JtYXQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZXhwb3J0VG9Dc3YoZmlsZU5hbWUsIChjdXN0b21EcyBhcyBhbnkpLCBzZXBhcmF0b3IsIGZvcm1hdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY29sdW1ucyBhbmQgY29sdW1uR3JvdXBzIGRpc3BsYXllZCBvbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbnMgVGhlIGRhdGFncmlkIGNvbHVtbnMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gY29sdW1uR3JvdXBzIFRoZSBjb2x1bW4gZ3JvdXBzIHRvIHVwZGF0ZS5cbiAgICovXG4gIHVwZGF0ZUNvbHVtbnMoY29sdW1uczogU29ob0RhdGFHcmlkQ29sdW1uW10sIGNvbHVtbkdyb3VwczogU29ob0RhdGFHcmlkQ29sdW1uR3JvdXBbXSk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZUNvbHVtbnMoY29sdW1ucywgY29sdW1uR3JvdXBzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhIEpTT04gYXJyYXkgd2l0aCBjb2x1bW5zIGFuZCByZXR1cm4gdGhlIGNvbHVtbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5TdHIgVGhlIGpzb24gcmVwcmVzbnRhdGlvbiBvZiB0aGUgY29sdW1uIG9iamVjdC5cbiAgICogQHJldHVybiAgVGhlIGFycmF5IG9mIGNvbHVtbnMuXG4gICAqL1xuICBjb2x1bW5zRnJvbVN0cmluZyhjb2x1bW5zOiBzdHJpbmcpOiBPYmplY3QgeyAvLyBAdG9kbyB0eXBpbmdzIGZvciByZXR1cm4gdmFsdWVcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuY29sdW1uc0Zyb21TdHJpbmcoY29sdW1ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgY29sdW1ucyB0byB0aGVpciBkZWZhdWx0cyAodXNlZCBvbiByZXN0b3JlIG1lbnUgaXRlbSkuXG4gICAqL1xuICByZXNldENvbHVtbnMoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlc2V0Q29sdW1ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIHBlcnNvbmFsaXplIGRpYWxvZy5cbiAgICovXG4gIHBlcnNvbmFsaXplQ29sdW1ucygpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucGVyc29uYWxpemVDb2x1bW5zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSB0aGUgdXNlciBzZXR0aW5ncyBmcm9tIGxvY2FsIFN0b3JhZ2Ugb3IgYXMgcGFzc2VkIGluLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzZXR0aW5ncyB0byB1c2UuXG4gICAqL1xuICByZXN0b3JlVXNlclNldHRpbmdzKHNldHRpbmdzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5yZXN0b3JlVXNlclNldHRpbmdzKHNldHRpbmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYSB0ZXJtIGFjcm9zcyBhbGwgY29sdW1ucyBhbmQgaGlnaGxpZ2h0IGl0XG4gICAqIEBwYXJhbSB0ZXJtIC0gdGhlIHNlYXJjaCB0ZXJtXG4gICAqL1xuICBrZXl3b3JkU2VhcmNoKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5rZXl3b3JkU2VhcmNoKHZhbHVlKVxuICAgIH0pXG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEV2ZW50IEhhbmRsZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogSGFuZGxlIGEgcmVxdWVzdCB0byBsb2FkIHRoZSBkYXRhIGZvciB0aGUgZ3JpZCBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAdG9kbyBwYWdpbmcgLSBub3QgeWV0IGZ1bGx5IGltcGxlbWVudGVkP1xuICAgKi9cbiAgcHJpdmF0ZSBvbkRhdGFSZXF1ZXN0KHJlcXVlc3Q6IFNvaG9EYXRhR3JpZFNvdXJjZVJlcXVlc3QsIHJlc3BvbnNlOiBTb2hvRGF0YUdyaWRSZXNwb25zZUZ1bmN0aW9uKSB7XG4gICAgLy8gVGhlIHJlcXVlc3QgZm9yIGRhdGEgaXMgbWFkZSBieSB0aGUgZGF0YWdyaWQsIHNvIGp1bXAgYmFjayBpbnRvIHRoZSBhbmd1bGFyIHpvbmUgLi4uXG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAvLyAuLi4gcmVxdWVzdCB0aGUgZGF0YSBmcm9tIHRoZSBzZXJ2aWNlIC4uLlxuICAgICAgdGhpcy5kYXRhZ3JpZFNlcnZpY2UuZ2V0RGF0YShyZXF1ZXN0KVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHRzOiBPYmplY3RbXSkgPT4ge1xuICAgICAgICAgIC8vIC4uIG9uIHJlY2VpcHQsIHBhc3MgdGhlIGRhdGEgYmFjayB0byB0aGUgZGF0YWdyaWQgYnV0XG4gICAgICAgICAgLy8gb3V0c2lkZSB0aGUgYW5ndWxhciB6b25lLlxuICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlc3BvbnNlKHJlc3VsdHMsIHJlcXVlc3QpKTtcbiAgICAgICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIGEgY2hpbGQgcm93IGhhcyBiZWVuIGV4cGFuZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkV4cGFuZFJvd0hhbmRsZXIoYXJnczogU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmJ1aWxkUm93VGVtcGxhdGVDb21wb25lbnQoZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5leHBhbmRyb3cubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY29tcG9uZW50IGZvciByb3dUZW1wbGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd1RlbXBsYXRlQ29tcG9uZW50KGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudFxuICAgICk7XG5cbiAgICAvLyBSZW1vdmUgY29tcG9uZW50IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLmZpbmRJbmRleCgoYykgPT4gZXZlbnQucm93ID09PSBjLnJvdyk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50c1tpZHhdLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXJQYXJlbnQgPSBldmVudC5kZXRhaWxbMF0ucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLXJvdy1kZXRhaWwtcGFkZGluZycpO1xuICAgIGNvbnRhaW5lclBhcmVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImRhdGFncmlkLWNlbGwtbGF5b3V0XCI+PC9kaXY+JztcbiAgICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJQYXJlbnQucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLWNlbGwtbGF5b3V0Jyk7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgbGV0IGRhdGFDb21wb25lbnQ6IGFueTtcbiAgICBpZiAoZXZlbnQuaXRlbS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlRmllbGQpKSB7XG4gICAgICBkYXRhQ29tcG9uZW50ID0gZXZlbnQuaXRlbVsodGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUZpZWxkIGFzIGFueSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogJ2FyZ3MnLFxuICAgICAgICAgIHVzZVZhbHVlOiB7IGlucHV0c0RhdGE6IHRoaXMuZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVDb21wb25lbnRJbnB1dHMsIGRhdGE6IGRhdGFDb21wb25lbnQsIC4uLmV2ZW50IH0sXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCwgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShpbmplY3RvciwgW10sIGNvbnRhaW5lcik7XG4gICAgZXZlbnRbJ3Jvd1RlbXBsYXRlQ29tcG9uZW50J10gPSBjb21wb25lbnQ7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnQuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnQuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gLi4uIGZpbmFsbHkgc3RvcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGZvciBsYXRlciwgd2UnbGwgZGVsZXRlIGl0IHdoZW5cbiAgICAvLyByZXF1ZXN0ZWQsIG9yIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgIHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLnB1c2goeyByb3c6IGV2ZW50LnJvdywgY29tcG9uZW50IH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjb250ZXh0IG1lbnUgaXMgb3BlbmVkXG4gICAqL1xuICBwcml2YXRlIG9uS2V5RG93bkhhbmRsZXIoZTogSlF1ZXJ5LkV2ZW50LCBhcmdzOiBTb2hvRGF0YUdyaWRLZXlEb3duQXJncywgcmVzcG9uc2U6IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGUsIGFyZ3MsIHJlc3BvbnNlIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMua2V5ZG93bi5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIGlmIChlLmtleSA9PT0gJ0YxMCcgJiYgZS5zaGlmdEtleSkge1xuICAgICAgJCgoZSBhcyBhbnkpLmN1cnJlbnRUYXJnZXQpLnRyaWdnZXIoJ2NvbnRleHRtZW51Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIGEgY2hpbGQgcm93IGhhcyBiZWVuIGV4cGFuZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRQcm9wZXJ0eSBzdHJpbmcgaWRcbiAgICovXG4gIEBJbnB1dCgpIHNldCBvbkJlZm9yZVNlbGVjdChiZWZvcmVTZWxlY3RGdW5jdGlvbjogU29ob0RhdGFHcmlkQmVmb3JlU2VsZWN0RnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkJlZm9yZVNlbGVjdCA9IGJlZm9yZVNlbGVjdEZ1bmN0aW9uO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm9uQmVmb3JlU2VsZWN0ID0gYmVmb3JlU2VsZWN0RnVuY3Rpb247XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdvbkJlZm9yZVNlbGVjdCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG4gIGdldCBvbkJlZm9yZVNlbGVjdCgpOiBTb2hvRGF0YUdyaWRCZWZvcmVTZWxlY3RGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm9uQmVmb3JlU2VsZWN0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMub25CZWZvcmVTZWxlY3Q7XG4gIH1cblxuICAvKipcbiAgICogIE1ha2VzIGl0IHBvc3NpYmxlIHRvIHNhdmUgc2VsZWN0aW9ucyB3aGVuIGNoYW5naW5nIHBhZ2VzIG9uIHNlcnZlciBzaWRlIHBhZ2luZy5cbiAgICogIFlvdSBtYXkgd2FudCB0byBhbHNvIHVzZSBzaG93U2VsZWN0QWxsQ2hlY2tCb3g6IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcyhhbGxvd1NlbGVjdEFjcm9zc1BhZ2VzOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcyA9IGFsbG93U2VsZWN0QWNyb3NzUGFnZXM7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcyA9IGFsbG93U2VsZWN0QWNyb3NzUGFnZXM7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdhbGxvd1NlbGVjdEFjcm9zc1BhZ2VzJywgUmVmcmVzaEhpbnRGbGFncy5Ob25lKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGFsbG93U2VsZWN0QWNyb3NzUGFnZXMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmFsbG93U2VsZWN0QWNyb3NzUGFnZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqICBTZWxlY3QgYWxsIHdpbGwgZWZmZWN0IG9ubHkgb24gY3VycmVudCBwYWdlIGFuZCBpdHMgZm9yIGNsaWVudCBzaWRlIHBhZ2luZyBvbmx5LlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNlbGVjdEFsbEN1cnJlbnRQYWdlKHNlbGVjdEFsbEN1cnJlbnRQYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0QWxsQ3VycmVudFBhZ2UgPSBzZWxlY3RBbGxDdXJyZW50UGFnZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RBbGxDdXJyZW50UGFnZSA9IHNlbGVjdEFsbEN1cnJlbnRQYWdlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2VsZWN0QWxsQ3VycmVudFBhZ2UnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuICBnZXQgc2VsZWN0QWxsQ3VycmVudFBhZ2UoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNlbGVjdEFsbEN1cnJlbnRQYWdlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgY29sdW1uIElEcyB1c2VkIHRvIGRlZmluZSBhcmlhIGRlc2NyaXB0b3JzIGZvciBzZWxlY3Rpb24gY2hlY2tib3hlcy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5JZHMoY29sdW1uSWRzOiBBcnJheTxTdHJpbmcgfCBOdW1iZXI+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uSWRzID0gY29sdW1uSWRzO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmNvbHVtbklkcyA9IGNvbHVtbklkcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2NvbHVtbklkcycsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBjb2x1bW5JZHMoKTogQXJyYXk8U3RyaW5nIHwgTnVtYmVyPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNvbHVtbklkcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbklkcztcbiAgfVxuXG4gIC8qKlxuICAgKklmIHRydWUsIHRoZSBuZXcgcm93IGluZGljYXRvciB3aWxsIGRpc3BsYXkgYWZ0ZXIgYWRkaW5nIGEgcm93XG4gICAqXG4gICAqIEBwYXJhbSBzaG93TmV3Um93SW5kaWNhdG9yIGJvb2xlYW4gc2hvdyBuZXcgaW5kaWNhdG9yIHNldHRpbmdcbiAgICovXG4gIEBJbnB1dCgpIHNldCBzaG93TmV3Um93SW5kaWNhdG9yKHNob3dOZXdSb3dJbmRpY2F0b3I6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaG93TmV3Um93SW5kaWNhdG9yID0gc2hvd05ld1Jvd0luZGljYXRvcjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zaG93TmV3Um93SW5kaWNhdG9yID0gc2hvd05ld1Jvd0luZGljYXRvcjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Nob3dOZXdSb3dJbmRpY2F0b3InLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuICBnZXQgc2hvd05ld1Jvd0luZGljYXRvcigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2hvd05ld1Jvd0luZGljYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNob3dOZXdSb3dJbmRpY2F0b3I7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb25FeHBhbmRDaGlsZHJlbihleHBhbmRDaGlsZHJlbkZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRFeHBhbmRDaGlsZHJlbkZ1bmN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMub25FeHBhbmRDaGlsZHJlbiA9IGV4cGFuZENoaWxkcmVuRnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25FeHBhbmRDaGlsZHJlbiA9IGV4cGFuZENoaWxkcmVuRnVuY3Rpb247XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdvbkV4cGFuZENoaWxkcmVuJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb25FeHBhbmRDaGlsZHJlbigpOiBTb2hvRGF0YUdyaWRFeHBhbmRDaGlsZHJlbkZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25FeHBhbmRDaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLm9uRXhwYW5kQ2hpbGRyZW47XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb25Db2xsYXBzZUNoaWxkcmVuKGNvbGxhcHNlQ2hpbGRyZW5GdW5jdGlvbjogU29ob0RhdGFHcmlkQ29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMub25Db2xsYXBzZUNoaWxkcmVuID0gY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLm9uQ29sbGFwc2VDaGlsZHJlbiA9IGNvbGxhcHNlQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uQ29sbGFwc2VDaGlsZHJlbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uQ29sbGFwc2VDaGlsZHJlbigpOiBTb2hvRGF0YUdyaWRDb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5vbkNvbGxhcHNlQ2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5vbkNvbGxhcHNlQ2hpbGRyZW47XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb25Qb3N0UmVuZGVyQ2VsbChvblBvc3RSZW5kZXJDZWxsOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgcG9zdFJlbmRlckNlbGwgPSAoZTogSlF1ZXJ5PEhUTUxFbGVtZW50PiwgYXJnczogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxBcmdzKSA9PiB7XG4gICAgICB0aGlzLm9uUG9zdFJlbmRlckNlbGxIYW5kbGVyKGUsIGFyZ3MpO1xuICAgICAgb25Qb3N0UmVuZGVyQ2VsbChlLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMub25Qb3N0UmVuZGVyQ2VsbCA9IHBvc3RSZW5kZXJDZWxsO1xuXG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25Qb3N0UmVuZGVyQ2VsbCA9IHBvc3RSZW5kZXJDZWxsO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkRlc3Ryb3lDZWxsKG9uRGVzdHJveUNlbGw6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsRnVuY3Rpb24pIHtcbiAgICBjb25zdCBkZXN0cm95Q2VsbCA9IChlOiBKUXVlcnk8SFRNTEVsZW1lbnQ+LCBhcmdzOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEFyZ3MpID0+IHtcbiAgICAgIHRoaXMub25EZXN0cm95Q2VsbEhhbmRsZXIoYXJncyk7XG4gICAgICBvbkRlc3Ryb3lDZWxsKGUsIGFyZ3MpO1xuICAgIH07XG5cbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkRlc3Ryb3lDZWxsID0gZGVzdHJveUNlbGw7XG5cbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vbkRlc3Ryb3lDZWxsID0gZGVzdHJveUNlbGw7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IG9uRWRpdENlbGwob25FZGl0Q2VsbDogU29ob0RhdGFHcmlkRWRpdENlbGxGdW5jdGlvbikge1xuICAgIGNvbnN0IGVkaXRDZWxsID0gKGVkaXRvcjogRXh0ZW5kZWRTb2hvRGF0YUdyaWRDZWxsRWRpdG9yKSA9PiB7XG4gICAgICB0aGlzLm9uRWRpdENlbGxIYW5kbGVyKGVkaXRvcik7XG4gICAgICBvbkVkaXRDZWxsKGVkaXRvcik7XG4gICAgfTtcblxuICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uRWRpdENlbGwgPSBlZGl0Q2VsbDtcblxuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLm9uRWRpdENlbGwgPSBlZGl0Q2VsbDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb25LZXlEb3duKG9uS2V5RG93bjogU29ob0RhdGFHcmlkS2V5RG93bkZ1bmN0aW9uKSB7XG4gICAgY29uc3Qga2V5RG93biA9IChlOiBKUXVlcnkuRXZlbnQsIGFyZ3M6IFNvaG9EYXRhR3JpZEtleURvd25BcmdzLCByZXNwb25zZTogRnVuY3Rpb24pID0+IHtcbiAgICAgIHRoaXMub25LZXlEb3duSGFuZGxlcihlLCBhcmdzLCByZXNwb25zZSk7XG4gICAgICBvbktleURvd24oZSwgYXJncywgcmVzcG9uc2UpO1xuICAgIH07XG5cbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbktleURvd24gPSBrZXlEb3duO1xuXG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25LZXlEb3duID0ga2V5RG93bjtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgb25FeHBhbmRSb3cob25FeHBhbmRSb3c6IFNvaG9EYXRhR3JpZEV4cGFuZFJvd0Z1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMub25FeHBhbmRSb3cgPSBvbkV4cGFuZFJvdztcblxuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLm9uRXhwYW5kUm93ID0gb25FeHBhbmRSb3c7XG4gICAgfVxuICB9XG5cbiAgLyogSWNvbiBuYW1lIGZvciBmYWxsYmFja3MgaWYgdGhlIGltYWdlIGRvZXMgbm90IGxvYWQgKi9cbiAgQElucHV0KCkgc2V0IGZhbGxiYWNrSW1hZ2UoZmFsbGJhY2tJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZmFsbGJhY2tJbWFnZSA9IGZhbGxiYWNrSW1hZ2U7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmFsbGJhY2tJbWFnZSA9IGZhbGxiYWNrSW1hZ2U7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmYWxsYmFja0ltYWdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmFsbGJhY2tJbWFnZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5mYWxsYmFja0ltYWdlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZmFsbGJhY2tJbWFnZTtcbiAgfVxuXG4gIC8qIFRvb2x0aXAgdG8gc2hvdyBpZiBpdCB0aGUgZmFsbGJhY2sgYXBwZWFycyAqL1xuICBASW5wdXQoKSBzZXQgZmFsbGJhY2tUb29sdGlwKGZhbGxiYWNrVG9vbHRpcDogU29ob0ZhbGxiYWNrVG9vbHRpcE9wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5mYWxsYmFja1Rvb2x0aXAgPSBmYWxsYmFja1Rvb2x0aXA7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmFsbGJhY2tUb29sdGlwID0gZmFsbGJhY2tUb29sdGlwO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZmFsbGJhY2tUb29sdGlwJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmFsbGJhY2tUb29sdGlwKCk6IFNvaG9GYWxsYmFja1Rvb2x0aXBPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZmFsbGJhY2tUb29sdGlwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZmFsbGJhY2tUb29sdGlwO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIGVkaXQgbW9kZSBpcyBhY3RpdmF0ZWQgb24gYW4gZWRpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyB0aGUgZXZlbnQgYXJndW1lbnRzXG4gICAqL1xuICBwcml2YXRlIG9uRXhpdEVkaXRNb2RlKGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmV4aXRlZGl0bW9kZS5uZXh0KGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBiZWZvcmUgZWRpdCBtb2RlIGlzIGFjdGl2YXRlZCBvbiBhbiBlZGl0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBldmVudCBhcmd1bWVudHNcbiAgICovXG4gIHByaXZhdGUgb25CZWZvcmVFbnRlckVkaXRNb2RlKGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmJlZm9yZWVudGVyZWRpdG1vZGUubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBlZGl0IG1vZGUgaXMgYWN0aXZhdGVkIG9uIGFuIGVkaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgdGhlIGV2ZW50IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBvbkVudGVyRWRpdE1vZGUoYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkge1xuICAgIGNvbnN0IGV2ZW50ID0geyBncmlkOiB0aGlzLCAuLi5hcmdzIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuZW50ZXJlZGl0bW9kZS5uZXh0KGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBhZnRlciBhIGNoaWxkIHJvdyBoYXMgYmVlbiBjb2xsYXBzZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQ29sbGFwc2VSb3coYXJnczogU29ob0RhdGFHcmlkUm93Q29sbGFwc2VFdmVudCkge1xuICAgIGNvbnN0IGV2ZW50ID0geyBncmlkOiB0aGlzLCAuLi5hcmdzIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGFwc2Vyb3cubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBhZGRlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dBZGQoYXJnczogU29ob0RhdGFHcmlkQWRkUm93RXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dBZGQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgY2VsbCBoYXMgY2hhbmdlZC5cbiAgICovXG4gIHByaXZhdGUgb25DZWxsQ2hhbmdlKGFyZ3M6IFNvaG9EYXRhR3JpZENlbGxDaGFuZ2VFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmNlbGxjaGFuZ2UubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGhhcyBiZWVuIGNsaWNrZWQuXG4gICAqL1xuICBwcml2YXRlIG9uUm93Q2xpY2tlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93Q2xpY2tlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGZpbHRlciByb3cgaXMgY2xvc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkNsb3NlRmlsdGVyUm93KGFyZ3M6IFNvaG9EYXRhR3JpZENsb3NlRmlsdGVyUm93RXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZUZpbHRlclJvdy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSBjb250ZXh0IG1lbnUgaXMgaXMgY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgb25Db250ZXh0TWVudShhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnU/Lm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIGNvbnRleHQgbWVudSBpcyBpcyBjbGlja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkRvdWJsZUNsaWNrKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dEb3VibGVDbGlja2VkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiB0aGUgZGF0YSBpcyBmaWx0ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgb25GaWx0ZXJlZChhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGZpbHRlciByb3cgb3BlbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbk9wZW5GaWx0ZXJSb3coYXJnczogU29ob0RhdGFHcmlkT3BlbkZpbHRlclJvd0V2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMub3BlbkZpbHRlclJvdy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgcmVtb3ZlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dSZW1vdmUoYXJnczogU29ob0RhdGFHcmlkUm93UmVtb3ZlRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dSZW1vdmUubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBkYXRhIGlzIHJlbmRlcmVkXG4gICAqL1xuICBwcml2YXRlIG9uUmVuZGVyZWQoYXJnczogU29ob0RhdGFHcmlkUmVuZGVyZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiB0aGUgZGF0YSBpcyBmaWx0ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlclJlbmRlcihhcmdzOiBTb2hvRGF0YUdyaWRBZnRlclJlbmRlckV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBiZWZvcmUgYSByb3cgaXMgYWN0aXZhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkJlZm9yZVJvd0FjdGl2YXRlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmJlZm9yZVJvd0FjdGl2YXRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgYWN0aXZhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0FjdGl2YXRlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd0FjdGl2YXRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNvbHVtbkNoYW5nZShhcmdzOiBTb2hvRGF0YUdyaWRDb2x1bW5DaGFuZ2VkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5DaGFuZ2UubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIGRlYWN0aXZhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0RlYWN0aXZhdGVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0RlYWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dEZWFjdGl2YXRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgcmVvcmRlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd1Jlb3JkZXJlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dSZW9yZGVyZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd1Jlb3JkZXJlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgb25TZWxlY3RlZChhcmdzOiBTb2hvRGF0YUdyaWRTZWxlY3RlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHNldHRpbmdzIGFyZSBjaGFuZ2VkIG9uIHRoZSBncmlkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblNldHRpbmdzQ2hhbmdlZChhcmdzOiBTb2hvRGF0YUdyaWRTZXR0aW5nc0NoYW5nZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzQ2hhbmdlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgc29ydGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblNvcnRlZChhcmdzOiBTb2hvRGF0YUdyaWRTb3J0ZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNvcnRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gc2VhcmNoIGluIHRvb2xiYXIgaXMgdHJpZ2dlcmVkXG4gICAqIEBwYXJhbSBhcmdzIFNlYXJjaGVkIGRhdGFcbiAgICovXG4gIHByaXZhdGUgb25TZWFyY2hlZChhcmdzOiBhbnlbXSkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaGVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiB1c2luZyBidWlsdC1pbiBwYWdlciB0byBuZXh0IHBhZ2UuXG4gICAqL1xuICBwcml2YXRlIG9uTmV4dFBhZ2UoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLm5leHRQYWdlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCB3aGVuIHVzaW5nIGJ1aWx0LWluIHBhZ2VyIHRvIHByZXZpb3VzIHBhZ2UuXG4gICAgICovXG4gIHByaXZhdGUgb25QcmV2aW91c1BhZ2UoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnByZXZpb3VzUGFnZS5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgd2hlbiB1c2luZyBidWlsdC1pbiBwYWdlciB0byBmaXJzdCBwYWdlLlxuICAgICAqL1xuICBwcml2YXRlIG9uRmlyc3RQYWdlKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5maXJzdFBhZ2UubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdXNpbmcgYnVpbHQtaW4gcGFnZXIgdG8gbGFzdCBwYWdlLlxuICAgICAqL1xuICBwcml2YXRlIG9uTGFzdFBhZ2UoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmxhc3RQYWdlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgb24gcGFnaW5nIHNpemUgY2hhbmdlXG4gICAqL1xuICBwcml2YXRlIG9uUGFnZVNpemVDaGFuZ2UoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYmVmb3JlIHBhZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBvbkJlZm9yZVBhZ2luZyhhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuYmVmb3JlUGFnaW5nLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgcGFnaW5nXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJQYWdpbmcoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUGFnaW5nLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgdmVydGljYWwgc2Nyb2xsXG4gICAqL1xuICBwcml2YXRlIG9uVmVydGljYWxTY3JvbGwoYXJnczogU29ob0RhdGFHcmlkU2Nyb2xsRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbC5uZXh0KGFyZ3MpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgdmVydGljYWwgc2Nyb2xsXG4gICAqL1xuICBwcml2YXRlIG9uRmlsdGVyT3BlcmF0b3JDaGFuZ2VkKGFyZ3M6IFNvaG9EYXRhR3JpZEZpbHRlck9wZXJhdG9yQ2hhbmdlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyb3BlcmF0b3JjaGFuZ2VkLm5leHQoYXJncyk7XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgZG9tIGpRdWVyeSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gIHJvdyBUaGUgcm93IGluZGV4LlxuICAgKiBAcGFyYW0gIGluY2x1ZGVHcm91cHMgSWYgdHJ1ZSBncm91cHMgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICogQHJldHVybiBUaGUgZG9tIGpRdWVyeSBub2RlXG4gICAqL1xuICByb3dOb2RlKHJvdzogbnVtYmVyLCBpbmNsdWRlR3JvdXBzOiBib29sZWFuKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQ/LnJvd05vZGUocm93LCBpbmNsdWRlR3JvdXBzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjZWxsIGRvbSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gIHJvdyBUaGUgcm93IGluZGV4LlxuICAgKiBAcGFyYW0gIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqIEBwYXJhbSAgaW5jbHVkZUdyb3VwcyBJZiB0cnVlIGdyb3VwcyBhcmUgdGFrZW4gaW50byBhY2NvdW50LlxuICAgKiBAcmV0dXJuIFRoZSBkb20gbm9kZVxuICAgKi9cbiAgY2VsbE5vZGUocm93OiBudW1iZXIsIGNlbGw6IG51bWJlciwgaW5jbHVkZUdyb3VwczogYm9vbGVhbik6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5jZWxsTm9kZShyb3csIGNlbGwsIGluY2x1ZGVHcm91cHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZCBEZXRhaWwgUm93IE9yIFRyZWUgUm93XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkYXRhUm93SW5kZXggVGhlIHJvdyB0byB0b2dnbGVcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gZXhwYW5kT25seSBTZXQgdGhlIHRvZ2dsZSB0byBleHBhbmQgb25seVxuICAgKi9cbiAgdG9nZ2xlUm93RGV0YWlsKGRhdGFSb3dJbmRleDogbnVtYmVyLCBleHBhbmRPbmx5PzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8udG9nZ2xlUm93RGV0YWlsKGRhdGFSb3dJbmRleCwgZXhwYW5kT25seSk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVTdW1tYXJ5Um93KGNvbDogb2JqZWN0LCBjZWxsOiBudW1iZXIpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZVN1bW1hcnlSb3coY29sLCBjZWxsKTtcbiAgICB9KVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIExpZmVjeWNsZSBFdmVudHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCBhZnRlciBBbmd1bGFyIGluaXRpYWxpemVzIHRoZSBkYXRhLWJvdW5kIGlucHV0IHByb3BlcnRpZXMuXG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZSh0aGlzLl9ncmlkT3B0aW9ucy5zb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBBbmd1bGFyIHByb2plY3RzIGV4dGVybmFsIGNvbnRlbnQgaW50byBpdHMgdmlldy5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBPbmNlIHRoZSB2aWV3IGlzIGNyZWF0ZWQgYW5kIHJlYWR5LCBpbml0aWFpc2UgdGhlIGRhdGEgZ3JpZCBjb21wb25lbnQuXG4gICAgdGhpcy5idWlsZERhdGFHcmlkKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoSGludCAhPT0gUmVmcmVzaEhpbnRGbGFncy5Ob25lKSB7XG4gICAgICB0aGlzLnVwZGF0ZWQodGhpcy5fZ3JpZE9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAganVzdCBiZWZvcmUgQW5ndWxhciBkZXN0cm95cyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBVbnN1YnNjcmliZSBvYnNlcnZhYmxlcywgZGV0YWNoIGV2ZW50IGhhbmRsZXJzIGFuZCByZW1vdmUgb3RoZXIgcmVzb3VyY2VzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy5cbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveURhdGFHcmlkKCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGUgTWVtYmVyc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBqUXVlcnkgY29udHJvbCAoYW5kIGFueSBvdGhlciByZXNvdXJjZXMpXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgZGVzdHJveURhdGFHcmlkKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIGR5bmFtaWMgY29tcG9uZW50cy5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGMuY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHRoZSBjYWNoZS5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzID0gW107XG5cbiAgICAvLyBSZW1vdmUgcm93VGVtcGxhdGUgZHluYW1pYyBjb21wb25lbnRzLlxuICAgIGlmICh0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cyAmJiB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGMuY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBOb3cgZGVzdHJveSB0aGUgZ3JpZC5cbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgaWYgKHRoaXMuZGF0YWdyaWQuZGVzdHJveSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kYXRhZ3JpZD8uZGVzdHJveSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YWdyaWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSAncG9zdENlbGxSZW5kZXInIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIgdG8gaG9zdCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIGFyZ3MgdGhlIGZvcm1hdHRlciBhcmd1bWVudHMuXG4gICAqL1xuICBwcml2YXRlIG9uUG9zdFJlbmRlckNlbGxIYW5kbGVyKGNvbnRhaW5lcjogSlF1ZXJ5LCBhcmdzOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEFyZ3MpIHtcbiAgICAvLyBQcmUtY29uZGl0aW9uc1xuICAgIGlmICghYXJncy5jb2wuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm47IC8vIHRocm93IEVycm9yKGBNaXNzaW5nICdjb21wb25lbnQnIGluIGNvbHVtbiAke2FyZ3MuY29sLmlkfWApO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIGZhY3RvcnkgZm9yIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIG9uIHRoZSBjb2x1bW4uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoYXJncy5jb2wuY29tcG9uZW50KTtcblxuICAgIC8vIENyZWF0ZSBhbiBpbmplY3RvciB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgYXJndW1lbnRzIGZvciB0aGVcbiAgICAvLyBjb21wb25lbnQuXG4gICAgLy8gY29uc3QgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBhcmdzIH1dLCB0aGlzLmluamVjdG9yKTtcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7IHByb3ZpZGVyczogW3sgcHJvdmlkZTogJ2FyZ3MnLCB1c2VWYWx1ZTogYXJncyB9XSwgcGFyZW50OiB0aGlzLmluamVjdG9yIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQsIGluIHRoZSBjb250YWluZXIuXG4gICAgY29uc3QgY29tcG9uZW50ID0gZmFjdG9yeS5jcmVhdGUoaW5qZWN0b3IsIFtdLCBjb250YWluZXIpO1xuXG4gICAgLy8gQ29weSBpbnRvIGl0IGFueSBjb2x1bW4gbGV2ZWwgSW5wdXRzLCB0aGVzZSBhcmUgb3B0aW9uYWwgYnV0IGFsbG93XG4gICAgLy8gY29sdW1uIHNwZWNpZmljIG92ZXJyaWRlcyB0byBiZSBkZWZpbmVkLlxuICAgIE9iamVjdC5hc3NpZ24oKGNvbXBvbmVudCBhcyBhbnkpLmluc3RhbmNlLCBhcmdzLmNvbC5jb21wb25lbnRJbnB1dHMpO1xuXG4gICAgLy8gLi4uIGF0dGFjaCB0byB0aGUgYXBwIC4uLlxuICAgIHRoaXMuYXBwLmF0dGFjaFZpZXcoY29tcG9uZW50Lmhvc3RWaWV3KTtcblxuICAgIC8vIC4uLiB1cGRhdGUgZm9yIGNoYW5nZXMgLi4uXG4gICAgY29tcG9uZW50LmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgIC8vIERvIHRoaXMgYXQgdGhlIGVuZD9cblxuICAgIC8vIC4uLiBmaW5hbGx5IHN0b3JlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBmb3IgbGF0ZXIsIHdlJ2xsIGRlbGV0ZSBpdCB3aGVuXG4gICAgLy8gcmVxdWVzdGVkLCBvciB3aGVuIHRoZSBncmlkIGlzIGRlc3Ryb3llZC5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzLnB1c2goXG4gICAgICB7IHJvdzogYXJncy5yb3csIGNlbGw6IGFyZ3MuY2VsbCwgY29tcG9uZW50IH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlICdkZXN0cm95Q2VsbCcgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3NcbiAgICovXG4gIHByaXZhdGUgb25EZXN0cm95Q2VsbEhhbmRsZXIoYXJnczogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxBcmdzKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5jZWxsQ29tcG9uZW50cy5maW5kSW5kZXgoKGMpID0+IGFyZ3Mucm93ID09PSBjLnJvdyAmJiBhcmdzLmNlbGwgPT09IGMuY2VsbCk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLmNlbGxDb21wb25lbnRzW2lkeF0uY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuY2VsbENvbXBvbmVudHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkVkaXRDZWxsSGFuZGxlcihlZGl0b3I6IEV4dGVuZGVkU29ob0RhdGFHcmlkQ2VsbEVkaXRvcikge1xuICAgIC8vIFByZS1jb25kaXRpb25zXG4gICAgaWYgKCFlZGl0b3IuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm47IC8vIHRocm93IEVycm9yKGBNaXNzaW5nICdjb21wb25lbnQnIGluIGNvbHVtbiAke2FyZ3MuY29sLmlkfWApO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIGZhY3RvcnkgZm9yIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIG9uIHRoZSBjb2x1bW4uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZWRpdG9yLmNvbXBvbmVudCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5qZWN0b3IgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGFyZ3VtZW50cyBmb3IgdGhlXG4gICAgLy8gY29tcG9uZW50LlxuICAgIC8vIGNvbnN0IGkgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBlZGl0b3IuYXJncyB9XSwgdGhpcy5pbmplY3Rvcik7XG4gICAgY29uc3QgaSA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6ICdhcmdzJywgdXNlVmFsdWU6IGVkaXRvci5hcmdzIH1dLFxuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yXG4gICAgfSk7XG5cbiAgICAvLyBXYXJuaW5nISEgdGhlIGR5bmFtaWMgY29tcG9uZW50IGlzIG5vdCBhZGRlZCBpbnNpZGUgdGhlIGNvbnRhaW5lcixcbiAgICAvLyBidXQgYXMgYSBzaWJsaW5nLCBzbyB3aGVuIGl0J3MgZGVzdHJveWVkIGl0IHRha2VzIGFueSBzaWJsaW5ncyAgd2l0aFxuICAgIC8vIGl0LiAgSXQgaXMgbm90IGNsZWFyIHdoeSB0aGlzIC0gc28gdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgYWRkXG4gICAgLy8gYSBzaW5nbGUgY2hpbGQgdG8gdGhlIGNlbGwgY29udGFpbmVyLlxuICAgIGNvbnN0IHRyYW5zaWVudENvbnRhaW5lciA9ICQoJzxkaXY+PC9kaXY+JykuYXBwZW5kVG8oZWRpdG9yLmFyZ3MuY29udGFpbmVyKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50LCBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKGksIFtdLCB0cmFuc2llbnRDb250YWluZXJbMF0pIGFzIENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPjtcblxuICAgIC8vIENvcHkgaW50byBpdCBhbnkgY29sdW1uIGxldmVsIElucHV0cywgdGhlc2UgYXJlIG9wdGlvbmFsIGJ1dCBhbGxvd1xuICAgIC8vIGNvbHVtbiBzcGVjaWZpYyBvdmVycmlkZXMgdG8gYmUgZGVmaW5lZC5cbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgZWRpdG9yLmFyZ3MuY29sLmVkaXRvckNvbXBvbmVudElucHV0cyk7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRvIHRoZSBlZGl0b3IuXG4gICAgZWRpdG9yLmluaXQoY29tcG9uZW50UmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREYXRhR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBjYWxsIG91dHNpZGUgdGhlIGFuZ3VsYXIgem9uZSBzbyBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgLy8gaXNuJ3QgdHJpZ2dlcmVkIGJ5IHRoZSBzb2hvIGNvbXBvbmVudC5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBXcmFwIHRoZSBlbGVtZW50IGluIGEgalF1ZXJ5IHNlbGVjdG9yLlxuICAgICAgdGhpcy5qUXVlcnlFbGVtZW50ID0galF1ZXJ5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgLy8gQWRkIHRoZSBvblBvc3RDZWxsUmVuZGVyZXJcbiAgICAgIGlmICghdGhpcy5fZ3JpZE9wdGlvbnMub25Qb3N0UmVuZGVyQ2VsbCkge1xuICAgICAgICB0aGlzLl9ncmlkT3B0aW9ucy5vblBvc3RSZW5kZXJDZWxsID0gKGMsIGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykgPT4ge1xuICAgICAgICAgIHRoaXMub25Qb3N0UmVuZGVyQ2VsbEhhbmRsZXIoYywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgZGVzdHJveSBjZWxsIGNhbGxiYWNrLlxuICAgICAgaWYgKCF0aGlzLl9ncmlkT3B0aW9ucy5vbkRlc3Ryb3lDZWxsKSB7XG4gICAgICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uRGVzdHJveUNlbGwgPSAoXywgYXJnczogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxBcmdzKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkRlc3Ryb3lDZWxsSGFuZGxlcihhcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBlZGl0IGNlbGwgY2FsbGJhY2suXG4gICAgICBpZiAoIXRoaXMuX2dyaWRPcHRpb25zLm9uRWRpdENlbGwpIHtcbiAgICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25FZGl0Q2VsbCA9IChlZGl0b3I6IEV4dGVuZGVkU29ob0RhdGFHcmlkQ2VsbEVkaXRvcikgPT4ge1xuICAgICAgICAgIHRoaXMub25FZGl0Q2VsbEhhbmRsZXIoZWRpdG9yKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBrZXlkb3duIGNhbGxiYWNrLlxuICAgICAgaWYgKCF0aGlzLl9ncmlkT3B0aW9ucy5vbktleURvd24pIHtcbiAgICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25LZXlEb3duID0gKGU6IEpRdWVyeS5FdmVudCwgYXJnczogU29ob0RhdGFHcmlkS2V5RG93bkFyZ3MsIHJlc3BvbnNlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICAgIHRoaXMub25LZXlEb3duSGFuZGxlcihlLCBhcmdzLCByZXNwb25zZSk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWxpc2UgYW55IGV2ZW50IGhhbmRsZXJzLlxuICAgICAgdGhpcy5qUXVlcnlFbGVtZW50XG4gICAgICAgIC5vbignYWRkcm93JywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEFkZFJvd0V2ZW50KSA9PiB0aGlzLm9uUm93QWRkKGFyZ3MpKVxuICAgICAgICAub24oJ2NlbGxjaGFuZ2UnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkQ2VsbENoYW5nZUV2ZW50KSA9PiB0aGlzLm9uQ2VsbENoYW5nZShhcmdzKSlcbiAgICAgICAgLm9uKCdjbGljaycsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSA9PiB0aGlzLm9uUm93Q2xpY2tlZChhcmdzKSlcbiAgICAgICAgLm9uKCdjbG9zZWZpbHRlcnJvdycsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRDbG9zZUZpbHRlclJvd0V2ZW50KSA9PiB0aGlzLm9uQ2xvc2VGaWx0ZXJSb3coYXJncykpXG4gICAgICAgIC5vbignY29sbGFwc2Vyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93Q29sbGFwc2VFdmVudCkgPT4gdGhpcy5vbkNvbGxhcHNlUm93KGFyZ3MpKVxuICAgICAgICAub24oJ2NvbnRleHRtZW51JywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQpID0+IHRoaXMub25Db250ZXh0TWVudShhcmdzKSlcbiAgICAgICAgLm9uKCdkYmxjbGljaycsIChfZTogSlF1ZXJ5LlRyaWdnZXJlZEV2ZW50LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSA9PiB0aGlzLm9uRG91YmxlQ2xpY2soYXJncykpXG4gICAgICAgIC5vbignYmVmb3JlZW50ZXJlZGl0bW9kZScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSA9PiB0aGlzLm9uQmVmb3JlRW50ZXJFZGl0TW9kZShhcmdzKSlcbiAgICAgICAgLm9uKCdleGl0ZWRpdG1vZGUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkgPT4gdGhpcy5vbkV4aXRFZGl0TW9kZShhcmdzKSlcbiAgICAgICAgLm9uKCdlbnRlcmVkaXRtb2RlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpID0+IHRoaXMub25FbnRlckVkaXRNb2RlKGFyZ3MpKVxuICAgICAgICAub24oJ2V4cGFuZHJvdycsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dFeHBhbmRFdmVudCkgPT4gdGhpcy5vbkV4cGFuZFJvd0hhbmRsZXIoYXJncykpXG4gICAgICAgIC5vbignZmlsdGVyZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudCkgPT4gdGhpcy5vbkZpbHRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ29wZW5maWx0ZXJyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkT3BlbkZpbHRlclJvd0V2ZW50KSA9PiB0aGlzLm9uT3BlbkZpbHRlclJvdyhhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dyZW1vdmUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93UmVtb3ZlRXZlbnQpID0+IHRoaXMub25Sb3dSZW1vdmUoYXJncykpXG4gICAgICAgIC5vbigncmVuZGVyZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUmVuZGVyZWRFdmVudCkgPT4gdGhpcy5vblJlbmRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ2FmdGVycmVuZGVyJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEFmdGVyUmVuZGVyRXZlbnQpID0+IHRoaXMub25BZnRlclJlbmRlcihhcmdzKSlcbiAgICAgICAgLm9uKCdiZWZvcmVyb3dhY3RpdmF0ZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpID0+IHRoaXMub25CZWZvcmVSb3dBY3RpdmF0ZWQoYXJncykpXG4gICAgICAgIC5vbigncm93YWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZEV2ZW50KSA9PiB0aGlzLm9uUm93QWN0aXZhdGVkKGFyZ3MpKVxuICAgICAgICAub24oJ3Jvd2RlYWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0RlYWN0aXZhdGVkRXZlbnQpID0+IHRoaXMub25Sb3dEZWFjdGl2YXRlZChhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dyZW9yZGVyJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd1Jlb3JkZXJlZEV2ZW50KSA9PiB0aGlzLm9uUm93UmVvcmRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ2NvbHVtbmNoYW5nZScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHRoaXMub25Db2x1bW5DaGFuZ2UoYXJncykpXG4gICAgICAgIC5vbignc2VsZWN0ZWQnLFxuICAgICAgICAgIChlOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFNlbGVjdGVkUm93W10sIHR5cGU/OiBTb2hvRGF0YUdyaWRTZWxlY3RlZEV2ZW50VHlwZSwgcm93RGF0YT86IFNvaG9EYXRhR3JpZFNlbGVjdGVkUm93W10gfCBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdykgPT5cbiAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZCh7IGUsIHJvd3M6IGFyZ3MsIHR5cGUsIHJvd0RhdGEgfSkpXG4gICAgICAgIC5vbignc2V0dGluZ3NjaGFuZ2VkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFNldHRpbmdzQ2hhbmdlZEV2ZW50KSA9PiB0aGlzLm9uU2V0dGluZ3NDaGFuZ2VkKGFyZ3MpKVxuICAgICAgICAub24oJ3NvcnRlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTb3J0ZWRFdmVudCkgPT4gdGhpcy5vblNvcnRlZChhcmdzKSlcbiAgICAgICAgLm9uKCdzZWFyY2hlZCcsIChfZTogYW55LCBhcmdzOiBhbnlbXSkgPT4gdGhpcy5vblNlYXJjaGVkKGFyZ3MpKVxuICAgICAgICAub24oJ2JlZm9yZXBhZ2luZycsIChfZTogYW55LCBhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSA9PiB0aGlzLm9uQmVmb3JlUGFnaW5nKGFyZ3MpKVxuICAgICAgICAub24oJ2FmdGVycGFnaW5nJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25BZnRlclBhZ2luZyhhcmdzKSlcbiAgICAgICAgLm9uKCdzY3JvbGwnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkU2Nyb2xsRXZlbnQpID0+IHRoaXMub25WZXJ0aWNhbFNjcm9sbChhcmdzKSlcbiAgICAgICAgLm9uKCdmaWx0ZXJvcGVyYXRvcmNoYW5nZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRmlsdGVyT3BlcmF0b3JDaGFuZ2VkRXZlbnQpID0+IHRoaXMub25GaWx0ZXJPcGVyYXRvckNoYW5nZWQoYXJncykpXG4gICAgICAgIC5vbignbmV4dHBhZ2UnLCAoX2U6IGFueSwgYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykgPT4gdGhpcy5vbk5leHRQYWdlKGFyZ3MpKVxuICAgICAgICAub24oJ3ByZXZpb3VzcGFnZScsIChfZTogYW55LCBhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSA9PiB0aGlzLm9uUHJldmlvdXNQYWdlKGFyZ3MpKVxuICAgICAgICAub24oJ2ZpcnN0cGFnZScsIChfZTogYW55LCBhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSA9PiB0aGlzLm9uRmlyc3RQYWdlKGFyZ3MpKVxuICAgICAgICAub24oJ2xhc3RwYWdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25MYXN0UGFnZShhcmdzKSlcbiAgICAgICAgLm9uKCdwYWdlc2l6ZWNoYW5nZScsIChfZTogYW55LCBhcmdzOiBTb2hvUGFnZXJQYWdpbmdJbmZvKSA9PiB0aGlzLm9uUGFnZVNpemVDaGFuZ2UoYXJncykpXG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXNlIHRoZSBTb2hvWGkgY29udHJvbC5cbiAgICB0aGlzLmpRdWVyeUVsZW1lbnQ/LmRhdGFncmlkKHRoaXMuX2dyaWRPcHRpb25zKTtcbiAgICB0aGlzLmpRdWVyeUVsZW1lbnQ/LnJlbW92ZUF0dHIoJ3JvbGUnKTtcblxuICAgIC8vIE9uY2UgdGhlIGNvbnRyb2wgaXMgaW5pdGlhbGlzZWQsIGV4dHJhY3QgdGhlIGNvbnRyb2xcbiAgICAvLyBwbHVnLWluIGZyb20gdGhlIGVsZW1lbnQuICBUaGUgZWxlbWVudCBuYW1lIGlzXG4gICAgLy8gZGVmaW5lZCBieSB0aGUgcGx1Zy1pbiwgYnV0IGluIHRoaXMgY2FzZSBpcyAnZGF0YWdyaWQnLlxuICAgIHRoaXMuZGF0YWdyaWQgPSB0aGlzLmpRdWVyeUVsZW1lbnQ/LmRhdGEoJ2RhdGFncmlkJyk7XG5cbiAgICAvLyBJZiBcImF1dG9cIiBhbmQgdGhlcmUncyBhIHNlcnZpY2UsIGdldCB0aGUgY29sdW1ucyBmcm9tIGl0LlxuICAgIC8vIChtYXkgd2FudCB0byBjaGVjayBpZiBjb2x1bW5zIGhhdmUgYWxyZWFkeSBiZWVuIHNldD8gRXJyb3I/KVxuICAgIGlmICh0aGlzLmRhdGFncmlkVHlwZSA9PT0gU29ob0RhdGFHcmlkQ29tcG9uZW50LkFVVE8gJiYgdGhpcy5kYXRhZ3JpZFNlcnZpY2UpIHtcbiAgICAgIC8vIEJvb3RzdHJhcCBmcm9tIHNlcnZpY2UsIG5vdGUgdGhpcyBpcyBub3QgYXN5bmMuXG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGFncmlkU2VydmljZS5nZXRDb2x1bW5zKCk7XG4gICAgICAvLyBPbmNlIHRoZSBjb2x1bW5zIGFyZSBzZXQsIHJlcXVlc3QgdGhlIGRhdGEgKHBhZ2luZz8pXG4gICAgICB0aGlzLmRhdGFncmlkU2VydmljZS5nZXREYXRhKG51bGwpXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhZ3JpZD8ubG9hZERhdGEoZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkRGF0YSkge1xuICAgICAgLy8gTm90IHVzaW5nIGEgc2VydmljZSwgc28gdXNlIHRoZSBwcmUtbG9hZGVkIGRhdGEuXG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LmxvYWREYXRhKCh0aGlzLmdyaWREYXRhIGFzIGFueSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBjb21wb25lbnRzIGFzIHJlcXVpcmluZyBhIHJlYnVpbGQgYWZ0ZXIgdGhlIG5leHQgdXBkYXRlLlxuICAgKlxuICAgKiBAdG9kbyBwb3NzaWJsZSBhZGQgaGludHM/IFJlYnVpbGQsIFVwZGF0ZSwgU2V0T3B0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25OYW1lIC0gdGhlIG9wdGlvbiB0aGF0IHdhcyB1cGRhdGVkLCAoYWxsb3dpbmcgc3BlY2lmaWMgaGFuZGxpbmcpXG4gICAqIEBwYXJhbSBoaW50IC0gdGhlIHR5cGUgb2YgcmVmcmVzaCByZXF1aXJlZCwgdXBkYXRlPy5cbiAgICovXG4gIHByaXZhdGUgbWFya0ZvclJlZnJlc2gob3B0aW9uTmFtZTogc3RyaW5nLCBoaW50OiBSZWZyZXNoSGludEZsYWdzKSB7XG5cbiAgICAvLyBNZXJnZSBpbiB0aGUgaGludC5cbiAgICB0aGlzLnJlZnJlc2hIaW50IHw9IGhpbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAgIC8vIC4uLiBzbyB3ZSBjYW4gdXNlIGl0IGxhdGVyXG4gICAgdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKG9wdGlvbk5hbWUpO1xuXG4gICAgLy8gLi4uIG1ha2Ugc3VyZSB0aGUgY2hhbmdlIGRldGVjdG9yIGtpY2tzIGluLCBvdGhlcndpc2UgaWYgdGhlIGlucHV0c1xuICAgIC8vIHdlcmUgY2hhbmdlIHByb2dyYW1tYXRpYWxseSB0aGUgY29tcG9uZW50IG1heSBub3QgYmUgZWxpZ2libGUgZm9yXG4gICAgLy8gdXBkYXRpbmcuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGdhcCBtZXRob2QgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGRhdGFncmlkIGFuZCByZWJ1aWxkIGl0IGFnYWluLlxuICAgKlxuICAgKiBUaGlzIGlzIHJlcXVpcmVkIHdoaWxzdCB0aGVyZSBpcyBubyBtZXRob2QgZm91bmQgdGhhdCBjYW4gdXBkYXRlIHRoZSB2aWV3XG4gICAqIGZvciBhIHBhcnRpY3VsYXIgaW5wdXQuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlZChzZXR0aW5ncz86IFNvaG9EYXRhR3JpZE9wdGlvbnMpIHtcbiAgICBpZiAoc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zID0gU29oby51dGlscy5tZXJnZVNldHRpbmdzKCh0aGlzLmVsZW1lbnRSZWYgYXMgYW55KVswXSwgc2V0dGluZ3MsIHRoaXMuX2dyaWRPcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucmVmcmVzaEhpbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlZCh0aGlzLl9ncmlkT3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRpbmdzICYmIHRoaXMucmVmcmVzaEhpbnQgJiBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpIHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlZCh0aGlzLl9ncmlkT3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVmcmVzaEhpbnQgJiBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpIHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVuZGVySGVhZGVyKCk7XG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlbmRlclJvd3MoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVySGVhZGVyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVuZGVySGVhZGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVmcmVzaEhpbnQgJiBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICB0aGlzLmRhdGFncmlkPy5yZW5kZXJSb3dzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gUmVzZXQgdGhlIGZsYWdzLlxuICAgIHRoaXMucmVmcmVzaEhpbnQgPSBSZWZyZXNoSGludEZsYWdzLk5vbmU7XG4gICAgdGhpcy5jaGFuZ2VkT3B0aW9ucyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZGF0YXNldCBvZiBkYXRhZ3JpZFxuICAgKiBAcGFyYW0gZGF0YXNldCBOZXcgZGF0YXNldCB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSBwYWdlckluZm8gUGFnZXIgaW5mbyBpZiBuZWVkZWRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEYXRhc2V0KGRhdGFzZXQ6IEFycmF5PGFueT4sIHBhZ2VySW5mbz86IG9iamVjdCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZURhdGFzZXQoZGF0YXNldCwgcGFnZXJJbmZvKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHNvdXJjZSBzZXR0aW5nL2Z1bmN0aW9uIHRvIHVzZSBzb3VyY2UgaW5wdXQgaWYgc2V0LlxuICAgKiBPdGhlcndpc2UgdXNlIGRhdGFHcmlkU2VydmljZSBpZiB0aGF0IGlzIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZSB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU291cmNlKHNvdXJjZTogU29ob0RhdGFHcmlkU291cmNlRnVuY3Rpb24gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAvLyBJZiBhIHNvdXJjZSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVmaW5lZCwgYW5kIGEgc2VydmljZSBoYXNcbiAgICAvLyB1c2UgdGhlIGRhdGEgc2VydmljZSB0byBsb2FkIHRoZSBkYXRhIGR5bmFtaWNhbGx5IGZvciBwYWdpbmcuXG4gICAgaWYgKCFzb3VyY2UgJiYgdGhpcy5kYXRhZ3JpZFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLnNvdXJjZSA9IChyZXF1ZXN0OiBTb2hvRGF0YUdyaWRTb3VyY2VSZXF1ZXN0LCByZXNwb25zZTogU29ob0RhdGFHcmlkUmVzcG9uc2VGdW5jdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVJlcXVlc3QocmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZSAmJiB0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9ncmlkT3B0aW9ucy5zb3VyY2UgPSAocmVxdWVzdDogU29ob0RhdGFHcmlkU291cmNlUmVxdWVzdCwgcmVzcG9uc2U6IFNvaG9EYXRhR3JpZFJlc3BvbnNlRnVuY3Rpb24pID0+IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHNvdXJjZShyZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpIHtcbiAgICAvLyBBZGQgYW4gYWRhcHRlciBmb3IgYWxsIHRoZSBjb2x1bW5zIHVzaW5nIGFuIGNvbXBvbmVudCBhcyBhbiBlZGl0b3IuXG4gICAgKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgIGlmIChjLmVkaXRvckNvbXBvbmVudCkge1xuICAgICAgICAvLyBVc2UgYSBgZnVuY3Rpb24gZXhwcmVzc2lvbmAgcmF0aGVyIHRoYW4gYW4gYGFycm93IGZ1bmN0aW9uYCBhcyB0aGUgZWRpdG9yIGlzIHVzZWRcbiAgICAgICAgLy8gYXMgY29uc3RydWN0b3IuXG4gICAgICAgIC8vIHRlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICBjLmVkaXRvciA9IGZ1bmN0aW9uIChyb3c/OiBhbnksIGNlbGw/OiBhbnksIHZhbHVlPzogYW55LCBjb250YWluZXI/OiBKUXVlcnksIGNvbD86IFNvaG9EYXRhR3JpZENvbHVtbiB8IHVuZGVmaW5lZCwgZT86IGFueSwgYXBpPzogYW55LCBpdGVtPzogYW55KSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHJldHVybiBuZXcgU29ob0FuZ3VsYXJFZGl0b3JBZGFwdGVyKGMuZWRpdG9yQ29tcG9uZW50LCB7IHJvdywgY2VsbCwgdmFsdWUsIGNvbnRhaW5lcjogKGNvbnRhaW5lciBhcyBhbnkpWzBdLCBjb2wsIGUsIGFwaSwgaXRlbSB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JTdW1tYXJ5Um93U2V0dGluZ3MoKSB7XG4gICAgaWYgKCF0aGlzLl9ncmlkT3B0aW9ucy5zdW1tYXJ5Um93Q29sdW1ucyB8fCB0aGlzLl9ncmlkT3B0aW9ucy5zdW1tYXJ5Um93Q29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLmNvbHVtbnMuZm9yRWFjaCgoYzogYW55KSA9PiB7XG4gICAgICAgIGMuc3VtbWFyeVJvd0Zvcm1hdHRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgYy5zdW1tYXJ5VGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgYy5hZ2dyZWdhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBjLnN1bW1hcnlUZXh0UGxhY2VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zLmZvckVhY2goKHNjKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9ICh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLmNvbHVtbnMuZmluZCgoYzogYW55KSA9PiBjLmZpZWxkID09PSBzYy5maWVsZCk7XG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5zdW1tYXJ5Um93Rm9ybWF0dGVyID0gc2Muc3VtbWFyeVJvd0Zvcm1hdHRlcjtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLnN1bW1hcnlUZXh0ID0gc2Muc3VtbWFyeVRleHQ7XG4gICAgICAgIChjb2x1bW4gYXMgYW55KS5hZ2dyZWdhdG9yID0gc2MuYWdncmVnYXRvcjtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLnN1bW1hcnlUZXh0UGxhY2VtZW50ID0gc2Muc3VtbWFyeVRleHRQbGFjZW1lbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlICdleHBhbmRyb3cnIGFuZCAnY29sbGFwc2Vyb3cnIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2hvRGF0YUdyaWRUb2dnbGVSb3dFdmVudCBleHRlbmRzIFNvaG9EYXRhR3JpZFJvd0V4cGFuZEV2ZW50IHtcbiAgLy8gVGhlIGRhdGEgZ3JpZCBjb21wb25lbnQgb3JpZ2luYXRpbmcgdGhlIGNhbGwuXG4gIGdyaWQ6IFNvaG9EYXRhR3JpZENvbXBvbmVudDtcbiAgYXJncz86IGFueTtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSAna2V5ZG93bicgZXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2hvRGF0YUdyaWRLZXlEb3duRXZlbnQge1xuICAvLyBUaGUgZGF0YSBncmlkIGNvbXBvbmVudCBvcmlnaW5hdGluZyB0aGUgY2FsbC5cbiAgZTogSlF1ZXJ5LkV2ZW50O1xuICBhcmdzPzogU29ob0RhdGFHcmlkS2V5RG93bkFyZ3M7XG4gIHJlc3BvbnNlPzogRnVuY3Rpb247XG59XG4iXX0=
|