@skyux/grids 9.21.2 → 10.0.0-alpha.0

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.
@@ -955,13 +955,13 @@ export class SkyGridComponent {
955
955
  return (arrayA.length === arrayB.length &&
956
956
  arrayA.every((value, index) => value === arrayB[index]));
957
957
  }
958
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SkyGridComponent, deps: [{ token: i1.SkyAffixService }, { token: i0.ChangeDetectorRef }, { token: i2.DragulaService }, { token: i3.SkyGridAdapterService }, { token: i1.SkyOverlayService }, { token: i1.SkyAppWindowRef }, { token: i1.SkyUIConfigService }, { token: i1.SkyLogService }], target: i0.ɵɵFactoryTarget.Component }); }
959
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SkyGridComponent, selector: "sky-grid", inputs: { columns: "columns", data: "data", enableMultiselect: "enableMultiselect", fit: "fit", hasToolbar: "hasToolbar", height: "height", highlightText: "highlightText", messageStream: "messageStream", multiselectRowId: "multiselectRowId", rowHighlightedId: "rowHighlightedId", selectedColumnIds: "selectedColumnIds", selectedRowIds: "selectedRowIds", settingsKey: "settingsKey", sortField: "sortField", width: "width" }, outputs: { columnWidthChange: "columnWidthChange", multiselectSelectionChange: "multiselectSelectionChange", rowDeleteCancel: "rowDeleteCancel", rowDeleteConfirm: "rowDeleteConfirm", selectedColumnIdsChange: "selectedColumnIdsChange", sortFieldChange: "sortFieldChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, providers: [SkyGridAdapterService], queries: [{ propertyName: "columnComponents", predicate: SkyGridColumnComponent }], viewQueries: [{ propertyName: "inlineDeleteTemplateRef", first: true, predicate: ["inlineDeleteTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "tableContainerElementRef", first: true, predicate: ["gridContainer"], descendants: true }, { propertyName: "tableElementRef", first: true, predicate: ["gridTable"], descendants: true }, { propertyName: "topScrollContainerElementRef", first: true, predicate: ["topScrollContainer"], descendants: true }, { propertyName: "resizeBar", first: true, predicate: ["resizeBar"], descendants: true }, { propertyName: "columnElementRefs", predicate: ["gridCol"], descendants: true }, { propertyName: "columnRangeInputElementRefs", predicate: ["colSizeRange"], descendants: true }, { propertyName: "inlineDeleteRefs", predicate: ["inlineDeleteRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sky-grid\">\n <div\n *ngIf=\"showTopScroll\"\n class=\"sky-grid-top-scroll-container\"\n (scroll)=\"onTopScroll($event)\"\n #topScrollContainer\n >\n <div\n class=\"sky-grid-top-scroll\"\n [style.width.px]=\"getTopScrollWidth()\"\n ></div>\n </div>\n <div\n class=\"sky-grid-table-container\"\n [style.height.px]=\"height\"\n [style.width.px]=\"width\"\n (scroll)=\"onGridScroll($event)\"\n #gridContainer\n >\n <table class=\"sky-grid-table\" [ngClass]=\"getTableClassNames()\" #gridTable>\n <thead>\n <tr [dragula]=\"dragulaGroupName\">\n <th\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-heading sky-grid-multiselect-cell sky-grid-header-locked\"\n scope=\"col\"\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <span class=\"screen-reader-only\">\n {{ 'skyux_grid_multiselect_select_row' | skyLibResources }}\n </span>\n </th>\n <th\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-heading sky-field-label\"\n scope=\"col\"\n [attr.sky-cmp-index]=\"i\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n [attr.aria-sort]=\"getAriaSortDirection(column) | async\"\n [id]=\"'sky-grid-' + gridId + '-column-' + i\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n [tabIndex]=\"column.isSortable ? 0 : -1\"\n (mouseup)=\"sortByColumn(column)\"\n (keydown)=\"onKeydown($event, column)\"\n (touchmove)=\"onTouchMove($event)\"\n #gridCol\n >\n <div\n class=\"overflow\"\n [ngClass]=\"getTableHeaderClassNames(column)\"\n [style.max-width.px]=\"column.width - 1\"\n [style.width.px]=\"column.width - 1\"\n >\n <span\n *ngIf=\"(getCaretVisibility(column.field) | async) === 'hidden'\"\n class=\"sky-grid-header-caret-hidden-spacing\"\n ></span>\n <!-- The no spacing here is intentional to avoid extra spaces due to these being inline elements -->\n <span class=\"sky-grid-header-text\">{{\n column.heading?.trim()\n }}</span>\n <sky-icon\n class=\"sky-grid-heading-sort\"\n [ngClass]=\"\n 'sky-grid-heading-sort-' +\n (getCaretVisibility(column.field) | async)\n \"\n [icon]=\"getCaretIconNames(column)\"\n />\n <sky-help-inline\n *ngIf=\"column.inlineHelpPopover\"\n [ngClass]=\"{\n 'sky-grid-help-inline-sort-hidden':\n getHelpInlineClass(column.field) | async\n }\"\n [skyPopover]=\"column.inlineHelpPopover\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (mouseup)=\"$event.stopPropagation()\"\n >\n </sky-help-inline>\n </div>\n <span\n *ngIf=\"(fit === 'width' && !last) || fit === 'scroll'\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-handle\"\n tabindex=\"-1\"\n [attr.sky-cmp-index]=\"i\"\n (mousedown)=\"onResizeColumnStart($event)\"\n (touchstart)=\"onResizeColumnStart($event)\"\n >\n </span>\n <input\n aria-label=\"Width of column\"\n class=\"sky-grid-column-input-aria-only\"\n role=\"slider\"\n type=\"range\"\n [attr.aria-controls]=\"'sky-grid-' + gridId + '-column-' + i\"\n [attr.aria-valuemin]=\"minColWidth\"\n [attr.aria-valuemax]=\"maxColWidth\"\n [attr.aria-valuenow]=\"column.width\"\n [attr.sky-cmp-index]=\"i\"\n [min]=\"minColWidth\"\n [max]=\"maxColWidth\"\n [step]=\"columnResizeStep\"\n [(ngModel)]=\"column.width\"\n (blur)=\"onResizeHandleBlur()\"\n (focus)=\"onResizeHandleFocus($event)\"\n (keydown)=\"onKeydownResizeCol($event)\"\n (change)=\"onInputChangeResizeCol($event)\"\n #colSizeRange\n />\n </th>\n </tr>\n </thead>\n <tbody class=\"sky-grid-tbody\">\n <tr\n class=\"sky-grid-row\"\n *ngFor=\"let item of items; let i = index\"\n [attr.aria-current]=\"isRowHighlighted(item.id) ? true : null\"\n [attr.sky-cmp-id]=\"item.id\"\n [ngClass]=\"{\n 'sky-grid-multiselect-selected-row': item.isSelected,\n 'sky-grid-multiselect-row': enableMultiselect,\n 'sky-grid-row-highlight': isRowHighlighted(item.id)\n }\"\n (click)=\"onRowClick($event, item)\"\n >\n <td\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-multiselect-cell sky-grid-header-locked\"\n >\n <div\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <sky-checkbox\n [label]=\"'skyux_grid_multiselect_select_row' | skyLibResources\"\n (change)=\"onMultiselectCheckboxChange()\"\n [(ngModel)]=\"item.isSelected\"\n >\n </sky-checkbox>\n </div>\n </td>\n <td\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-cell\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n >\n <sky-grid-cell\n [skyHighlight]=\"\n !column.excludeFromHighlighting ? highlightText : undefined\n \"\n [template]=\"column.template || defaultCellTemplate\"\n [fieldSelector]=\"column.field\"\n [item]=\"item\"\n [columnId]=\"column.id\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n >\n </sky-grid-cell>\n </td>\n </tr>\n </tbody>\n </table>\n <div\n *ngIf=\"showResizeBar\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-bar\"\n tabindex=\"-1\"\n #resizeBar\n ></div>\n </div>\n</div>\n\n<ng-template #defaultCellTemplate let-row=\"row\" let-value=\"value\">{{\n value\n}}</ng-template>\n\n<ng-template let-item #inlineDeleteTemplateRef>\n <div\n [id]=\"'row-delete-ref-' + item.id\"\n [ngStyle]=\"{\n height: getRowHeight(0),\n position: 'fixed',\n width: tableWidth + 'px'\n }\"\n #inlineDeleteRef\n >\n <sky-inline-delete\n [pending]=\"getRowDeleteItem(item.id).pending\"\n (cancelTriggered)=\"cancelRowDelete(item.id)\"\n (deleteTriggered)=\"confirmRowDelete(item.id)\"\n ></sky-inline-delete>\n </div>\n</ng-template>\n", styles: [".sky-grid{position:relative;display:block}.sky-grid-table-container{overflow:auto}.sky-grid-table{position:relative;table-layout:fixed;border-collapse:collapse;margin:0;font-size:15px;min-width:100%}.sky-grid-table.sky-grid-fit{max-width:100%;width:100%}.sky-grid-tbody{background-color:#fff}.sky-grid-row{border-bottom:1px dotted #cdcfd2}.sky-grid-row:nth-child(odd){background-color:#fbfbfb}.sky-grid-row.sky-grid-row-highlight{border-top:1px solid #0974a1;box-shadow:0 0 0 3px inset #0974a1}.sky-grid-row .sky-grid-cell{padding:0;min-width:10px}.sky-grid-heading{position:relative;border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;border-right-width:0px;padding:0;cursor:pointer;background-color:#fff;overflow:visible;background-clip:padding-box;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;user-select:none}.sky-grid-heading:first-child{border-left:1px solid transparent}.sky-grid-heading.sky-grid-header-dragging{background-color:#eeeeef}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-heading-sort,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-heading-sort{width:14px}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-help-inline-sort-hidden,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-help-inline-sort-hidden{margin-left:-14px;margin-right:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-header-caret-hidden-spacing{padding-left:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-heading-sort-visible{width:14px}.sky-grid-heading div{padding:8px}.sky-grid-heading .overflow{text-overflow:ellipsis;white-space:nowrap;position:relative;z-index:1;overflow:hidden;min-width:100%}.sky-grid-heading .sky-grid-column-input-aria-only{-webkit-appearance:none;-moz-appearance:none;height:100%;width:5px;position:absolute;display:block;top:0;bottom:0;right:0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-track{background:transparent}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-ms-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only:focus{background-color:#00b4f1}.sky-grid-column-alignment-left{text-align:left}.sky-grid-column-alignment-center{text-align:center}.sky-grid-column-alignment-right{text-align:right}.sky-grid-multiselect-cell{padding:0;text-align:center}.sky-grid-multiselect-cell ::ng-deep .sky-switch-control{margin:0 auto}th.sky-grid-multiselect-cell{cursor:default}th.sky-grid-multiselect-cell .screen-reader-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);outline:none;white-space:nowrap}@-moz-document url-prefix(){.sky-grid-multiselect-row td{border-left:0px solid transparent;border-right:0px solid transparent}}.sky-grid-multiselect-row:hover{background-color:#e9e4f1}.sky-grid-multiselect-row:hover:nth-child(odd){background:#e9e4f1}.sky-grid-multiselect-selected-row{background:#f1eef6;border-top:1px solid #dadbf6;border-bottom:1px solid #dadbf6}.sky-grid-multiselect-selected-row:nth-child(odd){background:#f1eef6}.sky-grid-has-toolbar .sky-grid-heading{border-top-width:0px}.sky-grid-heading-sort.sky-grid-heading-sort-hidden{visibility:hidden}.sky-grid-heading-sort.sky-grid-heading-sort-visible{visibility:visible;padding-left:5px}.sky-grid-resize-handle{position:absolute;right:0;top:0;bottom:0;width:30px;z-index:2;min-height:20px;height:100%!important;vertical-align:middle;cursor:col-resize}.sky-grid-resize-handle:hover:after{background-color:#00b4f1}.sky-grid-resize-handle:after{position:absolute;right:0;top:0;bottom:0;width:5px;height:100%;content:\"\"}.sky-grid-resize-bar{position:absolute;top:0;left:0;z-index:99;height:100%;width:5px;background:#00b4f1;opacity:.6}tr{position:relative}.sky-grid-top-scroll-container{overflow:auto}.sky-grid-top-scroll{height:1px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "indeterminate", "required"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i7.λ3, selector: "sky-help-inline", inputs: ["ariaControls", "ariaExpanded", "ariaLabel"], outputs: ["actionClick"] }, { kind: "component", type: i7.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i8.λ8, selector: "sky-inline-delete", inputs: ["pending"], outputs: ["cancelTriggered", "deleteTriggered"] }, { kind: "directive", type: i9.λ7, selector: "[skyPopover]", inputs: ["skyPopover", "skyPopoverAlignment", "skyPopoverMessageStream", "skyPopoverPlacement", "skyPopoverTrigger"] }, { kind: "directive", type: i7.SkyTextHighlightDirective, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { kind: "component", type: i10.SkyGridCellComponent, selector: "sky-grid-cell", inputs: ["item", "columnId", "template", "fieldSelector"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i11.SkyLibResourcesPipe, name: "skyLibResources" }], viewProviders: [DragulaService], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
958
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: SkyGridComponent, deps: [{ token: i1.SkyAffixService }, { token: i0.ChangeDetectorRef }, { token: i2.DragulaService }, { token: i3.SkyGridAdapterService }, { token: i1.SkyOverlayService }, { token: i1.SkyAppWindowRef }, { token: i1.SkyUIConfigService }, { token: i1.SkyLogService }], target: i0.ɵɵFactoryTarget.Component }); }
959
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: SkyGridComponent, selector: "sky-grid", inputs: { columns: "columns", data: "data", enableMultiselect: "enableMultiselect", fit: "fit", hasToolbar: "hasToolbar", height: "height", highlightText: "highlightText", messageStream: "messageStream", multiselectRowId: "multiselectRowId", rowHighlightedId: "rowHighlightedId", selectedColumnIds: "selectedColumnIds", selectedRowIds: "selectedRowIds", settingsKey: "settingsKey", sortField: "sortField", width: "width" }, outputs: { columnWidthChange: "columnWidthChange", multiselectSelectionChange: "multiselectSelectionChange", rowDeleteCancel: "rowDeleteCancel", rowDeleteConfirm: "rowDeleteConfirm", selectedColumnIdsChange: "selectedColumnIdsChange", sortFieldChange: "sortFieldChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, providers: [SkyGridAdapterService], queries: [{ propertyName: "columnComponents", predicate: SkyGridColumnComponent }], viewQueries: [{ propertyName: "inlineDeleteTemplateRef", first: true, predicate: ["inlineDeleteTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "tableContainerElementRef", first: true, predicate: ["gridContainer"], descendants: true }, { propertyName: "tableElementRef", first: true, predicate: ["gridTable"], descendants: true }, { propertyName: "topScrollContainerElementRef", first: true, predicate: ["topScrollContainer"], descendants: true }, { propertyName: "resizeBar", first: true, predicate: ["resizeBar"], descendants: true }, { propertyName: "columnElementRefs", predicate: ["gridCol"], descendants: true }, { propertyName: "columnRangeInputElementRefs", predicate: ["colSizeRange"], descendants: true }, { propertyName: "inlineDeleteRefs", predicate: ["inlineDeleteRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sky-grid\">\n <div\n *ngIf=\"showTopScroll\"\n class=\"sky-grid-top-scroll-container\"\n (scroll)=\"onTopScroll($event)\"\n #topScrollContainer\n >\n <div\n class=\"sky-grid-top-scroll\"\n [style.width.px]=\"getTopScrollWidth()\"\n ></div>\n </div>\n <div\n class=\"sky-grid-table-container\"\n [style.height.px]=\"height\"\n [style.width.px]=\"width\"\n (scroll)=\"onGridScroll($event)\"\n #gridContainer\n >\n <table class=\"sky-grid-table\" [ngClass]=\"getTableClassNames()\" #gridTable>\n <thead>\n <tr [dragula]=\"dragulaGroupName\">\n <th\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-heading sky-grid-multiselect-cell sky-grid-header-locked\"\n scope=\"col\"\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <span class=\"screen-reader-only\">\n {{ 'skyux_grid_multiselect_select_row' | skyLibResources }}\n </span>\n </th>\n <th\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-heading sky-field-label\"\n scope=\"col\"\n [attr.sky-cmp-index]=\"i\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n [attr.aria-sort]=\"getAriaSortDirection(column) | async\"\n [id]=\"'sky-grid-' + gridId + '-column-' + i\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n [tabIndex]=\"column.isSortable ? 0 : -1\"\n (mouseup)=\"sortByColumn(column)\"\n (keydown)=\"onKeydown($event, column)\"\n (touchmove)=\"onTouchMove($event)\"\n #gridCol\n >\n <div\n class=\"overflow\"\n [ngClass]=\"getTableHeaderClassNames(column)\"\n [style.max-width.px]=\"column.width - 1\"\n [style.width.px]=\"column.width - 1\"\n >\n <span\n *ngIf=\"(getCaretVisibility(column.field) | async) === 'hidden'\"\n class=\"sky-grid-header-caret-hidden-spacing\"\n ></span>\n <!-- The no spacing here is intentional to avoid extra spaces due to these being inline elements -->\n <span class=\"sky-grid-header-text\">{{\n column.heading?.trim()\n }}</span>\n <sky-icon\n class=\"sky-grid-heading-sort\"\n [ngClass]=\"\n 'sky-grid-heading-sort-' +\n (getCaretVisibility(column.field) | async)\n \"\n [icon]=\"getCaretIconNames(column)\"\n />\n <sky-help-inline\n *ngIf=\"column.inlineHelpPopover\"\n [ngClass]=\"{\n 'sky-grid-help-inline-sort-hidden':\n getHelpInlineClass(column.field) | async\n }\"\n [skyPopover]=\"column.inlineHelpPopover\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (mouseup)=\"$event.stopPropagation()\"\n >\n </sky-help-inline>\n </div>\n <span\n *ngIf=\"(fit === 'width' && !last) || fit === 'scroll'\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-handle\"\n tabindex=\"-1\"\n [attr.sky-cmp-index]=\"i\"\n (mousedown)=\"onResizeColumnStart($event)\"\n (touchstart)=\"onResizeColumnStart($event)\"\n >\n </span>\n <input\n aria-label=\"Width of column\"\n class=\"sky-grid-column-input-aria-only\"\n role=\"slider\"\n type=\"range\"\n [attr.aria-controls]=\"'sky-grid-' + gridId + '-column-' + i\"\n [attr.aria-valuemin]=\"minColWidth\"\n [attr.aria-valuemax]=\"maxColWidth\"\n [attr.aria-valuenow]=\"column.width\"\n [attr.sky-cmp-index]=\"i\"\n [min]=\"minColWidth\"\n [max]=\"maxColWidth\"\n [step]=\"columnResizeStep\"\n [(ngModel)]=\"column.width\"\n (blur)=\"onResizeHandleBlur()\"\n (focus)=\"onResizeHandleFocus($event)\"\n (keydown)=\"onKeydownResizeCol($event)\"\n (change)=\"onInputChangeResizeCol($event)\"\n #colSizeRange\n />\n </th>\n </tr>\n </thead>\n <tbody class=\"sky-grid-tbody\">\n <tr\n class=\"sky-grid-row\"\n *ngFor=\"let item of items; let i = index\"\n [attr.aria-current]=\"isRowHighlighted(item.id) ? true : null\"\n [attr.sky-cmp-id]=\"item.id\"\n [ngClass]=\"{\n 'sky-grid-multiselect-selected-row': item.isSelected,\n 'sky-grid-multiselect-row': enableMultiselect,\n 'sky-grid-row-highlight': isRowHighlighted(item.id)\n }\"\n (click)=\"onRowClick($event, item)\"\n >\n <td\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-multiselect-cell sky-grid-header-locked\"\n >\n <div\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <sky-checkbox\n [label]=\"'skyux_grid_multiselect_select_row' | skyLibResources\"\n (change)=\"onMultiselectCheckboxChange()\"\n [(ngModel)]=\"item.isSelected\"\n >\n </sky-checkbox>\n </div>\n </td>\n <td\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-cell\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n >\n <sky-grid-cell\n [skyHighlight]=\"\n !column.excludeFromHighlighting ? highlightText : undefined\n \"\n [template]=\"column.template || defaultCellTemplate\"\n [fieldSelector]=\"column.field\"\n [item]=\"item\"\n [columnId]=\"column.id\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n >\n </sky-grid-cell>\n </td>\n </tr>\n </tbody>\n </table>\n <div\n *ngIf=\"showResizeBar\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-bar\"\n tabindex=\"-1\"\n #resizeBar\n ></div>\n </div>\n</div>\n\n<ng-template #defaultCellTemplate let-row=\"row\" let-value=\"value\">{{\n value\n}}</ng-template>\n\n<ng-template let-item #inlineDeleteTemplateRef>\n <div\n [id]=\"'row-delete-ref-' + item.id\"\n [ngStyle]=\"{\n height: getRowHeight(0),\n position: 'fixed',\n width: tableWidth + 'px'\n }\"\n #inlineDeleteRef\n >\n <sky-inline-delete\n [pending]=\"getRowDeleteItem(item.id).pending\"\n (cancelTriggered)=\"cancelRowDelete(item.id)\"\n (deleteTriggered)=\"confirmRowDelete(item.id)\"\n ></sky-inline-delete>\n </div>\n</ng-template>\n", styles: [".sky-grid{position:relative;display:block}.sky-grid-table-container{overflow:auto}.sky-grid-table{position:relative;table-layout:fixed;border-collapse:collapse;margin:0;font-size:15px;min-width:100%}.sky-grid-table.sky-grid-fit{max-width:100%;width:100%}.sky-grid-tbody{background-color:#fff}.sky-grid-row{border-bottom:1px dotted #cdcfd2}.sky-grid-row:nth-child(odd){background-color:#fbfbfb}.sky-grid-row.sky-grid-row-highlight{border-top:1px solid #0974a1;box-shadow:0 0 0 3px inset #0974a1}.sky-grid-row .sky-grid-cell{padding:0;min-width:10px}.sky-grid-heading{position:relative;border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;border-right-width:0px;padding:0;cursor:pointer;background-color:#fff;overflow:visible;background-clip:padding-box;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;user-select:none}.sky-grid-heading:first-child{border-left:1px solid transparent}.sky-grid-heading.sky-grid-header-dragging{background-color:#eeeeef}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-heading-sort,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-heading-sort{width:14px}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-help-inline-sort-hidden,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-help-inline-sort-hidden{margin-left:-14px;margin-right:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-header-caret-hidden-spacing{padding-left:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-heading-sort-visible{width:14px}.sky-grid-heading div{padding:8px}.sky-grid-heading .overflow{text-overflow:ellipsis;white-space:nowrap;position:relative;z-index:1;overflow:hidden;min-width:100%}.sky-grid-heading .sky-grid-column-input-aria-only{-webkit-appearance:none;-moz-appearance:none;height:100%;width:5px;position:absolute;display:block;top:0;bottom:0;right:0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-track{background:transparent}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-ms-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only:focus{background-color:#00b4f1}.sky-grid-column-alignment-left{text-align:left}.sky-grid-column-alignment-center{text-align:center}.sky-grid-column-alignment-right{text-align:right}.sky-grid-multiselect-cell{padding:0;text-align:center}.sky-grid-multiselect-cell ::ng-deep .sky-switch-control{margin:0 auto}th.sky-grid-multiselect-cell{cursor:default}th.sky-grid-multiselect-cell .screen-reader-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);outline:none;white-space:nowrap}@-moz-document url-prefix(){.sky-grid-multiselect-row td{border-left:0px solid transparent;border-right:0px solid transparent}}.sky-grid-multiselect-row:hover{background-color:#e9e4f1}.sky-grid-multiselect-row:hover:nth-child(odd){background:#e9e4f1}.sky-grid-multiselect-selected-row{background:#f1eef6;border-top:1px solid #dadbf6;border-bottom:1px solid #dadbf6}.sky-grid-multiselect-selected-row:nth-child(odd){background:#f1eef6}.sky-grid-has-toolbar .sky-grid-heading{border-top-width:0px}.sky-grid-heading-sort.sky-grid-heading-sort-hidden{visibility:hidden}.sky-grid-heading-sort.sky-grid-heading-sort-visible{visibility:visible;padding-left:5px}.sky-grid-resize-handle{position:absolute;right:0;top:0;bottom:0;width:30px;z-index:2;min-height:20px;height:100%!important;vertical-align:middle;cursor:col-resize}.sky-grid-resize-handle:hover:after{background-color:#00b4f1}.sky-grid-resize-handle:after{position:absolute;right:0;top:0;bottom:0;width:5px;height:100%;content:\"\"}.sky-grid-resize-bar{position:absolute;top:0;left:0;z-index:99;height:100%;width:5px;background:#00b4f1;opacity:.6}tr{position:relative}.sky-grid-top-scroll-container{overflow:auto}.sky-grid-top-scroll{height:1px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "indeterminate", "required"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i7.λ3, selector: "sky-help-inline", inputs: ["ariaControls", "ariaExpanded", "ariaLabel"], outputs: ["actionClick"] }, { kind: "component", type: i7.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i8.λ8, selector: "sky-inline-delete", inputs: ["pending"], outputs: ["cancelTriggered", "deleteTriggered"] }, { kind: "directive", type: i9.λ7, selector: "[skyPopover]", inputs: ["skyPopover", "skyPopoverAlignment", "skyPopoverMessageStream", "skyPopoverPlacement", "skyPopoverTrigger"] }, { kind: "directive", type: i7.SkyTextHighlightDirective, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { kind: "component", type: i10.SkyGridCellComponent, selector: "sky-grid-cell", inputs: ["item", "columnId", "template", "fieldSelector"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i11.SkyLibResourcesPipe, name: "skyLibResources" }], viewProviders: [DragulaService], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
960
960
  }
961
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SkyGridComponent, decorators: [{
961
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: SkyGridComponent, decorators: [{
962
962
  type: Component,
963
963
  args: [{ selector: 'sky-grid', viewProviders: [DragulaService], providers: [SkyGridAdapterService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-grid\">\n <div\n *ngIf=\"showTopScroll\"\n class=\"sky-grid-top-scroll-container\"\n (scroll)=\"onTopScroll($event)\"\n #topScrollContainer\n >\n <div\n class=\"sky-grid-top-scroll\"\n [style.width.px]=\"getTopScrollWidth()\"\n ></div>\n </div>\n <div\n class=\"sky-grid-table-container\"\n [style.height.px]=\"height\"\n [style.width.px]=\"width\"\n (scroll)=\"onGridScroll($event)\"\n #gridContainer\n >\n <table class=\"sky-grid-table\" [ngClass]=\"getTableClassNames()\" #gridTable>\n <thead>\n <tr [dragula]=\"dragulaGroupName\">\n <th\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-heading sky-grid-multiselect-cell sky-grid-header-locked\"\n scope=\"col\"\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <span class=\"screen-reader-only\">\n {{ 'skyux_grid_multiselect_select_row' | skyLibResources }}\n </span>\n </th>\n <th\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-heading sky-field-label\"\n scope=\"col\"\n [attr.sky-cmp-index]=\"i\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n [attr.aria-sort]=\"getAriaSortDirection(column) | async\"\n [id]=\"'sky-grid-' + gridId + '-column-' + i\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n [tabIndex]=\"column.isSortable ? 0 : -1\"\n (mouseup)=\"sortByColumn(column)\"\n (keydown)=\"onKeydown($event, column)\"\n (touchmove)=\"onTouchMove($event)\"\n #gridCol\n >\n <div\n class=\"overflow\"\n [ngClass]=\"getTableHeaderClassNames(column)\"\n [style.max-width.px]=\"column.width - 1\"\n [style.width.px]=\"column.width - 1\"\n >\n <span\n *ngIf=\"(getCaretVisibility(column.field) | async) === 'hidden'\"\n class=\"sky-grid-header-caret-hidden-spacing\"\n ></span>\n <!-- The no spacing here is intentional to avoid extra spaces due to these being inline elements -->\n <span class=\"sky-grid-header-text\">{{\n column.heading?.trim()\n }}</span>\n <sky-icon\n class=\"sky-grid-heading-sort\"\n [ngClass]=\"\n 'sky-grid-heading-sort-' +\n (getCaretVisibility(column.field) | async)\n \"\n [icon]=\"getCaretIconNames(column)\"\n />\n <sky-help-inline\n *ngIf=\"column.inlineHelpPopover\"\n [ngClass]=\"{\n 'sky-grid-help-inline-sort-hidden':\n getHelpInlineClass(column.field) | async\n }\"\n [skyPopover]=\"column.inlineHelpPopover\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n (mouseup)=\"$event.stopPropagation()\"\n >\n </sky-help-inline>\n </div>\n <span\n *ngIf=\"(fit === 'width' && !last) || fit === 'scroll'\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-handle\"\n tabindex=\"-1\"\n [attr.sky-cmp-index]=\"i\"\n (mousedown)=\"onResizeColumnStart($event)\"\n (touchstart)=\"onResizeColumnStart($event)\"\n >\n </span>\n <input\n aria-label=\"Width of column\"\n class=\"sky-grid-column-input-aria-only\"\n role=\"slider\"\n type=\"range\"\n [attr.aria-controls]=\"'sky-grid-' + gridId + '-column-' + i\"\n [attr.aria-valuemin]=\"minColWidth\"\n [attr.aria-valuemax]=\"maxColWidth\"\n [attr.aria-valuenow]=\"column.width\"\n [attr.sky-cmp-index]=\"i\"\n [min]=\"minColWidth\"\n [max]=\"maxColWidth\"\n [step]=\"columnResizeStep\"\n [(ngModel)]=\"column.width\"\n (blur)=\"onResizeHandleBlur()\"\n (focus)=\"onResizeHandleFocus($event)\"\n (keydown)=\"onKeydownResizeCol($event)\"\n (change)=\"onInputChangeResizeCol($event)\"\n #colSizeRange\n />\n </th>\n </tr>\n </thead>\n <tbody class=\"sky-grid-tbody\">\n <tr\n class=\"sky-grid-row\"\n *ngFor=\"let item of items; let i = index\"\n [attr.aria-current]=\"isRowHighlighted(item.id) ? true : null\"\n [attr.sky-cmp-id]=\"item.id\"\n [ngClass]=\"{\n 'sky-grid-multiselect-selected-row': item.isSelected,\n 'sky-grid-multiselect-row': enableMultiselect,\n 'sky-grid-row-highlight': isRowHighlighted(item.id)\n }\"\n (click)=\"onRowClick($event, item)\"\n >\n <td\n *ngIf=\"enableMultiselect\"\n class=\"sky-grid-multiselect-cell sky-grid-header-locked\"\n >\n <div\n [style.max-width.px]=\"minColWidth\"\n [style.width.px]=\"minColWidth\"\n >\n <sky-checkbox\n [label]=\"'skyux_grid_multiselect_select_row' | skyLibResources\"\n (change)=\"onMultiselectCheckboxChange()\"\n [(ngModel)]=\"item.isSelected\"\n >\n </sky-checkbox>\n </div>\n </td>\n <td\n *ngFor=\"\n let column of displayedColumns;\n let last = last;\n let i = index\n \"\n class=\"sky-grid-cell\"\n [ngClass]=\"'sky-grid-column-alignment-' + column.alignment\"\n [style.max-width.px]=\"column.width\"\n [style.width.px]=\"column.width\"\n >\n <sky-grid-cell\n [skyHighlight]=\"\n !column.excludeFromHighlighting ? highlightText : undefined\n \"\n [template]=\"column.template || defaultCellTemplate\"\n [fieldSelector]=\"column.field\"\n [item]=\"item\"\n [columnId]=\"column.id\"\n [attr.sky-cmp-id]=\"column.id || column.field\"\n >\n </sky-grid-cell>\n </td>\n </tr>\n </tbody>\n </table>\n <div\n *ngIf=\"showResizeBar\"\n aria-hidden=\"true\"\n class=\"sky-grid-resize-bar\"\n tabindex=\"-1\"\n #resizeBar\n ></div>\n </div>\n</div>\n\n<ng-template #defaultCellTemplate let-row=\"row\" let-value=\"value\">{{\n value\n}}</ng-template>\n\n<ng-template let-item #inlineDeleteTemplateRef>\n <div\n [id]=\"'row-delete-ref-' + item.id\"\n [ngStyle]=\"{\n height: getRowHeight(0),\n position: 'fixed',\n width: tableWidth + 'px'\n }\"\n #inlineDeleteRef\n >\n <sky-inline-delete\n [pending]=\"getRowDeleteItem(item.id).pending\"\n (cancelTriggered)=\"cancelRowDelete(item.id)\"\n (deleteTriggered)=\"confirmRowDelete(item.id)\"\n ></sky-inline-delete>\n </div>\n</ng-template>\n", styles: [".sky-grid{position:relative;display:block}.sky-grid-table-container{overflow:auto}.sky-grid-table{position:relative;table-layout:fixed;border-collapse:collapse;margin:0;font-size:15px;min-width:100%}.sky-grid-table.sky-grid-fit{max-width:100%;width:100%}.sky-grid-tbody{background-color:#fff}.sky-grid-row{border-bottom:1px dotted #cdcfd2}.sky-grid-row:nth-child(odd){background-color:#fbfbfb}.sky-grid-row.sky-grid-row-highlight{border-top:1px solid #0974a1;box-shadow:0 0 0 3px inset #0974a1}.sky-grid-row .sky-grid-cell{padding:0;min-width:10px}.sky-grid-heading{position:relative;border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;border-right-width:0px;padding:0;cursor:pointer;background-color:#fff;overflow:visible;background-clip:padding-box;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;user-select:none}.sky-grid-heading:first-child{border-left:1px solid transparent}.sky-grid-heading.sky-grid-header-dragging{background-color:#eeeeef}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-heading-sort,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-heading-sort{width:14px}.sky-grid-heading.sky-grid-column-alignment-left .sky-grid-help-inline-sort-hidden,.sky-grid-heading.sky-grid-column-alignment-center .sky-grid-help-inline-sort-hidden{margin-left:-14px;margin-right:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-header-caret-hidden-spacing{padding-left:14px}.sky-grid-heading.sky-grid-column-alignment-right .sky-grid-heading-sort-visible{width:14px}.sky-grid-heading div{padding:8px}.sky-grid-heading .overflow{text-overflow:ellipsis;white-space:nowrap;position:relative;z-index:1;overflow:hidden;min-width:100%}.sky-grid-heading .sky-grid-column-input-aria-only{-webkit-appearance:none;-moz-appearance:none;height:100%;width:5px;position:absolute;display:block;top:0;bottom:0;right:0}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-track{background:transparent}.sky-grid-heading .sky-grid-column-input-aria-only::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-ms-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-grid-heading .sky-grid-column-input-aria-only:focus{background-color:#00b4f1}.sky-grid-column-alignment-left{text-align:left}.sky-grid-column-alignment-center{text-align:center}.sky-grid-column-alignment-right{text-align:right}.sky-grid-multiselect-cell{padding:0;text-align:center}.sky-grid-multiselect-cell ::ng-deep .sky-switch-control{margin:0 auto}th.sky-grid-multiselect-cell{cursor:default}th.sky-grid-multiselect-cell .screen-reader-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);outline:none;white-space:nowrap}@-moz-document url-prefix(){.sky-grid-multiselect-row td{border-left:0px solid transparent;border-right:0px solid transparent}}.sky-grid-multiselect-row:hover{background-color:#e9e4f1}.sky-grid-multiselect-row:hover:nth-child(odd){background:#e9e4f1}.sky-grid-multiselect-selected-row{background:#f1eef6;border-top:1px solid #dadbf6;border-bottom:1px solid #dadbf6}.sky-grid-multiselect-selected-row:nth-child(odd){background:#f1eef6}.sky-grid-has-toolbar .sky-grid-heading{border-top-width:0px}.sky-grid-heading-sort.sky-grid-heading-sort-hidden{visibility:hidden}.sky-grid-heading-sort.sky-grid-heading-sort-visible{visibility:visible;padding-left:5px}.sky-grid-resize-handle{position:absolute;right:0;top:0;bottom:0;width:30px;z-index:2;min-height:20px;height:100%!important;vertical-align:middle;cursor:col-resize}.sky-grid-resize-handle:hover:after{background-color:#00b4f1}.sky-grid-resize-handle:after{position:absolute;right:0;top:0;bottom:0;width:5px;height:100%;content:\"\"}.sky-grid-resize-bar{position:absolute;top:0;left:0;z-index:99;height:100%;width:5px;background:#00b4f1;opacity:.6}tr{position:relative}.sky-grid-top-scroll-container{overflow:auto}.sky-grid-top-scroll{height:1px}\n"] }]
964
- }], ctorParameters: function () { return [{ type: i1.SkyAffixService }, { type: i0.ChangeDetectorRef }, { type: i2.DragulaService }, { type: i3.SkyGridAdapterService }, { type: i1.SkyOverlayService }, { type: i1.SkyAppWindowRef }, { type: i1.SkyUIConfigService }, { type: i1.SkyLogService }]; }, propDecorators: { columns: [{
964
+ }], ctorParameters: () => [{ type: i1.SkyAffixService }, { type: i0.ChangeDetectorRef }, { type: i2.DragulaService }, { type: i3.SkyGridAdapterService }, { type: i1.SkyOverlayService }, { type: i1.SkyAppWindowRef }, { type: i1.SkyUIConfigService }, { type: i1.SkyLogService }], propDecorators: { columns: [{
965
965
  type: Input
966
966
  }], data: [{
967
967
  type: Input
@@ -1034,4 +1034,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1034
1034
  type: HostListener,
1035
1035
  args: ['window:resize']
1036
1036
  }] } });
1037
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHNCQUFzQixHQU12QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxHQUVkLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxTQUFTLEVBQ1QsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU16RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU0vRCxPQUFPLEVB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QXNCO2dCQUkvQixpQkFBaUI7c0JBRHhCLFlBQVk7dUJBQUMsU0FBUztnQkFHZiwyQkFBMkI7c0JBRGxDLFlBQVk7dUJBQUMsY0FBYztnQkFHcEIsZ0JBQWdCO3NCQUR2QixZQUFZO3VCQUFDLGlCQUFpQjtnQkFHdkIsdUJBQXVCO3NCQUQ5QixTQUFTO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFHbkQsd0JBQXdCO3NCQUQvQixTQUFTO3VCQUFDLGVBQWU7Z0JBR2xCLGVBQWU7c0JBRHRCLFNBQVM7dUJBQUMsV0FBVztnQkFHZCw0QkFBNEI7c0JBRG5DLFNBQVM7dUJBQUMsb0JBQW9CO2dCQUd2QixTQUFTO3NCQURoQixTQUFTO3VCQUFDLFdBQVc7Z0JBOElmLGNBQWM7c0JBRHBCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QXBwV2luZG93UmVmLFxuICBTa3lMb2dTZXJ2aWNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbiAgU2t5VUlDb25maWdTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQge1xuICBMaXN0SXRlbU1vZGVsLFxuICBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbCxcbn0gZnJvbSAnQHNreXV4L2xpc3QtYnVpbGRlci1jb21tb24nO1xuXG5pbXBvcnQgeyBEcmFndWxhU2VydmljZSB9IGZyb20gJ25nMi1kcmFndWxhJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFrZVdoaWxlLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUdyaWRBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vZ3JpZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5Nb2RlbCB9IGZyb20gJy4vZ3JpZC1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLWRlc2NyaXB0aW9uLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi1oZWFkaW5nLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1jb2x1bW4taW5saW5lLWhlbHAtcG9wb3Zlci1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLXdpZHRoLW1vZGVsLWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lHcmlkTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlJztcbmltcG9ydCB7IFNreUdyaWRNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1tZXNzYWdlLXR5cGUnO1xuaW1wb3J0IHsgU2t5R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3MgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jYW5jZWwtYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY29uZmlnJztcbmltcG9ydCB7IFNreUdyaWRSb3dEZWxldGVDb25maXJtQXJncyB9IGZyb20gJy4vdHlwZXMvZ3JpZC1yb3ctZGVsZXRlLWNvbmZpcm0tYXJncyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29udGVudHMgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jb250ZW50cyc7XG5pbXBvcnQgeyBTa3lHcmlkU2VsZWN0ZWRSb3dzTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtc2VsZWN0ZWQtcm93cy1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1zZWxlY3RlZC1yb3dzLXNvdXJjZSc7XG5pbXBvcnQgeyBTa3lHcmlkVUlDb25maWcgfSBmcm9tICcuL3R5cGVzL2dyaWQtdWktY29uZmlnJztcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgYFNreUdyaWRDb21wb25lbnRgIGFuZCBpdHMgZmVhdHVyZXMgYXJlIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgZGF0YSBncmlkIGluc3RlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2RhdGEtZ3JpZFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbRHJhZ3VsYVNlcnZpY2VdLFxuICBwcm92aWRlcnM6IFtTa3lHcmlkQWRhcHRlclNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5R3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIENvbHVtbnMgYW5kIGNvbHVtbiBwcm9wZXJ0aWVzIGZvciB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29sdW1ucyhuZXdDb2x1bW5zOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+KSB7XG4gICAgY29uc3Qgb2xkQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcbiAgICBpZiAob2xkQ29sdW1ucykge1xuICAgICAgdGhpcy50cmFuc2ZlckNvbHVtbldpZHRocyhvbGRDb2x1bW5zLCB0aGlzLmNvbHVtbnMpO1xuICAgICAgdGhpcy5pc1Jlc2l6ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucyh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmb3IgdGhlIGdyaWQuIEVhY2ggaXRlbSByZXF1aXJlcyBhbiBgaWRgIGFuZCBhIHByb3BlcnR5IHRoYXQgbWFwc1xuICAgKiB0byB0aGUgYGZpZWxkYCBvciBgaWRgIHByb3BlcnR5IG9mIGVhY2ggY29sdW1uIGluIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRhdGE6IEFycmF5PGFueT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBtdWx0aXNlbGVjdCBmZWF0dXJlIHRvIGRpc3BsYXkgYSBjb2x1bW4gb2ZcbiAgICogY2hlY2tib3hlcyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBncmlkLiBZb3UgY2FuIHNwZWNpZnkgYSB1bmlxdWUgSUQgd2l0aFxuICAgKiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5LCBidXQgbXVsdGlzZWxlY3QgZGVmYXVsdHMgdG8gdGhlIGBpZGAgcHJvcGVydHkgb25cbiAgICogdGhlIGBkYXRhYCBvYmplY3QuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZW5hYmxlTXVsdGlzZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogSG93IHRoZSBncmlkIGZpdHMgdG8gaXRzIHBhcmVudC4gVGhlIHZhbGlkIG9wdGlvbnMgYXJlIGB3aWR0aGAsXG4gICAqIHdoaWNoIGZpdHMgdGhlIGdyaWQgdG8gdGhlIHBhcmVudCdzIGZ1bGwgd2lkdGgsIGFuZCBgc2Nyb2xsYCwgd2hpY2ggYWxsb3dzIHRoZSBncmlkXG4gICAqIHRvIGV4Y2VlZCB0aGUgcGFyZW50J3Mgd2lkdGguIElmIHRoZSBncmlkIGRvZXMgbm90IGhhdmUgZW5vdWdoIGNvbHVtbnMgdG8gZmlsbFxuICAgKiB0aGUgcGFyZW50J3Mgd2lkdGgsIGl0IGFsd2F5cyBzdHJldGNoZXMgdG8gdGhlIHBhcmVudCdzIGZ1bGwgd2lkdGguXG4gICAqIEBkZWZhdWx0IFwid2lkdGhcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGZpdCA9ICd3aWR0aCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSBhIHRvb2xiYXIgd2l0aCB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoYXNUb29sYmFyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRleHQgdG8gaGlnaGxpZ2h0IHdpdGhpbiB0aGUgZ3JpZC5cbiAgICogVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzZWFyY2guXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlnaGxpZ2h0VGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YWJsZSB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lHcmlkTWVzc2FnZT4oKTtcblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IG1hdGNoZXMgYSBwcm9wZXJ0eSBvbiB0aGUgYGRhdGFgIG9iamVjdC5cbiAgICogQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSB1c2VzIHRoZSBgaWRgIHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG11bHRpc2VsZWN0Um93SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3cgdG8gaGlnaGxpZ2h0LiBUaGUgSUQgbWF0Y2hlcyB0aGUgYGlkYCBwcm9wZXJ0eVxuICAgKiBvZiB0aGUgYGRhdGFgIG9iamVjdC4gVHlwaWNhbGx5LCB0aGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiB0aGUgZmx5b3V0IGNvbXBvbmVudCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dIaWdobGlnaHRlZElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQgYmFzZWQgb24gdGhlIGBpZGAgb3IgYGZpZWxkYCBwcm9wZXJ0aWVzXG4gICAqIG9mIHRoZSBjb2x1bW5zLiBJZiBubyBjb2x1bW5zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIGdyaWQgZGlzcGxheXMgYWxsIGNvbHVtbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkQ29sdW1uSWRzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgY29uc3QgY3VycmVudElkcyA9IHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnMoKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaWRzIGhhdmUgY2hhbmdlZC5cbiAgICBpZiAoIWN1cnJlbnRJZHMgfHwgIXZhbHVlIHx8ICF0aGlzLmFycmF5c0VxdWFsKHZhbHVlLCBjdXJyZW50SWRzKSkge1xuICAgICAgLy8gVGhpcyB2YXJpYWJsZSBlbnN1cmVzIHRoYXQgd2UgZG8gbm90IHNldCB1c2VyIGNvbmZpZyBvcHRpb25zIG9yIGZpcmUgdGhlIGNoYW5nZSBldmVudFxuICAgICAgLy8gb24gdGhlIGZpcnN0IHRpbWUgdGhhdCB0aGUgY29sdW1ucyBhcmUgc2V0IHVwXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbklkc1NldCkge1xuICAgICAgICB0aGlzLnNldFVzZXJDb25maWcoe1xuICAgICAgICAgIHNlbGVjdGVkQ29sdW1uSWRzOiB2YWx1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc0NoYW5nZS5lbWl0KHRoaXMuX3NlbGVjdGVkQ29sdW1uSWRzKTtcblxuICAgICAgICBpZiAodGhpcy5pc1Jlc2l6ZWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0VGFibGVXaWR0aCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc1NldCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ29sdW1uSWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENvbHVtbklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0IG9mIElEcyBmb3IgdGhlIHJvd3MgdG8gc2VsZWN0IGluIGEgbXVsdGlzZWxlY3QgZ3JpZC5cbiAgICogVGhlIElEcyBtYXRjaCB0aGUgYGlkYCBwcm9wZXJ0aWVzIG9mIHRoZSBgZGF0YWAgb2JqZWN0cy5cbiAgICogUm93cyB3aXRoIElEcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgYXJlIGRlLXNlbGVjdGVkIGluIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZFJvd0lkcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB2YWx1ZTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlNlbGVjdGVkUm93SWRzQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkUm93SWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJvd0lkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGtleSBmb3IgdGhlIFVJIENvbmZpZyBTZXJ2aWNlIHRvIHJldHJpZXZlIHN0b3JlZCBzZXR0aW5ncyBmcm9tIGEgZGF0YWJhc2UuXG4gICAqIFRoZSBVSSBDb25maWcgU2VydmljZSBzYXZlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB1c2VycyBhbmQgcmV0dXJuc1xuICAgKiBgc2VsZWN0ZWRDb2x1bW5JZHNgIHRvIHByZXNlcnZlIHRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgYW5kIHRoZSBwcmVmZXJyZWQgY29sdW1uIG9yZGVyLiBZb3UgIG11c3QgcHJvdmlkZSBgaWRgIHZhbHVlcyBmb3IgeW91ciBgc2t5LWdyaWQtY29sdW1uYCBlbGVtZW50cyBiZWNhdXNlIHRoZSBVSSBDb25maWcgU2VydmljZSBkZXBlbmRzIG9uIHRob3NlIHZhbHVlcyB0byBvcmdhbml6ZSBjb2x1bW5zIGJhc2VkIG9uIHVzZXIgc2V0dGluZ3MuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBVSSBDb25maWcgU2VydmljZSwgc2VlIFt0aGUgc3RpY2t5IHNldHRpbmdzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vZGV2ZWxvcC9zdGlja3ktc2V0dGluZ3MpLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldHRpbmdzS2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgY2FyZXQgaW4gdGhlIGNvbHVtbiB0aGF0IHdhcyB1c2VkIHRvIHNvcnQgdGhlIGdyaWQuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bFxuICAgKiB3aGVuIHlvdSBwcm9ncmFtbWF0aWNhbGx5IHNvcnQgZGF0YSBhbmQgd2FudCB0byB2aXN1YWxseSBpbmRpY2F0ZSBob3cgdGhlIGdyaWQgd2FzIHNvcnRlZC5cbiAgICogVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGEgYExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsYCB2YWx1ZSB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICogLSBgZmllbGRTZWxlY3RvcmAgUmVwcmVzZW50cyB0aGUgY3VycmVudCBzb3J0IGZpZWxkLiBUaGlzIHByb3BlcnR5IGFjY2VwdHMgYHN0cmluZ2AgdmFsdWVzLlxuICAgKiAtIGBkZXNjZW5kaW5nYCBJbmRpY2F0ZXMgd2hldGhlciB0byBzb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIuIFRoZSBjYXJldCB0aGF0IHZpc3VhbGx5XG4gICAqIGluZGljYXRlcyB0aGUgc29ydCBvcmRlciBwb2ludHMgZG93biBmb3IgZGVzY2VuZGluZyBvcmRlciBhbmQgdXAgZm9yIGFzY2VuZGluZyBvcmRlci5cbiAgICogVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGBib29sZWFuYCB2YWx1ZXMuIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0RmllbGQ6IExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsO1xuXG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIGdyaWQgaW4gcGl4ZWxzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHdpZHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHdpZHRoIG9mIGEgY29sdW1uIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGNvbHVtbldpZHRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICBBcnJheTxTa3lHcmlkQ29sdW1uV2lkdGhNb2RlbENoYW5nZT5cbiAgPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBzZWxlY3Rpb24gb2YgbXVsdGlzZWxlY3QgY2hlY2tib3hlcyBjaGFuZ2VzLlxuICAgKiBFbWl0cyBhbiBhcnJheSBvZiBJRHMgZm9yIHRoZSBzZWxlY3RlZCByb3dzIGJhc2VkIG9uIHRoZSBgbXVsdGlzZWxlY3RSb3dJZGAgcHJvcGVydHlcbiAgICogdGhhdCB0aGUgY29uc3VtZXIgcHJvdmlkZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZT4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJvd0RlbGV0ZUNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5R3JpZFJvd0RlbGV0ZUNhbmNlbEFyZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByb3dEZWxldGVDb25maXJtID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lHcmlkUm93RGVsZXRlQ29uZmlybUFyZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGNvbHVtbnMgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZCBjaGFuZ2Ugb3Igd2hlbiB0aGUgb3JkZXIgb2YgdGhlIGNvbHVtbnMgY2hhbmdlcy5cbiAgICogVGhlIGV2ZW50IGVtaXRzIGFuIGFycmF5IG9mIElEcyBmb3IgdGhlIGRpc3BsYXllZCBjb2x1bW5zIHRoYXQgcmVmbGVjdHMgdGhlIGNvbHVtbiBvcmRlci5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PHN0cmluZz4+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGFjdGl2ZSBzb3J0IGZpZWxkIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNvcnRGaWVsZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdFNvcnRGaWVsZFNlbGVjdG9yTW9kZWw+KCk7XG5cbiAgcHVibGljIGNvbHVtblJlc2l6ZVN0ZXAgPSAxMDtcbiAgcHVibGljIGN1cnJlbnRTb3J0RmllbGQ6IEJlaGF2aW9yU3ViamVjdDxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD47XG4gIHB1YmxpYyBkaXNwbGF5ZWRDb2x1bW5zOiBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+O1xuICBwdWJsaWMgZHJhZ3VsYUdyb3VwTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZ3JpZElkOiBudW1iZXIgPSArK25leHRJZDtcbiAgcHVibGljIHJvd0RlbGV0ZUNvbmZpZ3M6IFNreUdyaWRSb3dEZWxldGVDb25maWdbXSA9IFtdO1xuICBwdWJsaWMgaXRlbXM6IEFycmF5PGFueT47XG4gIHB1YmxpYyBtYXhDb2xXaWR0aCA9IDk5OTk7IC8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciwgYXMgdGhlIGlucHV0IHJhbmdlIHBpY2tlciB3b24ndCB3b3JrIHdpdGhvdXQgYSB2YWx1ZS5cbiAgcHVibGljIG1pbkNvbFdpZHRoID0gNTA7XG4gIHB1YmxpYyBzaG93UmVzaXplQmFyID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93VG9wU2Nyb2xsID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCB0YWJsZVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lHcmlkQ29sdW1uQ29tcG9uZW50KVxuICBwcml2YXRlIGNvbHVtbkNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxTa3lHcmlkQ29sdW1uQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkcmVuKCdncmlkQ29sJylcbiAgcHJpdmF0ZSBjb2x1bW5FbGVtZW50UmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkcmVuKCdjb2xTaXplUmFuZ2UnKVxuICBwcml2YXRlIGNvbHVtblJhbmdlSW5wdXRFbGVtZW50UmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkcmVuKCdpbmxpbmVEZWxldGVSZWYnKVxuICBwcml2YXRlIGlubGluZURlbGV0ZVJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnaW5saW5lRGVsZXRlVGVtcGxhdGVSZWYnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHByaXZhdGUgaW5saW5lRGVsZXRlVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICBAVmlld0NoaWxkKCdncmlkQ29udGFpbmVyJylcbiAgcHJpdmF0ZSB0YWJsZUNvbnRhaW5lckVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2dyaWRUYWJsZScpXG4gIHByaXZhdGUgdGFibGVFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0b3BTY3JvbGxDb250YWluZXInKVxuICBwcml2YXRlIHRvcFNjcm9sbENvbnRhaW5lckVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Jlc2l6ZUJhcicpXG4gIHByaXZhdGUgcmVzaXplQmFyOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgYWN0aXZlUmVzaXplQ29sdW1uSW5kZXg6IHN0cmluZztcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gZmFsc2U7XG4gIHByaXZhdGUgaXNSZXNpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcm93RGVsZXRlQ29udGVudHM6IHsgW2lkOiBzdHJpbmddOiBTa3lHcmlkUm93RGVsZXRlQ29udGVudHMgfSA9IHt9O1xuICBwcml2YXRlIHN0YXJ0Q29sdW1uV2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIHNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICBwcml2YXRlIHNlbGVjdGVkQ29sdW1uSWRzU2V0ID0gZmFsc2U7XG4gIHByaXZhdGUgeFBvc1N0YXJ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPjtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb2x1bW5JZHM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgX3NlbGVjdGVkUm93SWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gIHJlYWRvbmx5ICNlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWZmaXhTZXJ2aWNlOiBTa3lBZmZpeFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBkcmFndWxhU2VydmljZTogRHJhZ3VsYVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBncmlkQWRhcHRlcjogU2t5R3JpZEFkYXB0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3ZlcmxheVNlcnZpY2U6IFNreU92ZXJsYXlTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2t5V2luZG93OiBTa3lBcHBXaW5kb3dSZWYsXG4gICAgcHJpdmF0ZSB1aUNvbmZpZ1NlcnZpY2U6IFNreVVJQ29uZmlnU2VydmljZSxcbiAgICBsb2dnZXI6IFNreUxvZ1NlcnZpY2UsXG4gICkge1xuICAgIGxvZ2dlci5kZXByZWNhdGVkKCdTa3lHcmlkQ29tcG9uZW50Jywge1xuICAgICAgZGVwcmVjYXRpb25NYWpvclZlcnNpb246IDYsXG4gICAgICBtb3JlSW5mb1VybDogJ2h0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9kYXRhLWdyaWQnLFxuICAgICAgcmVwbGFjZW1lbnRSZWNvbW1lbmRhdGlvbjogJ1VzZSBkYXRhIGdyaWQgaW5zdGVhZC4nLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gbmV3IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD4oKTtcbiAgICB0aGlzLml0ZW1zID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPih7XG4gICAgICBmaWVsZFNlbGVjdG9yOiAnJyxcbiAgICAgIGRlc2NlbmRpbmc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuZHJhZ3VsYUdyb3VwTmFtZSA9IGBza3ktZ3JpZHMtZ3JvdXAtJHt0aGlzLmdyaWRJZH1gO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMubWVzc2FnZVN0cmVhbVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBTa3lHcmlkTWVzc2FnZSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3NLZXkpIHtcbiAgICAgIHRoaXMuYXBwbHlVc2VyQ29uZmlnKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXRDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgY29sdW1uIGRyYWctYW5kLWRyb3AuXG4gICAgdGhpcy5ncmlkQWRhcHRlci5pbml0aWFsaXplRHJhZ0FuZERyb3AoXG4gICAgICB0aGlzLmRyYWd1bGFHcm91cE5hbWUsXG4gICAgICB0aGlzLmRyYWd1bGFTZXJ2aWNlLFxuICAgICAgKHNlbGVjdGVkQ29sdW1uSWRzOiBBcnJheTxzdHJpbmc+KSA9PiB7XG4gICAgICAgIHRoaXMub25IZWFkZXJEcm9wKHNlbGVjdGVkQ29sdW1uSWRzKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuYXBwbHlTZWxlY3RlZFJvd3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbnMnXSAmJiB0aGlzLmNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uSWRzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzLmZpbHRlcigoY29sdW1uSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBjb2x1bW5JZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKHRydWUpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gJiYgdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcblxuICAgICAgLy8gVGhpcyBzZXQgdGltZW91dCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBkYXRhIGhhcyByZW5kZXJlZCBpbiB0aGUgZ3JpZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgY2xlYW5zIHVwIGFueSBsaW5nZXJpbmcgcm93IGRlbGV0ZXMgZm9yIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMucm93RGVsZXRlQ29udGVudHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcm93cyByZS1yZW5kZXIgdGh1cyBtZXNzaW5nIHVwIHRoZSBhZmZpeGVycy4gV2UgbXVzdCByZWFmZml4IHRoZW0gc28gdGhhdCB0aGluZ3NcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHJlbmRlciBjb3JyZWN0bHkuXG4gICAgICAgICAgICBjb25zdCByb3dFbGVtZW50OiBIVE1MRWxlbWVudCA9XG4gICAgICAgICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnW3NreS1jbXAtaWQ9XCInICsgaWQgKyAnXCJdJyxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5yb3dEZWxldGVDb250ZW50c1tpZF0uYWZmaXhlci5hZmZpeFRvKHJvd0VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgYXV0b0ZpdENvbnRleHQ6IFNreUFmZml4QXV0b0ZpdENvbnRleHQuVmlld3BvcnQsXG4gICAgICAgICAgICAgIGlzU3RpY2t5OiB0cnVlLFxuICAgICAgICAgICAgICBwbGFjZW1lbnQ6ICdhYm92ZScsXG4gICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiAndG9wJyxcbiAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgICAgICAgICBlbmFibGVBdXRvRml0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydzb3J0RmllbGQnXSkge1xuICAgICAgdGhpcy5zZXRTb3J0SGVhZGVycygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UuY29tcGxldGUoKTtcblxuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZHJhZ3VsYVNlcnZpY2UuZGVzdHJveSh0aGlzLmRyYWd1bGFHcm91cE5hbWUpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICB9XG5cbiAgcHVibGljIGdldFRvcFNjcm9sbFdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFibGVDbGFzc05hbWVzKCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodGhpcy5maXQgIT09ICdzY3JvbGwnKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3NreS1ncmlkLWZpdCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc1Rvb2xiYXIpIHtcbiAgICAgIGNsYXNzTmFtZXMucHVzaCgnc2t5LWdyaWQtaGFzLXRvb2xiYXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hZGREZWxpbWl0ZXIoY2xhc3NOYW1lcywgJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYWJsZUhlYWRlckNsYXNzTmFtZXMoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4ubG9ja2VkKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3NreS1ncmlkLWhlYWRlci1sb2NrZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hZGREZWxpbWl0ZXIoY2xhc3NOYW1lcywgJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXJldEljb25OYW1lcyhjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGNvbnN0IGljb25OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuZ2V0U29ydERpcmVjdGlvbihjb2x1bW4uZmllbGQpLnN1YnNjcmliZSgoc29ydERpcikgPT4ge1xuICAgICAgaWYgKHNvcnREaXIgPT09ICdhc2MnKSB7XG4gICAgICAgIGljb25OYW1lcy5wdXNoKCdjYXJldC11cCcpO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnREaXIgPT09ICdkZXNjJykge1xuICAgICAgICBpY29uTmFtZXMucHVzaCgnY2FyZXQtZG93bicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRkRGVsaW1pdGVyKGljb25OYW1lcywgJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSB7XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGtleSA9PT0gJ2VudGVyJyB8fCBrZXkgPT09ICcgJykge1xuICAgICAgdGhpcy5zb3J0QnlDb2x1bW4oY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc29ydEJ5Q29sdW1uKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGUgJiYgY29sdW1uLmlzU29ydGFibGUpIHtcbiAgICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgZmllbGRTZWxlY3RvcjogY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgICBkZXNjZW5kaW5nOiB0cnVlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZCAmJlxuICAgICAgICAgICAgICBmaWVsZC5maWVsZFNlbGVjdG9yID09PSBjb2x1bW4uZmllbGQgJiZcbiAgICAgICAgICAgICAgZmllbGQuZGVzY2VuZGluZ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgIGZpZWxkU2VsZWN0b3I6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgICBkZXNjZW5kaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc29ydEZpZWxkQ2hhbmdlLmVtaXQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U29ydEZpZWxkLm5leHQoc2VsZWN0b3IpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydERpcmVjdGlvbihjb2x1bW5GaWVsZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uRmllbGRcbiAgICAgICAgICA/IGZpZWxkLmRlc2NlbmRpbmdcbiAgICAgICAgICAgID8gJ2Rlc2MnXG4gICAgICAgICAgICA6ICdhc2MnXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFyaWFTb3J0RGlyZWN0aW9uKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U29ydEZpZWxkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKChmaWVsZCkgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjZW5kaW5nJ1xuICAgICAgICAgICAgOiAnYXNjZW5kaW5nJ1xuICAgICAgICAgIDogY29sdW1uLmlzU29ydGFibGVcbiAgICAgICAgICA/ICdub25lJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXJldFZpc2liaWxpdHkoY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbkZpZWxkID8gJ3Zpc2libGUnIDogJ2hpZGRlbic7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEhlbHBJbmxpbmVDbGFzcyhjb2x1bW5GaWVsZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FyZXRWaXNpYmlsaXR5KGNvbHVtbkZpZWxkKS5waXBlKFxuICAgICAgbWFwKCh2aXNpYmlsaXR5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHZpc2liaWxpdHkgPT09ICdoaWRkZW4nO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk11bHRpc2VsZWN0Q2hlY2tib3hDaGFuZ2UoKSB7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2hlY2tib3hDaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbkhlYWRpbmcoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSGVhZGluZ01vZGVsQ2hhbmdlKSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5Nb2RlbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkKSB8fFxuICAgICAgICAoY2hhbmdlLmZpZWxkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmZpZWxkID09PSBjb2x1bW4uZmllbGQpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5oZWFkaW5nID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSW5saW5lSGVscFBvcG92ZXIoXG4gICAgY2hhbmdlOiBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSxcbiAgKSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5Nb2RlbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkKSB8fFxuICAgICAgICAoY2hhbmdlLmZpZWxkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmZpZWxkID09PSBjb2x1bW4uZmllbGQpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5pbmxpbmVIZWxwUG9wb3ZlciA9IGNoYW5nZS52YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbkRlc2NyaXB0aW9uKGNoYW5nZTogU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UpIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbk1vZGVsID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY2hhbmdlLmlkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmlkID09PSBjb2x1bW4uaWQpIHx8XG4gICAgICAgIChjaGFuZ2UuZmllbGQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuZmllbGQgPT09IGNvbHVtbi5maWVsZClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChmb3VuZENvbHVtbk1vZGVsKSB7XG4gICAgICBmb3VuZENvbHVtbk1vZGVsLmRlc2NyaXB0aW9uID0gY2hhbmdlLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVDb2x1bW5TdGFydChldmVudDoge1xuICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4gdm9pZDtcbiAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdm9pZDtcbiAgICBwYWdlWD86IG51bWJlcjtcbiAgfSk6IHZvaWQge1xuICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcmVzaXplZCwgaW5pdGlhbGl6ZSBhbGwgdGhlIHJlc2l6ZSB3aWR0aHMuXG4gICAgaWYgKCF0aGlzLmlzUmVzaXplZCkge1xuICAgICAgdGhpcy5pbml0Q29sdW1uV2lkdGhzKCk7XG4gICAgICB0aGlzLmlzUmVzaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50KTtcblxuICAgIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSA9IHRydWU7XG4gICAgdGhpcy54UG9zU3RhcnQgPSBldmVudC5wYWdlWDtcbiAgICB0aGlzLnNob3dSZXNpemVCYXIgPSB0cnVlO1xuXG4gICAgLy8gU2hvdyB2aXN1YWwgaW5kaWNhdG9yIG9mIHdoZXJlIG1vdXNlIGlzIGRyYWdnaW5nIChyZXNpemVCYXIpLlxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24oZXZlbnQucGFnZVgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IG1vdXNlTW92ZUV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgY29uc3QgdG91Y2hNb3ZlRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICd0b3VjaG1vdmUnKTtcblxuICAgIG1lcmdlKG1vdXNlTW92ZUV2ZW50LCB0b3VjaE1vdmVFdmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGU7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgobW92ZUV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblJlc2l6ZUhhbmRsZU1vdmUobW92ZUV2ZW50KTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgbW91c2VVcEV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcpO1xuICAgIGNvbnN0IHRvdWNoRW5kRXZlbnQgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICd0b3VjaGVuZCcpO1xuXG4gICAgbWVyZ2UobW91c2VVcEV2ZW50LCB0b3VjaEVuZEV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlbmRFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVSZWxlYXNlKGVuZEV2ZW50KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uS2V5ZG93blJlc2l6ZUNvbChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcmVzaXplZCwgaW5pdGlhbGl6ZSBhbGwgdGhlIHJlc2l6ZSB3aWR0aHMuXG4gICAgaWYgKCF0aGlzLmlzUmVzaXplZCkge1xuICAgICAgdGhpcy5pbml0Q29sdW1uV2lkdGhzKCk7XG4gICAgICB0aGlzLmlzUmVzaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlUmVzaXplQ29sKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBOdW1iZXIoaW5wdXQudmFsdWUpO1xuICAgIGNvbnN0IGRlbHRhWCA9IG5ld1ZhbHVlIC0gdGhpcy5zdGFydENvbHVtbldpZHRoO1xuICAgIHRoaXMucmVzaXplQ29sdW1uQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4LCBuZXdWYWx1ZSwgZGVsdGFYKTtcbiAgICBjb25zdCBsZWZ0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGxlZnQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy54UG9zU3RhcnQ7XG4gICAgY29uc3QgbmV3Q29sV2lkdGggPSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGggKyBkZWx0YVg7XG5cbiAgICBpZiAobmV3Q29sV2lkdGggPD0gdGhpcy5taW5Db2xXaWR0aCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gdGhpcy5nZXRNYXhSYW5nZUJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnICYmIG5ld0NvbFdpZHRoID4gbWF4KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGV2ZW50LnBhZ2VYKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZUJsdXIoKSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVGb2N1cyhldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IHRydWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgbGVmdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIHRoaXMuc2V0UmVzaXplQmFyUG9zaXRpb24obGVmdCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVSZWxlYXNlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gZmFsc2U7XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQucGFnZVggLSB0aGlzLnhQb3NTdGFydDtcbiAgICBjb25zdCBuZXdDb2xXaWR0aCA9IHRoaXMuc3RhcnRDb2x1bW5XaWR0aCArIGRlbHRhWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCwgbmV3Q29sV2lkdGgsIGRlbHRhWCk7XG4gICAgdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCA9IHVuZGVmaW5lZDtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgb25Sb3dDbGljayhldmVudDogYW55LCBzZWxlY3RlZEl0ZW06IExpc3RJdGVtTW9kZWwpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmVuYWJsZU11bHRpc2VsZWN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCB8fFxuICAgICAgICAhdGhpcy5pc0ludGVyYWN0aXZlRWxlbWVudChldmVudClcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZCA9ICFzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZDtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuUm93Q2xpY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1Jvd0hpZ2hsaWdodGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5yb3dIaWdobGlnaHRlZElkKSB7XG4gICAgICByZXR1cm4gaWQgPT09IHRoaXMucm93SGlnaGxpZ2h0ZWRJZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldFJvd0hlaWdodChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkQWRhcHRlci5nZXRSb3dIZWlnaHQodGhpcy50YWJsZUVsZW1lbnRSZWYsIGluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxSb3dEZWxldGUoaWQ6IHN0cmluZykge1xuICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IGlkLFxuICAgICk7XG4gICAgdGhpcy5yb3dEZWxldGVDYW5jZWwuZW1pdCh7IGlkOiBpZCB9KTtcblxuICAgIHRoaXMuZGVzdHJveVJvd0RlbGV0ZShpZCk7XG4gIH1cblxuICBwdWJsaWMgY29uZmlybVJvd0RlbGV0ZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoKGNvbmZpZykgPT4gY29uZmlnLmlkID09PSBpZCkucGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5yb3dEZWxldGVDb25maXJtLmVtaXQoeyBpZDogaWQgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGVsZXRlSXRlbShpZDogc3RyaW5nKTogU2t5R3JpZFJvd0RlbGV0ZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMucm93RGVsZXRlQ29uZmlncy5maW5kKChyb3dEZWxldGUpID0+IHJvd0RlbGV0ZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLy8gUHJldmVudCB0b3VjaCBkZXZpY2VzIGZyb20gaW5hZHZlcnRlbnRseSBzY3JvbGxpbmcgZ3JpZCB3aGlsZSBkcmFnZ2luZyBjb2x1bW5zLlxuICBwdWJsaWMgb25Ub3VjaE1vdmUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Ub3BTY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXJFbGVtZW50UmVmKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxUcmlnZ2VyZWQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICB0aGlzLnRvcFNjcm9sbENvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUcmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkdyaWRTY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMudG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZikge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsVHJpZ2dlcmVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9wU2Nyb2xsQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPVxuICAgICAgICAgIHRoaXMudGFibGVDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zaG93VG9wU2Nyb2xsICYmXG4gICAgICB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzICYmXG4gICAgICB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGxldCBjb2x1bW5zV2lkdGhUb3RhbCA9IDA7XG4gICAgICBjb25zdCB3aW5kb3dTaXplID0gdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LmlubmVyV2lkdGg7XG4gICAgICB0aGlzLmNvbHVtbkVsZW1lbnRSZWZzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2hvd1RvcFNjcm9sbCkge1xuICAgICAgICAgIGNvbnN0IGNvbXB1dGVkV2lkdGggPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUoY29sLm5hdGl2ZUVsZW1lbnQpLndpZHRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0V2lkdGggPSBjb2wubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCB8fCBvZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIHRoaXMubWluQ29sV2lkdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2x1bW5zV2lkdGhUb3RhbCA9IGNvbHVtbnNXaWR0aFRvdGFsICsgd2lkdGg7XG4gICAgICAgICAgaWYgKGNvbHVtbnNXaWR0aFRvdGFsID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VG9wU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11bHRpc2VsZWN0U2VsZWN0QWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5TZWxlY3RBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdENsZWFyQWxsKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuQ2xlYXJBbGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2U6IFNreUdyaWRNZXNzYWdlKSB7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlNlbGVjdEFsbDpcbiAgICAgICAgdGhpcy5tdWx0aXNlbGVjdFNlbGVjdEFsbCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQ2xlYXJBbGw6XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RDbGVhckFsbCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLlByb21wdERlbGV0ZVJvdzpcbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGEgJiYgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdykge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gdGhpcy5yb3dEZWxldGVDb25maWdzLmZpbmQoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgPT09IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdDb25maWcpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nQ29uZmlnLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3dEZWxldGVDb25maWdzLnB1c2goe1xuICAgICAgICAgICAgICBpZDogbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZCxcbiAgICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgIGVuYWJsZVNjcm9sbDogdHJ1ZSxcbiAgICAgICAgICAgICAgc2hvd0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgICAgICAgY2xvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICAgIGVuYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogdHJ1ZSxcbiAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy4jZW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBvdmVybGF5LmF0dGFjaFRlbXBsYXRlKHRoaXMuaW5saW5lRGVsZXRlVGVtcGxhdGVSZWYsIHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmRhdGEuZmluZChcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5pZCA9PT0gbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdlIGFyZSBtYW51YWxseSBzZXR0aW5nIHRoZSB6LWluZGV4IGhlcmUgYmVjYXVzZSBvdmVybGF5cyB3aWxsIGFsd2F5cyBiZSBvbiB0b3Agb2ZcbiAgICAgICAgICAgICAqIHRoZSBvbW5pYmFyLiBUaGlzIG1hbnVhbCBzZXR0aW5nIGlzIDEgbGVzcyB0aGFuIHRoZSBvbW5pYmFyJ3Mgei1pbmRleCBvZiAxMDAwLiBXZVxuICAgICAgICAgICAgICogZGlzY3Vzc2VkIGNoYW5naW5nIHRoZSBvdmVybGF5IHNlcnZpY2UgdG8gYWxsb3cgZm9yIHRoaXMgYnV0IGRlY2lkZWQgYWdhaW5zdCB0aGF0XG4gICAgICAgICAgICAgKiBjaGFuZ2UgYXQgdGhpcyB0aW1lIGR1ZSB0byBpdHMgbmljaGUgbmF0dXJlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBvdmVybGF5LmNvbXBvbmVudFJlZi5pbnN0YW5jZS56SW5kZXggPSAnOTk5JztcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlubGluZURlbGV0ZVJlZiA9IHRoaXMuaW5saW5lRGVsZXRlUmVmc1xuICAgICAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgICAgICAuZmluZCgoZWxSZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGVsUmVmLm5hdGl2ZUVsZW1lbnQuaWQgPT09XG4gICAgICAgICAgICAgICAgICAgICdyb3ctZGVsZXRlLXJlZi0nICsgbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgYWZmaXhlciA9IHRoaXMuYWZmaXhTZXJ2aWNlLmNyZWF0ZUFmZml4ZXIoaW5saW5lRGVsZXRlUmVmKTtcblxuICAgICAgICAgICAgICBjb25zdCByb3dFbGVtZW50OiBIVE1MRWxlbWVudCA9XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgJ1tza3ktY21wLWlkPVwiJyArIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQgKyAnXCJdJyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGFmZml4ZXIuYWZmaXhUbyhyb3dFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgYXV0b0ZpdENvbnRleHQ6IFNreUFmZml4QXV0b0ZpdENvbnRleHQuVmlld3BvcnQsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiAnYWJvdmUnLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiAndG9wJyxcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29udGVudHNbbWVzc2FnZS5kYXRhLnByb21wdERlbGV0ZVJvdy5pZF0gPSB7XG4gICAgICAgICAgICAgICAgYWZmaXhlcjogYWZmaXhlcixcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBvdmVybGF5LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTa3lHcmlkTWVzc2FnZVR5cGUuQWJvcnREZWxldGVSb3c6XG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICYmIG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdykge1xuICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29uZmlncyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maWx0ZXIoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiBjb25maWcuaWQgIT09IG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdy5pZCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKG1lc3NhZ2UuZGF0YS5hYm9ydERlbGV0ZVJvdy5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9uSGVhZGVyRHJvcChuZXdDb2x1bW5JZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAvLyB1cGRhdGUgc2VsZWN0ZWQgY29sdW1uSWRzXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbklkc1NldCA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbklkcyA9IG5ld0NvbHVtbklkcztcblxuICAgIC8vIG1hcmsgZm9yIGNoZWNrIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lm9uUHVzaFxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHNldERpc3BsYXllZENvbHVtbnMocmVzcGVjdEhpZGRlbiA9IGZhbHNlKSB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb2x1bW5zKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbklkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHNldHVwIGRpc3BsYXllZCBjb2x1bW5zXG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNcbiAgICAgICAgICAuZmlsdGVyKChjb2x1bW5JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcCgoY29sdW1uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpWzBdO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChyZXNwZWN0SGlkZGVuKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIHJldHVybiAhY29sdW1uLmhpZGRlbjtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1EYXRhKCkge1xuICAgIC8vIFRyYW5zZm9ybSBkYXRhIGludG8gb2JqZWN0IHdpdGggaWQgYW5kIGRhdGEgcHJvcGVydGllc1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YSAmJlxuICAgICAgdGhpcy5kYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuZGF0YVswXS5pZCAmJlxuICAgICAgIXRoaXMuZGF0YVswXS5kYXRhXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdFJvd0lkKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmdldEdyaWREYXRhV2l0aFNlbGVjdGVkUm93cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YS5tYXAoKGl0ZW0pID0+IG5ldyBMaXN0SXRlbU1vZGVsKGl0ZW0uaWQsIGl0ZW0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEdyaWREYXRhV2l0aFNlbGVjdGVkUm93cygpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdldFNlbGVjdGVkUm93cygpO1xuICAgIHJldHVybiB0aGlzLmRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICBsZXQgY2hlY2tlZDtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXRlbSwgdGhpcy5tdWx0aXNlbGVjdFJvd0lkKSkge1xuICAgICAgICBjaGVja2VkID0gc2VsZWN0ZWRSb3dzLmluZGV4T2YoaXRlbVt0aGlzLm11bHRpc2VsZWN0Um93SWRdKSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tlZCA9IHNlbGVjdGVkUm93cy5pbmRleE9mKGl0ZW0uaWQpID4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IExpc3RJdGVtTW9kZWwoaXRlbS5pZCwgaXRlbSwgY2hlY2tlZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRSb3dzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5pdGVtc1tpXS5pc1NlbGVjdGVkID1cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmluZGV4T2YodGhpcy5pdGVtc1tpXS5pZCkgPiAtMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTb3J0SGVhZGVycygpIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGQubmV4dChcbiAgICAgIHRoaXMuc29ydEZpZWxkIHx8IHsgZmllbGRTZWxlY3RvcjogJycsIGRlc2NlbmRpbmc6IGZhbHNlIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5Db21wb25lbnRzLm1hcCgoY29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFNreUdyaWRDb2x1bW5Nb2RlbChjb2x1bW5Db21wb25lbnQudGVtcGxhdGUsIGNvbHVtbkNvbXBvbmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5nZXRDb2x1bW5zRnJvbUNvbXBvbmVudCgpO1xuXG4gICAgLy8gVGhpcyBzZXQgdGltZW91dCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBjb2x1bW5zIGhhdmUgcmVuZGVyZWQgaW4gdGhlIGdyaWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZUNvbHVtbkJ5SW5kZXgoXG4gICAgY29sdW1uSW5kZXg6IHN0cmluZyxcbiAgICBuZXdDb2xXaWR0aDogbnVtYmVyLFxuICAgIGRlbHRhWDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk1vZGVsQnlJbmRleChjb2x1bW5JbmRleCk7XG5cbiAgICAvLyBQcmV2ZW50IGFjY2lkZW50YWwgc2hyaW5rYWdlIGJlbG93IG1pbmltdW0gd2lkdGguXG4gICAgaWYgKG5ld0NvbFdpZHRoIDw9IHRoaXMubWluQ29sV2lkdGgpIHtcbiAgICAgIGRlbHRhWCA9IGRlbHRhWCArIHRoaXMubWluQ29sV2lkdGggLSBuZXdDb2xXaWR0aDtcbiAgICAgIG5ld0NvbFdpZHRoID0gdGhpcy5taW5Db2xXaWR0aDtcbiAgICB9XG5cbiAgICAvLyBmaXQ9d2lkdGggYWRkcy9yZW1vdmVzIHdpZHRoIGZyb20gdGhlIGxhc3QgY29sdW1uXG4gICAgLy8gZml0PXNjcm9sbCBhZGRzL3JlbW92ZXMgd2lkdGggZnJvbSB0aGUgdGFibGVcbiAgICBpZiAodGhpcy5maXQgPT09ICd3aWR0aCcpIHtcbiAgICAgIGNvbnN0IGxhc3RDb2x1bW4gPSB0aGlzLmdldExhc3REaXNwbGF5ZWRDb2x1bW4oKTtcblxuICAgICAgLy8gUHJldmVudCBhY2NpZGVudGFsIGdyb3d0aCB0aGF0IHdvdWxkIGJ1bXAgbGFzdCBjb2x1bW4gb2ZmIHNjcmVlbi5cbiAgICAgIGNvbnN0IG1heCA9IHRoaXMuZ2V0TWF4UmFuZ2VCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICAgIGlmIChuZXdDb2xXaWR0aCA+IG1heCkge1xuICAgICAgICBuZXdDb2xXaWR0aCA9IG1heDtcbiAgICAgICAgZGVsdGFYID0gbWF4IC0gdGhpcy5zdGFydENvbHVtbldpZHRoO1xuICAgICAgfVxuICAgICAgY29sdW1uLndpZHRoID0gbmV3Q29sV2lkdGg7XG4gICAgICBsYXN0Q29sdW1uLndpZHRoID0gbGFzdENvbHVtbi53aWR0aCAtIGRlbHRhWDtcbiAgICAgIHRoaXMudXBkYXRlTWF4UmFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aCArIGRlbHRhWH1weGAsXG4gICAgICApO1xuICAgICAgY29sdW1uLndpZHRoID0gbmV3Q29sV2lkdGg7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5jb2x1bW5XaWR0aENoYW5nZS5lbWl0KHRoaXMuZ2V0Q29sdW1uV2lkdGhNb2RlbENoYW5nZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdENvbHVtbldpZHRocygpIHtcbiAgICAvLyBFc3RhYmxpc2ggdGFibGUgd2lkdGguXG4gICAgdGhpcy5zaG93VG9wU2Nyb2xsID0gdHJ1ZTtcblxuICAgIC8vIFNldCBjb2x1bW4gd2lkdGhzIGJhc2VkIG9uIHRoZSB3aWR0aCBpbml0aWFsbHkgZ2l2ZW4gYnkgdGhlIGJyb3dzZXIuXG4gICAgLy8gY29tcHV0ZWRXaWR0aCBwcmV2ZW50cyBhY2NpZGVudGFsIG92ZXJmbG93IGZvciBicm93c2VycyB3aXRoIHN1Yi1waXhlbCB3aWR0aHMuXG4gICAgdGhpcy5jb2x1bW5FbGVtZW50UmVmcy5mb3JFYWNoKChjb2wsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjb21wdXRlZFdpZHRoID0gcGFyc2VGbG9hdChcbiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUoY29sLm5hdGl2ZUVsZW1lbnQpLndpZHRoLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9mZnNldFdpZHRoID0gY29sLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgoaW5kZXgpLndpZHRoID0gTWF0aC5tYXgoXG4gICAgICAgIGNvbXB1dGVkV2lkdGggfHwgb2Zmc2V0V2lkdGgsXG4gICAgICAgIHRoaXMubWluQ29sV2lkdGgsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gJ3Njcm9sbCcgdGFibGVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGFuZCBvdXRzaWRlIG9mIHRoZWlyIGNvbnN0cmFpbnRzLlxuICAgIGlmICh0aGlzLmZpdCA9PT0gJ3Njcm9sbCcpIHtcbiAgICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsZW1lbnRSZWYsICdtaW4td2lkdGgnLCAnYXV0bycpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtYXggbGltaXRzIGZvciBpbnB1dCByYW5nZXMuXG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heFJhbmdlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZmVyQ29sdW1uV2lkdGhzKFxuICAgIG9sZENvbHVtbnM6IFNreUdyaWRDb2x1bW5Nb2RlbFtdLFxuICAgIG5ld0NvbHVtbnM6IFNreUdyaWRDb2x1bW5Nb2RlbFtdLFxuICApIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChvbGRDb2x1bW5zICYmIG5ld0NvbHVtbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkQ29sdW1uIG9mIG9sZENvbHVtbnMpIHtcbiAgICAgICAgaWYgKG9sZENvbHVtbi53aWR0aCkge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nQ29sdW1uID0gbmV3Q29sdW1ucy5maW5kKFxuICAgICAgICAgICAgKG5ld0NvbHVtbikgPT4gb2xkQ29sdW1uLmlkID09PSBuZXdDb2x1bW4uaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdDb2x1bW4gJiYgIW1hdGNoaW5nQ29sdW1uLndpZHRoKSB7XG4gICAgICAgICAgICBtYXRjaGluZ0NvbHVtbi53aWR0aCA9IG9sZENvbHVtbi53aWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uV2lkdGhNb2RlbENoYW5nZSgpIHtcbiAgICBjb25zdCBjb2x1bW5XaWR0aE1vZGVsQ2hhbmdlID0gbmV3IEFycmF5PFNreUdyaWRDb2x1bW5XaWR0aE1vZGVsQ2hhbmdlPigpO1xuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbHVtbldpZHRoTW9kZWxDaGFuZ2UucHVzaCh7XG4gICAgICAgIGlkOiBjb2x1bW4uaWQsXG4gICAgICAgIGZpZWxkOiBjb2x1bW4uZmllbGQsXG4gICAgICAgIHdpZHRoOiBjb2x1bW4ud2lkdGgsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sdW1uV2lkdGhNb2RlbENoYW5nZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWF4UmFuZ2UoKSB7XG4gICAgY29uc3QgbGVmdG92ZXJXaWR0aCA9XG4gICAgICB0aGlzLmdldExhc3REaXNwbGF5ZWRDb2x1bW4oKS53aWR0aCAtIHRoaXMubWluQ29sV2lkdGg7XG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG5ld01heFJhbmdlID0gY29sdW1uLndpZHRoICsgbGVmdG92ZXJXaWR0aDtcbiAgICAgIGNvbnN0IHJhbmdlSW5wdXQgPSB0aGlzLmdldFJhbmdlSW5wdXRCeUluZGV4KGluZGV4KTtcbiAgICAgIHJhbmdlSW5wdXQubmF0aXZlRWxlbWVudC5tYXggPSBuZXdNYXhSYW5nZTtcbiAgICAgIHJhbmdlSW5wdXQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCBuZXdNYXhSYW5nZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVSZXNpemVDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGNsaWNrVGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXggPSBjbGlja1RhcmdldC5nZXRBdHRyaWJ1dGUoJ3NreS1jbXAtaW5kZXgnKTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk1vZGVsQnlJbmRleCh0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4KTtcbiAgICB0aGlzLnN0YXJ0Q29sdW1uV2lkdGggPSBjb2x1bW4ud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGFibGVXaWR0aCgpIHtcbiAgICB0aGlzLnNreVdpbmRvdy5uYXRpdmVXaW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmdyaWRBZGFwdGVyLnNldFN0eWxlKHRoaXMudGFibGVFbGVtZW50UmVmLCAnd2lkdGgnLCBgYXV0b2ApO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmdyaWRBZGFwdGVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZixcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgYCR7dGhpcy50YWJsZVdpZHRofXB4YCxcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VJbnB1dEJ5SW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJhbmdlSW5wdXRFbGVtZW50UmVmcy5maW5kKFxuICAgICAgKGlucHV0KSA9PlxuICAgICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2t5LWNtcC1pbmRleCcpID09PSBpbmRleC50b1N0cmluZygpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbk1vZGVsQnlJbmRleChpbmRleDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1uc1tOdW1iZXIoaW5kZXgpXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF4UmFuZ2VCeUluZGV4KGluZGV4OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb2x1bW5FbGVtZW50UmVmID0gdGhpcy5jb2x1bW5FbGVtZW50UmVmcy5maW5kKFxuICAgICAgKHRoKSA9PiB0aC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnc2t5LWNtcC1pbmRleCcpID09PSBpbmRleCxcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlSW5wdXQgPSBjb2x1bW5FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICcuc2t5LWdyaWQtY29sdW1uLWlucHV0LWFyaWEtb25seScsXG4gICAgKTtcbiAgICByZXR1cm4gTnVtYmVyKHJhbmdlSW5wdXQubWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFzdERpc3BsYXllZENvbHVtbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWxpbWl0ZXIodGV4dDogc3RyaW5nW10sIGRlbGltaXRlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRleHQuZmlsdGVyKCh2YWwpID0+IHZhbCkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Um93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb3dEZWxldGVDb250ZW50cyA9IHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHJvd0RlbGV0ZUNvbnRlbnRzKSB7XG4gICAgICByb3dEZWxldGVDb250ZW50cy5hZmZpeGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuY2xvc2Uocm93RGVsZXRlQ29udGVudHMub3ZlcmxheSk7XG4gICAgICBkZWxldGUgdGhpcy5yb3dEZWxldGVDb250ZW50c1tpZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0ZWRSb3dzKHNvdXJjZTogU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogU2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlID0ge1xuICAgICAgc2VsZWN0ZWRSb3dJZHM6IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCksXG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICB9O1xuICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTZWxlY3RlZDtcbiAgICAgIH0pXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXRlbS5kYXRhLCB0aGlzLm11bHRpc2VsZWN0Um93SWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBpdGVtLmRhdGFbdGhpcy5tdWx0aXNlbGVjdFJvd0lkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ludGVyYWN0aXZlRWxlbWVudChldmVudDogYW55KTogYW55IHtcbiAgICBjb25zdCBpbnRlcmFjdGl2ZUVsU2VsZWN0b3JzID0gYFxuICAgICAgYSxcbiAgICAgIGJ1dHRvbixcbiAgICAgIGlucHV0LFxuICAgICAgbGFiZWwsXG4gICAgICBvcHRpb24sXG4gICAgICBzZWxlY3QsXG4gICAgICB0ZXh0YXJlYSxcbiAgICAgIGRldGFpbHMsXG4gICAgICBkaWFsb2csXG4gICAgICBtZW51LFxuICAgICAgbWVudWl0ZW0sXG4gICAgICBzdW1tYXJ5YDtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoaW50ZXJhY3RpdmVFbFNlbGVjdG9ycyk7XG4gIH1cblxuICBwcml2YXRlIHNldFJlc2l6ZUJhclBvc2l0aW9uKHhQb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsID0gdGhpcy50YWJsZUNvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHJlc2l6ZUJhclggPVxuICAgICAgeFBvc2l0aW9uIC1cbiAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG4gICAgICBwYXJlbnRTY3JvbGw7XG4gICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnJlc2l6ZUJhciwgJ2xlZnQnLCByZXNpemVCYXJYICsgJ3B4Jyk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VXNlckNvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAgIC5nZXRDb25maWcodGhpcy5zZXR0aW5nc0tleSlcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAoY29uZmlnOiBTa3lHcmlkVUlDb25maWcpID0+IHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5zZWxlY3RlZENvbHVtbklkcykge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGNvbHVtbklkcyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBjdXJyZW50IGRhdGEgc2V0LlxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gY29uZmlnLnNlbGVjdGVkQ29sdW1uSWRzLmZpbHRlcigoaWQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlkID09PSBpZCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRVc2VyQ29uZmlnKGNvbmZpZzogU2t5R3JpZFVJQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51aUNvbmZpZ1NlcnZpY2VcbiAgICAgIC5zZXRDb25maWcodGhpcy5zZXR0aW5nc0tleSwgY29uZmlnKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgICgpID0+IHt9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3Qgc2F2ZSBncmlkIHNldHRpbmdzLicpO1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdENvbHVtbnMoKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5jb2x1bW5Db21wb25lbnRzLmxlbmd0aCAhPT0gMCB8fCB0aGlzLmNvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnModHJ1ZSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8vIFdhdGNoIGZvciBhZGRlZC9yZW1vdmVkIGNvbHVtbnM6XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNvbHVtbkNvbXBvbmVudHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVDb2x1bW5zKCkpLFxuICAgICk7XG5cbiAgICAvLyBXYXRjaCBmb3IgY29sdW1uIGhlYWRpbmcgY2hhbmdlczpcbiAgICB0aGlzLmNvbHVtbkNvbXBvbmVudHMuZm9yRWFjaCgoY29tcDogU2t5R3JpZENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbXAuaGVhZGluZ01vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbkhlYWRpbmdNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5IZWFkaW5nKGNoYW5nZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5kZXNjcmlwdGlvbk1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbkRlc2NyaXB0aW9uTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uRGVzY3JpcHRpb24oY2hhbmdlKTtcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICBjb21wLmlubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICAgICAoY2hhbmdlOiBTa3lHcmlkQ29sdW1uSW5saW5lSGVscFBvcG92ZXJNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbmxpbmVIZWxwUG9wb3ZlcihjaGFuZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcnJheXNFcXVhbChhcnJheUE6IGFueVtdLCBhcnJheUI6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFycmF5QS5sZW5ndGggPT09IGFycmF5Qi5sZW5ndGggJiZcbiAgICAgIGFycmF5QS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gYXJyYXlCW2luZGV4XSlcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2t5LWdyaWRcIj5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2hvd1RvcFNjcm9sbFwiXG4gICAgY2xhc3M9XCJza3ktZ3JpZC10b3Atc2Nyb2xsLWNvbnRhaW5lclwiXG4gICAgKHNjcm9sbCk9XCJvblRvcFNjcm9sbCgkZXZlbnQpXCJcbiAgICAjdG9wU2Nyb2xsQ29udGFpbmVyXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNreS1ncmlkLXRvcC1zY3JvbGxcIlxuICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldFRvcFNjcm9sbFdpZHRoKClcIlxuICAgID48L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNreS1ncmlkLXRhYmxlLWNvbnRhaW5lclwiXG4gICAgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHRcIlxuICAgIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiXG4gICAgKHNjcm9sbCk9XCJvbkdyaWRTY3JvbGwoJGV2ZW50KVwiXG4gICAgI2dyaWRDb250YWluZXJcbiAgPlxuICAgIDx0YWJsZSBjbGFzcz1cInNreS1ncmlkLXRhYmxlXCIgW25nQ2xhc3NdPVwiZ2V0VGFibGVDbGFzc05hbWVzKClcIiAjZ3JpZFRhYmxlPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHIgW2RyYWd1bGFdPVwiZHJhZ3VsYUdyb3VwTmFtZVwiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgKm5nSWY9XCJlbmFibGVNdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWhlYWRpbmcgc2t5LWdyaWQtbXVsdGlzZWxlY3QtY2VsbCBza3ktZ3JpZC1oZWFkZXItbG9ja2VkXCJcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwibWluQ29sV2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjcmVlbi1yZWFkZXItb25seVwiPlxuICAgICAgICAgICAgICB7eyAnc2t5dXhfZ3JpZF9tdWx0aXNlbGVjdF9zZWxlY3Rfcm93JyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBkaXNwbGF5ZWRDb2x1bW5zO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWhlYWRpbmcgc2t5LWZpZWxkLWxhYmVsXCJcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaW5kZXhdPVwiaVwiXG4gICAgICAgICAgICBbYXR0ci5za3ktY21wLWlkXT1cImNvbHVtbi5pZCB8fCBjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldEFyaWFTb3J0RGlyZWN0aW9uKGNvbHVtbikgfCBhc3luY1wiXG4gICAgICAgICAgICBbaWRdPVwiJ3NreS1ncmlkLScgKyBncmlkSWQgKyAnLWNvbHVtbi0nICsgaVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCInc2t5LWdyaWQtY29sdW1uLWFsaWdubWVudC0nICsgY29sdW1uLmFsaWdubWVudFwiXG4gICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJjb2x1bW4uaXNTb3J0YWJsZSA/IDAgOiAtMVwiXG4gICAgICAgICAgICAobW91c2V1cCk9XCJzb3J0QnlDb2x1bW4oY29sdW1uKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50LCBjb2x1bW4pXCJcbiAgICAgICAgICAgICh0b3VjaG1vdmUpPVwib25Ub3VjaE1vdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAjZ3JpZENvbFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJvdmVyZmxvd1wiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFRhYmxlSGVhZGVyQ2xhc3NOYW1lcyhjb2x1bW4pXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4ud2lkdGggLSAxXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbi53aWR0aCAtIDFcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdldENhcmV0VmlzaWJpbGl0eShjb2x1bW4uZmllbGQpIHwgYXN5bmMpID09PSAnaGlkZGVuJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1oZWFkZXItY2FyZXQtaGlkZGVuLXNwYWNpbmdcIlxuICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICA8IS0tIFRoZSBubyBzcGFjaW5nIGhlcmUgaXMgaW50ZW50aW9uYWwgdG8gYXZvaWQgZXh0cmEgc3BhY2VzIGR1ZSB0byB0aGVzZSBiZWluZyBpbmxpbmUgZWxlbWVudHMgLS0+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2t5LWdyaWQtaGVhZGVyLXRleHRcIj57e1xuICAgICAgICAgICAgICAgIGNvbHVtbi5oZWFkaW5nPy50cmltKClcbiAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxza3ktaWNvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGluZy1zb3J0XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICdza3ktZ3JpZC1oZWFkaW5nLXNvcnQtJyArXG4gICAgICAgICAgICAgICAgICAoZ2V0Q2FyZXRWaXNpYmlsaXR5KGNvbHVtbi5maWVsZCkgfCBhc3luYylcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cImdldENhcmV0SWNvbk5hbWVzKGNvbHVtbilcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c2t5LWhlbHAtaW5saW5lXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uaW5saW5lSGVscFBvcG92ZXJcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICdza3ktZ3JpZC1oZWxwLWlubGluZS1zb3J0LWhpZGRlbic6XG4gICAgICAgICAgICAgICAgICAgIGdldEhlbHBJbmxpbmVDbGFzcyhjb2x1bW4uZmllbGQpIHwgYXN5bmNcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbc2t5UG9wb3Zlcl09XCJjb2x1bW4uaW5saW5lSGVscFBvcG92ZXJcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNldXApPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3NreS1oZWxwLWlubGluZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgKm5nSWY9XCIoZml0ID09PSAnd2lkdGgnICYmICFsYXN0KSB8fCBmaXQgPT09ICdzY3JvbGwnXCJcbiAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1yZXNpemUtaGFuZGxlXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaW5kZXhdPVwiaVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25SZXNpemVDb2x1bW5TdGFydCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHRvdWNoc3RhcnQpPVwib25SZXNpemVDb2x1bW5TdGFydCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiV2lkdGggb2YgY29sdW1uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1jb2x1bW4taW5wdXQtYXJpYS1vbmx5XCJcbiAgICAgICAgICAgICAgcm9sZT1cInNsaWRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3NreS1ncmlkLScgKyBncmlkSWQgKyAnLWNvbHVtbi0nICsgaVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtaW5dPVwibWluQ29sV2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWF4XT1cIm1heENvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW5vd109XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgICBbbWluXT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW21heF09XCJtYXhDb2xXaWR0aFwiXG4gICAgICAgICAgICAgIFtzdGVwXT1cImNvbHVtblJlc2l6ZVN0ZXBcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uUmVzaXplSGFuZGxlQmx1cigpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uUmVzaXplSGFuZGxlRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93blJlc2l6ZUNvbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlUmVzaXplQ29sKCRldmVudClcIlxuICAgICAgICAgICAgICAjY29sU2l6ZVJhbmdlXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5IGNsYXNzPVwic2t5LWdyaWQtdGJvZHlcIj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1yb3dcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiaXNSb3dIaWdobGlnaHRlZChpdGVtLmlkKSA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5za3ktY21wLWlkXT1cIml0ZW0uaWRcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdza3ktZ3JpZC1tdWx0aXNlbGVjdC1zZWxlY3RlZC1yb3cnOiBpdGVtLmlzU2VsZWN0ZWQsXG4gICAgICAgICAgICAnc2t5LWdyaWQtbXVsdGlzZWxlY3Qtcm93JzogZW5hYmxlTXVsdGlzZWxlY3QsXG4gICAgICAgICAgICAnc2t5LWdyaWQtcm93LWhpZ2hsaWdodCc6IGlzUm93SGlnaGxpZ2h0ZWQoaXRlbS5pZClcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgKm5nSWY9XCJlbmFibGVNdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLW11bHRpc2VsZWN0LWNlbGwgc2t5LWdyaWQtaGVhZGVyLWxvY2tlZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNreS1jaGVja2JveFxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInc2t5dXhfZ3JpZF9tdWx0aXNlbGVjdF9zZWxlY3Rfcm93JyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbk11bHRpc2VsZWN0Q2hlY2tib3hDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvc2t5LWNoZWNrYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIGRpc3BsYXllZENvbHVtbnM7XG4gICAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdDtcbiAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtY2VsbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCInc2t5LWdyaWQtY29sdW1uLWFsaWdubWVudC0nICsgY29sdW1uLmFsaWdubWVudFwiXG4gICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c2t5LWdyaWQtY2VsbFxuICAgICAgICAgICAgICBbc2t5SGlnaGxpZ2h0XT1cIlxuICAgICAgICAgICAgICAgICFjb2x1bW4uZXhjbHVkZUZyb21IaWdobGlnaHRpbmcgPyBoaWdobGlnaHRUZXh0IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4udGVtcGxhdGUgfHwgZGVmYXVsdENlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtmaWVsZFNlbGVjdG9yXT1cImNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICBbY29sdW1uSWRdPVwiY29sdW1uLmlkXCJcbiAgICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pZF09XCJjb2x1bW4uaWQgfHwgY29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc2t5LWdyaWQtY2VsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic2hvd1Jlc2l6ZUJhclwiXG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgY2xhc3M9XCJza3ktZ3JpZC1yZXNpemUtYmFyXCJcbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgI3Jlc2l6ZUJhclxuICAgID48L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbFRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPnt7XG4gIHZhbHVlXG59fTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtaXRlbSAjaW5saW5lRGVsZXRlVGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICBbaWRdPVwiJ3Jvdy1kZWxldGUtcmVmLScgKyBpdGVtLmlkXCJcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICBoZWlnaHQ6IGdldFJvd0hlaWdodCgwKSxcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgd2lkdGg6IHRhYmxlV2lkdGggKyAncHgnXG4gICAgfVwiXG4gICAgI2lubGluZURlbGV0ZVJlZlxuICA+XG4gICAgPHNreS1pbmxpbmUtZGVsZXRlXG4gICAgICBbcGVuZGluZ109XCJnZXRSb3dEZWxldGVJdGVtKGl0ZW0uaWQpLnBlbmRpbmdcIlxuICAgICAgKGNhbmNlbFRyaWdnZXJlZCk9XCJjYW5jZWxSb3dEZWxldGUoaXRlbS5pZClcIlxuICAgICAgKGRlbGV0ZVRyaWdnZXJlZCk9XCJjb25maXJtUm93RGVsZXRlKGl0ZW0uaWQpXCJcbiAgICA+PC9za3ktaW5saW5lLWRlbGV0ZT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
1037
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZ3JpZHMvc3JjL2xpYi9tb2R1bGVzL2dyaWQvZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHNCQUFzQixHQU12QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxHQUVkLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxTQUFTLEVBQ1QsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU16RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU0vRCxPQUFPLEVB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Uzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBR25ELHdCQUF3QjtzQkFEL0IsU0FBUzt1QkFBQyxlQUFlO2dCQUdsQixlQUFlO3NCQUR0QixTQUFTO3VCQUFDLFdBQVc7Z0JBR2QsNEJBQTRCO3NCQURuQyxTQUFTO3VCQUFDLG9CQUFvQjtnQkFHdkIsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxXQUFXO2dCQThJZixjQUFjO3NCQURwQixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LFxuICBTa3lBZmZpeFNlcnZpY2UsXG4gIFNreUFwcFdpbmRvd1JlZixcbiAgU2t5TG9nU2VydmljZSxcbiAgU2t5T3ZlcmxheVNlcnZpY2UsXG4gIFNreVVJQ29uZmlnU2VydmljZSxcbn0gZnJvbSAnQHNreXV4L2NvcmUnO1xuaW1wb3J0IHtcbiAgTGlzdEl0ZW1Nb2RlbCxcbiAgTGlzdFNvcnRGaWVsZFNlbGVjdG9yTW9kZWwsXG59IGZyb20gJ0Bza3l1eC9saXN0LWJ1aWxkZXItY29tbW9uJztcblxuaW1wb3J0IHsgRHJhZ3VsYVNlcnZpY2UgfSBmcm9tICduZzItZHJhZ3VsYSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgZnJvbUV2ZW50LFxuICBtZXJnZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRha2VXaGlsZSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lHcmlkQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2dyaWQtYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2dyaWQtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lHcmlkQ29sdW1uTW9kZWwgfSBmcm9tICcuL2dyaWQtY29sdW1uLm1vZGVsJztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi1kZXNjcmlwdGlvbi1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbkhlYWRpbmdNb2RlbENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZ3JpZC1jb2x1bW4taGVhZGluZy1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtY29sdW1uLWlubGluZS1oZWxwLXBvcG92ZXItbW9kZWwtY2hhbmdlJztcbmltcG9ydCB7IFNreUdyaWRDb2x1bW5XaWR0aE1vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLWNvbHVtbi13aWR0aC1tb2RlbC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5R3JpZE1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtbWVzc2FnZSc7XG5pbXBvcnQgeyBTa3lHcmlkTWVzc2FnZVR5cGUgfSBmcm9tICcuL3R5cGVzL2dyaWQtbWVzc2FnZS10eXBlJztcbmltcG9ydCB7IFNreUdyaWRSb3dEZWxldGVDYW5jZWxBcmdzIH0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY2FuY2VsLWFyZ3MnO1xuaW1wb3J0IHsgU2t5R3JpZFJvd0RlbGV0ZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMvZ3JpZC1yb3ctZGVsZXRlLWNvbmZpZyc7XG5pbXBvcnQgeyBTa3lHcmlkUm93RGVsZXRlQ29uZmlybUFyZ3MgfSBmcm9tICcuL3R5cGVzL2dyaWQtcm93LWRlbGV0ZS1jb25maXJtLWFyZ3MnO1xuaW1wb3J0IHsgU2t5R3JpZFJvd0RlbGV0ZUNvbnRlbnRzIH0gZnJvbSAnLi90eXBlcy9ncmlkLXJvdy1kZWxldGUtY29udGVudHMnO1xuaW1wb3J0IHsgU2t5R3JpZFNlbGVjdGVkUm93c01vZGVsQ2hhbmdlIH0gZnJvbSAnLi90eXBlcy9ncmlkLXNlbGVjdGVkLXJvd3MtbW9kZWwtY2hhbmdlJztcbmltcG9ydCB7IFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UgfSBmcm9tICcuL3R5cGVzL2dyaWQtc2VsZWN0ZWQtcm93cy1zb3VyY2UnO1xuaW1wb3J0IHsgU2t5R3JpZFVJQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9ncmlkLXVpLWNvbmZpZyc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGBTa3lHcmlkQ29tcG9uZW50YCBhbmQgaXRzIGZlYXR1cmVzIGFyZSBkZXByZWNhdGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGRhdGEgZ3JpZCBpbnN0ZWFkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9kYXRhLWdyaWRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dyaWQuY29tcG9uZW50LnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW0RyYWd1bGFTZXJ2aWNlXSxcbiAgcHJvdmlkZXJzOiBbU2t5R3JpZEFkYXB0ZXJTZXJ2aWNlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBDb2x1bW5zIGFuZCBjb2x1bW4gcHJvcGVydGllcyBmb3IgdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbHVtbnMobmV3Q29sdW1uczogQXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPikge1xuICAgIGNvbnN0IG9sZENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgdGhpcy5fY29sdW1ucyA9IG5ld0NvbHVtbnM7XG4gICAgaWYgKG9sZENvbHVtbnMpIHtcbiAgICAgIHRoaXMudHJhbnNmZXJDb2x1bW5XaWR0aHMob2xkQ29sdW1ucywgdGhpcy5jb2x1bW5zKTtcbiAgICAgIHRoaXMuaXNSZXNpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldERpc3BsYXllZENvbHVtbnModHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRhdGEgZm9yIHRoZSBncmlkLiBFYWNoIGl0ZW0gcmVxdWlyZXMgYW4gYGlkYCBhbmQgYSBwcm9wZXJ0eSB0aGF0IG1hcHNcbiAgICogdG8gdGhlIGBmaWVsZGAgb3IgYGlkYCBwcm9wZXJ0eSBvZiBlYWNoIGNvbHVtbiBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkYXRhOiBBcnJheTxhbnk+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgbXVsdGlzZWxlY3QgZmVhdHVyZSB0byBkaXNwbGF5IGEgY29sdW1uIG9mXG4gICAqIGNoZWNrYm94ZXMgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZ3JpZC4gWW91IGNhbiBzcGVjaWZ5IGEgdW5pcXVlIElEIHdpdGhcbiAgICogdGhlIGBtdWx0aXNlbGVjdFJvd0lkYCBwcm9wZXJ0eSwgYnV0IG11bHRpc2VsZWN0IGRlZmF1bHRzIHRvIHRoZSBgaWRgIHByb3BlcnR5IG9uXG4gICAqIHRoZSBgZGF0YWAgb2JqZWN0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVuYWJsZU11bHRpc2VsZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgZ3JpZCBmaXRzIHRvIGl0cyBwYXJlbnQuIFRoZSB2YWxpZCBvcHRpb25zIGFyZSBgd2lkdGhgLFxuICAgKiB3aGljaCBmaXRzIHRoZSBncmlkIHRvIHRoZSBwYXJlbnQncyBmdWxsIHdpZHRoLCBhbmQgYHNjcm9sbGAsIHdoaWNoIGFsbG93cyB0aGUgZ3JpZFxuICAgKiB0byBleGNlZWQgdGhlIHBhcmVudCdzIHdpZHRoLiBJZiB0aGUgZ3JpZCBkb2VzIG5vdCBoYXZlIGVub3VnaCBjb2x1bW5zIHRvIGZpbGxcbiAgICogdGhlIHBhcmVudCdzIHdpZHRoLCBpdCBhbHdheXMgc3RyZXRjaGVzIHRvIHRoZSBwYXJlbnQncyBmdWxsIHdpZHRoLlxuICAgKiBAZGVmYXVsdCBcIndpZHRoXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaXQgPSAnd2lkdGgnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgYSB0b29sYmFyIHdpdGggdGhlIGdyaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGFzVG9vbGJhciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBncmlkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUZXh0IHRvIGhpZ2hsaWdodCB3aXRoaW4gdGhlIGdyaWQuXG4gICAqIFR5cGljYWxseSwgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggc2VhcmNoLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpZ2hsaWdodFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9ic2VydmFibGUgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXNzYWdlU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5R3JpZE1lc3NhZ2U+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgSUQgdGhhdCBtYXRjaGVzIGEgcHJvcGVydHkgb24gdGhlIGBkYXRhYCBvYmplY3QuXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgdXNlcyB0aGUgYGlkYCBwcm9wZXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtdWx0aXNlbGVjdFJvd0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcm93IHRvIGhpZ2hsaWdodC4gVGhlIElEIG1hdGNoZXMgdGhlIGBpZGAgcHJvcGVydHlcbiAgICogb2YgdGhlIGBkYXRhYCBvYmplY3QuIFR5cGljYWxseSwgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICogdGhlIGZseW91dCBjb21wb25lbnQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3cuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcm93SGlnaGxpZ2h0ZWRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkIGJhc2VkIG9uIHRoZSBgaWRgIG9yIGBmaWVsZGAgcHJvcGVydGllc1xuICAgKiBvZiB0aGUgY29sdW1ucy4gSWYgbm8gY29sdW1ucyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBncmlkIGRpc3BsYXlzIGFsbCBjb2x1bW5zLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZENvbHVtbklkcyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSB0aGlzLl9zZWxlY3RlZENvbHVtbklkcztcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbklkcyA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIGlkcyBoYXZlIGNoYW5nZWQuXG4gICAgaWYgKCFjdXJyZW50SWRzIHx8ICF2YWx1ZSB8fCAhdGhpcy5hcnJheXNFcXVhbCh2YWx1ZSwgY3VycmVudElkcykpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgZW5zdXJlcyB0aGF0IHdlIGRvIG5vdCBzZXQgdXNlciBjb25maWcgb3B0aW9ucyBvciBmaXJlIHRoZSBjaGFuZ2UgZXZlbnRcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCB0aW1lIHRoYXQgdGhlIGNvbHVtbnMgYXJlIHNldCB1cFxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQpIHtcbiAgICAgICAgdGhpcy5zZXRVc2VyQ29uZmlnKHtcbiAgICAgICAgICBzZWxlY3RlZENvbHVtbklkczogdmFsdWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZENvbHVtbklkcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXNpemVkKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFRhYmxlV2lkdGgoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZENvbHVtbklkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDb2x1bW5JZHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNldCBvZiBJRHMgZm9yIHRoZSByb3dzIHRvIHNlbGVjdCBpbiBhIG11bHRpc2VsZWN0IGdyaWQuXG4gICAqIFRoZSBJRHMgbWF0Y2ggdGhlIGBpZGAgcHJvcGVydGllcyBvZiB0aGUgYGRhdGFgIG9iamVjdHMuXG4gICAqIFJvd3Mgd2l0aCBJRHMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGFyZSBkZS1zZWxlY3RlZCBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dJZHModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzID0gdmFsdWU7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRSb3dzKCk7XG4gICAgICB0aGlzLmVtaXRTZWxlY3RlZFJvd3MoU2t5R3JpZFNlbGVjdGVkUm93c1NvdXJjZS5TZWxlY3RlZFJvd0lkc0NoYW5nZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZFJvd0lkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSb3dJZHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBrZXkgZm9yIHRoZSBVSSBDb25maWcgU2VydmljZSB0byByZXRyaWV2ZSBzdG9yZWQgc2V0dGluZ3MgZnJvbSBhIGRhdGFiYXNlLlxuICAgKiBUaGUgVUkgQ29uZmlnIFNlcnZpY2Ugc2F2ZXMgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdXNlcnMgYW5kIHJldHVybnNcbiAgICogYHNlbGVjdGVkQ29sdW1uSWRzYCB0byBwcmVzZXJ2ZSB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGFuZCB0aGUgcHJlZmVycmVkIGNvbHVtbiBvcmRlci4gWW91ICBtdXN0IHByb3ZpZGUgYGlkYCB2YWx1ZXMgZm9yIHlvdXIgYHNreS1ncmlkLWNvbHVtbmAgZWxlbWVudHMgYmVjYXVzZSB0aGUgVUkgQ29uZmlnIFNlcnZpY2UgZGVwZW5kcyBvbiB0aG9zZSB2YWx1ZXMgdG8gb3JnYW5pemUgY29sdW1ucyBiYXNlZCBvbiB1c2VyIHNldHRpbmdzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVUkgQ29uZmlnIFNlcnZpY2UsIHNlZSBbdGhlIHN0aWNreSBzZXR0aW5ncyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2RldmVsb3Avc3RpY2t5LXNldHRpbmdzKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXR0aW5nc0tleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBhIGNhcmV0IGluIHRoZSBjb2x1bW4gdGhhdCB3YXMgdXNlZCB0byBzb3J0IHRoZSBncmlkLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWxcbiAgICogd2hlbiB5b3UgcHJvZ3JhbW1hdGljYWxseSBzb3J0IGRhdGEgYW5kIHdhbnQgdG8gdmlzdWFsbHkgaW5kaWNhdGUgaG93IHRoZSBncmlkIHdhcyBzb3J0ZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBhIGBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbGAgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqIC0gYGZpZWxkU2VsZWN0b3JgIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc29ydCBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGBzdHJpbmdgIHZhbHVlcy5cbiAgICogLSBgZGVzY2VuZGluZ2AgSW5kaWNhdGVzIHdoZXRoZXIgdG8gc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyLiBUaGUgY2FyZXQgdGhhdCB2aXN1YWxseVxuICAgKiBpbmRpY2F0ZXMgdGhlIHNvcnQgb3JkZXIgcG9pbnRzIGRvd24gZm9yIGRlc2NlbmRpbmcgb3JkZXIgYW5kIHVwIGZvciBhc2NlbmRpbmcgb3JkZXIuXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBgYm9vbGVhbmAgdmFsdWVzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc29ydEZpZWxkOiBMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbDtcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBncmlkIGluIHBpeGVscy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB3aWR0aCBvZiBhIGNvbHVtbiBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjb2x1bW5XaWR0aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgQXJyYXk8U2t5R3JpZENvbHVtbldpZHRoTW9kZWxDaGFuZ2U+XG4gID4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgc2VsZWN0aW9uIG9mIG11bHRpc2VsZWN0IGNoZWNrYm94ZXMgY2hhbmdlcy5cbiAgICogRW1pdHMgYW4gYXJyYXkgb2YgSURzIGZvciB0aGUgc2VsZWN0ZWQgcm93cyBiYXNlZCBvbiB0aGUgYG11bHRpc2VsZWN0Um93SWRgIHByb3BlcnR5XG4gICAqIHRoYXQgdGhlIGNvbnN1bWVyIHByb3ZpZGVzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtdWx0aXNlbGVjdFNlbGVjdGlvbkNoYW5nZSA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxTa3lHcmlkU2VsZWN0ZWRSb3dzTW9kZWxDaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByb3dEZWxldGVDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUdyaWRSb3dEZWxldGVDYW5jZWxBcmdzPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcm93RGVsZXRlQ29uZmlybSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5R3JpZFJvd0RlbGV0ZUNvbmZpcm1BcmdzPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQgY2hhbmdlIG9yIHdoZW4gdGhlIG9yZGVyIG9mIHRoZSBjb2x1bW5zIGNoYW5nZXMuXG4gICAqIFRoZSBldmVudCBlbWl0cyBhbiBhcnJheSBvZiBJRHMgZm9yIHRoZSBkaXNwbGF5ZWQgY29sdW1ucyB0aGF0IHJlZmxlY3RzIHRoZSBjb2x1bW4gb3JkZXIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNlbGVjdGVkQ29sdW1uSWRzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxzdHJpbmc+PigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgc29ydCBmaWVsZCBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzb3J0RmllbGRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RTb3J0RmllbGRTZWxlY3Rvck1vZGVsPigpO1xuXG4gIHB1YmxpYyBjb2x1bW5SZXNpemVTdGVwID0gMTA7XG4gIHB1YmxpYyBjdXJyZW50U29ydEZpZWxkOiBCZWhhdmlvclN1YmplY3Q8TGlzdFNvcnRGaWVsZFNlbGVjdG9yTW9kZWw+O1xuICBwdWJsaWMgZGlzcGxheWVkQ29sdW1uczogQXJyYXk8U2t5R3JpZENvbHVtbk1vZGVsPjtcbiAgcHVibGljIGRyYWd1bGFHcm91cE5hbWU6IHN0cmluZztcbiAgcHVibGljIGdyaWRJZDogbnVtYmVyID0gKytuZXh0SWQ7XG4gIHB1YmxpYyByb3dEZWxldGVDb25maWdzOiBTa3lHcmlkUm93RGVsZXRlQ29uZmlnW10gPSBbXTtcbiAgcHVibGljIGl0ZW1zOiBBcnJheTxhbnk+O1xuICBwdWJsaWMgbWF4Q29sV2lkdGggPSA5OTk5OyAvLyBUaGlzIGlzIGFuIGFyYml0cmFyeSBudW1iZXIsIGFzIHRoZSBpbnB1dCByYW5nZSBwaWNrZXIgd29uJ3Qgd29yayB3aXRob3V0IGEgdmFsdWUuXG4gIHB1YmxpYyBtaW5Db2xXaWR0aCA9IDUwO1xuICBwdWJsaWMgc2hvd1Jlc2l6ZUJhciA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd1RvcFNjcm9sbCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBnZXQgdGFibGVXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5R3JpZENvbHVtbkNvbXBvbmVudClcbiAgcHJpdmF0ZSBjb2x1bW5Db21wb25lbnRzOiBRdWVyeUxpc3Q8U2t5R3JpZENvbHVtbkNvbXBvbmVudD47XG5cbiAgQFZpZXdDaGlsZHJlbignZ3JpZENvbCcpXG4gIHByaXZhdGUgY29sdW1uRWxlbWVudFJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZHJlbignY29sU2l6ZVJhbmdlJylcbiAgcHJpdmF0ZSBjb2x1bW5SYW5nZUlucHV0RWxlbWVudFJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZHJlbignaW5saW5lRGVsZXRlUmVmJylcbiAgcHJpdmF0ZSBpbmxpbmVEZWxldGVSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ2lubGluZURlbGV0ZVRlbXBsYXRlUmVmJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwcml2YXRlIGlubGluZURlbGV0ZVRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgQFZpZXdDaGlsZCgnZ3JpZENvbnRhaW5lcicpXG4gIHByaXZhdGUgdGFibGVDb250YWluZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdncmlkVGFibGUnKVxuICBwcml2YXRlIHRhYmxlRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndG9wU2Nyb2xsQ29udGFpbmVyJylcbiAgcHJpdmF0ZSB0b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdyZXNpemVCYXInKVxuICBwcml2YXRlIHJlc2l6ZUJhcjogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIGFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4OiBzdHJpbmc7XG4gIHByaXZhdGUgaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSA9IGZhbHNlO1xuICBwcml2YXRlIGlzUmVzaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJvd0RlbGV0ZUNvbnRlbnRzOiB7IFtpZDogc3RyaW5nXTogU2t5R3JpZFJvd0RlbGV0ZUNvbnRlbnRzIH0gPSB7fTtcbiAgcHJpdmF0ZSBzdGFydENvbHVtbldpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBzY3JvbGxUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbHVtbklkc1NldCA9IGZhbHNlO1xuICBwcml2YXRlIHhQb3NTdGFydDogbnVtYmVyO1xuXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PFNreUdyaWRDb2x1bW5Nb2RlbD47XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uSWRzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIF9zZWxlY3RlZFJvd0lkczogQXJyYXk8c3RyaW5nPjtcblxuICByZWFkb25seSAjZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFmZml4U2VydmljZTogU2t5QWZmaXhTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZHJhZ3VsYVNlcnZpY2U6IERyYWd1bGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JpZEFkYXB0ZXI6IFNreUdyaWRBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBwcml2YXRlIHNreVdpbmRvdzogU2t5QXBwV2luZG93UmVmLFxuICAgIHByaXZhdGUgdWlDb25maWdTZXJ2aWNlOiBTa3lVSUNvbmZpZ1NlcnZpY2UsXG4gICAgbG9nZ2VyOiBTa3lMb2dTZXJ2aWNlLFxuICApIHtcbiAgICBsb2dnZXIuZGVwcmVjYXRlZCgnU2t5R3JpZENvbXBvbmVudCcsIHtcbiAgICAgIGRlcHJlY2F0aW9uTWFqb3JWZXJzaW9uOiA2LFxuICAgICAgbW9yZUluZm9Vcmw6ICdodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvZGF0YS1ncmlkJyxcbiAgICAgIHJlcGxhY2VtZW50UmVjb21tZW5kYXRpb246ICdVc2UgZGF0YSBncmlkIGluc3RlYWQuJyxcbiAgICB9KTtcblxuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uTW9kZWw+KCk7XG4gICAgdGhpcy5pdGVtcyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0U29ydEZpZWxkU2VsZWN0b3JNb2RlbD4oe1xuICAgICAgZmllbGRTZWxlY3RvcjogJycsXG4gICAgICBkZXNjZW5kaW5nOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLmRyYWd1bGFHcm91cE5hbWUgPSBgc2t5LWdyaWRzLWdyb3VwLSR7dGhpcy5ncmlkSWR9YDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VTdHJlYW1cbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobWVzc2FnZTogU2t5R3JpZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzS2V5KSB7XG4gICAgICB0aGlzLmFwcGx5VXNlckNvbmZpZygpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRDb2x1bW5zKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGNvbHVtbiBkcmFnLWFuZC1kcm9wLlxuICAgIHRoaXMuZ3JpZEFkYXB0ZXIuaW5pdGlhbGl6ZURyYWdBbmREcm9wKFxuICAgICAgdGhpcy5kcmFndWxhR3JvdXBOYW1lLFxuICAgICAgdGhpcy5kcmFndWxhU2VydmljZSxcbiAgICAgIChzZWxlY3RlZENvbHVtbklkczogQXJyYXk8c3RyaW5nPikgPT4ge1xuICAgICAgICB0aGlzLm9uSGVhZGVyRHJvcChzZWxlY3RlZENvbHVtbklkcyk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLmFwcGx5U2VsZWN0ZWRSb3dzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydjb2x1bW5zJ10gJiYgdGhpcy5jb2x1bW5zKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbHVtbklkcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzID0gdGhpcy5zZWxlY3RlZENvbHVtbklkcy5maWx0ZXIoKGNvbHVtbklkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RGlzcGxheWVkQ29sdW1ucyh0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmIHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG5cbiAgICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgZGF0YSBoYXMgcmVuZGVyZWQgaW4gdGhlIGdyaWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBUaGlzIGNsZWFucyB1cCBhbnkgbGluZ2VyaW5nIHJvdyBkZWxldGVzIGZvciBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLlxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGlkKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Um93RGVsZXRlKGlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHJvd3MgcmUtcmVuZGVyIHRodXMgbWVzc2luZyB1cCB0aGUgYWZmaXhlcnMuIFdlIG11c3QgcmVhZmZpeCB0aGVtIHNvIHRoYXQgdGhpbmdzXG4gICAgICAgICAgICAvLyBjb250aW51ZSB0byByZW5kZXIgY29ycmVjdGx5LlxuICAgICAgICAgICAgY29uc3Qgcm93RWxlbWVudDogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgJ1tza3ktY21wLWlkPVwiJyArIGlkICsgJ1wiXScsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdLmFmZml4ZXIuYWZmaXhUbyhyb3dFbGVtZW50LCB7XG4gICAgICAgICAgICAgIGF1dG9GaXRDb250ZXh0OiBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LlZpZXdwb3J0LFxuICAgICAgICAgICAgICBpc1N0aWNreTogdHJ1ZSxcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiAnYWJvdmUnLFxuICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogJ3RvcCcsXG4gICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdsZWZ0JyxcbiAgICAgICAgICAgICAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hlY2tVc2VyQ29sdW1uV2lkdGhzRm9yU2Nyb2xsKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snc29ydEZpZWxkJ10pIHtcbiAgICAgIHRoaXMuc2V0U29ydEhlYWRlcnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLm11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5yb3dEZWxldGVDb250ZW50cykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIHRoaXMuZGVzdHJveVJvd0RlbGV0ZShpZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRyYWd1bGFTZXJ2aWNlLmRlc3Ryb3kodGhpcy5kcmFndWxhR3JvdXBOYW1lKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb3BTY3JvbGxXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICB9XG5cbiAgcHVibGljIGdldFRhYmxlQ2xhc3NOYW1lcygpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZml0ICE9PSAnc2Nyb2xsJykge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1maXQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNUb29sYmFyKSB7XG4gICAgICBjbGFzc05hbWVzLnB1c2goJ3NreS1ncmlkLWhhcy10b29sYmFyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkRGVsaW1pdGVyKGNsYXNzTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFibGVIZWFkZXJDbGFzc05hbWVzKGNvbHVtbjogU2t5R3JpZENvbHVtbk1vZGVsKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxvY2tlZCkge1xuICAgICAgY2xhc3NOYW1lcy5wdXNoKCdza3ktZ3JpZC1oZWFkZXItbG9ja2VkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkRGVsaW1pdGVyKGNsYXNzTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FyZXRJY29uTmFtZXMoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpIHtcbiAgICBjb25zdCBpY29uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0aGlzLmdldFNvcnREaXJlY3Rpb24oY29sdW1uLmZpZWxkKS5zdWJzY3JpYmUoKHNvcnREaXIpID0+IHtcbiAgICAgIGlmIChzb3J0RGlyID09PSAnYXNjJykge1xuICAgICAgICBpY29uTmFtZXMucHVzaCgnY2FyZXQtdXAnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0RGlyID09PSAnZGVzYycpIHtcbiAgICAgICAgaWNvbk5hbWVzLnB1c2goJ2NhcmV0LWRvd24nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZERlbGltaXRlcihpY29uTmFtZXMsICcgJyk7XG4gIH1cblxuICBwdWJsaWMgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChrZXkgPT09ICdlbnRlcicgfHwga2V5ID09PSAnICcpIHtcbiAgICAgIHRoaXMuc29ydEJ5Q29sdW1uKGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNvcnRCeUNvbHVtbihjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlICYmIGNvbHVtbi5pc1NvcnRhYmxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0RmllbGRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICBtYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgIGZpZWxkU2VsZWN0b3I6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgICAgICAgZGVzY2VuZGluZzogdHJ1ZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQgJiZcbiAgICAgICAgICAgICAgZmllbGQuZmllbGRTZWxlY3RvciA9PT0gY29sdW1uLmZpZWxkICYmXG4gICAgICAgICAgICAgIGZpZWxkLmRlc2NlbmRpbmdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICBmaWVsZFNlbGVjdG9yOiBjb2x1bW4uZmllbGQsXG4gICAgICAgICAgICAgICAgZGVzY2VuZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvcnRGaWVsZENoYW5nZS5lbWl0KHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZC5uZXh0KHNlbGVjdG9yKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb24oY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbkZpZWxkXG4gICAgICAgICAgPyBmaWVsZC5kZXNjZW5kaW5nXG4gICAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgICAgOiAnYXNjJ1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcmlhU29ydERpcmVjdGlvbihjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnRGaWVsZC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkU2VsZWN0b3IgPT09IGNvbHVtbi5maWVsZFxuICAgICAgICAgID8gZmllbGQuZGVzY2VuZGluZ1xuICAgICAgICAgICAgPyAnZGVzY2VuZGluZydcbiAgICAgICAgICAgIDogJ2FzY2VuZGluZydcbiAgICAgICAgICA6IGNvbHVtbi5pc1NvcnRhYmxlXG4gICAgICAgICAgPyAnbm9uZSdcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FyZXRWaXNpYmlsaXR5KGNvbHVtbkZpZWxkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3J0RmllbGQucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWVsZC5maWVsZFNlbGVjdG9yID09PSBjb2x1bW5GaWVsZCA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uRmllbGQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldENhcmV0VmlzaWJpbGl0eShjb2x1bW5GaWVsZCkucGlwZShcbiAgICAgIG1hcCgodmlzaWJpbGl0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB2aXNpYmlsaXR5ID09PSAnaGlkZGVuJztcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlKCkge1xuICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLkNoZWNrYm94Q2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW5IZWFkaW5nKGNoYW5nZTogU2t5R3JpZENvbHVtbkhlYWRpbmdNb2RlbENoYW5nZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjaGFuZ2UuaWQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuaWQgPT09IGNvbHVtbi5pZCkgfHxcbiAgICAgICAgKGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGZvdW5kQ29sdW1uTW9kZWwpIHtcbiAgICAgIGZvdW5kQ29sdW1uTW9kZWwuaGVhZGluZyA9IGNoYW5nZS52YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUlubGluZUhlbHBQb3BvdmVyKFxuICAgIGNoYW5nZTogU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UsXG4gICkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1uTW9kZWwgPSB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uOiBTa3lHcmlkQ29sdW1uTW9kZWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjaGFuZ2UuaWQgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2UuaWQgPT09IGNvbHVtbi5pZCkgfHxcbiAgICAgICAgKGNoYW5nZS5maWVsZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5maWVsZCA9PT0gY29sdW1uLmZpZWxkKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGZvdW5kQ29sdW1uTW9kZWwpIHtcbiAgICAgIGZvdW5kQ29sdW1uTW9kZWwuaW5saW5lSGVscFBvcG92ZXIgPSBjaGFuZ2UudmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDb2x1bW5EZXNjcmlwdGlvbihjaGFuZ2U6IFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlKSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5Nb2RlbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW46IFNreUdyaWRDb2x1bW5Nb2RlbCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNoYW5nZS5pZCAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZS5pZCA9PT0gY29sdW1uLmlkKSB8fFxuICAgICAgICAoY2hhbmdlLmZpZWxkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlLmZpZWxkID09PSBjb2x1bW4uZmllbGQpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm91bmRDb2x1bW5Nb2RlbCkge1xuICAgICAgZm91bmRDb2x1bW5Nb2RlbC5kZXNjcmlwdGlvbiA9IGNoYW5nZS52YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUmVzaXplQ29sdW1uU3RhcnQoZXZlbnQ6IHtcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHZvaWQ7XG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7XG4gICAgcGFnZVg/OiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICAvLyBJZiB0aGlzIHRhYmxlIGhhc24ndCBiZWVuIHJlc2l6ZWQsIGluaXRpYWxpemUgYWxsIHRoZSByZXNpemUgd2lkdGhzLlxuICAgIGlmICghdGhpcy5pc1Jlc2l6ZWQpIHtcbiAgICAgIHRoaXMuaW5pdENvbHVtbldpZHRocygpO1xuICAgICAgdGhpcy5pc1Jlc2l6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZVJlc2l6ZUNvbHVtbihldmVudCk7XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGUgPSB0cnVlO1xuICAgIHRoaXMueFBvc1N0YXJ0ID0gZXZlbnQucGFnZVg7XG4gICAgdGhpcy5zaG93UmVzaXplQmFyID0gdHJ1ZTtcblxuICAgIC8vIFNob3cgdmlzdWFsIGluZGljYXRvciBvZiB3aGVyZSBtb3VzZSBpcyBkcmFnZ2luZyAocmVzaXplQmFyKS5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGV2ZW50LnBhZ2VYKTtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBtb3VzZU1vdmVFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScpO1xuICAgIGNvbnN0IHRvdWNoTW92ZUV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2htb3ZlJyk7XG5cbiAgICBtZXJnZShtb3VzZU1vdmVFdmVudCwgdG91Y2hNb3ZlRXZlbnQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0RyYWdnaW5nUmVzaXplSGFuZGxlO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG1vdmVFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25SZXNpemVIYW5kbGVNb3ZlKG1vdmVFdmVudCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IG1vdXNlVXBFdmVudCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcbiAgICBjb25zdCB0b3VjaEVuZEV2ZW50ID0gZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2hlbmQnKTtcblxuICAgIG1lcmdlKG1vdXNlVXBFdmVudCwgdG91Y2hFbmRFdmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmdSZXNpemVIYW5kbGU7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZW5kRXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uUmVzaXplSGFuZGxlUmVsZWFzZShlbmRFdmVudCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleWRvd25SZXNpemVDb2woZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAvLyBJZiB0aGlzIHRhYmxlIGhhc24ndCBiZWVuIHJlc2l6ZWQsIGluaXRpYWxpemUgYWxsIHRoZSByZXNpemUgd2lkdGhzLlxuICAgIGlmICghdGhpcy5pc1Jlc2l6ZWQpIHtcbiAgICAgIHRoaXMuaW5pdENvbHVtbldpZHRocygpO1xuICAgICAgdGhpcy5pc1Jlc2l6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZVJlc2l6ZUNvbHVtbihldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25JbnB1dENoYW5nZVJlc2l6ZUNvbChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gTnVtYmVyKGlucHV0LnZhbHVlKTtcbiAgICBjb25zdCBkZWx0YVggPSBuZXdWYWx1ZSAtIHRoaXMuc3RhcnRDb2x1bW5XaWR0aDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCwgbmV3VmFsdWUsIGRlbHRhWCk7XG4gICAgY29uc3QgbGVmdCA9IGlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihsZWZ0KTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZUhhbmRsZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5wYWdlWCAtIHRoaXMueFBvc1N0YXJ0O1xuICAgIGNvbnN0IG5ld0NvbFdpZHRoID0gdGhpcy5zdGFydENvbHVtbldpZHRoICsgZGVsdGFYO1xuXG4gICAgaWYgKG5ld0NvbFdpZHRoIDw9IHRoaXMubWluQ29sV2lkdGgpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IHRoaXMuZ2V0TWF4UmFuZ2VCeUluZGV4KHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXgpO1xuICAgIGlmICh0aGlzLmZpdCA9PT0gJ3dpZHRoJyAmJiBuZXdDb2xXaWR0aCA+IG1heCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZXRSZXNpemVCYXJQb3NpdGlvbihldmVudC5wYWdlWCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVCbHVyKCkge1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlRm9jdXMoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICB0aGlzLnNob3dSZXNpemVCYXIgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGxlZnQgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICB0aGlzLnNldFJlc2l6ZUJhclBvc2l0aW9uKGxlZnQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlUmVsZWFzZShldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuc2hvd1Jlc2l6ZUJhciA9IGZhbHNlO1xuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy54UG9zU3RhcnQ7XG4gICAgY29uc3QgbmV3Q29sV2lkdGggPSB0aGlzLnN0YXJ0Q29sdW1uV2lkdGggKyBkZWx0YVg7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5CeUluZGV4KHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXgsIG5ld0NvbFdpZHRoLCBkZWx0YVgpO1xuICAgIHRoaXMuaXNEcmFnZ2luZ1Jlc2l6ZUhhbmRsZSA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlUmVzaXplQ29sdW1uSW5kZXggPSB1bmRlZmluZWQ7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uUm93Q2xpY2soZXZlbnQ6IGFueSwgc2VsZWN0ZWRJdGVtOiBMaXN0SXRlbU1vZGVsKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5lbmFibGVNdWx0aXNlbGVjdCkge1xuICAgICAgaWYgKFxuICAgICAgICBldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgfHxcbiAgICAgICAgIXRoaXMuaXNJbnRlcmFjdGl2ZUVsZW1lbnQoZXZlbnQpXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLmlzU2VsZWN0ZWQgPSAhc2VsZWN0ZWRJdGVtLmlzU2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLlJvd0NsaWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNSb3dIaWdobGlnaHRlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucm93SGlnaGxpZ2h0ZWRJZCkge1xuICAgICAgcmV0dXJuIGlkID09PSB0aGlzLnJvd0hpZ2hsaWdodGVkSWQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dIZWlnaHQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEFkYXB0ZXIuZ2V0Um93SGVpZ2h0KHRoaXMudGFibGVFbGVtZW50UmVmLCBpbmRleCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsUm93RGVsZXRlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MgPSB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmlsdGVyKFxuICAgICAgKGNvbmZpZykgPT4gY29uZmlnLmlkICE9PSBpZCxcbiAgICApO1xuICAgIHRoaXMucm93RGVsZXRlQ2FuY2VsLmVtaXQoeyBpZDogaWQgfSk7XG5cbiAgICB0aGlzLmRlc3Ryb3lSb3dEZWxldGUoaWQpO1xuICB9XG5cbiAgcHVibGljIGNvbmZpcm1Sb3dEZWxldGUoaWQ6IHN0cmluZykge1xuICAgIHRoaXMucm93RGVsZXRlQ29uZmlncy5maW5kKChjb25maWcpID0+IGNvbmZpZy5pZCA9PT0gaWQpLnBlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMucm93RGVsZXRlQ29uZmlybS5lbWl0KHsgaWQ6IGlkIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJvd0RlbGV0ZUl0ZW0oaWQ6IHN0cmluZyk6IFNreUdyaWRSb3dEZWxldGVDb25maWcge1xuICAgIHJldHVybiB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmluZCgocm93RGVsZXRlKSA9PiByb3dEZWxldGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgdG91Y2ggZGV2aWNlcyBmcm9tIGluYWR2ZXJ0ZW50bHkgc2Nyb2xsaW5nIGdyaWQgd2hpbGUgZHJhZ2dpbmcgY29sdW1ucy5cbiAgcHVibGljIG9uVG91Y2hNb3ZlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHVibGljIG9uVG9wU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZikge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsVHJpZ2dlcmVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFibGVDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9XG4gICAgICAgICAgdGhpcy50b3BTY3JvbGxDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25HcmlkU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnRvcFNjcm9sbENvbnRhaW5lckVsZW1lbnRSZWYpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRyaWdnZXJlZCkge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvcFNjcm9sbENvbnRhaW5lckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNjcm9sbFRyaWdnZXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1VzZXJDb2x1bW5XaWR0aHNGb3JTY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1RvcFNjcm9sbCAmJlxuICAgICAgdGhpcy5jb2x1bW5FbGVtZW50UmVmcyAmJlxuICAgICAgdGhpcy5jb2x1bW5FbGVtZW50UmVmcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBsZXQgY29sdW1uc1dpZHRoVG90YWwgPSAwO1xuICAgICAgY29uc3Qgd2luZG93U2l6ZSA9IHRoaXMuc2t5V2luZG93Lm5hdGl2ZVdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgdGhpcy5jb2x1bW5FbGVtZW50UmVmcy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dUb3BTY3JvbGwpIHtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFdpZHRoID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbC5uYXRpdmVFbGVtZW50KS53aWR0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG9mZnNldFdpZHRoID0gY29sLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggfHwgb2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICB0aGlzLm1pbkNvbFdpZHRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29sdW1uc1dpZHRoVG90YWwgPSBjb2x1bW5zV2lkdGhUb3RhbCArIHdpZHRoO1xuICAgICAgICAgIGlmIChjb2x1bW5zV2lkdGhUb3RhbCA+IHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RvcFNjcm9sbCA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtdWx0aXNlbGVjdFNlbGVjdEFsbCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0ZWRSb3dzKFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UuU2VsZWN0QWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgbXVsdGlzZWxlY3RDbGVhckFsbCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGVkUm93cyhTa3lHcmlkU2VsZWN0ZWRSb3dzU291cmNlLkNsZWFyQWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlOiBTa3lHcmlkTWVzc2FnZSkge1xuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlIFNreUdyaWRNZXNzYWdlVHlwZS5TZWxlY3RBbGw6XG4gICAgICAgIHRoaXMubXVsdGlzZWxlY3RTZWxlY3RBbGwoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLkNsZWFyQWxsOlxuICAgICAgICB0aGlzLm11bHRpc2VsZWN0Q2xlYXJBbGwoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNreUdyaWRNZXNzYWdlVHlwZS5Qcm9tcHREZWxldGVSb3c6XG4gICAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICYmIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0NvbmZpZyA9IHRoaXMucm93RGVsZXRlQ29uZmlncy5maW5kKFxuICAgICAgICAgICAgKGNvbmZpZykgPT4gY29uZmlnLmlkID09PSBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICAgICAgICBleGlzdGluZ0NvbmZpZy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm93RGVsZXRlQ29uZmlncy5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQsXG4gICAgICAgICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5jcmVhdGUoe1xuICAgICAgICAgICAgICBlbmFibGVTY3JvbGw6IHRydWUsXG4gICAgICAgICAgICAgIHNob3dCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICBlbmFibGVDbG9zZTogZmFsc2UsXG4gICAgICAgICAgICAgIGVuYWJsZVBvaW50ZXJFdmVudHM6IHRydWUsXG4gICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuI2Vudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgb3ZlcmxheS5hdHRhY2hUZW1wbGF0ZSh0aGlzLmlubGluZURlbGV0ZVRlbXBsYXRlUmVmLCB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogdGhpcy5kYXRhLmZpbmQoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uaWQgPT09IG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXZSBhcmUgbWFudWFsbHkgc2V0dGluZyB0aGUgei1pbmRleCBoZXJlIGJlY2F1c2Ugb3ZlcmxheXMgd2lsbCBhbHdheXMgYmUgb24gdG9wIG9mXG4gICAgICAgICAgICAgKiB0aGUgb21uaWJhci4gVGhpcyBtYW51YWwgc2V0dGluZyBpcyAxIGxlc3MgdGhhbiB0aGUgb21uaWJhcidzIHotaW5kZXggb2YgMTAwMC4gV2VcbiAgICAgICAgICAgICAqIGRpc2N1c3NlZCBjaGFuZ2luZyB0aGUgb3ZlcmxheSBzZXJ2aWNlIHRvIGFsbG93IGZvciB0aGlzIGJ1dCBkZWNpZGVkIGFnYWluc3QgdGhhdFxuICAgICAgICAgICAgICogY2hhbmdlIGF0IHRoaXMgdGltZSBkdWUgdG8gaXRzIG5pY2hlIG5hdHVyZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgb3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UuekluZGV4ID0gJzk5OSc7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmxpbmVEZWxldGVSZWYgPSB0aGlzLmlubGluZURlbGV0ZVJlZnNcbiAgICAgICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAgICAgLmZpbmQoKGVsUmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmlkID09PVxuICAgICAgICAgICAgICAgICAgICAncm93LWRlbGV0ZS1yZWYtJyArIG1lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGFmZml4ZXIgPSB0aGlzLmFmZml4U2VydmljZS5jcmVhdGVBZmZpeGVyKGlubGluZURlbGV0ZVJlZik7XG5cbiAgICAgICAgICAgICAgY29uc3Qgcm93RWxlbWVudDogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICdbc2t5LWNtcC1pZD1cIicgKyBtZXNzYWdlLmRhdGEucHJvbXB0RGVsZXRlUm93LmlkICsgJ1wiXScsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBhZmZpeGVyLmFmZml4VG8ocm93RWxlbWVudCwge1xuICAgICAgICAgICAgICAgIGF1dG9GaXRDb250ZXh0OiBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LlZpZXdwb3J0LFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHBsYWNlbWVudDogJ2Fib3ZlJyxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogJ3RvcCcsXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgICAgICAgICAgIGVuYWJsZUF1dG9GaXQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW21lc3NhZ2UuZGF0YS5wcm9tcHREZWxldGVSb3cuaWRdID0ge1xuICAgICAgICAgICAgICAgIGFmZml4ZXI6IGFmZml4ZXIsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU2t5R3JpZE1lc3NhZ2VUeXBlLkFib3J0RGVsZXRlUm93OlxuICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSAmJiBtZXNzYWdlLmRhdGEuYWJvcnREZWxldGVSb3cpIHtcbiAgICAgICAgICB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MgPSB0aGlzLnJvd0RlbGV0ZUNvbmZpZ3MuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbmZpZykgPT4gY29uZmlnLmlkICE9PSBtZXNzYWdlLmRhdGEuYWJvcnREZWxldGVSb3cuaWQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuZGVzdHJveVJvd0RlbGV0ZShtZXNzYWdlLmRhdGEuYWJvcnREZWxldGVSb3cuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhlYWRlckRyb3AobmV3Q29sdW1uSWRzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgLy8gdXBkYXRlIHNlbGVjdGVkIGNvbHVtbklkc1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHNTZXQgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgPSBuZXdDb2x1bW5JZHM7XG5cbiAgICAvLyBtYXJrIGZvciBjaGVjayBiZWNhdXNlIHdlIGFyZSB1c2luZyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5vblB1c2hcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREaXNwbGF5ZWRDb2x1bW5zKHJlc3BlY3RIaWRkZW4gPSBmYWxzZSkge1xuICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2x1bW5JZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBzZXR1cCBkaXNwbGF5ZWQgY29sdW1uc1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1uSWRzXG4gICAgICAgICAgLmZpbHRlcigoY29sdW1uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4uaWQgPT09IGNvbHVtbklkKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKGNvbHVtbklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uaWQgPT09IGNvbHVtbklkKVswXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcGVjdEhpZGRlbikge1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IHtcbiAgICAgICAgICByZXR1cm4gIWNvbHVtbi5oaWRkZW47XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtRGF0YSgpIHtcbiAgICAvLyBUcmFuc2Zvcm0gZGF0YSBpbnRvIG9iamVjdCB3aXRoIGlkIGFuZCBkYXRhIHByb3BlcnRpZXNcbiAgICBpZiAoXG4gICAgICB0aGlzLmRhdGEgJiZcbiAgICAgIHRoaXMuZGF0YS5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmRhdGFbMF0uaWQgJiZcbiAgICAgICF0aGlzLmRhdGFbMF0uZGF0YVxuICAgICkge1xuICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3RSb3dJZCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5nZXRHcmlkRGF0YVdpdGhTZWxlY3RlZFJvd3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGEubWFwKChpdGVtKSA9PiBuZXcgTGlzdEl0ZW1Nb2RlbChpdGVtLmlkLCBpdGVtKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcmlkRGF0YVdpdGhTZWxlY3RlZFJvd3MoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgbGV0IGNoZWNrZWQ7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZW0sIHRoaXMubXVsdGlzZWxlY3RSb3dJZCkpIHtcbiAgICAgICAgY2hlY2tlZCA9IHNlbGVjdGVkUm93cy5pbmRleE9mKGl0ZW1bdGhpcy5tdWx0aXNlbGVjdFJvd0lkXSkgPiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrZWQgPSBzZWxlY3RlZFJvd3MuaW5kZXhPZihpdGVtLmlkKSA+IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMaXN0SXRlbU1vZGVsKGl0ZW0uaWQsIGl0ZW0sIGNoZWNrZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdGVkUm93cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaV0uaXNTZWxlY3RlZCA9XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5pbmRleE9mKHRoaXMuaXRlbXNbaV0uaWQpID4gLTE7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0U29ydEhlYWRlcnMoKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkLm5leHQoXG4gICAgICB0aGlzLnNvcnRGaWVsZCB8fCB7IGZpZWxkU2VsZWN0b3I6ICcnLCBkZXNjZW5kaW5nOiBmYWxzZSB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbnNGcm9tQ29tcG9uZW50KCkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uQ29tcG9uZW50cy5tYXAoKGNvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTa3lHcmlkQ29sdW1uTW9kZWwoY29sdW1uQ29tcG9uZW50LnRlbXBsYXRlLCBjb2x1bW5Db21wb25lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZ2V0Q29sdW1uc0Zyb21Db21wb25lbnQoKTtcblxuICAgIC8vIFRoaXMgc2V0IHRpbWVvdXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgY29sdW1ucyBoYXZlIHJlbmRlcmVkIGluIHRoZSBncmlkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrVXNlckNvbHVtbldpZHRoc0ZvclNjcm9sbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5CeUluZGV4KFxuICAgIGNvbHVtbkluZGV4OiBzdHJpbmcsXG4gICAgbmV3Q29sV2lkdGg6IG51bWJlcixcbiAgICBkZWx0YVg6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuXG4gICAgLy8gUHJldmVudCBhY2NpZGVudGFsIHNocmlua2FnZSBiZWxvdyBtaW5pbXVtIHdpZHRoLlxuICAgIGlmIChuZXdDb2xXaWR0aCA8PSB0aGlzLm1pbkNvbFdpZHRoKSB7XG4gICAgICBkZWx0YVggPSBkZWx0YVggKyB0aGlzLm1pbkNvbFdpZHRoIC0gbmV3Q29sV2lkdGg7XG4gICAgICBuZXdDb2xXaWR0aCA9IHRoaXMubWluQ29sV2lkdGg7XG4gICAgfVxuXG4gICAgLy8gZml0PXdpZHRoIGFkZHMvcmVtb3ZlcyB3aWR0aCBmcm9tIHRoZSBsYXN0IGNvbHVtblxuICAgIC8vIGZpdD1zY3JvbGwgYWRkcy9yZW1vdmVzIHdpZHRoIGZyb20gdGhlIHRhYmxlXG4gICAgaWYgKHRoaXMuZml0ID09PSAnd2lkdGgnKSB7XG4gICAgICBjb25zdCBsYXN0Q29sdW1uID0gdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCk7XG5cbiAgICAgIC8vIFByZXZlbnQgYWNjaWRlbnRhbCBncm93dGggdGhhdCB3b3VsZCBidW1wIGxhc3QgY29sdW1uIG9mZiBzY3JlZW4uXG4gICAgICBjb25zdCBtYXggPSB0aGlzLmdldE1heFJhbmdlQnlJbmRleChjb2x1bW5JbmRleCk7XG4gICAgICBpZiAobmV3Q29sV2lkdGggPiBtYXgpIHtcbiAgICAgICAgbmV3Q29sV2lkdGggPSBtYXg7XG4gICAgICAgIGRlbHRhWCA9IG1heCAtIHRoaXMuc3RhcnRDb2x1bW5XaWR0aDtcbiAgICAgIH1cbiAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbFdpZHRoO1xuICAgICAgbGFzdENvbHVtbi53aWR0aCA9IGxhc3RDb2x1bW4ud2lkdGggLSBkZWx0YVg7XG4gICAgICB0aGlzLnVwZGF0ZU1heFJhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMudGFibGVFbGVtZW50UmVmLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICBgJHt0aGlzLnRhYmxlV2lkdGggKyBkZWx0YVh9cHhgLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbFdpZHRoO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuY29sdW1uV2lkdGhDaGFuZ2UuZW1pdCh0aGlzLmdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5XaWR0aHMoKSB7XG4gICAgLy8gRXN0YWJsaXNoIHRhYmxlIHdpZHRoLlxuICAgIHRoaXMuc2hvd1RvcFNjcm9sbCA9IHRydWU7XG5cbiAgICAvLyBTZXQgY29sdW1uIHdpZHRocyBiYXNlZCBvbiB0aGUgd2lkdGggaW5pdGlhbGx5IGdpdmVuIGJ5IHRoZSBicm93c2VyLlxuICAgIC8vIGNvbXB1dGVkV2lkdGggcHJldmVudHMgYWNjaWRlbnRhbCBvdmVyZmxvdyBmb3IgYnJvd3NlcnMgd2l0aCBzdWItcGl4ZWwgd2lkdGhzLlxuICAgIHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY29tcHV0ZWRXaWR0aCA9IHBhcnNlRmxvYXQoXG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbC5uYXRpdmVFbGVtZW50KS53aWR0aCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGNvbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRoaXMuZ2V0Q29sdW1uTW9kZWxCeUluZGV4KGluZGV4KS53aWR0aCA9IE1hdGgubWF4KFxuICAgICAgICBjb21wdXRlZFdpZHRoIHx8IG9mZnNldFdpZHRoLFxuICAgICAgICB0aGlzLm1pbkNvbFdpZHRoLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vICdzY3JvbGwnIHRhYmxlcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBhbmQgb3V0c2lkZSBvZiB0aGVpciBjb25zdHJhaW50cy5cbiAgICBpZiAodGhpcy5maXQgPT09ICdzY3JvbGwnKSB7XG4gICAgICB0aGlzLmdyaWRBZGFwdGVyLnNldFN0eWxlKHRoaXMudGFibGVFbGVtZW50UmVmLCAnbWluLXdpZHRoJywgJ2F1dG8nKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWF4IGxpbWl0cyBmb3IgaW5wdXQgcmFuZ2VzLlxuICAgIGlmICh0aGlzLmZpdCA9PT0gJ3dpZHRoJykge1xuICAgICAgdGhpcy51cGRhdGVNYXhSYW5nZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2ZlckNvbHVtbldpZHRocyhcbiAgICBvbGRDb2x1bW5zOiBTa3lHcmlkQ29sdW1uTW9kZWxbXSxcbiAgICBuZXdDb2x1bW5zOiBTa3lHcmlkQ29sdW1uTW9kZWxbXSxcbiAgKSB7XG4gICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAob2xkQ29sdW1ucyAmJiBuZXdDb2x1bW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZENvbHVtbiBvZiBvbGRDb2x1bW5zKSB7XG4gICAgICAgIGlmIChvbGRDb2x1bW4ud2lkdGgpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ0NvbHVtbiA9IG5ld0NvbHVtbnMuZmluZChcbiAgICAgICAgICAgIChuZXdDb2x1bW4pID0+IG9sZENvbHVtbi5pZCA9PT0gbmV3Q29sdW1uLmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nQ29sdW1uICYmICFtYXRjaGluZ0NvbHVtbi53aWR0aCkge1xuICAgICAgICAgICAgbWF0Y2hpbmdDb2x1bW4ud2lkdGggPSBvbGRDb2x1bW4ud2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbldpZHRoTW9kZWxDaGFuZ2UoKSB7XG4gICAgY29uc3QgY29sdW1uV2lkdGhNb2RlbENoYW5nZSA9IG5ldyBBcnJheTxTa3lHcmlkQ29sdW1uV2lkdGhNb2RlbENoYW5nZT4oKTtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb2x1bW5XaWR0aE1vZGVsQ2hhbmdlLnB1c2goe1xuICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoTW9kZWxDaGFuZ2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1heFJhbmdlKCkge1xuICAgIGNvbnN0IGxlZnRvdmVyV2lkdGggPVxuICAgICAgdGhpcy5nZXRMYXN0RGlzcGxheWVkQ29sdW1uKCkud2lkdGggLSB0aGlzLm1pbkNvbFdpZHRoO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXhSYW5nZSA9IGNvbHVtbi53aWR0aCArIGxlZnRvdmVyV2lkdGg7XG4gICAgICBjb25zdCByYW5nZUlucHV0ID0gdGhpcy5nZXRSYW5nZUlucHV0QnlJbmRleChpbmRleCk7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQubWF4ID0gbmV3TWF4UmFuZ2U7XG4gICAgICByYW5nZUlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWF4JywgbmV3TWF4UmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplUmVzaXplQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmFjdGl2ZVJlc2l6ZUNvbHVtbkluZGV4ID0gY2xpY2tUYXJnZXQuZ2V0QXR0cmlidXRlKCdza3ktY21wLWluZGV4Jyk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5Nb2RlbEJ5SW5kZXgodGhpcy5hY3RpdmVSZXNpemVDb2x1bW5JbmRleCk7XG4gICAgdGhpcy5zdGFydENvbHVtbldpZHRoID0gY29sdW1uLndpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhYmxlV2lkdGgoKSB7XG4gICAgdGhpcy5za3lXaW5kb3cubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWxlbWVudFJlZiwgJ3dpZHRoJywgYGF1dG9gKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQWRhcHRlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy50YWJsZUVsZW1lbnRSZWYsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGAke3RoaXMudGFibGVXaWR0aH1weGAsXG4gICAgICApO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFJhbmdlSW5wdXRCeUluZGV4KGluZGV4OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5SYW5nZUlucHV0RWxlbWVudFJlZnMuZmluZChcbiAgICAgIChpbnB1dCkgPT5cbiAgICAgICAgaW5wdXQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NreS1jbXAtaW5kZXgnKSA9PT0gaW5kZXgudG9TdHJpbmcoKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5Nb2RlbEJ5SW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNbTnVtYmVyKGluZGV4KV07XG4gIH1cblxuICBwcml2YXRlIGdldE1heFJhbmdlQnlJbmRleChpbmRleDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uRWxlbWVudFJlZiA9IHRoaXMuY29sdW1uRWxlbWVudFJlZnMuZmluZChcbiAgICAgICh0aCkgPT4gdGgubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NreS1jbXAtaW5kZXgnKSA9PT0gaW5kZXgsXG4gICAgKTtcbiAgICBjb25zdCByYW5nZUlucHV0ID0gY29sdW1uRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLnNreS1ncmlkLWNvbHVtbi1pbnB1dC1hcmlhLW9ubHknLFxuICAgICk7XG4gICAgcmV0dXJuIE51bWJlcihyYW5nZUlucHV0Lm1heCk7XG4gIH1cblxuICBwcml2YXRlIGdldExhc3REaXNwbGF5ZWRDb2x1bW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1uTW9kZWxCeUluZGV4KHRoaXMuZGlzcGxheWVkQ29sdW1ucy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVsaW1pdGVyKHRleHQ6IHN0cmluZ1tdLCBkZWxpbWl0ZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0ZXh0LmZpbHRlcigodmFsKSA9PiB2YWwpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVJvd0RlbGV0ZShpZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgcm93RGVsZXRlQ29udGVudHMgPSB0aGlzLnJvd0RlbGV0ZUNvbnRlbnRzW2lkXTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChyb3dEZWxldGVDb250ZW50cykge1xuICAgICAgcm93RGVsZXRlQ29udGVudHMuYWZmaXhlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlKHJvd0RlbGV0ZUNvbnRlbnRzLm92ZXJsYXkpO1xuICAgICAgZGVsZXRlIHRoaXMucm93RGVsZXRlQ29udGVudHNbaWRdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGVkUm93cyhzb3VyY2U6IFNreUdyaWRTZWxlY3RlZFJvd3NTb3VyY2UpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IFNreUdyaWRTZWxlY3RlZFJvd3NNb2RlbENoYW5nZSA9IHtcbiAgICAgIHNlbGVjdGVkUm93SWRzOiB0aGlzLmdldFNlbGVjdGVkUm93cygpLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgfTtcbiAgICB0aGlzLm11bHRpc2VsZWN0U2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRSb3dzKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmlzU2VsZWN0ZWQ7XG4gICAgICB9KVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZW0uZGF0YSwgdGhpcy5tdWx0aXNlbGVjdFJvd0lkKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5kYXRhW3RoaXMubXVsdGlzZWxlY3RSb3dJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnRlcmFjdGl2ZUVsZW1lbnQoZXZlbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgaW50ZXJhY3RpdmVFbFNlbGVjdG9ycyA9IGBcbiAgICAgIGEsXG4gICAgICBidXR0b24sXG4gICAgICBpbnB1dCxcbiAgICAgIGxhYmVsLFxuICAgICAgb3B0aW9uLFxuICAgICAgc2VsZWN0LFxuICAgICAgdGV4dGFyZWEsXG4gICAgICBkZXRhaWxzLFxuICAgICAgZGlhbG9nLFxuICAgICAgbWVudSxcbiAgICAgIG1lbnVpdGVtLFxuICAgICAgc3VtbWFyeWA7XG4gICAgcmV0dXJuIGV2ZW50LnRhcmdldC5jbG9zZXN0KGludGVyYWN0aXZlRWxTZWxlY3RvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXNpemVCYXJQb3NpdGlvbih4UG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFNjcm9sbCA9IHRoaXMudGFibGVDb250YWluZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCByZXNpemVCYXJYID1cbiAgICAgIHhQb3NpdGlvbiAtXG4gICAgICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuICAgICAgcGFyZW50U2Nyb2xsO1xuICAgIHRoaXMuZ3JpZEFkYXB0ZXIuc2V0U3R5bGUodGhpcy5yZXNpemVCYXIsICdsZWZ0JywgcmVzaXplQmFyWCArICdweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVVzZXJDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnVpQ29uZmlnU2VydmljZVxuICAgICAgICAuZ2V0Q29uZmlnKHRoaXMuc2V0dGluZ3NLZXkpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNvbmZpZzogU2t5R3JpZFVJQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2VsZWN0ZWRDb2x1bW5JZHMpIHtcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBjb2x1bW5JZHMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgY3VycmVudCBkYXRhIHNldC5cbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbklkcyA9IGNvbmZpZy5zZWxlY3RlZENvbHVtbklkcy5maWx0ZXIoKGlkKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5pZCA9PT0gaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckNvbmZpZyhjb25maWc6IFNreUdyaWRVSUNvbmZpZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXR0aW5nc0tleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudWlDb25maWdTZXJ2aWNlXG4gICAgICAuc2V0Q29uZmlnKHRoaXMuc2V0dGluZ3NLZXksIGNvbmZpZylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHNhdmUgZ3JpZCBzZXR0aW5ncy4nKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5zKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cy5sZW5ndGggIT09IDAgfHwgdGhpcy5jb2x1bW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgIGlmICh0aGlzLmNvbHVtbkNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdldENvbHVtbnNGcm9tQ29tcG9uZW50KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhbnNmb3JtRGF0YSgpO1xuICAgICAgdGhpcy5zZXREaXNwbGF5ZWRDb2x1bW5zKHRydWUpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyBXYXRjaCBmb3IgYWRkZWQvcmVtb3ZlZCBjb2x1bW5zOlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jb2x1bW5Db21wb25lbnRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlQ29sdW1ucygpKSxcbiAgICApO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNvbHVtbiBoZWFkaW5nIGNoYW5nZXM6XG4gICAgdGhpcy5jb2x1bW5Db21wb25lbnRzLmZvckVhY2goKGNvbXA6IFNreUdyaWRDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICBjb21wLmhlYWRpbmdNb2RlbENoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgICAgIChjaGFuZ2U6IFNreUdyaWRDb2x1bW5IZWFkaW5nTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1uSGVhZGluZyhjaGFuZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbXAuZGVzY3JpcHRpb25Nb2RlbENoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgICAgIChjaGFuZ2U6IFNreUdyaWRDb2x1bW5EZXNjcmlwdGlvbk1vZGVsQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbkRlc2NyaXB0aW9uKGNoYW5nZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgY29tcC5pbmxpbmVIZWxwUG9wb3Zlck1vZGVsQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgKGNoYW5nZTogU2t5R3JpZENvbHVtbklubGluZUhlbHBQb3BvdmVyTW9kZWxDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5saW5lSGVscFBvcG92ZXIoY2hhbmdlKTtcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXJyYXlzRXF1YWwoYXJyYXlBOiBhbnlbXSwgYXJyYXlCOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhcnJheUEubGVuZ3RoID09PSBhcnJheUIubGVuZ3RoICYmXG4gICAgICBhcnJheUEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGFycmF5QltpbmRleF0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNreS1ncmlkXCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dUb3BTY3JvbGxcIlxuICAgIGNsYXNzPVwic2t5LWdyaWQtdG9wLXNjcm9sbC1jb250YWluZXJcIlxuICAgIChzY3JvbGwpPVwib25Ub3BTY3JvbGwoJGV2ZW50KVwiXG4gICAgI3RvcFNjcm9sbENvbnRhaW5lclxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJza3ktZ3JpZC10b3Atc2Nyb2xsXCJcbiAgICAgIFtzdHlsZS53aWR0aC5weF09XCJnZXRUb3BTY3JvbGxXaWR0aCgpXCJcbiAgICA+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZ3JpZC10YWJsZS1jb250YWluZXJcIlxuICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0XCJcbiAgICBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIlxuICAgIChzY3JvbGwpPVwib25HcmlkU2Nyb2xsKCRldmVudClcIlxuICAgICNncmlkQ29udGFpbmVyXG4gID5cbiAgICA8dGFibGUgY2xhc3M9XCJza3ktZ3JpZC10YWJsZVwiIFtuZ0NsYXNzXT1cImdldFRhYmxlQ2xhc3NOYW1lcygpXCIgI2dyaWRUYWJsZT5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIFtkcmFndWxhXT1cImRyYWd1bGFHcm91cE5hbWVcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1oZWFkaW5nIHNreS1ncmlkLW11bHRpc2VsZWN0LWNlbGwgc2t5LWdyaWQtaGVhZGVyLWxvY2tlZFwiXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY3JlZW4tcmVhZGVyLW9ubHlcIj5cbiAgICAgICAgICAgICAge3sgJ3NreXV4X2dyaWRfbXVsdGlzZWxlY3Rfc2VsZWN0X3JvdycgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBjb2x1bW4gb2YgZGlzcGxheWVkQ29sdW1ucztcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSBsYXN0O1xuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1oZWFkaW5nIHNreS1maWVsZC1sYWJlbFwiXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pZF09XCJjb2x1bW4uaWQgfHwgY29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJnZXRBcmlhU29ydERpcmVjdGlvbihjb2x1bW4pIHwgYXN5bmNcIlxuICAgICAgICAgICAgW2lkXT1cIidza3ktZ3JpZC0nICsgZ3JpZElkICsgJy1jb2x1bW4tJyArIGlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3NreS1ncmlkLWNvbHVtbi1hbGlnbm1lbnQtJyArIGNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwiY29sdW1uLmlzU29ydGFibGUgPyAwIDogLTFcIlxuICAgICAgICAgICAgKG1vdXNldXApPVwic29ydEJ5Q29sdW1uKGNvbHVtbilcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudCwgY29sdW1uKVwiXG4gICAgICAgICAgICAodG91Y2htb3ZlKT1cIm9uVG91Y2hNb3ZlKCRldmVudClcIlxuICAgICAgICAgICAgI2dyaWRDb2xcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwib3ZlcmZsb3dcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRUYWJsZUhlYWRlckNsYXNzTmFtZXMoY29sdW1uKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uLndpZHRoIC0gMVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGggLSAxXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cIihnZXRDYXJldFZpc2liaWxpdHkoY29sdW1uLmZpZWxkKSB8IGFzeW5jKSA9PT0gJ2hpZGRlbidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtaGVhZGVyLWNhcmV0LWhpZGRlbi1zcGFjaW5nXCJcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPCEtLSBUaGUgbm8gc3BhY2luZyBoZXJlIGlzIGludGVudGlvbmFsIHRvIGF2b2lkIGV4dHJhIHNwYWNlcyBkdWUgdG8gdGhlc2UgYmVpbmcgaW5saW5lIGVsZW1lbnRzIC0tPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNreS1ncmlkLWhlYWRlci10ZXh0XCI+e3tcbiAgICAgICAgICAgICAgICBjb2x1bW4uaGVhZGluZz8udHJpbSgpXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c2t5LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWhlYWRpbmctc29ydFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAnc2t5LWdyaWQtaGVhZGluZy1zb3J0LScgK1xuICAgICAgICAgICAgICAgICAgKGdldENhcmV0VmlzaWJpbGl0eShjb2x1bW4uZmllbGQpIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJnZXRDYXJldEljb25OYW1lcyhjb2x1bW4pXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNreS1oZWxwLWlubGluZVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAnc2t5LWdyaWQtaGVscC1pbmxpbmUtc29ydC1oaWRkZW4nOlxuICAgICAgICAgICAgICAgICAgICBnZXRIZWxwSW5saW5lQ2xhc3MoY29sdW1uLmZpZWxkKSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW3NreVBvcG92ZXJdPVwiY29sdW1uLmlubGluZUhlbHBQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9za3ktaGVscC1pbmxpbmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiKGZpdCA9PT0gJ3dpZHRoJyAmJiAhbGFzdCkgfHwgZml0ID09PSAnc2Nyb2xsJ1wiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5za3ktY21wLWluZGV4XT1cImlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cIm9uUmVzaXplQ29sdW1uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIldpZHRoIG9mIGNvbHVtblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtY29sdW1uLWlucHV0LWFyaWEtb25seVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJzbGlkZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidza3ktZ3JpZC0nICsgZ3JpZElkICsgJy1jb2x1bW4tJyArIGlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbWluXT1cIm1pbkNvbFdpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCJtYXhDb2xXaWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuc2t5LWNtcC1pbmRleF09XCJpXCJcbiAgICAgICAgICAgICAgW21pbl09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFttYXhdPVwibWF4Q29sV2lkdGhcIlxuICAgICAgICAgICAgICBbc3RlcF09XCJjb2x1bW5SZXNpemVTdGVwXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvblJlc2l6ZUhhbmRsZUJsdXIoKVwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJvblJlc2l6ZUhhbmRsZUZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd25SZXNpemVDb2woJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZVJlc2l6ZUNvbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgI2NvbFNpemVSYW5nZVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInNreS1ncmlkLXRib2R5XCI+XG4gICAgICAgIDx0clxuICAgICAgICAgIGNsYXNzPVwic2t5LWdyaWQtcm93XCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzUm93SGlnaGxpZ2h0ZWQoaXRlbS5pZCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuc2t5LWNtcC1pZF09XCJpdGVtLmlkXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc2t5LWdyaWQtbXVsdGlzZWxlY3Qtc2VsZWN0ZWQtcm93JzogaXRlbS5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgJ3NreS1ncmlkLW11bHRpc2VsZWN0LXJvdyc6IGVuYWJsZU11bHRpc2VsZWN0LFxuICAgICAgICAgICAgJ3NreS1ncmlkLXJvdy1oaWdobGlnaHQnOiBpc1Jvd0hpZ2hsaWdodGVkKGl0ZW0uaWQpXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgY2xhc3M9XCJza3ktZ3JpZC1tdWx0aXNlbGVjdC1jZWxsIHNreS1ncmlkLWhlYWRlci1sb2NrZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtaW5Db2xXaWR0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3NreXV4X2dyaWRfbXVsdGlzZWxlY3Rfc2VsZWN0X3JvdycgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25NdWx0aXNlbGVjdENoZWNrYm94Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3NreS1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBkaXNwbGF5ZWRDb2x1bW5zO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3Q7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1ncmlkLWNlbGxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ3NreS1ncmlkLWNvbHVtbi1hbGlnbm1lbnQtJyArIGNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNreS1ncmlkLWNlbGxcbiAgICAgICAgICAgICAgW3NreUhpZ2hsaWdodF09XCJcbiAgICAgICAgICAgICAgICAhY29sdW1uLmV4Y2x1ZGVGcm9tSGlnaGxpZ2h0aW5nID8gaGlnaGxpZ2h0VGV4dCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLnRlbXBsYXRlIHx8IGRlZmF1bHRDZWxsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbZmllbGRTZWxlY3Rvcl09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW2NvbHVtbklkXT1cImNvbHVtbi5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLnNreS1jbXAtaWRdPVwiY29sdW1uLmlkIHx8IGNvbHVtbi5maWVsZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3NreS1ncmlkLWNlbGw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInNob3dSZXNpemVCYXJcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGNsYXNzPVwic2t5LWdyaWQtcmVzaXplLWJhclwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICNyZXNpemVCYXJcbiAgICA+PC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj57e1xuICB2YWx1ZVxufX08L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LWl0ZW0gI2lubGluZURlbGV0ZVRlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgW2lkXT1cIidyb3ctZGVsZXRlLXJlZi0nICsgaXRlbS5pZFwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgaGVpZ2h0OiBnZXRSb3dIZWlnaHQoMCksXG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHdpZHRoOiB0YWJsZVdpZHRoICsgJ3B4J1xuICAgIH1cIlxuICAgICNpbmxpbmVEZWxldGVSZWZcbiAgPlxuICAgIDxza3ktaW5saW5lLWRlbGV0ZVxuICAgICAgW3BlbmRpbmddPVwiZ2V0Um93RGVsZXRlSXRlbShpdGVtLmlkKS5wZW5kaW5nXCJcbiAgICAgIChjYW5jZWxUcmlnZ2VyZWQpPVwiY2FuY2VsUm93RGVsZXRlKGl0ZW0uaWQpXCJcbiAgICAgIChkZWxldGVUcmlnZ2VyZWQpPVwiY29uZmlybVJvd0RlbGV0ZShpdGVtLmlkKVwiXG4gICAgPjwvc2t5LWlubGluZS1kZWxldGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==