igniteui-angular 15.0.1 → 15.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
- package/fesm2015/igniteui-angular.mjs +2 -2
- package/fesm2015/igniteui-angular.mjs.map +1 -1
- package/fesm2020/igniteui-angular.mjs +2 -2
- package/fesm2020/igniteui-angular.mjs.map +1 -1
- package/migrations/update-15_0_0/index.js +33 -0
- package/package.json +1 -1
|
@@ -705,10 +705,10 @@ export class IgxGridFilteringRowComponent {
|
|
|
705
705
|
}
|
|
706
706
|
}
|
|
707
707
|
IgxGridFilteringRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: IgxGridFilteringRowComponent, deps: [{ token: i1.IgxFilteringService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.PlatformUtil }], target: i0.ɵɵFactoryTarget.Component });
|
|
708
|
-
IgxGridFilteringRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: { column: "column", value: "value" }, host: { listeners: { "keydown": "onKeydownHandler($event)" }, properties: { "class.igx-grid__filtering-row": "this.defaultCSSClass", "class.igx-grid__filtering-row--compact": "this.compactCSSClass", "class.igx-grid__filtering-row--cosy": "this.cosyCSSClass" } }, viewQueries: [{ propertyName: "defaultFilterUI", first: true, predicate: ["defaultFilterUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateUI", first: true, predicate: ["defaultDateUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultTimeUI", first: true, predicate: ["defaultTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateTimeUI", first: true, predicate: ["defaultDateTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, read: ElementRef }, { propertyName: "dropDownConditions", first: true, predicate: ["inputGroupConditions"], descendants: true, read: IgxDropDownComponent, static: true }, { propertyName: "chipsArea", first: true, predicate: ["chipsArea"], descendants: true, read: IgxChipsAreaComponent, static: true }, { propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "inputGroupPrefix", first: true, predicate: ["inputGroupPrefix"], descendants: true, read: ElementRef }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "operand", first: true, predicate: ["operand"], descendants: true }, { propertyName: "closeButton", first: true, predicate: ["closeButton"], descendants: true, static: true }, { propertyName: "dropDownOperators", predicate: ["operators"], descendants: true, read: IgxDropDownComponent }], ngImport: i0, template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i5.IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: i6.IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: i6.IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: i7.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i8.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: i9.IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: i10.IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: i11.IgxPrefixDirective, selector: "igx-prefix,[igxPrefix]" }, { kind: "directive", type: i12.IgxSuffixDirective, selector: "igx-suffix,[igxSuffix]" }, { kind: "component", type: i13.IgxChipsAreaComponent, selector: "igx-chips-area", inputs: ["class", "width", "height"], outputs: ["reorder", "selectionChange", "moveStart", "moveEnd"] }, { kind: "component", type: i14.IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "component", type: i15.IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: i16.IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: i17.IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "component", type: i18.IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: i19.IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
708
|
+
IgxGridFilteringRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: IgxGridFilteringRowComponent, selector: "igx-grid-filtering-row", inputs: { column: "column", value: "value" }, host: { listeners: { "keydown": "onKeydownHandler($event)" }, properties: { "class.igx-grid__filtering-row": "this.defaultCSSClass", "class.igx-grid__filtering-row--compact": "this.compactCSSClass", "class.igx-grid__filtering-row--cosy": "this.cosyCSSClass" } }, viewQueries: [{ propertyName: "defaultFilterUI", first: true, predicate: ["defaultFilterUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateUI", first: true, predicate: ["defaultDateUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultTimeUI", first: true, predicate: ["defaultTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDateTimeUI", first: true, predicate: ["defaultDateTimeUI"], descendants: true, read: TemplateRef, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true, read: ElementRef }, { propertyName: "dropDownConditions", first: true, predicate: ["inputGroupConditions"], descendants: true, read: IgxDropDownComponent, static: true }, { propertyName: "chipsArea", first: true, predicate: ["chipsArea"], descendants: true, read: IgxChipsAreaComponent, static: true }, { propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "inputGroupPrefix", first: true, predicate: ["inputGroupPrefix"], descendants: true, read: ElementRef }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "operand", first: true, predicate: ["operand"], descendants: true }, { propertyName: "closeButton", first: true, predicate: ["closeButton"], descendants: true, static: true }, { propertyName: "dropDownOperators", predicate: ["operators"], descendants: true, read: IgxDropDownComponent }], ngImport: i0, template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton type=\"button\" (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i5.IgxDatePickerComponent, selector: "igx-date-picker", inputs: ["hideOutsideDays", "displayMonthsCount", "showWeekNumbers", "formatter", "headerOrientation", "todayButtonLabel", "cancelButtonLabel", "spinLoop", "spinDelta", "outlet", "id", "formatViews", "disabledDates", "specialDates", "calendarFormat", "value", "minValue", "maxValue", "resourceStrings", "readOnly"], outputs: ["valueChange", "validationFailed"] }, { kind: "component", type: i6.IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: i6.IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: i7.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i8.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }, { kind: "component", type: i9.IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: i10.IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "directive", type: i11.IgxPrefixDirective, selector: "igx-prefix,[igxPrefix]" }, { kind: "directive", type: i12.IgxSuffixDirective, selector: "igx-suffix,[igxSuffix]" }, { kind: "component", type: i13.IgxChipsAreaComponent, selector: "igx-chips-area", inputs: ["class", "width", "height"], outputs: ["reorder", "selectionChange", "moveStart", "moveEnd"] }, { kind: "component", type: i14.IgxChipComponent, selector: "igx-chip", inputs: ["id", "tabIndex", "data", "draggable", "animateOnRelease", "hideBaseOnDrag", "removable", "removeIcon", "selectable", "selectIcon", "class", "disabled", "selected", "color", "resourceStrings"], outputs: ["selectedChange", "moveStart", "moveEnd", "remove", "chipClick", "selectedChanging", "selectedChanged", "keyDown", "dragEnter", "dragLeave", "dragOver", "dragDrop"] }, { kind: "component", type: i15.IgxDropDownComponent, selector: "igx-drop-down", inputs: ["allowItemsFocus", "labelledBy"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "component", type: i16.IgxDropDownItemComponent, selector: "igx-drop-down-item" }, { kind: "directive", type: i17.IgxDropDownItemNavigationDirective, selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { kind: "component", type: i18.IgxTimePickerComponent, selector: "igx-time-picker", inputs: ["id", "displayFormat", "inputFormat", "mode", "minValue", "maxValue", "spinLoop", "formatter", "headerOrientation", "readOnly", "value", "resourceStrings", "okButtonLabel", "cancelButtonLabel", "itemsDelta"], outputs: ["selected", "valueChange", "validationFailed"] }, { kind: "directive", type: i19.IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
709
709
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: IgxGridFilteringRowComponent, decorators: [{
|
|
710
710
|
type: Component,
|
|
711
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-filtering-row', template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n" }]
|
|
711
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'igx-grid-filtering-row', template: "<!-- Have to apply styles inline because of the overlay outlet ... -->\n<igx-drop-down #inputGroupConditions [displayDensity]=\"displayDensity\" [height]=\"'200px'\" (selectionChanging)=\"onConditionsChanged($event)\">\n <igx-drop-down-item *ngFor=\"let condition of conditions\"\n [value]=\"condition\"\n [selected]=\"isConditionSelected(condition)\">\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon family=\"imx-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{ translateCondition(condition) }}</span>\n </div>\n </igx-drop-down-item>\n</igx-drop-down>\n\n<ng-template #defaultFilterUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n autocomplete=\"off\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [type]=\"type\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-template #defaultDateUI>\n <igx-date-picker #picker\n [(value)]=\"value\"\n [readOnly]=\"true\"\n [outlet]=\"filteringService.grid.outlet\"\n [locale]=\"filteringService.grid.locale\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\"\n type=\"box\"\n [displayFormat]=\"column.pipeArgs.format\"\n [formatter]=\"column.formatter\"\n [placeholder]=\"placeholder\"\n [weekStart]=\"column.pipeArgs.weekStart\"\n [displayDensity]=\"displayDensity\"\n (keydown)=\"onInputKeyDown($event)\"\n (focusout)=\"onInputGroupFocusout()\"\n (closed)=\"focusEditElement()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n</ng-template>\n\n<ng-template #defaultTimeUI>\n <igx-time-picker #picker\n [(value)]=\"value\"\n [inputFormat]=\"column.defaultTimeFormat\"\n [locale]=\"filteringService.grid.locale\"\n [formatter]=\"column.formatter\"\n [outlet]=\"filteringService.grid.outlet\"\n [displayDensity]=\"displayDensity\"\n type=\"box\"\n [readOnly]=\"true\"\n [placeholder]=\"placeholder\"\n (closed)=\"focusEditElement()\"\n (focusout)=\"onInputGroupFocusout()\"\n (keydown)=\"onInputKeyDown($event)\"\n (click)=\"expression.condition.isUnary ? null : picker.open()\">\n <igx-prefix #inputGroupPrefix\n tabindex=\"0\"\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"expression.condition.iconName\"></igx-icon>\n </igx-prefix>\n <igx-suffix *ngIf=\"value\">\n <igx-icon tabindex=\"0\" (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick($event)\">done</igx-icon>\n <igx-icon tabindex=\"0\" (keydown)=\"onClearKeyDown($event)\" (click)=\"clearInput($event)\">clear</igx-icon>\n </igx-suffix>\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n</ng-template>\n\n<ng-template #defaultDateTimeUI>\n <igx-input-group #inputGroup type=\"box\" [displayDensity]=\"displayDensity\" (focusout)=\"onInputGroupFocusout()\">\n <igx-prefix #inputGroupPrefix\n (click)=\"inputGroupPrefixClick($event)\"\n (keydown)=\"onPrefixKeyDown($event)\"\n tabindex=\"0\"\n [igxDropDownItemNavigation]=\"inputGroupConditions\">\n <igx-icon family=\"imx-icons\" [name]=\"getIconName()\"></igx-icon>\n </igx-prefix>\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"placeholder\"\n [igxDateTimeEditor]=\"column.defaultDateTimeFormat\"\n [value]=\"value\"\n (valueChange)=\"onInput($event)\"\n [readonly]=\"isUnaryCondition\"\n (click)=\"onInputClick()\"\n (keydown)=\"onInputKeyDown($event)\"\n (keyup)=\"onInputKeyUp()\"/>\n <igx-suffix *ngIf=\"value || value === 0\" >\n <igx-icon (keydown)=\"onCommitKeyDown($event)\" (click)=\"onCommitClick()\" tabindex=\"0\">done</igx-icon>\n <igx-icon (keydown)=\"onClearKeyDown($event)\" (click)=\"onClearClick()\" tabindex=\"0\">clear</igx-icon>\n </igx-suffix>\n </igx-input-group>\n</ng-template>\n\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this }\"></ng-container>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-start\" *ngIf=\"showArrows\" (keydown)=\"onLeftArrowKeyDown($event)\" (click)=\"scrollChipsOnArrowPress('left')\">\n <igx-icon>navigate_before</igx-icon>\n</button>\n\n<div #container class=\"igx-grid__filtering-row-main\">\n <div>\n <igx-chips-area #chipsArea>\n <ng-container *ngFor=\"let item of expressionsList; index as i; let last = last;\" tabindex=\"0\">\n <igx-chip #chip id='chip'\n (pointerdown)=\"onChipPointerdown($event, chip)\"\n (click)=\"onChipClick($event, item)\"\n (keydown)=\"onChipKeyDown($event, item)\"\n (remove)=\"onChipRemoved($event, item)\"\n [selectable]=\"false\"\n [selected]=\"item.isSelected\"\n [displayDensity]=\"displayDensity\"\n [removable]=\"true\">\n <igx-icon\n igxPrefix\n family=\"imx-icons\"\n [name]=\"item.expression.condition.iconName\">\n </igx-icon>\n <span>{{filteringService.getChipLabel(item.expression)}}</span>\n </igx-chip>\n\n <span id='operand' *ngIf=\"!last\">\n <button igxButton type=\"button\" (click)=\"toggleOperatorsDropDown($event, i)\" [igxDropDownItemNavigation]=\"operators\" [displayDensity]=\"displayDensity\">\n <igx-icon>expand_more</igx-icon>\n <span>{{filteringService.getOperatorAsString(item.afterOperator)}}</span>\n </button>\n <igx-drop-down [displayDensity]=\"column.grid.displayDensity\" #operators (selectionChanging)=\"onLogicOperatorChanged($event, item)\">\n <igx-drop-down-item [value]=\"0\" [selected]=\"item.afterOperator === 0\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}</igx-drop-down-item>\n <igx-drop-down-item [value]=\"1\" [selected]=\"item.afterOperator === 1\">{{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}</igx-drop-down-item>\n </igx-drop-down>\n </span>\n </ng-container>\n </igx-chips-area>\n </div>\n</div>\n\n<button igxButton=\"icon\" type=\"button\" class=\"igx-grid__filtering-row-scroll-end\" *ngIf=\"showArrows\" (click)=\"scrollChipsOnArrowPress('right')\">\n <igx-icon>navigate_next</igx-icon>\n</button>\n\n<div #buttonsContainer [ngClass]=\"isNarrowWidth ? 'igx-grid__filtering-row-editing-buttons--small' : 'igx-grid__filtering-row-editing-buttons'\">\n <button [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"clearFiltering()\" [disabled]=\"disabled\" [tabindex]=\"disabled\">\n <igx-icon>refresh</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_reset}}</span>\n </button>\n <button #closeButton [displayDensity]=\"displayDensity\" [igxButton]=\"isNarrowWidth ? 'icon' : 'flat'\" type=\"button\" igxRipple (click)=\"close()\">\n <igx-icon>close</igx-icon>\n <span>{{isNarrowWidth ? '' : filteringService.grid.resourceStrings.igx_grid_filter_row_close}}</span>\n </button>\n</div>\n" }]
|
|
712
712
|
}], ctorParameters: function () { return [{ type: i1.IgxFilteringService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i2.PlatformUtil }]; }, propDecorators: { column: [{
|
|
713
713
|
type: Input
|
|
714
714
|
}], value: [{
|
|
@@ -768,4 +768,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImpor
|
|
|
768
768
|
type: HostListener,
|
|
769
769
|
args: ['keydown', ['$event']]
|
|
770
770
|
}] } });
|
|
771
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFFWixVQUFVLEVBQ1YsV0FBVyxFQUNYLHVCQUF1QixFQUV2QixZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBdUIsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRixPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLHlEQUF5RCxDQUFDO0FBQy9HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNqSCxPQUFPLEVBQXNCLHFCQUFxQixFQUFvQixNQUFNLDJCQUEyQixDQUFDO0FBR3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVB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RUFBRSxvQkFBb0IsRUFBRTtnQkFJL0MsVUFBVTtzQkFEbkIsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUluQyxNQUFNO3NCQURmLFNBQVM7dUJBQUMsUUFBUTtnQkFJVCxnQkFBZ0I7c0JBRHpCLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUl6QyxTQUFTO3NCQURsQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTlCLE9BQU87c0JBRGhCLFNBQVM7dUJBQUMsU0FBUztnQkFJVixXQUFXO3NCQURwQixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBa0RuQyxnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIFZpZXdSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSwgRGF0YVV0aWwgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElneERyb3BEb3duQ29tcG9uZW50LCBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vLi4vZHJvcC1kb3duL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgVmVydGljYWxBbGlnbm1lbnQsIE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uL2Nvbm5lY3RlZC1wb3NpdGlvbmluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJQmFzZUNoaXBFdmVudEFyZ3MsIElneENoaXBzQXJlYUNvbXBvbmVudCwgSWd4Q2hpcENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NoaXBzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4RHJvcERvd25JdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZHJvcC1kb3duL2Ryb3AtZG93bi1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hGaWx0ZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb3ZlcmxheS9zY3JvbGwnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpc0VxdWFsLCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEV4cHJlc3Npb25VSSB9IGZyb20gJy4uL2V4Y2VsLXN0eWxlL2NvbW1vbic7XG5pbXBvcnQgeyBDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1maWx0ZXJpbmctcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uKCk6IENvbHVtblR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5fY29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5mb3JFYWNoKGV4cCA9PiBleHAuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2YWw7XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0ID0gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldEV4cHJlc3Npb25zKHRoaXMuX2NvbHVtbi5maWVsZCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuXG4gICAgICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uc2VhcmNoVmFsIDogbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbCkge1xuICAgICAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmV4cHJlc3Npb24gPT09IHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKHRoaXMuY29sdW1uLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWw7XG4gICAgICAgICAgICBpZiAoaXNFcXVhbChvbGRWYWx1ZSwgdmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9IERhdGFVdGlsLnBhcnNlVmFsdWUodGhpcy5jb2x1bW4uZGF0YVR5cGUsIHZhbCk7XG4gICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFeHByZXNzaW9uKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzcGxheURlbnNpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZSA/IERpc3BsYXlEZW5zaXR5LmNvc3kgOiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3cnKVxuICAgIHB1YmxpYyBkZWZhdWx0Q1NTQ2xhc3MgPSB0cnVlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBjb21wYWN0Q1NTQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgY29zeUNTU0NsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZ3JpZC5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29zeTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RmlsdGVyVUknLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEZpbHRlclVJOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdERhdGVVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RGF0ZVVJOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFRpbWVVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0VGltZVVJOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdERhdGVUaW1lVUknLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdERhdGVUaW1lVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBpbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXBDb25kaXRpb25zJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRyb3BEb3duQ29uZGl0aW9uczogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdjaGlwc0FyZWEnLCB7IHJlYWQ6IElneENoaXBzQXJlYUNvbXBvbmVudCwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGNoaXBzQXJlYTogSWd4Q2hpcHNBcmVhQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZHJlbignb3BlcmF0b3JzJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHByb3RlY3RlZCBkcm9wRG93bk9wZXJhdG9yczogUXVlcnlMaXN0PElneERyb3BEb3duQ29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXAnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXRHcm91cDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHByb3RlY3RlZCBwaWNrZXI6IElneERhdGVQaWNrZXJDb21wb25lbnQgfCBJZ3hUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cFByZWZpeCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBpbnB1dEdyb3VwUHJlZml4OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdvcGVyYW5kJylcbiAgICBwcm90ZWN0ZWQgb3BlcmFuZDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjbG9zZUJ1dHRvbicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGNsb3NlQnV0dG9uOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dBcnJvd3M6IGJvb2xlYW47XG4gICAgcHVibGljIGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgIHB1YmxpYyBleHByZXNzaW9uc0xpc3Q6IEFycmF5PEV4cHJlc3Npb25VST47XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9jb25kaXRpb25zT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpXG4gICAgfTtcblxuICAgIHByaXZhdGUgX29wZXJhdG9yc092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSh0aGlzLl9wb3NpdGlvblNldHRpbmdzKVxuICAgIH07XG5cbiAgICBwcml2YXRlIGNoaXBzQXJlYVdpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBfY29sdW1uID0gbnVsbDtcbiAgICBwcml2YXRlIGlzS2V5UHJlc3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jYW5jZWxDaGlwQ2xpY2sgPSBmYWxzZTtcblxuICAgIC8qKiBzd2l0Y2ggdG8gaWNvbiBidXR0b25zIHdoZW4gd2lkdGggaXMgYmVsb3cgNDMycHggKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IE5BUlJPV19XSURUSF9USFJFU0hPTEQgPSA0MzI7XG5cbiAgICBwcml2YXRlICRkZXN0cm95ZXIgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgcmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsXG4gICAgKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25IYW5kbGVyKGV2dDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0ZpbHRlcmluZ0tleUNvbWJvKGV2dCkpIHtcbiAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmNvbHVtbi5ncmlkLm91dGxldDtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuY29sdW1uLmdyaWQub3V0bGV0O1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbmQoZXhwciA9PiBleHByLmlzU2VsZWN0ZWQgPT09IHRydWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBzZWxlY3RlZEl0ZW0uZXhwcmVzc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLmxvY2FsZUNoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveWVyKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISh0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgJiYgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREYXRlVUk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFRpbWVVSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERhdGVUaW1lVUk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZpbHRlclVJO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbHVtbi5kYXRhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb25kaXRpb25zKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJzLmNvbmRpdGlvbkxpc3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVW5hcnlDb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uICYmIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5nZXRDaGlwTGFiZWwodGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19kYXRlX3BsYWNlaG9sZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X2Jvb2xlYW5fcGxhY2Vob2xkZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9yb3dfcGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIHRoZSBpbnB1dCBncm91cCdzIHByZWZpeC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25QcmVmaXhLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQWN0aXZhdGlvbktleShldmVudCkgJiYgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLlRBQiAmJiAhdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5pc0tleVByZXNzZWQgPSB0cnVlO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24odGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FTlRFUikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1pdElucHV0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYWx0S2V5ICYmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLkFSUk9XX0RPV04pKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24odGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGxhdGZvcm0uaXNGaWx0ZXJpbmdLZXlDb21ibyhldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXl1cCBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRLZXlVcCgpIHtcbiAgICAgICAgdGhpcy5pc0tleVByZXNzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBpbnB1dCBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnRBcmdzKSB7XG4gICAgICAgIC8vIFRoZSAnaXNrZXlQcmVzc2VkJyBmbGFnIGlzIG5lZWRlZCBmb3IgYSBjYXNlIGluIElFLCBiZWNhdXNlIHRoZSBpbnB1dCBldmVudCBpcyBmaXJlZCBvbiBmb2N1cyBhbmQgZm9yIHNvbWUgcmVhc29uLFxuICAgICAgICAvLyB3aGVuIHlvdSBoYXZlIGEgamFwYW5lc2UgY2hhcmFjdGVyIGFzIGEgcGxhY2Vob2xkZXIsIG9uIGluaXQgdGhlIHZhbHVlIGhlcmUgaXMgZW1wdHkgc3RyaW5nIC5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRBcmdzLnRhcmdldDtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBldmVudEFyZ3M7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNFZGdlICYmIHRhcmdldC50eXBlICE9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgfHwgdGhpcy5pc0tleVByZXNzZWQgfHwgdGFyZ2V0LnZhbHVlIHx8IHRhcmdldC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjb21wb3NpdGlvbnN0YXJ0IG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db21wb3NpdGlvblN0YXJ0KCkge1xuICAgICAgICB0aGlzLmlzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjb21wb3NpdGlvbmVuZCBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tcG9zaXRpb25FbmQoKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBpbnB1dCBjbGljayBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuICYmIHRoaXMuZHJvcERvd25Db25kaXRpb25zLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBvcGVyYXRpb24gY29uZGl0aW9uIGZvciBhIGdpdmVuIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25kaXRpb24odmFsdWU6IHN0cmluZyk6IElGaWx0ZXJpbmdPcGVyYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVycy5jb25kaXRpb24odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgY29uZGl0aW9uIG5hbWUgZm9yIGEgZ2l2ZW4gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zbGF0ZUNvbmRpdGlvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5nc1tgaWd4X2dyaWRfZmlsdGVyXyR7dGhpcy5nZXRDb25kaXRpb24odmFsdWUpLm5hbWV9YF0gfHwgdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaWNvbiBuYW1lIG9mIHRoZSBjdXJyZW50IGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SWNvbk5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbiAmJiB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb25kaXRpb24odGhpcy5jb25kaXRpb25zWzBdKS5pY29uTmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gY29uZGl0aW9uIGlzIHNlbGVjdGVkIGluIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbmRpdGlvblNlbGVjdGVkKGNvbmRpdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA9PT0gY29uZGl0aW9uTmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY3VycmVudCBmaWx0ZXJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyaW5nKCkge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIodGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21taXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIGNvbW1pdElucHV0KCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5maWx0ZXIoZXggPT4gZXguaXNTZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgICAgIHNlbGVjdGVkSXRlbS5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gZmFsc2UpO1xuXG4gICAgICAgIGxldCBpbmRleFRvRGVzZWxlY3QgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0W2luZGV4XS5leHByZXNzaW9uO1xuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsICYmICFleHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0Rlc2VsZWN0ID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4VG9EZXNlbGVjdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXhwcmVzc2lvbihpbmRleFRvRGVzZWxlY3QsIHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEV4cHJlc3Npb24oKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDaGlwc1doZW5BZGRpbmdFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFySW5wdXQoZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3Iga2V5ZG93biBvbiBjbGVhciBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ2xlYXJLZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgY2xpY2sgb24gY2xlYXIgYnV0dG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNsZWFyQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIGNvbW1pdCBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tbWl0S2V5RG93bihldmVudEFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50QXJncykpIHtcbiAgICAgICAgICAgIGV2ZW50QXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRJbnB1dCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjbGljayBvbiBjb21taXQgYnV0dG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbW1pdENsaWNrKGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0SW5wdXQoKTtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgZm9jdXNvdXQgb24gdGhlIGlucHV0IGdyb3VwLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0R3JvdXBGb2N1c291dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUgIT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gJiYgIXRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChmb2N1c2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2lneC1jaGlwX19yZW1vdmUnKSB8fCBmb2N1c2VkRWxlbWVudC50YWdOYW1lID09PSAnSUdYLURBWS1JVEVNJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEoZm9jdXNlZEVsZW1lbnQgJiYgdGhpcy5lZGl0b3JzQ29udGFpbihmb2N1c2VkRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21taXRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGZpbHRlcmluZyBlZGl0IHJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0WzBdLmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFswXS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldEV4cHJlc3Npb25zKHRoaXMuY29sdW1uLmZpZWxkKS5wb3AoKTtcblxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRUb1JlbW92ZSA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbHRlcihleCA9PiBleC5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gbnVsbCAmJiAhZXguZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSk7XG4gICAgICAgICAgICBpZiAoY29uZFRvUmVtb3ZlICYmIGNvbmRUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uZFRvUmVtb3ZlLmZvckVhY2goYyA9PiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVtb3ZlRXhwcmVzc2lvbih0aGlzLmNvbHVtbi5maWVsZCwgdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihjKSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS51cGRhdGVGaWx0ZXJpbmdDZWxsKHRoaXMuY29sdW1uKTtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnNlbGVjdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIGRhdGUgcGlja2VyJ3Mgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkRhdGVTZWxlY3RlZCh2YWx1ZTogRGF0ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGlucHV0R3JvdXBQcmVmaXhDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBjb25kaXRpb25zIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVDb25kaXRpb25zRHJvcERvd24odGFyZ2V0OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX2NvbmRpdGlvbnNPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGFyZ2V0IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMudG9nZ2xlKHRoaXMuX2NvbmRpdGlvbnNPdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBsb2dpYyBvcGVyYXRvcnMgZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZU9wZXJhdG9yc0Ryb3BEb3duKGV2ZW50QXJncywgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IGV2ZW50QXJncy50YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrID0gW2V2ZW50QXJncy50YXJnZXQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZHJvcERvd25PcGVyYXRvcnMudG9BcnJheSgpW2luZGV4XS50b2dnbGUodGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGFuZ2UgZXZlbnQgaW4gY29uZGl0aW9ucyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db25kaXRpb25zQ2hhbmdlZChldmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnRBcmdzLm5ld1NlbGVjdGlvbiBhcyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uID0gdGhpcy5nZXRDb25kaXRpb24odmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZ3JpZCdzIGZpbHRlcmluZyBvbiB0aGUgbmV4dCBjeWNsZSB0byBlbnN1cmUgdGhlIGRyb3AtZG93biBpcyBjbG9zZWRcbiAgICAgICAgICAgIC8vIGlmIHRoZSBkcm9wLWRvd24gaXMgbm90IGNsb3NlZCB0aGlzIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51bmFyeUNvbmRpdGlvbkNoYW5nZWRDYWxsYmFjaygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmNvbmRpdGlvbkNoYW5nZWRDYWxsYmFjaygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYmVjYXVzZSBvZiBhbiBpc3N1ZSBpbiBJRSwgd2hlcmUgeW91IGFyZSBzdGlsbCBhYmxlIHRvIHdyaXRlIGluIHRoZSBpbnB1dCxcbiAgICAgICAgLy8gaWYgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgdGhlbiBzZXQgdG8gcmVhZG9ubHkuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKSk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25DaGlwUG9pbnRlcmRvd24oYXJncywgY2hpcDogSWd4Q2hpcENvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fY2FuY2VsQ2hpcENsaWNrID0gY2hpcC5zZWxlY3RlZFxuICAgICAgICAgICAgJiYgYWN0aXZlRWxlbWVudCAmJiB0aGlzLmVkaXRvcnNDb250YWluKGFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoaXBDbGljayhhcmdzLCBpdGVtOiBFeHByZXNzaW9uVUkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbmNlbENoaXBDbGljaykge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsQ2hpcENsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5mb3JFYWNoKGV4ID0+IGV4LmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy50b2dnbGVDaGlwKGl0ZW0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVDaGlwKGl0ZW06IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSAhaXRlbS5pc1NlbGVjdGVkO1xuICAgICAgICBpZiAoaXRlbS5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBpdGVtLmV4cHJlc3Npb247XG5cbiAgICAgICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgY2hpcCBrZXlkb3duIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBLZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCwgaXRlbTogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGlmIChldmVudEFyZ3Mua2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FTlRFUikge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpcChpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjcm9sbHMgdGhlIGZpcnN0IGNoaXAgaW50byB2aWV3IGlmIHRoZSB0YWIga2V5IGlzIHByZXNzZWQgb24gdGhlIGxlZnQgYXJyb3cuXG4gICAgICovXG4gICAgcHVibGljIG9uTGVmdEFycm93S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5UQUIpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGlwIHJlbW92ZWQgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcFJlbW92ZWQoZXZlbnRBcmdzOiBJQmFzZUNoaXBFdmVudEFyZ3MsIGl0ZW06IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgdGhpcy5yZW1vdmVFeHByZXNzaW9uKGluZGV4VG9SZW1vdmUsIGl0ZW0uZXhwcmVzc2lvbik7XG5cbiAgICAgICAgdGhpcy5zY3JvbGxDaGlwc09uUmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgbG9naWMgb3BlcmF0b3IgY2hhbmdlZCBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Mb2dpY09wZXJhdG9yQ2hhbmdlZChldmVudEFyZ3M6IElTZWxlY3Rpb25FdmVudEFyZ3MsIGV4cHJlc3Npb246IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBpZiAoZXZlbnRBcmdzLm9sZFNlbGVjdGlvbikge1xuICAgICAgICAgICAgZXhwcmVzc2lvbi5hZnRlck9wZXJhdG9yID0gKGV2ZW50QXJncy5uZXdTZWxlY3Rpb24gYXMgSWd4RHJvcERvd25JdGVtQ29tcG9uZW50KS52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0W3RoaXMuZXhwcmVzc2lvbnNMaXN0LmluZGV4T2YoZXhwcmVzc2lvbikgKyAxXS5iZWZvcmVPcGVyYXRvciA9IGV4cHJlc3Npb24uYWZ0ZXJPcGVyYXRvcjtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGdyaWQncyBmaWx0ZXJpbmcgb24gdGhlIG5leHQgY3ljbGUgdG8gZW5zdXJlIHRoZSBkcm9wLWRvd24gaXMgY2xvc2VkXG4gICAgICAgICAgICAvLyBpZiB0aGUgZHJvcC1kb3duIGlzIG5vdCBjbG9zZWQgdGhpcyBldmVudCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZmlsdGVyKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgY2hpcHMgaW50byB0aGUgY2hpcCBhcmVhIHdoZW4gbGVmdCBvciByaWdodCBhcnJvd3MgYXJlIHByZXNzZWQuXG4gICAgICovXG4gICAgcHVibGljIHNjcm9sbENoaXBzT25BcnJvd1ByZXNzKGFycm93UG9zaXRpb246IHN0cmluZykge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBjb25zdCBjaGlwQXJhZUNoaWxkcmVuID0gdGhpcy5jaGlwc0FyZWEuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAoYXJyb3dQb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBBcmFlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5jZWlsKGNoaXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpIDwgTWF0aC5jZWlsKGNvbnRhaW5lclJlY3QucmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY291bnQgPCBjaGlwQXJhZUNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgLT0gTWF0aC5jZWlsKGNoaXBBcmFlQ2hpbGRyZW5bY291bnRdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSAtXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbChjb250YWluZXJSZWN0LnJpZ2h0KSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyb3dQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaXAgb2YgY2hpcEFyYWVDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSA8IE1hdGguY2VpbChjb250YWluZXJSZWN0LmxlZnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCArPSBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSAtXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbChjaGlwQXJhZUNoaWxkcmVuW2NvdW50IC0gMV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJlc2V0cyB0aGUgY2hpcHMgYXJlYVxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2hpcHNBcmVhKCkge1xuICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVBcnJvd0J1dHRvbnMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZm9jdXNFZGl0RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5nZXRFZGl0RWxlbWVudCgpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3llci5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93SGlkZUFycm93QnV0dG9ucygpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpcHNBcmVhV2lkdGggPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3dBcnJvd3MgPSB0aGlzLmNoaXBzQXJlYVdpZHRoID49IGNvbnRhaW5lcldpZHRoICYmIHRoaXMuaXNDb2x1bW5GaWx0ZXJlZDtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzZSB0aGUgY2RyLmRldGVjdENoYW5nZXMoKSB1c2FnZSBoZXJlXG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgVmlld1JlZikuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRXhwcmVzc2lvbihpc1NlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGV4cHJVSSA9IG5ldyBFeHByZXNzaW9uVUkoKTtcbiAgICAgICAgZXhwclVJLmV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb247XG4gICAgICAgIGV4cHJVSS5iZWZvcmVPcGVyYXRvciA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCA+IDAgPyBGaWx0ZXJpbmdMb2dpYy5BbmQgOiBudWxsO1xuICAgICAgICBleHByVUkuaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQ7XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3QucHVzaChleHByVUkpO1xuXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbnNMaXN0W2xlbmd0aCAtIDJdKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFtsZW5ndGggLSAyXS5hZnRlck9wZXJhdG9yID0gdGhpcy5leHByZXNzaW9uc0xpc3RbbGVuZ3RoIC0gMV0uYmVmb3JlT3BlcmF0b3I7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dIaWRlQXJyb3dCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVFeHByZXNzaW9uKGluZGV4VG9SZW1vdmU6IG51bWJlciwgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgPT09IDAgJiYgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRmlsdGVyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVtb3ZlRXhwcmVzc2lvbih0aGlzLmNvbHVtbi5maWVsZCwgaW5kZXhUb1JlbW92ZSk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXIoKTtcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uID09PSBleHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRFeHByZXNzaW9uKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSB7XG4gICAgICAgICAgICBmaWVsZE5hbWU6IHRoaXMuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBudWxsLFxuICAgICAgICAgICAgc2VhcmNoVmFsOiBudWxsLFxuICAgICAgICAgICAgaWdub3JlQ2FzZTogdGhpcy5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSAhPT0gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gPSB0aGlzLmdldENvbmRpdGlvbih0aGlzLmNvbmRpdGlvbnNbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSAmJiB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNXaGVuQWRkaW5nRXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlwQXJhZUNoaWxkcmVuIHx8IGNoaXBBcmFlQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlwc0NvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgY2hpcHNBcmVhV2lkdGggPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgaWYgKGNoaXBzQXJlYVdpZHRoID4gY2hpcHNDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IGNoaXBzQ29udGFpbmVyV2lkdGggLSBjaGlwc0FyZWFXaWR0aDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm0ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7b2Zmc2V0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNPblJlbW92ZSgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBBcmFlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkgPCBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY291bnQgPD0gMikge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWYgPSBjaGlwQXJhZUNoaWxkcmVuW2NvdW50XS5pZCA9PT0gJ2NoaXAnID8gY291bnQgLSAyIDogY291bnQgLSAxO1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCArPSBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSAtIE1hdGguY2VpbChjaGlwQXJhZUNoaWxkcmVuW2RpZl0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICghIXRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWwgfHwgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5hcnlDb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEV4cHJlc3Npb24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckludGVybmFsKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVkaXRvcnNDb250YWluKGNoaWxkOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBjaGVjayBpcyBmYWxzZSBhbmQgdGhlIHNlY29uZCBpcyB1bmRlZmluZWQgdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGFsd2F5cyByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKHRoaXMuaW5wdXRHcm91cCAmJiB0aGlzLmlucHV0R3JvdXAubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZClcbiAgICAgICAgICAgIHx8IHRoaXMucGlja2VyICYmIHRoaXMucGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQ29sdW1uRmlsdGVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgJiYgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc05hcnJvd1dpZHRoKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDwgdGhpcy5OQVJST1dfV0lEVEhfVEhSRVNIT0xEO1xuICAgIH1cbn1cbiIsIjwhLS0gSGF2ZSB0byBhcHBseSBzdHlsZXMgaW5saW5lIGJlY2F1c2Ugb2YgdGhlIG92ZXJsYXkgb3V0bGV0IC4uLiAtLT5cbjxpZ3gtZHJvcC1kb3duICNpbnB1dEdyb3VwQ29uZGl0aW9ucyBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbaGVpZ2h0XT1cIicyMDBweCdcIiAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25Db25kaXRpb25zQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgPGlneC1kcm9wLWRvd24taXRlbSAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnNcIlxuICAgICAgICBbdmFsdWVdPVwiY29uZGl0aW9uXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cImlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldENvbmRpdGlvbihjb25kaXRpb24pLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi10ZXh0XCI+e3sgdHJhbnNsYXRlQ29uZGl0aW9uKGNvbmRpdGlvbikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuPC9pZ3gtZHJvcC1kb3duPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWx0ZXJVST5cbiAgICA8aWd4LWlucHV0LWdyb3VwICNpbnB1dEdyb3VwIHR5cGU9XCJib3hcIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiAoZm9jdXNvdXQpPVwib25JbnB1dEdyb3VwRm9jdXNvdXQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgW25hbWVdPVwiZ2V0SWNvbk5hbWUoKVwiPjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1VuYXJ5Q29uZGl0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25zdGFydCk9XCJvbkNvbXBvc2l0aW9uU3RhcnQoKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25lbmQpPVwib25Db21wb3NpdGlvbkVuZCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cIm9uSW5wdXRLZXlVcCgpXCIvPlxuICAgICAgICAgICAgPGlneC1zdWZmaXggKm5nSWY9XCJ2YWx1ZSB8fCB2YWx1ZSA9PT0gMFwiID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25Db21taXRLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25Db21taXRDbGljaygpXCIgdGFiaW5kZXg9XCIwXCI+ZG9uZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIChrZXlkb3duKT1cIm9uQ2xlYXJLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25DbGVhckNsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2lneC1zdWZmaXg+XG4gICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHREYXRlVUk+XG4gICAgPGlneC1kYXRlLXBpY2tlciAjcGlja2VyXG4gICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICBbb3V0bGV0XT1cImZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5vdXRsZXRcIlxuICAgICAgICBbbG9jYWxlXT1cImZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5sb2NhbGVcIlxuICAgICAgICAoY2xpY2spPVwiZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSA/IG51bGwgOiBwaWNrZXIub3BlbigpXCJcbiAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImNvbHVtbi5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICBbZm9ybWF0dGVyXT1cImNvbHVtbi5mb3JtYXR0ZXJcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbd2Vla1N0YXJ0XT1cImNvbHVtbi5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIlxuICAgICAgICAoY2xvc2VkKT1cImZvY3VzRWRpdEVsZW1lbnQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbnB1dEdyb3VwUHJlZml4Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtcHJlZml4PlxuICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25Db21taXRLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25Db21taXRDbGljaygkZXZlbnQpXCI+ZG9uZTwvaWd4LWljb24+XG4gICAgICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJjbGVhcklucHV0KCRldmVudClcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICA8aWd4LXBpY2tlci1jbGVhcj48L2lneC1waWNrZXItY2xlYXI+XG4gICAgPC9pZ3gtZGF0ZS1waWNrZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUaW1lVUk+XG4gICAgPGlneC10aW1lLXBpY2tlciAjcGlja2VyXG4gICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0XT1cImNvbHVtbi5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgIFtsb2NhbGVdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLmxvY2FsZVwiXG4gICAgICAgIFtmb3JtYXR0ZXJdPVwiY29sdW1uLmZvcm1hdHRlclwiXG4gICAgICAgIFtvdXRsZXRdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLm91dGxldFwiXG4gICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIChjbG9zZWQpPVwiZm9jdXNFZGl0RWxlbWVudCgpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cImV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkgPyBudWxsIDogcGlja2VyLm9wZW4oKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJpbXgtaWNvbnNcIiBbbmFtZV09XCJleHByZXNzaW9uLmNvbmRpdGlvbi5pY29uTmFtZVwiPjwvaWd4LWljb24+XG4gICAgPC9pZ3gtcHJlZml4PlxuICAgIDxpZ3gtc3VmZml4ICpuZ0lmPVwidmFsdWVcIj5cbiAgICAgICAgPGlneC1pY29uIHRhYmluZGV4PVwiMFwiIChrZXlkb3duKT1cIm9uQ29tbWl0S2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQ29tbWl0Q2xpY2soJGV2ZW50KVwiPmRvbmU8L2lneC1pY29uPlxuICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJjbGVhcklucHV0KCRldmVudClcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgPC9pZ3gtc3VmZml4PlxuICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICA8L2lneC10aW1lLXBpY2tlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdERhdGVUaW1lVUk+XG4gICAgPGlneC1pbnB1dC1ncm91cCAjaW5wdXRHcm91cCB0eXBlPVwiYm94XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIj5cbiAgICAgICAgPGlneC1wcmVmaXggI2lucHV0R3JvdXBQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0R3JvdXBQcmVmaXhDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QcmVmaXhLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldEljb25OYW1lKClcIj48L2lneC1pY29uPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICBpZ3hJbnB1dFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbaWd4RGF0ZVRpbWVFZGl0b3JdPVwiY29sdW1uLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNVbmFyeUNvbmRpdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5dXApPVwib25JbnB1dEtleVVwKClcIi8+XG4gICAgICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlIHx8IHZhbHVlID09PSAwXCIgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAoa2V5ZG93bik9XCJvbkNvbW1pdEtleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNvbW1pdENsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5kb25lPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8L2lneC1pbnB1dC1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHRoaXMgfVwiPjwvbmctY29udGFpbmVyPlxuXG48YnV0dG9uIGlneEJ1dHRvbj1cImljb25cIiBjbGFzcz1cImlneC1ncmlkX19maWx0ZXJpbmctcm93LXNjcm9sbC1zdGFydFwiICpuZ0lmPVwic2hvd0Fycm93c1wiIChrZXlkb3duKT1cIm9uTGVmdEFycm93S2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cInNjcm9sbENoaXBzT25BcnJvd1ByZXNzKCdsZWZ0JylcIj5cbiAgICA8aWd4LWljb24+bmF2aWdhdGVfYmVmb3JlPC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuXG48ZGl2ICNjb250YWluZXIgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy1tYWluXCI+XG4gICAgPGRpdj5cbiAgICAgICAgIDxpZ3gtY2hpcHMtYXJlYSAjY2hpcHNBcmVhPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBleHByZXNzaW9uc0xpc3Q7IGluZGV4IGFzIGk7IGxldCBsYXN0ID0gbGFzdDtcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICA8aWd4LWNoaXAgI2NoaXAgaWQ9J2NoaXAnXG4gICAgICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJvbkNoaXBQb2ludGVyZG93bigkZXZlbnQsIGNoaXApXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2hpcENsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkNoaXBLZXlEb3duKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cIm9uQ2hpcFJlbW92ZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIml0ZW0uaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlneFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24uaWNvbk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXJpbmdTZXJ2aWNlLmdldENoaXBMYWJlbChpdGVtLmV4cHJlc3Npb24pfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9pZ3gtY2hpcD5cblxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdvcGVyYW5kJyAqbmdJZj1cIiFsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWd4QnV0dG9uIChjbGljayk9XCJ0b2dnbGVPcGVyYXRvcnNEcm9wRG93bigkZXZlbnQsIGkpXCIgW2lneERyb3BEb3duSXRlbU5hdmlnYXRpb25dPVwib3BlcmF0b3JzXCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+ZXhwYW5kX21vcmU8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXJpbmdTZXJ2aWNlLmdldE9wZXJhdG9yQXNTdHJpbmcoaXRlbS5hZnRlck9wZXJhdG9yKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1kcm9wLWRvd24gW2Rpc3BsYXlEZW5zaXR5XT1cImNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5XCIgI29wZXJhdG9ycyAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25Mb2dpY09wZXJhdG9yQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1kcm9wLWRvd24taXRlbSBbdmFsdWVdPVwiMFwiIFtzZWxlY3RlZF09XCJpdGVtLmFmdGVyT3BlcmF0b3IgPT09IDBcIj57e2ZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX2FuZH19PC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1kcm9wLWRvd24taXRlbSBbdmFsdWVdPVwiMVwiIFtzZWxlY3RlZF09XCJpdGVtLmFmdGVyT3BlcmF0b3IgPT09IDFcIj57e2ZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX29wZXJhdG9yX29yfX08L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtZHJvcC1kb3duPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lneC1jaGlwcy1hcmVhPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxidXR0b24gaWd4QnV0dG9uPVwiaWNvblwiIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctc2Nyb2xsLWVuZFwiICpuZ0lmPVwic2hvd0Fycm93c1wiIChjbGljayk9XCJzY3JvbGxDaGlwc09uQXJyb3dQcmVzcygncmlnaHQnKVwiPlxuICAgIDxpZ3gtaWNvbj5uYXZpZ2F0ZV9uZXh0PC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuXG48ZGl2ICNidXR0b25zQ29udGFpbmVyIFtuZ0NsYXNzXT1cImlzTmFycm93V2lkdGggPyAnaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctZWRpdGluZy1idXR0b25zLS1zbWFsbCcgOiAnaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctZWRpdGluZy1idXR0b25zJ1wiPlxuICAgIDxidXR0b24gW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW2lneEJ1dHRvbl09XCJpc05hcnJvd1dpZHRoID8gJ2ljb24nIDogJ2ZsYXQnXCIgaWd4UmlwcGxlIChjbGljayk9XCJjbGVhckZpbHRlcmluZygpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3RhYmluZGV4XT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxpZ3gtaWNvbj5yZWZyZXNoPC9pZ3gtaWNvbj5cbiAgICAgICAgPHNwYW4+e3tpc05hcnJvd1dpZHRoID8gJycgOiBmaWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9yb3dfcmVzZXR9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uICNjbG9zZUJ1dHRvbiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbaWd4QnV0dG9uXT1cImlzTmFycm93V2lkdGggPyAnaWNvbicgOiAnZmxhdCdcIiAgaWd4UmlwcGxlIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgICAgIDxpZ3gtaWNvbj5jbG9zZTwvaWd4LWljb24+XG4gICAgICAgIDxzcGFuPnt7aXNOYXJyb3dXaWR0aCA/ICcnIDogZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X2Nsb3NlfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
|
|
771
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2dyaWRzL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFFWixVQUFVLEVBQ1YsV0FBVyxFQUNYLHVCQUF1QixFQUV2QixZQUFZLEVBRWYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBdUIsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRixPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLHlEQUF5RCxDQUFDO0FBQy9HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUNqSCxPQUFPLEVBQXNCLHFCQUFxQixFQUFvQixNQUFNLDJCQUEyQixDQUFDO0FBR3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVB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RUFBRSxvQkFBb0IsRUFBRTtnQkFJL0MsVUFBVTtzQkFEbkIsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUluQyxNQUFNO3NCQURmLFNBQVM7dUJBQUMsUUFBUTtnQkFJVCxnQkFBZ0I7c0JBRHpCLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUl6QyxTQUFTO3NCQURsQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTlCLE9BQU87c0JBRGhCLFNBQVM7dUJBQUMsU0FBUztnQkFJVixXQUFXO3NCQURwQixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBa0RuQyxnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIFZpZXdSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSwgRGF0YVV0aWwgfSBmcm9tICcuLi8uLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IElneERyb3BEb3duQ29tcG9uZW50LCBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vLi4vZHJvcC1kb3duL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgVmVydGljYWxBbGlnbm1lbnQsIE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uL2Nvbm5lY3RlZC1wb3NpdGlvbmluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJQmFzZUNoaXBFdmVudEFyZ3MsIElneENoaXBzQXJlYUNvbXBvbmVudCwgSWd4Q2hpcENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NoaXBzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4RHJvcERvd25JdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZHJvcC1kb3duL2Ryb3AtZG93bi1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hGaWx0ZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvb3ZlcmxheS9zY3JvbGwnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpc0VxdWFsLCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEV4cHJlc3Npb25VSSB9IGZyb20gJy4uL2V4Y2VsLXN0eWxlL2NvbW1vbic7XG5pbXBvcnQgeyBDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1maWx0ZXJpbmctcm93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1maWx0ZXJpbmctcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uKCk6IENvbHVtblR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5fY29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5mb3JFYWNoKGV4cCA9PiBleHAuaXNTZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2YWw7XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0ID0gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldEV4cHJlc3Npb25zKHRoaXMuX2NvbHVtbi5maWVsZCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuXG4gICAgICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uc2VhcmNoVmFsIDogbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbCkge1xuICAgICAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmV4cHJlc3Npb24gPT09IHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKHRoaXMuY29sdW1uLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWw7XG4gICAgICAgICAgICBpZiAoaXNFcXVhbChvbGRWYWx1ZSwgdmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9IERhdGFVdGlsLnBhcnNlVmFsdWUodGhpcy5jb2x1bW4uZGF0YVR5cGUsIHZhbCk7XG4gICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFeHByZXNzaW9uKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzcGxheURlbnNpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZSA/IERpc3BsYXlEZW5zaXR5LmNvc3kgOiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3cnKVxuICAgIHB1YmxpYyBkZWZhdWx0Q1NTQ2xhc3MgPSB0cnVlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBjb21wYWN0Q1NTQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5ncmlkLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgY29zeUNTU0NsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZ3JpZC5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29zeTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RmlsdGVyVUknLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEZpbHRlclVJOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdERhdGVVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RGF0ZVVJOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdFRpbWVVSScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0VGltZVVJOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdERhdGVUaW1lVUknLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdERhdGVUaW1lVUk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBpbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXBDb25kaXRpb25zJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRyb3BEb3duQ29uZGl0aW9uczogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdjaGlwc0FyZWEnLCB7IHJlYWQ6IElneENoaXBzQXJlYUNvbXBvbmVudCwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGNoaXBzQXJlYTogSWd4Q2hpcHNBcmVhQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZHJlbignb3BlcmF0b3JzJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHByb3RlY3RlZCBkcm9wRG93bk9wZXJhdG9yczogUXVlcnlMaXN0PElneERyb3BEb3duQ29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXAnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXRHcm91cDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHByb3RlY3RlZCBwaWNrZXI6IElneERhdGVQaWNrZXJDb21wb25lbnQgfCBJZ3hUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cFByZWZpeCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBpbnB1dEdyb3VwUHJlZml4OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdvcGVyYW5kJylcbiAgICBwcm90ZWN0ZWQgb3BlcmFuZDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjbG9zZUJ1dHRvbicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGNsb3NlQnV0dG9uOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dBcnJvd3M6IGJvb2xlYW47XG4gICAgcHVibGljIGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgIHB1YmxpYyBleHByZXNzaW9uc0xpc3Q6IEFycmF5PEV4cHJlc3Npb25VST47XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9jb25kaXRpb25zT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpXG4gICAgfTtcblxuICAgIHByaXZhdGUgX29wZXJhdG9yc092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSh0aGlzLl9wb3NpdGlvblNldHRpbmdzKVxuICAgIH07XG5cbiAgICBwcml2YXRlIGNoaXBzQXJlYVdpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBfY29sdW1uID0gbnVsbDtcbiAgICBwcml2YXRlIGlzS2V5UHJlc3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jYW5jZWxDaGlwQ2xpY2sgPSBmYWxzZTtcblxuICAgIC8qKiBzd2l0Y2ggdG8gaWNvbiBidXR0b25zIHdoZW4gd2lkdGggaXMgYmVsb3cgNDMycHggKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IE5BUlJPV19XSURUSF9USFJFU0hPTEQgPSA0MzI7XG5cbiAgICBwcml2YXRlICRkZXN0cm95ZXIgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgcmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsXG4gICAgKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25IYW5kbGVyKGV2dDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0ZpbHRlcmluZ0tleUNvbWJvKGV2dCkpIHtcbiAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmNvbHVtbi5ncmlkLm91dGxldDtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuY29sdW1uLmdyaWQub3V0bGV0O1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbmQoZXhwciA9PiBleHByLmlzU2VsZWN0ZWQgPT09IHRydWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBzZWxlY3RlZEl0ZW0uZXhwcmVzc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLmxvY2FsZUNoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveWVyKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISh0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgJiYgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREYXRlVUk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFRpbWVVSTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERhdGVUaW1lVUk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZpbHRlclVJO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbHVtbi5kYXRhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb25kaXRpb25zKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJzLmNvbmRpdGlvbkxpc3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVW5hcnlDb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uICYmIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5nZXRDaGlwTGFiZWwodGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19kYXRlX3BsYWNlaG9sZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X2Jvb2xlYW5fcGxhY2Vob2xkZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2ZpbHRlcl9yb3dfcGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIHRoZSBpbnB1dCBncm91cCdzIHByZWZpeC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25QcmVmaXhLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzQWN0aXZhdGlvbktleShldmVudCkgJiYgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLlRBQiAmJiAhdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbmRpdGlvbnNEcm9wRG93bih0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5pc0tleVByZXNzZWQgPSB0cnVlO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24odGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FTlRFUikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1pdElucHV0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYWx0S2V5ICYmIChldmVudC5rZXkgPT09IHRoaXMucGxhdGZvcm0uS0VZTUFQLkFSUk9XX0RPV04pKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBQcmVmaXgubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDb25kaXRpb25zRHJvcERvd24odGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGxhdGZvcm0uaXNGaWx0ZXJpbmdLZXlDb21ibyhldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXl1cCBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXRLZXlVcCgpIHtcbiAgICAgICAgdGhpcy5pc0tleVByZXNzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBpbnB1dCBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIG9uSW5wdXQoZXZlbnRBcmdzKSB7XG4gICAgICAgIC8vIFRoZSAnaXNrZXlQcmVzc2VkJyBmbGFnIGlzIG5lZWRlZCBmb3IgYSBjYXNlIGluIElFLCBiZWNhdXNlIHRoZSBpbnB1dCBldmVudCBpcyBmaXJlZCBvbiBmb2N1cyBhbmQgZm9yIHNvbWUgcmVhc29uLFxuICAgICAgICAvLyB3aGVuIHlvdSBoYXZlIGEgamFwYW5lc2UgY2hhcmFjdGVyIGFzIGEgcGxhY2Vob2xkZXIsIG9uIGluaXQgdGhlIHZhbHVlIGhlcmUgaXMgZW1wdHkgc3RyaW5nIC5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRBcmdzLnRhcmdldDtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBldmVudEFyZ3M7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNFZGdlICYmIHRhcmdldC50eXBlICE9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgfHwgdGhpcy5pc0tleVByZXNzZWQgfHwgdGFyZ2V0LnZhbHVlIHx8IHRhcmdldC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjb21wb3NpdGlvbnN0YXJ0IG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db21wb3NpdGlvblN0YXJ0KCkge1xuICAgICAgICB0aGlzLmlzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjb21wb3NpdGlvbmVuZCBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tcG9zaXRpb25FbmQoKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBpbnB1dCBjbGljayBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuICYmIHRoaXMuZHJvcERvd25Db25kaXRpb25zLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwUHJlZml4Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKHRoaXMuaW5wdXRHcm91cFByZWZpeC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBvcGVyYXRpb24gY29uZGl0aW9uIGZvciBhIGdpdmVuIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25kaXRpb24odmFsdWU6IHN0cmluZyk6IElGaWx0ZXJpbmdPcGVyYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVycy5jb25kaXRpb24odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgY29uZGl0aW9uIG5hbWUgZm9yIGEgZ2l2ZW4gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zbGF0ZUNvbmRpdGlvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5nc1tgaWd4X2dyaWRfZmlsdGVyXyR7dGhpcy5nZXRDb25kaXRpb24odmFsdWUpLm5hbWV9YF0gfHwgdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaWNvbiBuYW1lIG9mIHRoZSBjdXJyZW50IGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SWNvbk5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbiAmJiB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb25kaXRpb24odGhpcy5jb25kaXRpb25zWzBdKS5pY29uTmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gY29uZGl0aW9uIGlzIHNlbGVjdGVkIGluIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbmRpdGlvblNlbGVjdGVkKGNvbmRpdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA9PT0gY29uZGl0aW9uTmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgY3VycmVudCBmaWx0ZXJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyaW5nKCkge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJGaWx0ZXIodGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSh0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21taXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIGNvbW1pdElucHV0KCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLmV4cHJlc3Npb25zTGlzdC5maWx0ZXIoZXggPT4gZXguaXNTZWxlY3RlZCA9PT0gdHJ1ZSk7XG4gICAgICAgIHNlbGVjdGVkSXRlbS5mb3JFYWNoKGUgPT4gZS5pc1NlbGVjdGVkID0gZmFsc2UpO1xuXG4gICAgICAgIGxldCBpbmRleFRvRGVzZWxlY3QgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0W2luZGV4XS5leHByZXNzaW9uO1xuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsICYmICFleHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0Rlc2VsZWN0ID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4VG9EZXNlbGVjdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXhwcmVzc2lvbihpbmRleFRvRGVzZWxlY3QsIHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEV4cHJlc3Npb24oKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDaGlwc1doZW5BZGRpbmdFeHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFySW5wdXQoZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3Iga2V5ZG93biBvbiBjbGVhciBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ2xlYXJLZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgY2xpY2sgb24gY2xlYXIgYnV0dG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNsZWFyQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBrZXlkb3duIG9uIGNvbW1pdCBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIG9uQ29tbWl0S2V5RG93bihldmVudEFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGV2ZW50QXJncykpIHtcbiAgICAgICAgICAgIGV2ZW50QXJncy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRJbnB1dCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjbGljayBvbiBjb21taXQgYnV0dG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbW1pdENsaWNrKGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0SW5wdXQoKTtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgZm9jdXNvdXQgb24gdGhlIGlucHV0IGdyb3VwLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0R3JvdXBGb2N1c291dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUgIT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gJiYgIXRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChmb2N1c2VkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2lneC1jaGlwX19yZW1vdmUnKSB8fCBmb2N1c2VkRWxlbWVudC50YWdOYW1lID09PSAnSUdYLURBWS1JVEVNJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEoZm9jdXNlZEVsZW1lbnQgJiYgdGhpcy5lZGl0b3JzQ29udGFpbihmb2N1c2VkRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21taXRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGZpbHRlcmluZyBlZGl0IHJvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25zTGlzdC5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0WzBdLmV4cHJlc3Npb24uc2VhcmNoVmFsID09PSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFswXS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdldEV4cHJlc3Npb25zKHRoaXMuY29sdW1uLmZpZWxkKS5wb3AoKTtcblxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRUb1JlbW92ZSA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0LmZpbHRlcihleCA9PiBleC5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gbnVsbCAmJiAhZXguZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSk7XG4gICAgICAgICAgICBpZiAoY29uZFRvUmVtb3ZlICYmIGNvbmRUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uZFRvUmVtb3ZlLmZvckVhY2goYyA9PiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVtb3ZlRXhwcmVzc2lvbih0aGlzLmNvbHVtbi5maWVsZCwgdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihjKSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS51cGRhdGVGaWx0ZXJpbmdDZWxsKHRoaXMuY29sdW1uKTtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnNlbGVjdGVkRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcblxuICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEV2ZW50IGhhbmRsZXIgZm9yIGRhdGUgcGlja2VyJ3Mgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkRhdGVTZWxlY3RlZCh2YWx1ZTogRGF0ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGlucHV0R3JvdXBQcmVmaXhDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlQ29uZGl0aW9uc0Ryb3BEb3duKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBjb25kaXRpb25zIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVDb25kaXRpb25zRHJvcERvd24odGFyZ2V0OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY29uZGl0aW9uc092ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX2NvbmRpdGlvbnNPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGFyZ2V0IGFzIEhUTUxFbGVtZW50XTtcbiAgICAgICAgdGhpcy5kcm9wRG93bkNvbmRpdGlvbnMudG9nZ2xlKHRoaXMuX2NvbmRpdGlvbnNPdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBsb2dpYyBvcGVyYXRvcnMgZHJvcGRvd24uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZU9wZXJhdG9yc0Ryb3BEb3duKGV2ZW50QXJncywgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IGV2ZW50QXJncy50YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICAgICAgdGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzLmV4Y2x1ZGVGcm9tT3V0c2lkZUNsaWNrID0gW2V2ZW50QXJncy50YXJnZXQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuZHJvcERvd25PcGVyYXRvcnMudG9BcnJheSgpW2luZGV4XS50b2dnbGUodGhpcy5fb3BlcmF0b3JzT3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGFuZ2UgZXZlbnQgaW4gY29uZGl0aW9ucyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db25kaXRpb25zQ2hhbmdlZChldmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnRBcmdzLm5ld1NlbGVjdGlvbiBhcyBJZ3hEcm9wRG93bkl0ZW1Db21wb25lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24uY29uZGl0aW9uID0gdGhpcy5nZXRDb25kaXRpb24odmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5KSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZ3JpZCdzIGZpbHRlcmluZyBvbiB0aGUgbmV4dCBjeWNsZSB0byBlbnN1cmUgdGhlIGRyb3AtZG93biBpcyBjbG9zZWRcbiAgICAgICAgICAgIC8vIGlmIHRoZSBkcm9wLWRvd24gaXMgbm90IGNsb3NlZCB0aGlzIGV2ZW50IGhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51bmFyeUNvbmRpdGlvbkNoYW5nZWRDYWxsYmFjaygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmNvbmRpdGlvbkNoYW5nZWRDYWxsYmFjaygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYmVjYXVzZSBvZiBhbiBpc3N1ZSBpbiBJRSwgd2hlcmUgeW91IGFyZSBzdGlsbCBhYmxlIHRvIHdyaXRlIGluIHRoZSBpbnB1dCxcbiAgICAgICAgLy8gaWYgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgdGhlbiBzZXQgdG8gcmVhZG9ubHkuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmZvY3VzRWRpdEVsZW1lbnQoKSk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25DaGlwUG9pbnRlcmRvd24oYXJncywgY2hpcDogSWd4Q2hpcENvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fY2FuY2VsQ2hpcENsaWNrID0gY2hpcC5zZWxlY3RlZFxuICAgICAgICAgICAgJiYgYWN0aXZlRWxlbWVudCAmJiB0aGlzLmVkaXRvcnNDb250YWluKGFjdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoaXBDbGljayhhcmdzLCBpdGVtOiBFeHByZXNzaW9uVUkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbmNlbENoaXBDbGljaykge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsQ2hpcENsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdC5mb3JFYWNoKGV4ID0+IGV4LmlzU2VsZWN0ZWQgPSBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy50b2dnbGVDaGlwKGl0ZW0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVDaGlwKGl0ZW06IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSAhaXRlbS5pc1NlbGVjdGVkO1xuICAgICAgICBpZiAoaXRlbS5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBpdGVtLmV4cHJlc3Npb247XG5cbiAgICAgICAgICAgIHRoaXMuZm9jdXNFZGl0RWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgY2hpcCBrZXlkb3duIGV2ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBLZXlEb3duKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCwgaXRlbTogRXhwcmVzc2lvblVJKSB7XG4gICAgICAgIGlmIChldmVudEFyZ3Mua2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FTlRFUikge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpcChpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjcm9sbHMgdGhlIGZpcnN0IGNoaXAgaW50byB2aWV3IGlmIHRoZSB0YWIga2V5IGlzIHByZXNzZWQgb24gdGhlIGxlZnQgYXJyb3cuXG4gICAgICovXG4gICAgcHVibGljIG9uTGVmdEFycm93S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5UQUIpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgPSAwO1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGlwIHJlbW92ZWQgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcFJlbW92ZWQoZXZlbnRBcmdzOiBJQmFzZUNoaXBFdmVudEFyZ3MsIGl0ZW06IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gdGhpcy5leHByZXNzaW9uc0xpc3QuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgdGhpcy5yZW1vdmVFeHByZXNzaW9uKGluZGV4VG9SZW1vdmUsIGl0ZW0uZXhwcmVzc2lvbik7XG5cbiAgICAgICAgdGhpcy5zY3JvbGxDaGlwc09uUmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlciBmb3IgbG9naWMgb3BlcmF0b3IgY2hhbmdlZCBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Mb2dpY09wZXJhdG9yQ2hhbmdlZChldmVudEFyZ3M6IElTZWxlY3Rpb25FdmVudEFyZ3MsIGV4cHJlc3Npb246IEV4cHJlc3Npb25VSSkge1xuICAgICAgICBpZiAoZXZlbnRBcmdzLm9sZFNlbGVjdGlvbikge1xuICAgICAgICAgICAgZXhwcmVzc2lvbi5hZnRlck9wZXJhdG9yID0gKGV2ZW50QXJncy5uZXdTZWxlY3Rpb24gYXMgSWd4RHJvcERvd25JdGVtQ29tcG9uZW50KS52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbnNMaXN0W3RoaXMuZXhwcmVzc2lvbnNMaXN0LmluZGV4T2YoZXhwcmVzc2lvbikgKyAxXS5iZWZvcmVPcGVyYXRvciA9IGV4cHJlc3Npb24uYWZ0ZXJPcGVyYXRvcjtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIGdyaWQncyBmaWx0ZXJpbmcgb24gdGhlIG5leHQgY3ljbGUgdG8gZW5zdXJlIHRoZSBkcm9wLWRvd24gaXMgY2xvc2VkXG4gICAgICAgICAgICAvLyBpZiB0aGUgZHJvcC1kb3duIGlzIG5vdCBjbG9zZWQgdGhpcyBldmVudCBoYW5kbGVyIHdpbGwgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZmlsdGVyKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgY2hpcHMgaW50byB0aGUgY2hpcCBhcmVhIHdoZW4gbGVmdCBvciByaWdodCBhcnJvd3MgYXJlIHByZXNzZWQuXG4gICAgICovXG4gICAgcHVibGljIHNjcm9sbENoaXBzT25BcnJvd1ByZXNzKGFycm93UG9zaXRpb246IHN0cmluZykge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBjb25zdCBjaGlwQXJhZUNoaWxkcmVuID0gdGhpcy5jaGlwc0FyZWEuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAoYXJyb3dQb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBBcmFlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5jZWlsKGNoaXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpIDwgTWF0aC5jZWlsKGNvbnRhaW5lclJlY3QucmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY291bnQgPCBjaGlwQXJhZUNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQgLT0gTWF0aC5jZWlsKGNoaXBBcmFlQ2hpbGRyZW5bY291bnRdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSAtXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbChjb250YWluZXJSZWN0LnJpZ2h0KSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyb3dQb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaXAgb2YgY2hpcEFyYWVDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSA8IE1hdGguY2VpbChjb250YWluZXJSZWN0LmxlZnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCArPSBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSAtXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbChjaGlwQXJhZUNoaWxkcmVuW2NvdW50IC0gMV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJlc2V0cyB0aGUgY2hpcHMgYXJlYVxuICAgICAqIEBtZW1iZXJvZiBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2hpcHNBcmVhKCkge1xuICAgICAgICB0aGlzLmNoaXBBcmVhU2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVBcnJvd0J1dHRvbnMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZm9jdXNFZGl0RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5nZXRFZGl0RWxlbWVudCgpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuJGRlc3Ryb3llci5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93SGlkZUFycm93QnV0dG9ucygpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpcHNBcmVhV2lkdGggPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3dBcnJvd3MgPSB0aGlzLmNoaXBzQXJlYVdpZHRoID49IGNvbnRhaW5lcldpZHRoICYmIHRoaXMuaXNDb2x1bW5GaWx0ZXJlZDtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzZSB0aGUgY2RyLmRldGVjdENoYW5nZXMoKSB1c2FnZSBoZXJlXG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5jZHIgYXMgVmlld1JlZikuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRXhwcmVzc2lvbihpc1NlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGV4cHJVSSA9IG5ldyBFeHByZXNzaW9uVUkoKTtcbiAgICAgICAgZXhwclVJLmV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb247XG4gICAgICAgIGV4cHJVSS5iZWZvcmVPcGVyYXRvciA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aCA+IDAgPyBGaWx0ZXJpbmdMb2dpYy5BbmQgOiBudWxsO1xuICAgICAgICBleHByVUkuaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQ7XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uc0xpc3QucHVzaChleHByVUkpO1xuXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuZXhwcmVzc2lvbnNMaXN0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbnNMaXN0W2xlbmd0aCAtIDJdKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zTGlzdFtsZW5ndGggLSAyXS5hZnRlck9wZXJhdG9yID0gdGhpcy5leHByZXNzaW9uc0xpc3RbbGVuZ3RoIC0gMV0uYmVmb3JlT3BlcmF0b3I7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dIaWRlQXJyb3dCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVFeHByZXNzaW9uKGluZGV4VG9SZW1vdmU6IG51bWJlciwgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgPT09IDAgJiYgdGhpcy5leHByZXNzaW9uc0xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRmlsdGVyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVtb3ZlRXhwcmVzc2lvbih0aGlzLmNvbHVtbi5maWVsZCwgaW5kZXhUb1JlbW92ZSk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXIoKTtcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uID09PSBleHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRFeHByZXNzaW9uKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSB7XG4gICAgICAgICAgICBmaWVsZE5hbWU6IHRoaXMuY29sdW1uLmZpZWxkLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBudWxsLFxuICAgICAgICAgICAgc2VhcmNoVmFsOiBudWxsLFxuICAgICAgICAgICAgaWdub3JlQ2FzZTogdGhpcy5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbi5kYXRhVHlwZSAhPT0gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5jb25kaXRpb24gPSB0aGlzLmdldENvbmRpdGlvbih0aGlzLmNvbmRpdGlvbnNbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZSAmJiB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93SGlkZUFycm93QnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNXaGVuQWRkaW5nRXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlwQXJhZUNoaWxkcmVuIHx8IGNoaXBBcmFlQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlwc0NvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgY2hpcHNBcmVhV2lkdGggPSB0aGlzLmNoaXBzQXJlYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgaWYgKGNoaXBzQXJlYVdpZHRoID4gY2hpcHNDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IGNoaXBzQ29udGFpbmVyV2lkdGggLSBjaGlwc0FyZWFXaWR0aDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKHRoaXMuY2hpcEFyZWFTY3JvbGxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm0ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7b2Zmc2V0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsQ2hpcHNPblJlbW92ZSgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgY29uc3QgY2hpcEFyYWVDaGlsZHJlbiA9IHRoaXMuY2hpcHNBcmVhLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlwIG9mIGNoaXBBcmFlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmNlaWwoY2hpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkgPCBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY291bnQgPD0gMikge1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWYgPSBjaGlwQXJhZUNoaWxkcmVuW2NvdW50XS5pZCA9PT0gJ2NoaXAnID8gY291bnQgLSAyIDogY291bnQgLSAxO1xuICAgICAgICAgICAgdGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCArPSBNYXRoLmNlaWwoY29udGFpbmVyUmVjdC5sZWZ0KSAtIE1hdGguY2VpbChjaGlwQXJhZUNoaWxkcmVuW2RpZl0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0odGhpcy5jaGlwQXJlYVNjcm9sbE9mZnNldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICghIXRoaXMuZXhwcmVzc2lvbi5zZWFyY2hWYWwgfHwgdGhpcy5leHByZXNzaW9uLnNlYXJjaFZhbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5hcnlDb25kaXRpb25DaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uc0xpc3QuZmluZChpdGVtID0+IGl0ZW0uZXhwcmVzc2lvbiA9PT0gdGhpcy5leHByZXNzaW9uKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEV4cHJlc3Npb24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckludGVybmFsKHRoaXMuY29sdW1uLmZpZWxkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVkaXRvcnNDb250YWluKGNoaWxkOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIHRoZSBmaXJzdCBjaGVjayBpcyBmYWxzZSBhbmQgdGhlIHNlY29uZCBpcyB1bmRlZmluZWQgdGhpcyB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGFsd2F5cyByZXR1cm5zIGJvb2xlYW5cbiAgICAgICAgcmV0dXJuICEhKHRoaXMuaW5wdXRHcm91cCAmJiB0aGlzLmlucHV0R3JvdXAubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZClcbiAgICAgICAgICAgIHx8IHRoaXMucGlja2VyICYmIHRoaXMucGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhjaGlsZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzQ29sdW1uRmlsdGVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgJiYgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc05hcnJvd1dpZHRoKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDwgdGhpcy5OQVJST1dfV0lEVEhfVEhSRVNIT0xEO1xuICAgIH1cbn1cbiIsIjwhLS0gSGF2ZSB0byBhcHBseSBzdHlsZXMgaW5saW5lIGJlY2F1c2Ugb2YgdGhlIG92ZXJsYXkgb3V0bGV0IC4uLiAtLT5cbjxpZ3gtZHJvcC1kb3duICNpbnB1dEdyb3VwQ29uZGl0aW9ucyBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbaGVpZ2h0XT1cIicyMDBweCdcIiAoc2VsZWN0aW9uQ2hhbmdpbmcpPVwib25Db25kaXRpb25zQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgPGlneC1kcm9wLWRvd24taXRlbSAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnNcIlxuICAgICAgICBbdmFsdWVdPVwiY29uZGl0aW9uXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cImlzQ29uZGl0aW9uU2VsZWN0ZWQoY29uZGl0aW9uKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldENvbmRpdGlvbihjb25kaXRpb24pLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi10ZXh0XCI+e3sgdHJhbnNsYXRlQ29uZGl0aW9uKGNvbmRpdGlvbikgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuPC9pZ3gtZHJvcC1kb3duPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRGaWx0ZXJVST5cbiAgICA8aWd4LWlucHV0LWdyb3VwICNpbnB1dEdyb3VwIHR5cGU9XCJib3hcIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiAoZm9jdXNvdXQpPVwib25JbnB1dEdyb3VwRm9jdXNvdXQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gZmFtaWx5PVwiaW14LWljb25zXCIgW25hbWVdPVwiZ2V0SWNvbk5hbWUoKVwiPjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1VuYXJ5Q29uZGl0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25zdGFydCk9XCJvbkNvbXBvc2l0aW9uU3RhcnQoKVwiXG4gICAgICAgICAgICAoY29tcG9zaXRpb25lbmQpPVwib25Db21wb3NpdGlvbkVuZCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cIm9uSW5wdXRLZXlVcCgpXCIvPlxuICAgICAgICAgICAgPGlneC1zdWZmaXggKm5nSWY9XCJ2YWx1ZSB8fCB2YWx1ZSA9PT0gMFwiID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25Db21taXRLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25Db21taXRDbGljaygpXCIgdGFiaW5kZXg9XCIwXCI+ZG9uZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIChrZXlkb3duKT1cIm9uQ2xlYXJLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25DbGVhckNsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2lneC1zdWZmaXg+XG4gICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHREYXRlVUk+XG4gICAgPGlneC1kYXRlLXBpY2tlciAjcGlja2VyXG4gICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICBbb3V0bGV0XT1cImZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5vdXRsZXRcIlxuICAgICAgICBbbG9jYWxlXT1cImZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5sb2NhbGVcIlxuICAgICAgICAoY2xpY2spPVwiZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeSA/IG51bGwgOiBwaWNrZXIub3BlbigpXCJcbiAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImNvbHVtbi5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICBbZm9ybWF0dGVyXT1cImNvbHVtbi5mb3JtYXR0ZXJcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbd2Vla1N0YXJ0XT1cImNvbHVtbi5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIlxuICAgICAgICAoY2xvc2VkKT1cImZvY3VzRWRpdEVsZW1lbnQoKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbnB1dEdyb3VwUHJlZml4Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtcHJlZml4PlxuICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlXCI+XG4gICAgICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25Db21taXRLZXlEb3duKCRldmVudClcIiAoY2xpY2spPVwib25Db21taXRDbGljaygkZXZlbnQpXCI+ZG9uZTwvaWd4LWljb24+XG4gICAgICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJjbGVhcklucHV0KCRldmVudClcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICA8aWd4LXBpY2tlci1jbGVhcj48L2lneC1waWNrZXItY2xlYXI+XG4gICAgPC9pZ3gtZGF0ZS1waWNrZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUaW1lVUk+XG4gICAgPGlneC10aW1lLXBpY2tlciAjcGlja2VyXG4gICAgICAgIFsodmFsdWUpXT1cInZhbHVlXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0XT1cImNvbHVtbi5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgIFtsb2NhbGVdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLmxvY2FsZVwiXG4gICAgICAgIFtmb3JtYXR0ZXJdPVwiY29sdW1uLmZvcm1hdHRlclwiXG4gICAgICAgIFtvdXRsZXRdPVwiZmlsdGVyaW5nU2VydmljZS5ncmlkLm91dGxldFwiXG4gICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIChjbG9zZWQpPVwiZm9jdXNFZGl0RWxlbWVudCgpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cImV4cHJlc3Npb24uY29uZGl0aW9uLmlzVW5hcnkgPyBudWxsIDogcGlja2VyLm9wZW4oKVwiPlxuICAgICAgICA8aWd4LXByZWZpeCAjaW5wdXRHcm91cFByZWZpeFxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAoY2xpY2spPVwiaW5wdXRHcm91cFByZWZpeENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblByZWZpeEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgIFtpZ3hEcm9wRG93bkl0ZW1OYXZpZ2F0aW9uXT1cImlucHV0R3JvdXBDb25kaXRpb25zXCI+XG4gICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJpbXgtaWNvbnNcIiBbbmFtZV09XCJleHByZXNzaW9uLmNvbmRpdGlvbi5pY29uTmFtZVwiPjwvaWd4LWljb24+XG4gICAgPC9pZ3gtcHJlZml4PlxuICAgIDxpZ3gtc3VmZml4ICpuZ0lmPVwidmFsdWVcIj5cbiAgICAgICAgPGlneC1pY29uIHRhYmluZGV4PVwiMFwiIChrZXlkb3duKT1cIm9uQ29tbWl0S2V5RG93bigkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQ29tbWl0Q2xpY2soJGV2ZW50KVwiPmRvbmU8L2lneC1pY29uPlxuICAgICAgICA8aWd4LWljb24gdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJjbGVhcklucHV0KCRldmVudClcIj5jbGVhcjwvaWd4LWljb24+XG4gICAgPC9pZ3gtc3VmZml4PlxuICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICA8L2lneC10aW1lLXBpY2tlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdERhdGVUaW1lVUk+XG4gICAgPGlneC1pbnB1dC1ncm91cCAjaW5wdXRHcm91cCB0eXBlPVwiYm94XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgKGZvY3Vzb3V0KT1cIm9uSW5wdXRHcm91cEZvY3Vzb3V0KClcIj5cbiAgICAgICAgPGlneC1wcmVmaXggI2lucHV0R3JvdXBQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0R3JvdXBQcmVmaXhDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25QcmVmaXhLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJpbnB1dEdyb3VwQ29uZGl0aW9uc1wiPlxuICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIFtuYW1lXT1cImdldEljb25OYW1lKClcIj48L2lneC1pY29uPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICBpZ3hJbnB1dFxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbaWd4RGF0ZVRpbWVFZGl0b3JdPVwiY29sdW1uLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNVbmFyeUNvbmRpdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5dXApPVwib25JbnB1dEtleVVwKClcIi8+XG4gICAgICAgICAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlIHx8IHZhbHVlID09PSAwXCIgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiAoa2V5ZG93bik9XCJvbkNvbW1pdEtleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNvbW1pdENsaWNrKClcIiB0YWJpbmRleD1cIjBcIj5kb25lPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24gKGtleWRvd24pPVwib25DbGVhcktleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJvbkNsZWFyQ2xpY2soKVwiIHRhYmluZGV4PVwiMFwiPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8L2lneC1pbnB1dC1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHRoaXMgfVwiPjwvbmctY29udGFpbmVyPlxuXG48YnV0dG9uIGlneEJ1dHRvbj1cImljb25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLXJvdy1zY3JvbGwtc3RhcnRcIiAqbmdJZj1cInNob3dBcnJvd3NcIiAoa2V5ZG93bik9XCJvbkxlZnRBcnJvd0tleURvd24oJGV2ZW50KVwiIChjbGljayk9XCJzY3JvbGxDaGlwc09uQXJyb3dQcmVzcygnbGVmdCcpXCI+XG4gICAgPGlneC1pY29uPm5hdmlnYXRlX2JlZm9yZTwvaWd4LWljb24+XG48L2J1dHRvbj5cblxuPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctbWFpblwiPlxuICAgIDxkaXY+XG4gICAgICAgICA8aWd4LWNoaXBzLWFyZWEgI2NoaXBzQXJlYT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZXhwcmVzc2lvbnNMaXN0OyBpbmRleCBhcyBpOyBsZXQgbGFzdCA9IGxhc3Q7XCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgPGlneC1jaGlwICNjaGlwIGlkPSdjaGlwJ1xuICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25DaGlwUG9pbnRlcmRvd24oJGV2ZW50LCBjaGlwKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBDbGljaygkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25DaGlwS2V5RG93bigkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJvbkNoaXBSZW1vdmVkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpdGVtLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ3hQcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImlteC1pY29uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZmlsdGVyaW5nU2VydmljZS5nZXRDaGlwTGFiZWwoaXRlbS5leHByZXNzaW9uKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvaWd4LWNoaXA+XG5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD0nb3BlcmFuZCcgKm5nSWY9XCIhbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlneEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZU9wZXJhdG9yc0Ryb3BEb3duKCRldmVudCwgaSlcIiBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJvcGVyYXRvcnNcIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5leHBhbmRfbW9yZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2ZpbHRlcmluZ1NlcnZpY2UuZ2V0T3BlcmF0b3JBc1N0cmluZyhpdGVtLmFmdGVyT3BlcmF0b3IpfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWRyb3AtZG93biBbZGlzcGxheURlbnNpdHldPVwiY29sdW1uLmdyaWQuZGlzcGxheURlbnNpdHlcIiAjb3BlcmF0b3JzIChzZWxlY3Rpb25DaGFuZ2luZyk9XCJvbkxvZ2ljT3BlcmF0b3JDaGFuZ2VkKCRldmVudCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWRyb3AtZG93bi1pdGVtIFt2YWx1ZV09XCIwXCIgW3NlbGVjdGVkXT1cIml0ZW0uYWZ0ZXJPcGVyYXRvciA9PT0gMFwiPnt7ZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3JfYW5kfX08L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWRyb3AtZG93bi1pdGVtIFt2YWx1ZV09XCIxXCIgW3NlbGVjdGVkXT1cIml0ZW0uYWZ0ZXJPcGVyYXRvciA9PT0gMVwiPnt7ZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfb3BlcmF0b3Jfb3J9fTwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1kcm9wLWRvd24+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaWd4LWNoaXBzLWFyZWE+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGJ1dHRvbiBpZ3hCdXR0b249XCJpY29uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctc2Nyb2xsLWVuZFwiICpuZ0lmPVwic2hvd0Fycm93c1wiIChjbGljayk9XCJzY3JvbGxDaGlwc09uQXJyb3dQcmVzcygncmlnaHQnKVwiPlxuICAgIDxpZ3gtaWNvbj5uYXZpZ2F0ZV9uZXh0PC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuXG48ZGl2ICNidXR0b25zQ29udGFpbmVyIFtuZ0NsYXNzXT1cImlzTmFycm93V2lkdGggPyAnaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctZWRpdGluZy1idXR0b25zLS1zbWFsbCcgOiAnaWd4LWdyaWRfX2ZpbHRlcmluZy1yb3ctZWRpdGluZy1idXR0b25zJ1wiPlxuICAgIDxidXR0b24gW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW2lneEJ1dHRvbl09XCJpc05hcnJvd1dpZHRoID8gJ2ljb24nIDogJ2ZsYXQnXCIgdHlwZT1cImJ1dHRvblwiIGlneFJpcHBsZSAoY2xpY2spPVwiY2xlYXJGaWx0ZXJpbmcoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFt0YWJpbmRleF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8aWd4LWljb24+cmVmcmVzaDwvaWd4LWljb24+XG4gICAgICAgIDxzcGFuPnt7aXNOYXJyb3dXaWR0aCA/ICcnIDogZmlsdGVyaW5nU2VydmljZS5ncmlkLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9maWx0ZXJfcm93X3Jlc2V0fX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAjY2xvc2VCdXR0b24gW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW2lneEJ1dHRvbl09XCJpc05hcnJvd1dpZHRoID8gJ2ljb24nIDogJ2ZsYXQnXCIgdHlwZT1cImJ1dHRvblwiIGlneFJpcHBsZSAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICA8c3Bhbj57e2lzTmFycm93V2lkdGggPyAnJyA6IGZpbHRlcmluZ1NlcnZpY2UuZ3JpZC5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZmlsdGVyX3Jvd19jbG9zZX19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|