igniteui-angular 16.1.2 → 16.1.3

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.
Files changed (66) hide show
  1. package/README.md +6 -5
  2. package/esm2022/lib/action-strip/action-strip.component.mjs +3 -3
  3. package/esm2022/lib/action-strip/grid-actions/grid-action-button.component.mjs +3 -3
  4. package/esm2022/lib/banner/banner.component.mjs +8 -8
  5. package/esm2022/lib/card/card.component.mjs +3 -3
  6. package/esm2022/lib/carousel/carousel.component.mjs +7 -7
  7. package/esm2022/lib/combo/combo-dropdown.component.mjs +3 -3
  8. package/esm2022/lib/combo/combo.common.mjs +5 -5
  9. package/esm2022/lib/combo/combo.component.mjs +3 -3
  10. package/esm2022/lib/combo/combo.directives.mjs +2 -2
  11. package/esm2022/lib/core/navigation/directives.mjs +3 -3
  12. package/esm2022/lib/date-common/calendar-container/calendar-container.component.mjs +3 -3
  13. package/esm2022/lib/date-picker/date-picker.component.mjs +7 -7
  14. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +6 -6
  15. package/esm2022/lib/dialog/dialog.component.mjs +5 -5
  16. package/esm2022/lib/directives/button/button.directive.mjs +8 -8
  17. package/esm2022/lib/directives/ripple/ripple.directive.mjs +6 -6
  18. package/esm2022/lib/directives/tooltip/tooltip-target.directive.mjs +7 -9
  19. package/esm2022/lib/directives/tooltip/tooltip.directive.mjs +2 -2
  20. package/esm2022/lib/drop-down/drop-down.component.mjs +3 -3
  21. package/esm2022/lib/expansion-panel/expansion-panel.component.mjs +4 -4
  22. package/esm2022/lib/grids/column-actions/column-actions.component.mjs +3 -3
  23. package/esm2022/lib/grids/common/crud.service.mjs +2 -2
  24. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
  25. package/esm2022/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +3 -3
  26. package/esm2022/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +3 -3
  27. package/esm2022/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +3 -3
  28. package/esm2022/lib/grids/filtering/excel-style/excel-style-header.component.mjs +3 -3
  29. package/esm2022/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +3 -3
  30. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +3 -3
  31. package/esm2022/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +3 -3
  32. package/esm2022/lib/grids/grid/grid.component.mjs +3 -3
  33. package/esm2022/lib/grids/grid-base.directive.mjs +4 -4
  34. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +3 -3
  35. package/esm2022/lib/grids/tree-grid/tree-grid.component.mjs +3 -3
  36. package/esm2022/lib/query-builder/query-builder.component.mjs +3 -3
  37. package/esm2022/lib/simple-combo/simple-combo.component.mjs +3 -3
  38. package/esm2022/lib/snackbar/snackbar.component.mjs +4 -4
  39. package/esm2022/lib/tabs/tabs/tabs.component.mjs +3 -3
  40. package/esm2022/lib/time-picker/time-picker.component.mjs +6 -5
  41. package/esm2022/lib/toast/toast.component.mjs +2 -2
  42. package/esm2022/lib/tree/tree-node/tree-node.component.mjs +4 -4
  43. package/fesm2022/igniteui-angular.mjs +117 -118
  44. package/fesm2022/igniteui-angular.mjs.map +1 -1
  45. package/lib/banner/banner.component.d.ts +5 -5
  46. package/lib/card/card.component.d.ts +2 -2
  47. package/lib/carousel/carousel.component.d.ts +6 -6
  48. package/lib/combo/combo.common.d.ts +4 -4
  49. package/lib/combo/combo.directives.d.ts +1 -1
  50. package/lib/core/navigation/directives.d.ts +2 -2
  51. package/lib/date-picker/date-picker.component.d.ts +4 -4
  52. package/lib/date-range-picker/date-range-picker.component.d.ts +3 -3
  53. package/lib/dialog/dialog.component.d.ts +4 -4
  54. package/lib/directives/button/button.directive.d.ts +7 -7
  55. package/lib/directives/ripple/ripple.directive.d.ts +6 -6
  56. package/lib/directives/tooltip/tooltip-target.directive.d.ts +6 -8
  57. package/lib/directives/tooltip/tooltip.directive.d.ts +1 -1
  58. package/lib/expansion-panel/expansion-panel.component.d.ts +3 -3
  59. package/lib/grids/common/crud.service.d.ts +1 -1
  60. package/lib/grids/grid-base.directive.d.ts +3 -3
  61. package/lib/snackbar/snackbar.component.d.ts +1 -1
  62. package/lib/time-picker/time-picker.component.d.ts +1 -1
  63. package/lib/toast/toast.component.d.ts +1 -1
  64. package/lib/tree/tree-node/tree-node.component.d.ts +3 -3
  65. package/migrations/common/UpdateChanges.js +1 -1
  66. package/package.json +1 -1
@@ -971,11 +971,11 @@ export class IgxQueryBuilderComponent extends DisplayDensityBase {
971
971
  editorIcons.forEach(icon => this.iconService.addSvgIconFromText(icon.name, icon.value, 'imx-icons'));
972
972
  }
973
973
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxQueryBuilderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.IgxIconService }, { token: i2.PlatformUtil }, { token: i0.ElementRef }, { token: LOCALE_ID }, { token: DisplayDensityToken, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
974
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxQueryBuilderComponent, isStandalone: true, selector: "igx-query-builder", inputs: { fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange" }, host: { properties: { "class.igx-query-builder": "this.cssClass", "style.display": "this.display" } }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "showLegend", "resourceStrings"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "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: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: 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: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: 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: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }] }); }
974
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: IgxQueryBuilderComponent, isStandalone: true, selector: "igx-query-builder", inputs: { fields: "fields", expressionTree: "expressionTree", locale: "locale", resourceStrings: "resourceStrings" }, outputs: { expressionTreeChange: "expressionTreeChange" }, host: { properties: { "class.igx-query-builder": "this.cssClass", "style.display": "this.display" } }, queries: [{ propertyName: "headerContent", first: true, predicate: IgxQueryBuilderHeaderComponent, descendants: true }], viewQueries: [{ propertyName: "fieldSelect", first: true, predicate: ["fieldSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "conditionSelect", first: true, predicate: ["conditionSelect"], descendants: true, read: IgxSelectComponent }, { propertyName: "searchValueInput", first: true, predicate: ["searchValueInput"], descendants: true, read: ElementRef }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }, { propertyName: "addRootAndGroupButton", first: true, predicate: ["addRootAndGroupButton"], descendants: true, read: ElementRef }, { propertyName: "addConditionButton", first: true, predicate: ["addConditionButton"], descendants: true, read: ElementRef }, { propertyName: "editingInputsContainer", first: true, predicate: ["editingInputsContainer"], descendants: true, read: ElementRef }, { propertyName: "addModeContainer", first: true, predicate: ["addModeContainer"], descendants: true, read: ElementRef }, { propertyName: "currentGroupButtonsContainer", first: true, predicate: ["currentGroupButtonsContainer"], descendants: true, read: ElementRef }, { propertyName: "contextMenuToggle", first: true, predicate: IgxToggleDirective, descendants: true }, { propertyName: "expressionsContainer", first: true, predicate: ["expressionsContainer"], descendants: true }, { propertyName: "overlayOutlet", first: true, predicate: ["overlayOutlet"], descendants: true, read: IgxOverlayOutletDirective, static: true }, { propertyName: "chips", predicate: IgxChipComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button type=\"button\"\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button type=\"button\"\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IgxQueryBuilderHeaderComponent, selector: "igx-query-builder-header", inputs: ["title", "showLegend", "resourceStrings"] }, { kind: "directive", type: IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "component", type: IgxChipComponent, selector: "igx-chip", inputs: ["variant", "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: "directive", type: IgxPrefixDirective, selector: "igx-prefix,[igxPrefix],[igxStart]" }, { kind: "directive", type: IgxSuffixDirective, selector: "igx-suffix,[igxSuffix],[igxEnd]" }, { kind: "component", type: IgxSelectComponent, selector: "igx-select", inputs: ["placeholder", "disabled", "overlaySettings", "value", "type"], outputs: ["opening", "opened", "closing", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: IgxSelectItemComponent, selector: "igx-select-item", inputs: ["text"] }, { kind: "component", type: IgxInputGroupComponent, selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { kind: "directive", type: IgxInputDirective, selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { kind: "component", type: 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: IgxPickerToggleComponent, selector: "igx-picker-toggle", outputs: ["clicked"] }, { kind: "component", type: IgxPickerClearComponent, selector: "igx-picker-clear" }, { kind: "component", type: 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: IgxDateTimeEditorDirective, selector: "[igxDateTimeEditor]", inputs: ["locale", "minValue", "maxValue", "spinLoop", "displayFormat", "igxDateTimeEditor", "value", "spinDelta"], outputs: ["valueChange", "validationFailed"], exportAs: ["igxDateTimeEditor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { kind: "component", type: IgxButtonGroupComponent, selector: "igx-buttongroup", inputs: ["id", "itemContentCssClass", "multiSelection", "selectionMode", "values", "disabled", "alignment"], outputs: ["selected", "deselected"] }, { kind: "directive", type: IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: IgxFieldFormatterPipe, name: "fieldFormatter" }] }); }
975
975
  }
976
976
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: IgxQueryBuilderComponent, decorators: [{
977
977
  type: Component,
978
- args: [{ selector: 'igx-query-builder', standalone: true, imports: [NgIf, IgxQueryBuilderHeaderComponent, IgxButtonDirective, IgxIconComponent, IgxChipComponent, IgxPrefixDirective, IgxSuffixDirective, IgxSelectComponent, FormsModule, NgFor, IgxSelectItemComponent, IgxInputGroupComponent, IgxInputDirective, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxDateTimeEditorDirective, NgTemplateOutlet, NgClass, IgxToggleDirective, IgxButtonGroupComponent, IgxOverlayOutletDirective, DatePipe, IgxFieldFormatterPipe], template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n" }]
978
+ args: [{ selector: 'igx-query-builder', standalone: true, imports: [NgIf, IgxQueryBuilderHeaderComponent, IgxButtonDirective, IgxIconComponent, IgxChipComponent, IgxPrefixDirective, IgxSuffixDirective, IgxSelectComponent, FormsModule, NgFor, IgxSelectItemComponent, IgxInputGroupComponent, IgxInputDirective, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxDateTimeEditorDirective, NgTemplateOutlet, NgClass, IgxToggleDirective, IgxButtonGroupComponent, IgxOverlayOutletDirective, DatePipe, IgxFieldFormatterPipe], template: "<igx-query-builder-header\n *ngIf=\"!headerContent\"\n [title]=\"this.resourceStrings.igx_query_builder_title\"\n>\n</igx-query-builder-header>\n\n<ng-content select=\"igx-query-builder-header\"></ng-content>\n\n<div\n #expressionsContainer\n class=\"igx-query-builder__main\"\n (scroll)=\"onExpressionsScrolled()\"\n>\n <ng-container *ngIf=\"!rootGroup\">\n <button type=\"button\"\n #addRootAndGroupButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addAndGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"addOrGroup()\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n\n <div class=\"igx-filter-empty\">\n <h6 class=\"igx-filter-empty__title\">\n {{ this.resourceStrings.igx_query_builder_initial_text }}\n </h6>\n </div>\n </ng-container>\n\n <ng-template\n #addExpressionsTemplate\n let-expressionItem\n let-afterExpression=\"afterExpression\"\n >\n <button type=\"button\"\n #addConditionButton\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addCondition(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_add_condition\n }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addAndGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_and_group }}</span>\n </button>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"hasEditedExpression\"\n (click)=\"addOrGroup(expressionItem, afterExpression)\"\n >\n <igx-icon>add</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_or_group }}</span>\n </button>\n </ng-template>\n\n <ng-template #filterOperandTemplate let-expressionItem>\n <div\n *ngIf=\"!expressionItem.inEditMode\"\n class=\"igx-filter-tree__expression-item\"\n (mouseenter)=\"expressionItem.hovered = true\"\n (mouseleave)=\"expressionItem.hovered = false\"\n >\n <igx-chip\n [data]=\"expressionItem\"\n [displayDensity]=\"\n displayDensity === 'compact' ? 'cosy' : displayDensity\n \"\n [removable]=\"true\"\n [selected]=\"expressionItem.selected\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onChipClick(expressionItem)\"\n (dblclick)=\"onChipDblClick(expressionItem)\"\n (remove)=\"onChipRemove(expressionItem)\"\n (selectedChanged)=\"onChipSelectionEnd()\"\n >\n <span igxPrefix class=\"igx-filter-tree__expression-column\">{{\n expressionItem.fieldLabel ||\n expressionItem.expression.fieldName\n }}</span>\n <igx-prefix>\n <igx-icon\n family=\"imx-icons\"\n [name]=\"expressionItem.expression.condition.iconName\"\n >\n </igx-icon>\n </igx-prefix>\n <span class=\"igx-filter-tree__expression-condition\">\n {{\n getConditionFriendlyName(\n expressionItem.expression.condition.name\n )\n }}\n </span>\n <span\n igxSuffix\n *ngIf=\"!expressionItem.expression.condition.isUnary\"\n >\n {{\n isDate(expressionItem.expression.searchVal)\n ? getFormatter(expressionItem.expression.fieldName)\n ? (expressionItem.expression.searchVal\n | fieldFormatter\n : getFormatter(\n expressionItem.expression.fieldName\n )\n : undefined)\n : (expressionItem.expression.searchVal\n | date\n : getFormat(\n expressionItem.expression.fieldName\n )\n : undefined\n : this.locale)\n : expressionItem.expression.searchVal\n }}\n </span>\n </igx-chip>\n <div\n class=\"igx-filter-tree__expression-actions\"\n *ngIf=\"\n (expressionItem.selected &&\n selectedExpressions.length === 1) ||\n expressionItem.hovered\n \"\n >\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionEdit(expressionItem)\"\n >\n edit\n </igx-icon>\n <igx-icon\n tabindex=\"0\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"enterExpressionAdd(expressionItem)\"\n *ngIf=\"\n !expressionItem.inAddMode &&\n (expressionItem.parent !== currentGroup ||\n expressionItem !==\n currentGroup.children[\n currentGroup.children.length - 1\n ])\n \"\n >\n add\n </igx-icon>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inEditMode\"\n #editingInputsContainer\n class=\"igx-filter-tree__inputs\"\n >\n <igx-select\n #fieldSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"fieldSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_column_placeholder\n \"\n [(ngModel)]=\"selectedField\"\n >\n <igx-select-item *ngFor=\"let field of fields\" [value]=\"field\">\n {{ field.label || field.header || field.field }}\n </igx-select-item>\n </igx-select>\n\n <igx-select\n #conditionSelect\n type=\"box\"\n [displayDensity]=\"'compact'\"\n [overlaySettings]=\"conditionSelectOverlaySettings\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_condition_placeholder\n \"\n [(ngModel)]=\"selectedCondition\"\n [disabled]=\"!selectedField\"\n >\n <igx-prefix\n *ngIf=\"\n selectedField &&\n conditionSelect.value &&\n selectedField.filters.condition(conditionSelect.value)\n \"\n >\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(\n conditionSelect.value\n ).iconName\n \"\n >\n </igx-icon>\n </igx-prefix>\n\n <igx-select-item\n *ngFor=\"let condition of getConditionList()\"\n [value]=\"condition\"\n [text]=\"getConditionFriendlyName(condition)\"\n >\n <div class=\"igx-grid__filtering-dropdown-items\">\n <igx-icon\n family=\"imx-icons\"\n [name]=\"\n selectedField.filters.condition(condition)\n .iconName\n \"\n >\n </igx-icon>\n <span class=\"igx-grid__filtering-dropdown-text\">{{\n getConditionFriendlyName(condition)\n }}</span>\n </div>\n </igx-select-item>\n </igx-select>\n\n <igx-input-group\n *ngIf=\"\n !selectedField ||\n (selectedField.dataType !== 'date' &&\n selectedField.dataType !== 'time' &&\n selectedField.dataType !== 'dateTime')\n \"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #searchValueInput\n igxInput\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [type]=\"\n selectedField && selectedField.dataType === 'number'\n ? 'number'\n : 'text'\n \"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_value_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n />\n </igx-input-group>\n\n <igx-date-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'date'\"\n [(value)]=\"searchValue\"\n (keydown)=\"openPicker($event)\"\n (click)=\"picker.open()\"\n type=\"box\"\n [readOnly]=\"true\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [displayFormat]=\"selectedField.pipeArgs.format\"\n [weekStart]=\"selectedField.pipeArgs.weekStart\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-date-picker>\n\n <igx-time-picker\n #picker\n *ngIf=\"selectedField && selectedField.dataType === 'time'\"\n [(value)]=\"searchValue\"\n (click)=\"picker.open()\"\n (keydown)=\"openPicker($event)\"\n [displayDensity]=\"'compact'\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_time_placeholder\n \"\n type=\"box\"\n [readOnly]=\"true\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [locale]=\"this.locale\"\n [outlet]=\"pickerOutlet\"\n [formatter]=\"selectedField.formatter\"\n [inputFormat]=\"selectedField.defaultTimeFormat\"\n >\n <!-- disable default icons -->\n <igx-picker-toggle></igx-picker-toggle>\n <igx-picker-clear></igx-picker-clear>\n </igx-time-picker>\n\n <igx-input-group\n #inputGroup\n type=\"box\"\n *ngIf=\"selectedField && selectedField.dataType === 'dateTime'\"\n type=\"box\"\n [displayDensity]=\"'compact'\"\n >\n <input\n #input\n igxInput\n tabindex=\"0\"\n [placeholder]=\"\n this.resourceStrings.igx_query_builder_date_placeholder\n \"\n [(ngModel)]=\"searchValue\"\n [disabled]=\"\n !selectedField ||\n !selectedCondition ||\n (selectedField &&\n selectedField.filters.condition(selectedCondition)\n .isUnary)\n \"\n [igxDateTimeEditor]=\"selectedField.defaultDateTimeFormat\"\n />\n </igx-input-group>\n\n <div class=\"igx-filter-tree__inputs-actions\">\n <button type=\"button\"\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!operandCanBeCommitted()\"\n (click)=\"commitOperandEdit()\"\n >\n <igx-icon>check</igx-icon>\n </button>\n <button type=\"button\"\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandEdit()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"expressionItem.inAddMode\"\n #addModeContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem.parent, expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"icon\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"cancelOperandAdd()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n </div>\n </ng-template>\n\n <ng-template #expressionTreeTemplate let-expressionItem>\n <div class=\"igx-filter-tree\">\n <div\n tabindex=\"0\"\n class=\"igx-filter-tree__line\"\n [ngClass]=\"{\n 'igx-filter-tree__line--and': expressionItem.operator === 0,\n 'igx-filter-tree__line--or': expressionItem.operator === 1,\n 'igx-filter-tree__line--selected': expressionItem.selected\n }\"\n (keydown)=\"invokeClick($event)\"\n (click)=\"onGroupClick(expressionItem)\"\n ></div>\n\n <div class=\"igx-filter-tree__expression\">\n <ng-container *ngFor=\"let expr of expressionItem.children\">\n <ng-container\n *ngTemplateOutlet=\"\n isExpressionGroup(expr)\n ? expressionTreeTemplate\n : filterOperandTemplate;\n context: context(expr)\n \"\n >\n </ng-container>\n </ng-container>\n <div\n *ngIf=\"currentGroup === expressionItem\"\n #currentGroupButtonsContainer\n class=\"igx-filter-tree__buttons\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n addExpressionsTemplate;\n context: context(expressionItem)\n \"\n >\n </ng-container>\n <button type=\"button\"\n igxButton=\"outlined\"\n *ngIf=\"expressionItem !== rootGroup\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"\n hasEditedExpression ||\n expressionItem.children.length < 2\n \"\n (click)=\"endGroup(expressionItem)\"\n >\n <span>{{\n this.resourceStrings.igx_query_builder_end_group\n }}</span>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-container *ngIf=\"rootGroup\">\n <ng-container\n *ngTemplateOutlet=\"\n expressionTreeTemplate;\n context: context(rootGroup)\n \"\n ></ng-container>\n </ng-container>\n\n <div\n igxToggle\n class=\"igx-filter-contextual-menu\"\n (keydown)=\"onKeyDown($event)\"\n (closed)=\"contextMenuClosed()\"\n [ngClass]=\"{\n 'igx-filter-contextual-menu--cosy': displayDensity === 'cosy',\n 'igx-filter-contextual-menu--compact': displayDensity === 'compact'\n }\"\n >\n <button type=\"button\"\n igxButton=\"icon\"\n class=\"igx-filter-contextual-menu__close-btn\"\n (click)=\"clearSelection()\"\n >\n <igx-icon>close</igx-icon>\n </button>\n\n <ng-container *ngIf=\"contextualGroup\">\n <igx-buttongroup\n [displayDensity]=\"this.displayDensity\"\n [values]=\"filteringLogics\"\n type=\"outline\"\n (selected)=\"selectFilteringLogic($event)\"\n >\n </igx-buttongroup>\n\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n [disabled]=\"!contextualGroup.parent\"\n (click)=\"ungroup()\"\n >\n <igx-icon family=\"imx-icons\" name=\"ungroup\"></igx-icon>\n <span>{{\n this.resourceStrings.igx_query_builder_ungroup\n }}</span>\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteGroup()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n <igx-icon>delete</igx-icon>\n <span>{{ this.resourceStrings.igx_query_builder_delete }}</span>\n </button>\n </ng-container>\n <ng-container *ngIf=\"!contextualGroup\">\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createAndGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_and_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"createOrGroup()\"\n >\n {{ this.resourceStrings.igx_query_builder_create_or_group }}\n </button>\n <button type=\"button\"\n igxButton=\"outlined\"\n [displayDensity]=\"this.displayDensity\"\n (click)=\"deleteFilters()\"\n class=\"igx-filter-contextual-menu__delete-btn\"\n >\n {{ this.resourceStrings.igx_query_builder_delete_filters }}\n </button>\n </ng-container>\n </div>\n</div>\n<div\n #overlayOutlet\n igxOverlayOutlet\n class=\"igx-query-builder__outlet\"\n (pointerdown)=\"onOutletPointerDown($event)\"\n></div>\n" }]
979
979
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.IgxIconService }, { type: i2.PlatformUtil }, { type: i0.ElementRef }, { type: undefined, decorators: [{
980
980
  type: Inject,
981
981
  args: [LOCALE_ID]
@@ -1043,4 +1043,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
1043
1043
  type: ViewChild,
1044
1044
  args: ['overlayOutlet', { read: IgxOverlayOutletDirective, static: true }]
1045
1045
  }] } });
1046
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNELE9BQU8sRUFBeUIsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFFbEcsT0FBTyxFQUFF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RUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBSWxELGdCQUFnQjtzQkFEdkIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSTNDLE1BQU07c0JBRGIsU0FBUzt1QkFBQyxRQUFRO2dCQUlYLHFCQUFxQjtzQkFENUIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWhELGtCQUFrQjtzQkFEekIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBTzlDLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsOEJBQThCO2dCQUk5QixzQkFBc0I7c0JBRG5DLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQWtCM0MsZ0JBQWdCO3NCQUQ3QixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFrQnJDLDRCQUE0QjtzQkFEekMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBa0J2RCxpQkFBaUI7c0JBRHhCLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUlyQixLQUFLO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQUl0QixvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUl6QixhQUFhO3NCQURwQixTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIExPQ0FMRV9JRCwgT3B0aW9uYWwsIE91dHB1dCwgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWssIE5nSWYsIE5nRm9yLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVkaXRvciB9IGZyb20gJ0BpZ25pdGV1aS9tYXRlcmlhbC1pY29ucy1leHRlbmRlZCc7XG5pbXBvcnQgeyBJQnV0dG9uR3JvdXBFdmVudEFyZ3MsIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uR3JvdXAvYnV0dG9uR3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneENoaXBDb21wb25lbnQgfSBmcm9tICcuLi9jaGlwcy9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2RlbnNpdHknO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9xdWVyeS1idWlsZGVyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElFeHByZXNzaW9uVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS10aW1lLWVkaXRvci9kYXRlLXRpbWUtZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vZ3JpZHMvY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vaWNvbi9pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgT3ZlcmxheVNldHRpbmdzLCBQb2ludCwgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgQ2xvc2VTY3JvbGxTdHJhdGVneSwgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4VGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXItaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hQaWNrZXJUb2dnbGVDb21wb25lbnQsIElneFBpY2tlckNsZWFyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWljb25zLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9zdWZmaXgvc3VmZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcblxuY29uc3QgREVGQVVMVF9QSVBFX0RBVEVfRk9STUFUID0gJ21lZGl1bURhdGUnO1xuY29uc3QgREVGQVVMVF9QSVBFX1RJTUVfRk9STUFUID0gJ21lZGl1bVRpbWUnO1xuY29uc3QgREVGQVVMVF9QSVBFX0RBVEVfVElNRV9GT1JNQVQgPSAnbWVkaXVtJztcbmNvbnN0IERFRkFVTFRfUElQRV9ESUdJVFNfSU5GTyA9ICcxLjAtMyc7XG5jb25zdCBERUZBVUxUX0RBVEVfVElNRV9GT1JNQVQgPSAnZGQvTU0veXl5eSBISDptbTpzcyB0dCc7XG5jb25zdCBERUZBVUxUX1RJTUVfRk9STUFUID0gJ2hoOm1tOnNzIHR0JztcblxuQFBpcGUoe1xuICAgIG5hbWU6ICdmaWVsZEZvcm1hdHRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hGaWVsZEZvcm1hdHRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAgIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZm9ybWF0dGVyOiAodjogYW55LCBkYXRhOiBhbnksIGZpZWxkRGF0YT86IGFueSkgPT4gYW55LCByb3dEYXRhOiBhbnksIGZpZWxkRGF0YT86IGFueSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0dGVyKHZhbHVlLCByb3dEYXRhLCBmaWVsZERhdGEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgcGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgIHB1YmxpYyBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25Hcm91cEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgY2hpbGRyZW46IEV4cHJlc3Npb25JdGVtW107XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgcHVibGljIGluRWRpdE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGluQWRkTW9kZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaG92ZXJlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZmllbGRMYWJlbDogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uLCBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB9XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdXNlZCBmb3Igb3BlcmF0aW5nIHdpdGggY29tcGxleCBmaWx0ZXJzIGJ5IGNyZWF0aW5nIG9yIGVkaXRpbmcgY29uZGl0aW9uc1xuICogYW5kIGdyb3VwaW5nIHRoZW0gdXNpbmcgQU5EL09SIGxvZ2ljLlxuICogSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBBZHZhbmNlZCBGaWx0ZXJpbmcgb2YgdGhlIEdyaWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtcXVlcnktYnVpbGRlciBbZmllbGRzXT1cInRoaXMuZmllbGRzXCI+XG4gKiA8L2lneC1xdWVyeS1idWlsZGVyPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXF1ZXJ5LWJ1aWxkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQsIElneEJ1dHRvbkRpcmVjdGl2ZSwgSWd4SWNvbkNvbXBvbmVudCwgSWd4Q2hpcENvbXBvbmVudCwgSWd4UHJlZml4RGlyZWN0aXZlLCBJZ3hTdWZmaXhEaXJlY3RpdmUsIElneFNlbGVjdENvbXBvbmVudCwgRm9ybXNNb2R1bGUsIE5nRm9yLCBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50LCBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4RGF0ZVBpY2tlckNvbXBvbmVudCwgSWd4UGlja2VyVG9nZ2xlQ29tcG9uZW50LCBJZ3hQaWNrZXJDbGVhckNvbXBvbmVudCwgSWd4VGltZVBpY2tlckNvbXBvbmVudCwgSWd4RGF0ZVRpbWVFZGl0b3JEaXJlY3RpdmUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ2xhc3MsIElneFRvZ2dsZURpcmVjdGl2ZSwgSWd4QnV0dG9uR3JvdXBDb21wb25lbnQsIElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIERhdGVQaXBlLCBJZ3hGaWVsZEZvcm1hdHRlclBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIElneFF1ZXJ5QnVpbGRlckNvbXBvbmVudCBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1xdWVyeS1idWlsZGVyJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXF1ZXJ5LWJ1aWxkZXInO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICAgIHB1YmxpYyBkaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZmllbGRzLlxuICAgICovXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogRmllbGRUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGZpZWxkcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmllbGRzKGZpZWxkczogRmllbGRUeXBlW10pIHtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gZmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLl9maWVsZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICB0aGlzLl9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1hdChmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICovXG4gICAgIHB1YmxpYyBnZXQgZXhwcmVzc2lvblRyZWUoKTogSUV4cHJlc3Npb25UcmVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cHJlc3Npb25UcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGV4cHJlc3Npb24gdHJlZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZXhwcmVzc2lvblRyZWUoZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSkge1xuICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IGV4cHJlc3Npb25UcmVlO1xuXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uJ3MgbG9jYWxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBFeHBlY3RzIGEgdmFsaWQgQkNQIDQ3IGxhbmd1YWdlIHRhZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICAvLyBpZiB2YWx1ZSBpcyBpbnZhbGlkLCBzZXQgaXQgYmFjayB0byBfbG9jYWxlSWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuX2xvY2FsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsZUlkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCBhcyB0aGUgZXhwcmVzc2lvbiB0cmVlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtcXVlcnktYnVpbGRlciAoZXhwcmVzc2lvblRyZWVDaGFuZ2UpPSdvbkV4cHJlc3Npb25UcmVlQ2hhbmdlKCknPjwvaWd4LXF1ZXJ5LWJ1aWxkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGV4cHJlc3Npb25UcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnZmllbGRTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgZmllbGRTZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbmRpdGlvblNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBjb25kaXRpb25TZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaFZhbHVlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIHNlYXJjaFZhbHVlSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHByaXZhdGUgcGlja2VyOiBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IHwgSWd4VGltZVBpY2tlckNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZFJvb3RBbmRHcm91cEJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgYWRkUm9vdEFuZEdyb3VwQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkQ29uZGl0aW9uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBhZGRDb25kaXRpb25CdXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBoZWFkZXJDb250ZW50OiBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0aW5nSW5wdXRzQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2FkZE1vZGVDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgc2V0IGFkZE1vZGVDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fYWRkTW9kZUNvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9hZGRNb2RlQ29udGFpbmVyICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZE1vZGVDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBnZXQgYWRkTW9kZUNvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZE1vZGVDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBzZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgJiYgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGdldCBjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKElneFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwcml2YXRlIGNvbnRleHRNZW51VG9nZ2xlOiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkcmVuKElneENoaXBDb21wb25lbnQpXG4gICAgcHJpdmF0ZSBjaGlwczogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnZXhwcmVzc2lvbnNDb250YWluZXInKVxuICAgIHByaXZhdGUgZXhwcmVzc2lvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdvdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIG92ZXJsYXlPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb290R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEV4cHJlc3Npb25zOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY3VycmVudEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dHVhbEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nTG9naWNzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb25kaXRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaWNrZXJPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfCBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2VcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlXG4gICAgfTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRGaWVsZDogRmllbGRUeXBlO1xuICAgIHByaXZhdGUgX2NsaWNrVGltZXI7XG4gICAgcHJpdmF0ZSBfZGJsQ2xpY2tEZWxheSA9IDIwMDtcbiAgICBwcml2YXRlIF9wcmV2ZW50Q2hpcENsaWNrID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZWRpdGluZ0lucHV0c0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9hZGRNb2RlQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfYWRkTW9kZUV4cHJlc3Npb246IEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICBwcml2YXRlIF9lZGl0ZWRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRHcm91cHM6IEV4cHJlc3Npb25Hcm91cEl0ZW1bXSA9IFtdO1xuICAgIHByaXZhdGUgX2ZpZWxkczogRmllbGRUeXBlW107XG4gICAgcHJpdmF0ZSBfZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZTtcbiAgICBwcml2YXRlIF9sb2NhbGU7XG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VTdHJpbmdzID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5RdWVyeUJ1aWxkZXJSZXNTdHJpbmdzO1xuXG4gICAgcHJpdmF0ZSBfcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuVG9wXG4gICAgfTtcblxuICAgIHByaXZhdGUgX292ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSh0aGlzLl9wb3NpdGlvblNldHRpbmdzKSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBDbG9zZVNjcm9sbFN0cmF0ZWd5KClcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBpY29uU2VydmljZTogSWd4SWNvblNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsLFxuICAgICAgICBwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcm90ZWN0ZWQgX2xvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM/OiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMsIGVsKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLl9sb2NhbGVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZEZpZWxkKHZhbHVlOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zZWxlY3RlZEZpZWxkO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEZpZWxkICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRGaWVsZCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKG9sZFZhbHVlICYmIHRoaXMuX3NlbGVjdGVkRmllbGQgJiYgdGhpcy5fc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gb2xkVmFsdWUuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRGaWVsZCgpOiBGaWVsZFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQaWNrZXJPdXRsZXQob3V0bGV0PzogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5waWNrZXJPdXRsZXQgPSBvdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ29udGV4dE1lbnVWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0ZWRFeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uKHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfSwgcGFyZW50KTtcblxuICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGFmdGVyRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgb3BlcmFuZEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KG9wZXJhbmRJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbmRHcm91cChwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmFkZEdyb3VwKEZpbHRlcmluZ0xvZ2ljLkFuZCwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZE9yR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5PciwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZEdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uZmllbGROYW1lID0gdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBEYXRhVXRpbC5wYXJzZVZhbHVlKHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSwgdGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmZpZWxkTGFiZWwgPSB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmhlYWRlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQ7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRBZGQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5maWVsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0odGhpcy5fZWRpdGVkRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlcmFuZENhbkJlQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkICYmIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gJiZcbiAgICAgICAgICAgICghIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICpcbiAgICAgKiB1c2VkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIGV4aXRPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVyYW5kQ2FuQmVDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kRWRpdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeHByZXNzaW9uR3JvdXAoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcFJlbW92ZShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5kZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJldmVudENoaXBDbGljaykge1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZXZlbnRDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcy5fZGJsQ2xpY2tEZWxheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRGJsQ2xpY2soZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xpY2tUaW1lcik7XG4gICAgICAgIHRoaXMuX3ByZXZlbnRDaGlwQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLmVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuZXhpdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEFkZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSA/XG4gICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24gP1xuICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbDtcblxuICAgICAgICBleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25JdGVtO1xuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZmllbGRTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmZpZWxkU2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKS5pc1VuYXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3QuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaFZhbHVlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5waWNrZXI/LmdldEVkaXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGdyb3VwLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBleHByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zID0gW107XG5cbiAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkFkZChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5fYWRkTW9kZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uLmluQWRkTW9kZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQgPyB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb25MaXN0KCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZXIoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLmZvcm1hdHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXQoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLnBpcGVBcmdzLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBZGRCdXR0b25Gb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkUm9vdEFuZEdyb3VwQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZGRDb25kaXRpb25CdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhZnRlckV4cHJlc3Npb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTZWxlY3Rpb25FbmQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxHcm91cCA9IHRoaXMuZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTtcbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLm9wZW4odGhpcy5fb3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvcm1hdChmaWVsZDogRmllbGRUeXBlKSB7XG4gICAgICAgIGlmICghZmllbGQucGlwZUFyZ3MpIHtcbiAgICAgICAgICAgIGZpZWxkLnBpcGVBcmdzID0geyBkaWdpdHNJbmZvOiBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQucGlwZUFyZ3MuZm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5waXBlQXJncy5mb3JtYXQgPSBmaWVsZC5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuVGltZSA/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9QSVBFX1RJTUVfRk9STUFUIDogZmllbGQuZGF0YVR5cGUgPT09IERhdGFUeXBlLkRhdGVUaW1lID9cbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QSVBFX0RBVEVfVElNRV9GT1JNQVQgOiBERUZBVUxUX1BJUEVfREFURV9GT1JNQVQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0ID0gREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5kZWZhdWx0VGltZUZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdFRpbWVGb3JtYXQgPSBERUZBVUxUX1RJTUVfRk9STUFUO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGaWx0ZXJzKGZpZWxkOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5maWx0ZXJzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlBlcmNlbnQ6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuVGltZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgPSAhZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQ7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucHVzaChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEdyb3VwKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYywgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtID0gbmV3IEV4cHJlc3Npb25Hcm91cEl0ZW0ob3BlcmF0b3IsIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGFmdGVyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb25kaXRpb24oZ3JvdXBJdGVtKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWUsIHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0pOiBFeHByZXNzaW9uR3JvdXBJdGVtIHtcbiAgICAgICAgbGV0IGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShleHByZXNzaW9uVHJlZS5vcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHIsIGdyb3VwSXRlbSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmluZ0V4cHIgPSBleHByIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHByQ29weTogSUZpbHRlcmluZ0V4cHJlc3Npb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpbHRlcmluZ0V4cHIuZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBmaWx0ZXJpbmdFeHByLmNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogZmlsdGVyaW5nRXhwci5zZWFyY2hWYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmaWx0ZXJpbmdFeHByLmlnbm9yZUNhc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKGV4cHJDb3B5LCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpbHRlcmluZ0V4cHIuZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEl0ZW0uZmllbGRMYWJlbCA9IGZpZWxkLmxhYmVsIHx8IGZpZWxkLmhlYWRlciB8fCBmaWVsZC5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0oZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgaWYgKCFncm91cEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvblRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGdyb3VwSXRlbS5vcGVyYXRvcik7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKChpdGVtIGFzIEV4cHJlc3Npb25Hcm91cEl0ZW0pKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHN1YlRyZWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKChpdGVtIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb250ZXh0TWVudSgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dHVhbEdyb3VwID0gdGhpcy5maW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpO1xuXG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuXG4gICAgICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdMb2dpY3MgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3JfYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3Jfb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHRNZW51VG9nZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX3NlbGVjdGVkR3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMgPSB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMuZXZlcnkob3AgPT4gdGhpcy5pc0luc2lkZUdyb3VwKG9wLCBncm91cCkpO1xuXG4gICAgICAgICAgICBpZiAoY29udGFpbnNBbGxTZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0luc2lkZUdyb3VwKGl0ZW06IEV4cHJlc3Npb25JdGVtLCBncm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnBhcmVudCA9PT0gZ3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnNpZGVHcm91cChpdGVtLnBhcmVudCwgZ3JvdXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uSXRlbS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbSA9PT0gdGhpcy5jdXJyZW50R3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gdGhpcy5jdXJyZW50R3JvdXAucGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBleHByZXNzaW9uSXRlbS5wYXJlbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0odGhpcy5yb290R3JvdXApO1xuXG4gICAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW0ucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljKSB7XG4gICAgICAgIGNvbnN0IGNoaXBzID0gdGhpcy5jaGlwcy50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnJlZHVjZSgoaSwgZSkgPT4gTWF0aC5taW4oaSwgY2hpcHMuZmluZEluZGV4KGMgPT4gYy5kYXRhID09PSBlKSksIE51bWJlci5NQVhfVkFMVUUpO1xuICAgICAgICBjb25zdCBmaXJzdEV4cHJlc3Npb24gPSBjaGlwc1ttaW5JbmRleF0uZGF0YTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBmaXJzdEV4cHJlc3Npb24ucGFyZW50O1xuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGZpcnN0RXhwcmVzc2lvbik7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGdyb3VwSXRlbSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucykge1xuICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2goZXhwcik7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcik7XG4gICAgICAgICAgICBleHByLnBhcmVudCA9IGdyb3VwSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLmNoaWxkcmVuICYmIGdyb3VwSXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlR3JvdXBSZWN1cnNpdmUoZ3JvdXBJdGVtLCAhZ3JvdXBJdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIGlmICghZ3JvdXBJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVHcm91cFJlY3Vyc2l2ZShncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0sIHNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChncm91cEl0ZW0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgICAgICAgaWYgKGdyb3VwSXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JvdXBzLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBncm91cEl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlR3JvdXBSZWN1cnNpdmUoZXhwciwgc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYW5kRXhwcmVzc2lvbiA9IGV4cHIgYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYW5kRXhwcmVzc2lvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKG9wZXJhbmRFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBleHByZXNzaW9uSXRlbS5wYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkR3JvdXBzLmluZGV4T2YocGFyZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLmZpbHRlcihjID0+IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGMuZGF0YSkgIT09IC0xKTtcbiAgICAgICAgbGV0IG1pblRvcCA9IGNoaXBzLnJlZHVjZSgodCwgYykgPT5cbiAgICAgICAgICAgIE1hdGgubWluKHQsIGMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgbWluVG9wID0gTWF0aC5tYXgoY29udGFpbmVyUmVjdC50b3AsIG1pblRvcCk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3QuYm90dG9tLCBtaW5Ub3ApO1xuICAgICAgICBsZXQgbWF4UmlnaHQgPSBjaGlwcy5yZWR1Y2UoKHIsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1heChyLCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpLCAwKTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgY29udGFpbmVyUmVjdC5sZWZ0KTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1pbihtYXhSaWdodCwgY29udGFpbmVyUmVjdC5yaWdodCk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSBuZXcgUG9pbnQobWF4UmlnaHQsIG1pblRvcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxFbGVtZW50SW50b1ZpZXcodGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmV4cHJlc3Npb25zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhcmdldE9mZnNldCA9IHRhcmdldC5vZmZzZXRUb3AgLSBjb250YWluZXIub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCBkZWx0YSA9IDEwO1xuXG4gICAgICAgIGlmIChjb250YWluZXIuc2Nyb2xsVG9wICsgZGVsdGEgPiB0YXJnZXRPZmZzZXQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0YXJnZXRPZmZzZXQgLSBkZWx0YTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIuc2Nyb2xsVG9wICsgY29udGFpbmVyLmNsaWVudEhlaWdodCA8IHRhcmdldE9mZnNldCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyBkZWx0YSkge1xuICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHRhcmdldE9mZnNldCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyBkZWx0YSAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy5yb290R3JvdXAgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0odGhpcy5leHByZXNzaW9uVHJlZSk7XG4gICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gdGhpcy5yb290R3JvdXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNWR0ljb25zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlZGl0b3JJY29ucyA9IGVkaXRvciBhcyBhbnlbXTtcbiAgICAgICAgZWRpdG9ySWNvbnMuZm9yRWFjaChpY29uID0+IHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbkZyb21UZXh0KGljb24ubmFtZSwgaWNvbi52YWx1ZSwgJ2lteC1pY29ucycpKTtcbiAgICB9XG59XG5cbiIsIjxpZ3gtcXVlcnktYnVpbGRlci1oZWFkZXJcbiAgICAqbmdJZj1cIiFoZWFkZXJDb250ZW50XCJcbiAgICBbdGl0bGVdPVwidGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdGl0bGVcIlxuPlxuPC9pZ3gtcXVlcnktYnVpbGRlci1oZWFkZXI+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cImlneC1xdWVyeS1idWlsZGVyLWhlYWRlclwiPjwvbmctY29udGVudD5cblxuPGRpdlxuICAgICNleHByZXNzaW9uc0NvbnRhaW5lclxuICAgIGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX21haW5cIlxuICAgIChzY3JvbGwpPVwib25FeHByZXNzaW9uc1Njcm9sbGVkKClcIlxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm9vdEdyb3VwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNhZGRSb290QW5kR3JvdXBCdXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRBbmRHcm91cCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9hbmRfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRPckdyb3VwKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+YWRkPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX29yX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci1lbXB0eVwiPlxuICAgICAgICAgICAgPGg2IGNsYXNzPVwiaWd4LWZpbHRlci1lbXB0eV9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9pbml0aWFsX3RleHQgfX1cbiAgICAgICAgICAgIDwvaDY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICNhZGRFeHByZXNzaW9uc1RlbXBsYXRlXG4gICAgICAgIGxldC1leHByZXNzaW9uSXRlbVxuICAgICAgICBsZXQtYWZ0ZXJFeHByZXNzaW9uPVwiYWZ0ZXJFeHByZXNzaW9uXCJcbiAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNhZGRDb25kaXRpb25CdXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRDb25kaXRpb24oZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+YWRkPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYWRkX2NvbmRpdGlvblxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRBbmRHcm91cChleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYW5kX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkT3JHcm91cChleHByZXNzaW9uSXRlbSwgYWZ0ZXJFeHByZXNzaW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2ZpbHRlck9wZXJhbmRUZW1wbGF0ZSBsZXQtZXhwcmVzc2lvbkl0ZW0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWV4cHJlc3Npb25JdGVtLmluRWRpdE1vZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24taXRlbVwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gdHJ1ZVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJleHByZXNzaW9uSXRlbS5ob3ZlcmVkID0gZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWNoaXBcbiAgICAgICAgICAgICAgICBbZGF0YV09XCJleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cIlxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RGVuc2l0eSA9PT0gJ2NvbXBhY3QnID8gJ2Nvc3knIDogZGlzcGxheURlbnNpdHlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImV4cHJlc3Npb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DaGlwQ2xpY2soZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoZGJsY2xpY2spPVwib25DaGlwRGJsQ2xpY2soZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlKT1cIm9uQ2hpcFJlbW92ZShleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwib25DaGlwU2VsZWN0aW9uRW5kKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlneFByZWZpeCBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1jb2x1bW5cIj57e1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5maWVsZExhYmVsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZVxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpZ3gtcHJlZml4PlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImlteC1pY29uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pY29uTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2lneC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tY29uZGl0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25kaXRpb25GcmllbmRseU5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBpZ3hTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24uaXNVbmFyeVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNEYXRlKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0Rm9ybWF0dGVyKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmllbGRGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRGb3JtYXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRGb3JtYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMubG9jYWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2lneC1jaGlwPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIChleHByZXNzaW9uSXRlbS5zZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFeHByZXNzaW9ucy5sZW5ndGggPT09IDEpIHx8XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIGVkaXRcbiAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVudGVyRXhwcmVzc2lvbkFkZChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIWV4cHJlc3Npb25JdGVtLmluQWRkTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25JdGVtLnBhcmVudCAhPT0gY3VycmVudEdyb3VwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cC5jaGlsZHJlbltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cC5jaGlsZHJlbi5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBhZGRcbiAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZVwiXG4gICAgICAgICAgICAjZWRpdGluZ0lucHV0c0NvbnRhaW5lclxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2lucHV0c1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2ZpZWxkU2VsZWN0XG4gICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cIidjb21wYWN0J1wiXG4gICAgICAgICAgICAgICAgW292ZXJsYXlTZXR0aW5nc109XCJmaWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jb2x1bW5fcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1zZWxlY3QtaXRlbSAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCIgW3ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIHx8IGZpZWxkLmhlYWRlciB8fCBmaWVsZC5maWVsZCB9fVxuICAgICAgICAgICAgICAgIDwvaWd4LXNlbGVjdC1pdGVtPlxuICAgICAgICAgICAgPC9pZ3gtc2VsZWN0PlxuXG4gICAgICAgICAgICA8aWd4LXNlbGVjdFxuICAgICAgICAgICAgICAgICNjb25kaXRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jb25kaXRpb25fcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb25kaXRpb25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1wcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblNlbGVjdC52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihjb25kaXRpb25TZWxlY3QudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1cImlteC1pY29uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TZWxlY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmljb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9pZ3gtcHJlZml4PlxuXG4gICAgICAgICAgICAgICAgPGlneC1zZWxlY3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29uZGl0aW9uIG9mIGdldENvbmRpdGlvbkxpc3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJnZXRDb25kaXRpb25GcmllbmRseU5hbWUoY29uZGl0aW9uKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi1pdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaWNvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX2ZpbHRlcmluZy1kcm9wZG93bi10ZXh0XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25kaXRpb25GcmllbmRseU5hbWUoY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvaWd4LXNlbGVjdC1pdGVtPlxuICAgICAgICAgICAgPC9pZ3gtc2VsZWN0PlxuXG4gICAgICAgICAgICA8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ3RpbWUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlICE9PSAnZGF0ZVRpbWUnKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cIidjb21wYWN0J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hWYWx1ZUlucHV0XG4gICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ251bWJlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0ZXh0J1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl92YWx1ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG5cbiAgICAgICAgICAgIDxpZ3gtZGF0ZS1waWNrZXJcbiAgICAgICAgICAgICAgICAjcGlja2VyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEZpZWxkICYmIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlJ1wiXG4gICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInBpY2tlci5vcGVuKClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RhdGVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ0aGlzLmxvY2FsZVwiXG4gICAgICAgICAgICAgICAgW291dGxldF09XCJwaWNrZXJPdXRsZXRcIlxuICAgICAgICAgICAgICAgIFtmb3JtYXR0ZXJdPVwic2VsZWN0ZWRGaWVsZC5mb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cInNlbGVjdGVkRmllbGQucGlwZUFyZ3MuZm9ybWF0XCJcbiAgICAgICAgICAgICAgICBbd2Vla1N0YXJ0XT1cInNlbGVjdGVkRmllbGQucGlwZUFyZ3Mud2Vla1N0YXJ0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgZGVmYXVsdCBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci10b2dnbGU+PC9pZ3gtcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8aWd4LXBpY2tlci1jbGVhcj48L2lneC1waWNrZXItY2xlYXI+XG4gICAgICAgICAgICA8L2lneC1kYXRlLXBpY2tlcj5cblxuICAgICAgICAgICAgPGlneC10aW1lLXBpY2tlclxuICAgICAgICAgICAgICAgICNwaWNrZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ3RpbWUnXCJcbiAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInBpY2tlci5vcGVuKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cIidjb21wYWN0J1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl90aW1lX3BsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdHRlcl09XCJzZWxlY3RlZEZpZWxkLmZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgW2lucHV0Rm9ybWF0XT1cInNlbGVjdGVkRmllbGQuZGVmYXVsdFRpbWVGb3JtYXRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgIDwvaWd4LXRpbWUtcGlja2VyPlxuXG4gICAgICAgICAgICA8aWd4LWlucHV0LWdyb3VwXG4gICAgICAgICAgICAgICAgI2lucHV0R3JvdXBcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGVUaW1lJ1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cIidjb21wYWN0J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZ3hJbnB1dFxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9kYXRlX3BsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQ29uZGl0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1VuYXJ5KVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbaWd4RGF0ZVRpbWVFZGl0b3JdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0RGF0ZVRpbWVGb3JtYXRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2lneC1pbnB1dC1ncm91cD5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9faW5wdXRzLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhb3BlcmFuZENhbkJlQ29tbWl0dGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29tbWl0T3BlcmFuZEVkaXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2hlY2s8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRFZGl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlneC1pY29uPmNsb3NlPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImV4cHJlc3Npb25JdGVtLmluQWRkTW9kZVwiXG4gICAgICAgICAgICAjYWRkTW9kZUNvbnRhaW5lclxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2J1dHRvbnNcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByZXNzaW9uSXRlbS5wYXJlbnQsIGV4cHJlc3Npb25JdGVtKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJpY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9wZXJhbmRBZGQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uPmNsb3NlPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNleHByZXNzaW9uVHJlZVRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2xpbmVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tYW5kJzogZXhwcmVzc2lvbkl0ZW0ub3BlcmF0b3IgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgICdpZ3gtZmlsdGVyLXRyZWVfX2xpbmUtLW9yJzogZXhwcmVzc2lvbkl0ZW0ub3BlcmF0b3IgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgICdpZ3gtZmlsdGVyLXRyZWVfX2xpbmUtLXNlbGVjdGVkJzogZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJpbnZva2VDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBleHByIG9mIGV4cHJlc3Npb25JdGVtLmNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHByZXNzaW9uR3JvdXAoZXhwcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBleHByZXNzaW9uVHJlZVRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmlsdGVyT3BlcmFuZFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQoZXhwcilcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRHcm91cCA9PT0gZXhwcmVzc2lvbkl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAjY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fYnV0dG9uc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4cHJlc3Npb25zVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByZXNzaW9uSXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0gIT09IHJvb3RHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRWRpdGVkRXhwcmVzc2lvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmNoaWxkcmVuLmxlbmd0aCA8IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9lbmRfZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvb3RHcm91cFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UcmVlVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChyb290R3JvdXApXG4gICAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2XG4gICAgICAgIGlneFRvZ2dsZVxuICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51XCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAoY2xvc2VkKT1cImNvbnRleHRNZW51Q2xvc2VkKClcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnUtLWNvc3knOiBkaXNwbGF5RGVuc2l0eSA9PT0gJ2Nvc3knLFxuICAgICAgICAgICAgJ2lneC1maWx0ZXItY29udGV4dHVhbC1tZW51LS1jb21wYWN0JzogZGlzcGxheURlbnNpdHkgPT09ICdjb21wYWN0J1xuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fY2xvc2UtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGlvbigpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmNsb3NlPC9pZ3gtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGlneC1idXR0b25ncm91cFxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICBbdmFsdWVzXT1cImZpbHRlcmluZ0xvZ2ljc1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RGaWx0ZXJpbmdMb2dpYygkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvaWd4LWJ1dHRvbmdyb3VwPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbnRleHR1YWxHcm91cC5wYXJlbnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1bmdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJpbXgtaWNvbnNcIiBuYW1lPVwidW5ncm91cFwiPjwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdW5ncm91cFxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fZGVsZXRlLWJ0blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uPmRlbGV0ZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGVsZXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZUFuZEdyb3VwKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NyZWF0ZV9hbmRfZ3JvdXAgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZU9yR3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfY3JlYXRlX29yX2dyb3VwIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RlbGV0ZV9maWx0ZXJzIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXZcbiAgICAjb3ZlcmxheU91dGxldFxuICAgIGlneE92ZXJsYXlPdXRsZXRcbiAgICBjbGFzcz1cImlneC1xdWVyeS1idWlsZGVyX19vdXRsZXRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbk91dGxldFBvaW50ZXJEb3duKCRldmVudClcIlxuPjwvZGl2PlxuIl19
1046
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcXVlcnktYnVpbGRlci9xdWVyeS1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9xdWVyeS1idWlsZGVyL3F1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFxQixZQUFZLEVBQWEsVUFBVSxFQUFhLFdBQVcsRUFDOUcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNELE9BQU8sRUFBeUIsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFFbEcsT0FBTyxFQUFF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RUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBSWxELGdCQUFnQjtzQkFEdkIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSTNDLE1BQU07c0JBRGIsU0FBUzt1QkFBQyxRQUFRO2dCQUlYLHFCQUFxQjtzQkFENUIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWhELGtCQUFrQjtzQkFEekIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBTzlDLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsOEJBQThCO2dCQUk5QixzQkFBc0I7c0JBRG5DLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQWtCM0MsZ0JBQWdCO3NCQUQ3QixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFrQnJDLDRCQUE0QjtzQkFEekMsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBa0J2RCxpQkFBaUI7c0JBRHhCLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUlyQixLQUFLO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQUl0QixvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUl6QixhQUFhO3NCQURwQixTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIExPQ0FMRV9JRCwgT3B0aW9uYWwsIE91dHB1dCwgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWssIE5nSWYsIE5nRm9yLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVkaXRvciB9IGZyb20gJ0BpZ25pdGV1aS9tYXRlcmlhbC1pY29ucy1leHRlbmRlZCc7XG5pbXBvcnQgeyBJQnV0dG9uR3JvdXBFdmVudEFyZ3MsIElneEJ1dHRvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uR3JvdXAvYnV0dG9uR3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneENoaXBDb21wb25lbnQgfSBmcm9tICcuLi9jaGlwcy9jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2RlbnNpdHknO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9xdWVyeS1idWlsZGVyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhVXRpbCB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQsIElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLCBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMsIElGaWx0ZXJpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsIElFeHByZXNzaW9uVHJlZSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSWd4QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEYXRlVGltZUVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS10aW1lLWVkaXRvci9kYXRlLXRpbWUtZWRpdG9yLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIElneFRvZ2dsZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vZ3JpZHMvY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vaWNvbi9pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgT3ZlcmxheVNldHRpbmdzLCBQb2ludCwgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgQ2xvc2VTY3JvbGxTdHJhdGVneSwgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4VGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXItaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hQaWNrZXJUb2dnbGVDb21wb25lbnQsIElneFBpY2tlckNsZWFyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWljb25zLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U2VsZWN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9zdWZmaXgvc3VmZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcblxuY29uc3QgREVGQVVMVF9QSVBFX0RBVEVfRk9STUFUID0gJ21lZGl1bURhdGUnO1xuY29uc3QgREVGQVVMVF9QSVBFX1RJTUVfRk9STUFUID0gJ21lZGl1bVRpbWUnO1xuY29uc3QgREVGQVVMVF9QSVBFX0RBVEVfVElNRV9GT1JNQVQgPSAnbWVkaXVtJztcbmNvbnN0IERFRkFVTFRfUElQRV9ESUdJVFNfSU5GTyA9ICcxLjAtMyc7XG5jb25zdCBERUZBVUxUX0RBVEVfVElNRV9GT1JNQVQgPSAnZGQvTU0veXl5eSBISDptbTpzcyB0dCc7XG5jb25zdCBERUZBVUxUX1RJTUVfRk9STUFUID0gJ2hoOm1tOnNzIHR0JztcblxuQFBpcGUoe1xuICAgIG5hbWU6ICdmaWVsZEZvcm1hdHRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hGaWVsZEZvcm1hdHRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAgIHB1YmxpYyB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZm9ybWF0dGVyOiAodjogYW55LCBkYXRhOiBhbnksIGZpZWxkRGF0YT86IGFueSkgPT4gYW55LCByb3dEYXRhOiBhbnksIGZpZWxkRGF0YT86IGFueSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0dGVyKHZhbHVlLCByb3dEYXRhLCBmaWVsZERhdGEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgcGFyZW50OiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgIHB1YmxpYyBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25Hcm91cEl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYztcbiAgICBwdWJsaWMgY2hpbGRyZW46IEV4cHJlc3Npb25JdGVtW107XG4gICAgY29uc3RydWN0b3Iob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljLCBwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuIEBpbnRlcm5hbFxuICpcbiAqIEludGVybmFsIGNsYXNzIHVzYWdlXG4gKi9cbmNsYXNzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSBleHRlbmRzIEV4cHJlc3Npb25JdGVtIHtcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogSUZpbHRlcmluZ0V4cHJlc3Npb247XG4gICAgcHVibGljIGluRWRpdE1vZGU6IGJvb2xlYW47XG4gICAgcHVibGljIGluQWRkTW9kZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgaG92ZXJlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZmllbGRMYWJlbDogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IElGaWx0ZXJpbmdFeHByZXNzaW9uLCBwYXJlbnQ6IEV4cHJlc3Npb25Hcm91cEl0ZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50KTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB9XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdXNlZCBmb3Igb3BlcmF0aW5nIHdpdGggY29tcGxleCBmaWx0ZXJzIGJ5IGNyZWF0aW5nIG9yIGVkaXRpbmcgY29uZGl0aW9uc1xuICogYW5kIGdyb3VwaW5nIHRoZW0gdXNpbmcgQU5EL09SIGxvZ2ljLlxuICogSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBBZHZhbmNlZCBGaWx0ZXJpbmcgb2YgdGhlIEdyaWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtcXVlcnktYnVpbGRlciBbZmllbGRzXT1cInRoaXMuZmllbGRzXCI+XG4gKiA8L2lneC1xdWVyeS1idWlsZGVyPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXF1ZXJ5LWJ1aWxkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQsIElneEJ1dHRvbkRpcmVjdGl2ZSwgSWd4SWNvbkNvbXBvbmVudCwgSWd4Q2hpcENvbXBvbmVudCwgSWd4UHJlZml4RGlyZWN0aXZlLCBJZ3hTdWZmaXhEaXJlY3RpdmUsIElneFNlbGVjdENvbXBvbmVudCwgRm9ybXNNb2R1bGUsIE5nRm9yLCBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50LCBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4RGF0ZVBpY2tlckNvbXBvbmVudCwgSWd4UGlja2VyVG9nZ2xlQ29tcG9uZW50LCBJZ3hQaWNrZXJDbGVhckNvbXBvbmVudCwgSWd4VGltZVBpY2tlckNvbXBvbmVudCwgSWd4RGF0ZVRpbWVFZGl0b3JEaXJlY3RpdmUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ2xhc3MsIElneFRvZ2dsZURpcmVjdGl2ZSwgSWd4QnV0dG9uR3JvdXBDb21wb25lbnQsIElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIERhdGVQaXBlLCBJZ3hGaWVsZEZvcm1hdHRlclBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIElneFF1ZXJ5QnVpbGRlckNvbXBvbmVudCBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1xdWVyeS1idWlsZGVyJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXF1ZXJ5LWJ1aWxkZXInO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICAgIHB1YmxpYyBkaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZmllbGRzLlxuICAgICovXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogRmllbGRUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGZpZWxkcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmllbGRzKGZpZWxkczogRmllbGRUeXBlW10pIHtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gZmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLl9maWVsZHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICB0aGlzLl9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1hdChmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiB0cmVlLlxuICAgICovXG4gICAgIHB1YmxpYyBnZXQgZXhwcmVzc2lvblRyZWUoKTogSUV4cHJlc3Npb25UcmVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cHJlc3Npb25UcmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGV4cHJlc3Npb24gdHJlZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZXhwcmVzc2lvblRyZWUoZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZSkge1xuICAgICAgICB0aGlzLl9leHByZXNzaW9uVHJlZSA9IGV4cHJlc3Npb25UcmVlO1xuXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGFwcGxpY2F0aW9uJ3MgbG9jYWxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBFeHBlY3RzIGEgdmFsaWQgQkNQIDQ3IGxhbmd1YWdlIHRhZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICAvLyBpZiB2YWx1ZSBpcyBpbnZhbGlkLCBzZXQgaXQgYmFjayB0byBfbG9jYWxlSWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuX2xvY2FsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsZUlkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElRdWVyeUJ1aWxkZXJSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJUXVlcnlCdWlsZGVyUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCBhcyB0aGUgZXhwcmVzc2lvbiB0cmVlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtcXVlcnktYnVpbGRlciAoZXhwcmVzc2lvblRyZWVDaGFuZ2UpPSdvbkV4cHJlc3Npb25UcmVlQ2hhbmdlKCknPjwvaWd4LXF1ZXJ5LWJ1aWxkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGV4cHJlc3Npb25UcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnZmllbGRTZWxlY3QnLCB7IHJlYWQ6IElneFNlbGVjdENvbXBvbmVudCB9KVxuICAgIHByaXZhdGUgZmllbGRTZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbmRpdGlvblNlbGVjdCcsIHsgcmVhZDogSWd4U2VsZWN0Q29tcG9uZW50IH0pXG4gICAgcHJpdmF0ZSBjb25kaXRpb25TZWxlY3Q6IElneFNlbGVjdENvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaFZhbHVlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcml2YXRlIHNlYXJjaFZhbHVlSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdwaWNrZXInKVxuICAgIHByaXZhdGUgcGlja2VyOiBJZ3hEYXRlUGlja2VyQ29tcG9uZW50IHwgSWd4VGltZVBpY2tlckNvbXBvbmVudDtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZFJvb3RBbmRHcm91cEJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByaXZhdGUgYWRkUm9vdEFuZEdyb3VwQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkQ29uZGl0aW9uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJpdmF0ZSBhZGRDb25kaXRpb25CdXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4UXVlcnlCdWlsZGVySGVhZGVyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBoZWFkZXJDb250ZW50OiBJZ3hRdWVyeUJ1aWxkZXJIZWFkZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0aW5nSW5wdXRzQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHJvdGVjdGVkIHNldCBlZGl0aW5nSW5wdXRzQ29udGFpbmVyKHZhbHVlOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICgodmFsdWUgJiYgIXRoaXMuX2VkaXRpbmdJbnB1dHNDb250YWluZXIpIHx8XG4gICAgICAgICAgICAodmFsdWUgJiYgdGhpcy5fZWRpdGluZ0lucHV0c0NvbnRhaW5lciAmJiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgIT09IHZhbHVlLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KHZhbHVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGVkaXRpbmdJbnB1dHNDb250YWluZXIoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0aW5nSW5wdXRzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2FkZE1vZGVDb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgc2V0IGFkZE1vZGVDb250YWluZXIodmFsdWU6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKCh2YWx1ZSAmJiAhdGhpcy5fYWRkTW9kZUNvbnRhaW5lcikgfHxcbiAgICAgICAgICAgICh2YWx1ZSAmJiB0aGlzLl9hZGRNb2RlQ29udGFpbmVyICYmIHRoaXMuX2FkZE1vZGVDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gdmFsdWUubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcodmFsdWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZE1vZGVDb250YWluZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBnZXQgYWRkTW9kZUNvbnRhaW5lcigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZE1vZGVDb250YWluZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHByb3RlY3RlZCBzZXQgY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoKHZhbHVlICYmICF0aGlzLl9jdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKSB8fFxuICAgICAgICAgICAgKHZhbHVlICYmIHRoaXMuX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXIgJiYgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50ICE9PSB2YWx1ZS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyh2YWx1ZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJvdGVjdGVkIGdldCBjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudEdyb3VwQnV0dG9uc0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKElneFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwcml2YXRlIGNvbnRleHRNZW51VG9nZ2xlOiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICBAVmlld0NoaWxkcmVuKElneENoaXBDb21wb25lbnQpXG4gICAgcHJpdmF0ZSBjaGlwczogUXVlcnlMaXN0PElneENoaXBDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnZXhwcmVzc2lvbnNDb250YWluZXInKVxuICAgIHByaXZhdGUgZXhwcmVzc2lvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdvdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIG92ZXJsYXlPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb290R3JvdXA6IEV4cHJlc3Npb25Hcm91cEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEV4cHJlc3Npb25zOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY3VycmVudEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dHVhbEdyb3VwOiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nTG9naWNzO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRDb25kaXRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaWNrZXJPdXRsZXQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfCBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2VcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlXG4gICAgfTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRGaWVsZDogRmllbGRUeXBlO1xuICAgIHByaXZhdGUgX2NsaWNrVGltZXI7XG4gICAgcHJpdmF0ZSBfZGJsQ2xpY2tEZWxheSA9IDIwMDtcbiAgICBwcml2YXRlIF9wcmV2ZW50Q2hpcENsaWNrID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZWRpdGluZ0lucHV0c0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIF9hZGRNb2RlQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX2N1cnJlbnRHcm91cEJ1dHRvbnNDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfYWRkTW9kZUV4cHJlc3Npb246IEV4cHJlc3Npb25PcGVyYW5kSXRlbTtcbiAgICBwcml2YXRlIF9lZGl0ZWRFeHByZXNzaW9uOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW07XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRHcm91cHM6IEV4cHJlc3Npb25Hcm91cEl0ZW1bXSA9IFtdO1xuICAgIHByaXZhdGUgX2ZpZWxkczogRmllbGRUeXBlW107XG4gICAgcHJpdmF0ZSBfZXhwcmVzc2lvblRyZWU6IElFeHByZXNzaW9uVHJlZTtcbiAgICBwcml2YXRlIF9sb2NhbGU7XG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VTdHJpbmdzID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5RdWVyeUJ1aWxkZXJSZXNTdHJpbmdzO1xuXG4gICAgcHJpdmF0ZSBfcG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuVG9wXG4gICAgfTtcblxuICAgIHByaXZhdGUgX292ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgbW9kYWw6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSh0aGlzLl9wb3NpdGlvblNldHRpbmdzKSxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBDbG9zZVNjcm9sbFN0cmF0ZWd5KClcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBpY29uU2VydmljZTogSWd4SWNvblNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsLFxuICAgICAgICBwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcm90ZWN0ZWQgX2xvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM/OiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMsIGVsKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLl9sb2NhbGVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgICAgIHRoaXMuZmllbGRTZWxlY3RPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdmVybGF5T3V0bGV0O1xuICAgICAgICB0aGlzLmNvbmRpdGlvblNlbGVjdE92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm92ZXJsYXlPdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZEZpZWxkKHZhbHVlOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zZWxlY3RlZEZpZWxkO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEZpZWxkICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRGaWVsZCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKG9sZFZhbHVlICYmIHRoaXMuX3NlbGVjdGVkRmllbGQgJiYgdGhpcy5fc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gb2xkVmFsdWUuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRGaWVsZCgpOiBGaWVsZFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRGaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQaWNrZXJPdXRsZXQob3V0bGV0PzogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5waWNrZXJPdXRsZXQgPSBvdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIHVzZWQgYnkgdGhlIGdyaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ29udGV4dE1lbnVWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0ZWRFeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uKHBhcmVudDogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKHtcbiAgICAgICAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICBzZWFyY2hWYWw6IG51bGxcbiAgICAgICAgfSwgcGFyZW50KTtcblxuICAgICAgICBpZiAoYWZ0ZXJFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGFmdGVyRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgb3BlcmFuZEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRlckV4cHJlc3Npb25FZGl0KG9wZXJhbmRJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbmRHcm91cChwYXJlbnQ/OiBFeHByZXNzaW9uR3JvdXBJdGVtLCBhZnRlckV4cHJlc3Npb24/OiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICB0aGlzLmFkZEdyb3VwKEZpbHRlcmluZ0xvZ2ljLkFuZCwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZE9yR3JvdXAocGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5hZGRHcm91cChGaWx0ZXJpbmdMb2dpYy5PciwgcGFyZW50LCBhZnRlckV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZEdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwSXRlbS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tbWl0T3BlcmFuZEVkaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmV4cHJlc3Npb24uZmllbGROYW1lID0gdGhpcy5zZWxlY3RlZEZpZWxkLmZpZWxkO1xuICAgICAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbi5leHByZXNzaW9uLmNvbmRpdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5zZWFyY2hWYWwgPSBEYXRhVXRpbC5wYXJzZVZhbHVlKHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSwgdGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmZpZWxkTGFiZWwgPSB0aGlzLnNlbGVjdGVkRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgIDogdGhpcy5zZWxlY3RlZEZpZWxkLmhlYWRlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWVsZC5oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQ7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvblRyZWUgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25UcmVlRnJvbUdyb3VwSXRlbSh0aGlzLnJvb3RHcm91cCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbE9wZXJhbmRBZGQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24uaW5BZGRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9hZGRNb2RlRXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24uaW5FZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VkaXRlZEV4cHJlc3Npb24uZXhwcmVzc2lvbi5maWVsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0odGhpcy5fZWRpdGVkRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2VkaXRlZEV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlcmFuZENhbkJlQ29tbWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkICYmIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gJiZcbiAgICAgICAgICAgICghIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHRoaXMuc2VsZWN0ZWRDb25kaXRpb24pLmlzVW5hcnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICpcbiAgICAgKiB1c2VkIGJ5IHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIGV4aXRPcGVyYW5kRWRpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVyYW5kQ2FuQmVDb21taXR0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kRWRpdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeHByZXNzaW9uR3JvdXAoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hpcFJlbW92ZShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5kZWxldGVJdGVtKGV4cHJlc3Npb25JdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJldmVudENoaXBDbGljaykge1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZXZlbnRDaGlwQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcy5fZGJsQ2xpY2tEZWxheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25DaGlwRGJsQ2xpY2soZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xpY2tUaW1lcik7XG4gICAgICAgIHRoaXMuX3ByZXZlbnRDaGlwQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLmVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkVkaXQoZXhwcmVzc2lvbkl0ZW06IEV4cHJlc3Npb25PcGVyYW5kSXRlbSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuZXhpdE9wZXJhbmRFZGl0KCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEFkZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9lZGl0ZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0ZWRFeHByZXNzaW9uLmluRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkRmllbGQgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSA/XG4gICAgICAgICAgICB0aGlzLmZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLmZpZWxkID09PSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmZpZWxkTmFtZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24gP1xuICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5jb25kaXRpb24ubmFtZSA6IG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbDtcblxuICAgICAgICBleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZWRpdGVkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25JdGVtO1xuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnRhcmdldCA9IHRoaXMuZmllbGRTZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5maWVsZFNlbGVjdE92ZXJsYXlTZXR0aW5ncy5leGNsdWRlRnJvbU91dHNpZGVDbGljayA9IFt0aGlzLmZpZWxkU2VsZWN0LmVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdO1xuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3RPdmVybGF5U2V0dGluZ3MuZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2sgPSBbdGhpcy5jb25kaXRpb25TZWxlY3QuZWxlbWVudCBhcyBIVE1MRWxlbWVudF07XG4gICAgICAgIHRoaXMuY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kgPSBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZFNlbGVjdC5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbih0aGlzLnNlbGVjdGVkQ29uZGl0aW9uKS5pc1VuYXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25TZWxlY3QuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaFZhbHVlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5waWNrZXI/LmdldEVkaXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fc2VsZWN0ZWRHcm91cHMpIHtcbiAgICAgICAgICAgIGdyb3VwLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4cHIgb2YgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICBleHByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zID0gW107XG5cbiAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVudGVyRXhwcmVzc2lvbkFkZChleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbk9wZXJhbmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5fYWRkTW9kZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZE1vZGVFeHByZXNzaW9uLmluQWRkTW9kZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWRkTW9kZUV4cHJlc3Npb24gPSBleHByZXNzaW9uSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cHJlc3Npb24oZXhwcmVzc2lvbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGV4dE1lbnVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnRBcmdzOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50QXJncy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnRBcmdzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNvbGxhcHNlZCAmJiAoa2V5ID09PSB0aGlzLnBsYXRmb3JtLktFWU1BUC5FU0NBUEUpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVBbmRHcm91cCgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVHcm91cChGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yR3JvdXAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoRmlsdGVyaW5nTG9naWMuT3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZpbHRlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSXRlbShleHByKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkdyb3VwQ2xpY2soZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXBJdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bmdyb3VwKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwID0gdGhpcy5jb250ZXh0dWFsR3JvdXA7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGVkR3JvdXAucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHNlbGVjdGVkR3JvdXApO1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4uc2VsZWN0ZWRHcm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBzZWxlY3RlZEdyb3VwLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZXhwci5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29tbWl0T3BlcmFuZEVkaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVHcm91cCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuY29udGV4dHVhbEdyb3VwO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzZWxlY3RlZEdyb3VwLnBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzZWxlY3RlZEdyb3VwKTtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290R3JvdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0RmlsdGVyaW5nTG9naWMoZXZlbnQ6IElCdXR0b25Hcm91cEV2ZW50QXJncykge1xuICAgICAgICB0aGlzLmNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9IGV2ZW50LmluZGV4IGFzIEZpbHRlcmluZ0xvZ2ljO1xuICAgICAgICB0aGlzLmNvbW1pdE9wZXJhbmRFZGl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uRnJpZW5kbHlOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5nc1tgaWd4X3F1ZXJ5X2J1aWxkZXJfZmlsdGVyXyR7bmFtZX1gXSB8fCBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25FeHByZXNzaW9uc1Njcm9sbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVUb2dnbGUuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLnJlcG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGludm9rZUNsaWNrKGV2ZW50QXJnczogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FjdGl2YXRpb25LZXkoZXZlbnRBcmdzKSkge1xuICAgICAgICAgICAgZXZlbnRBcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoZXZlbnRBcmdzLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUGlja2VyKGFyZ3M6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXNBY3RpdmF0aW9uS2V5KGFyZ3MpKSB7XG4gICAgICAgICAgICBhcmdzLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlci5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbk91dGxldFBvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgY2xvc2luZyB0aGUgc2VsZWN0J3MgZHJvcGRvd24gd2hlbiBjbGlja2luZyB0aGUgc2Nyb2xsXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29uZGl0aW9uTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGQgPyB0aGlzLnNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb25MaXN0KCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZXIoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLmZvcm1hdHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtYXQoZmllbGQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZChlbCA9PiBlbC5maWVsZCA9PT0gZmllbGQpLnBpcGVBcmdzLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqXG4gICAgICogdXNlZCBieSB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBZGRCdXR0b25Gb2N1cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkUm9vdEFuZEdyb3VwQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJvb3RBbmRHcm91cEJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZGRDb25kaXRpb25CdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZGl0aW9uQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbj86IEV4cHJlc3Npb25JdGVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhZnRlckV4cHJlc3Npb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoaXBTZWxlY3Rpb25FbmQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxHcm91cCA9IHRoaXMuZmluZFNpbmdsZVNlbGVjdGVkR3JvdXAoKTtcbiAgICAgICAgaWYgKGNvbnRleHR1YWxHcm91cCB8fCB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0dWFsR3JvdXAgPSBjb250ZXh0dWFsR3JvdXA7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbnRleHRNZW51VGFyZ2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudVRvZ2dsZS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLm9wZW4odGhpcy5fb3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudVRvZ2dsZS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvcm1hdChmaWVsZDogRmllbGRUeXBlKSB7XG4gICAgICAgIGlmICghZmllbGQucGlwZUFyZ3MpIHtcbiAgICAgICAgICAgIGZpZWxkLnBpcGVBcmdzID0geyBkaWdpdHNJbmZvOiBERUZBVUxUX1BJUEVfRElHSVRTX0lORk8gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmllbGQucGlwZUFyZ3MuZm9ybWF0KSB7XG4gICAgICAgICAgICBmaWVsZC5waXBlQXJncy5mb3JtYXQgPSBmaWVsZC5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuVGltZSA/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9QSVBFX1RJTUVfRk9STUFUIDogZmllbGQuZGF0YVR5cGUgPT09IERhdGFUeXBlLkRhdGVUaW1lID9cbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QSVBFX0RBVEVfVElNRV9GT1JNQVQgOiBERUZBVUxUX1BJUEVfREFURV9GT1JNQVQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdERhdGVUaW1lRm9ybWF0ID0gREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaWVsZC5kZWZhdWx0VGltZUZvcm1hdCkge1xuICAgICAgICAgICAgZmllbGQuZGVmYXVsdFRpbWVGb3JtYXQgPSBERUZBVUxUX1RJTUVfRk9STUFUO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGaWx0ZXJzKGZpZWxkOiBGaWVsZFR5cGUpIHtcbiAgICAgICAgaWYgKCFmaWVsZC5maWx0ZXJzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5maWx0ZXJzID0gSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlBlcmNlbnQ6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hOdW1iZXJGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuVGltZTpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneFRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmZpbHRlcnMgPSBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZmlsdGVycyA9IElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Ub2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgdGhpcy5leGl0T3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVFeHByZXNzaW9uKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uT3BlcmFuZEl0ZW0pIHtcbiAgICAgICAgZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQgPSAhZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWQ7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMucHVzaChleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGV4cHJlc3Npb25JdGVtKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEdyb3VwKG9wZXJhdG9yOiBGaWx0ZXJpbmdMb2dpYywgcGFyZW50PzogRXhwcmVzc2lvbkdyb3VwSXRlbSwgYWZ0ZXJFeHByZXNzaW9uPzogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG5cbiAgICAgICAgY29uc3QgZ3JvdXBJdGVtID0gbmV3IEV4cHJlc3Npb25Hcm91cEl0ZW0ob3BlcmF0b3IsIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGFmdGVyRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXJFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4ICsgMSwgMCwgZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gZ3JvdXBJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRDb25kaXRpb24oZ3JvdXBJdGVtKTtcbiAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHJlc3Npb25UcmVlOiBJRXhwcmVzc2lvblRyZWUsIHBhcmVudD86IEV4cHJlc3Npb25Hcm91cEl0ZW0pOiBFeHByZXNzaW9uR3JvdXBJdGVtIHtcbiAgICAgICAgbGV0IGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25UcmVlKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShleHByZXNzaW9uVHJlZS5vcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJlc3Npb25UcmVlLmZpbHRlcmluZ09wZXJhbmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVFeHByZXNzaW9uR3JvdXBJdGVtKGV4cHIsIGdyb3VwSXRlbSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmluZ0V4cHIgPSBleHByIGFzIElGaWx0ZXJpbmdFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHByQ29weTogSUZpbHRlcmluZ0V4cHJlc3Npb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpbHRlcmluZ0V4cHIuZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBmaWx0ZXJpbmdFeHByLmNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbDogZmlsdGVyaW5nRXhwci5zZWFyY2hWYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiBmaWx0ZXJpbmdFeHByLmlnbm9yZUNhc2VcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlcmFuZEl0ZW0gPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmRJdGVtKGV4cHJDb3B5LCBncm91cEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZWwgPT4gZWwuZmllbGQgPT09IGZpbHRlcmluZ0V4cHIuZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmFuZEl0ZW0uZmllbGRMYWJlbCA9IGZpZWxkLmxhYmVsIHx8IGZpZWxkLmhlYWRlciB8fCBmaWVsZC5maWVsZDtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2gob3BlcmFuZEl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncm91cEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0oZ3JvdXBJdGVtOiBFeHByZXNzaW9uR3JvdXBJdGVtKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgaWYgKCFncm91cEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvblRyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKGdyb3VwSXRlbS5vcGVyYXRvcik7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwSXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHByZXNzaW9uR3JvdXBJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRoaXMuY3JlYXRlRXhwcmVzc2lvblRyZWVGcm9tR3JvdXBJdGVtKChpdGVtIGFzIEV4cHJlc3Npb25Hcm91cEl0ZW0pKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHN1YlRyZWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKChpdGVtIGFzIEV4cHJlc3Npb25PcGVyYW5kSXRlbSkuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvblRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVDb250ZXh0TWVudSgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dHVhbEdyb3VwID0gdGhpcy5maW5kU2luZ2xlU2VsZWN0ZWRHcm91cCgpO1xuXG4gICAgICAgIGlmIChjb250ZXh0dWFsR3JvdXAgfHwgdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHVhbEdyb3VwID0gY29udGV4dHVhbEdyb3VwO1xuXG4gICAgICAgICAgICBpZiAoY29udGV4dHVhbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdMb2dpY3MgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3JfYW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNvbnRleHR1YWxHcm91cC5vcGVyYXRvciA9PT0gRmlsdGVyaW5nTG9naWMuQW5kXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9maWx0ZXJfb3BlcmF0b3Jfb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogY29udGV4dHVhbEdyb3VwLm9wZXJhdG9yID09PSBGaWx0ZXJpbmdMb2dpYy5PclxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRleHRNZW51VG9nZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51VG9nZ2xlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTaW5nbGVTZWxlY3RlZEdyb3VwKCk6IEV4cHJlc3Npb25Hcm91cEl0ZW0ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX3NlbGVjdGVkR3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluc0FsbFNlbGVjdGVkRXhwcmVzc2lvbnMgPSB0aGlzLnNlbGVjdGVkRXhwcmVzc2lvbnMuZXZlcnkob3AgPT4gdGhpcy5pc0luc2lkZUdyb3VwKG9wLCBncm91cCkpO1xuXG4gICAgICAgICAgICBpZiAoY29udGFpbnNBbGxTZWxlY3RlZEV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0luc2lkZUdyb3VwKGl0ZW06IEV4cHJlc3Npb25JdGVtLCBncm91cDogRXhwcmVzc2lvbkdyb3VwSXRlbSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnBhcmVudCA9PT0gZ3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnNpZGVHcm91cChpdGVtLnBhcmVudCwgZ3JvdXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlSXRlbShleHByZXNzaW9uSXRlbTogRXhwcmVzc2lvbkl0ZW0pIHtcbiAgICAgICAgaWYgKCFleHByZXNzaW9uSXRlbS5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByZXNzaW9uSXRlbSA9PT0gdGhpcy5jdXJyZW50R3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gdGhpcy5jdXJyZW50R3JvdXAucGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBleHByZXNzaW9uSXRlbS5wYXJlbnQuY2hpbGRyZW47XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihleHByZXNzaW9uSXRlbSk7XG4gICAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25UcmVlID0gdGhpcy5jcmVhdGVFeHByZXNzaW9uVHJlZUZyb21Hcm91cEl0ZW0odGhpcy5yb290R3JvdXApO1xuXG4gICAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcmVzc2lvbkl0ZW0ucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblRyZWVDaGFuZ2UuZW1pdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlR3JvdXAob3BlcmF0b3I6IEZpbHRlcmluZ0xvZ2ljKSB7XG4gICAgICAgIGNvbnN0IGNoaXBzID0gdGhpcy5jaGlwcy50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gdGhpcy5zZWxlY3RlZEV4cHJlc3Npb25zLnJlZHVjZSgoaSwgZSkgPT4gTWF0aC5taW4oaSwgY2hpcHMuZmluZEluZGV4KGMgPT4gYy5kYXRhID09PSBlKSksIE51bWJlci5NQVhfVkFMVUUpO1xuICAgICAgICBjb25zdCBmaXJzdEV4cHJlc3Npb24gPSBjaGlwc1ttaW5JbmRleF0uZGF0YTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBmaXJzdEV4cHJlc3Npb24ucGFyZW50O1xuICAgICAgICBjb25zdCBncm91cEl0ZW0gPSBuZXcgRXhwcmVzc2lvbkdyb3VwSXRlbShvcGVyYXRvciwgcGFyZW50KTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGZpcnN0RXhwcmVzc2lvbik7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGdyb3VwSXRlbSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucykge1xuICAgICAgICAgICAgZ3JvdXBJdGVtLmNoaWxkcmVuLnB1c2goZXhwcik7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0oZXhwcik7XG4gICAgICAgICAgICBleHByLnBhcmVudCA9IGdyb3VwSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUdyb3VwKGdyb3VwSXRlbTogRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICB0aGlzLmV4aXRPcGVyYW5kRWRpdCgpO1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLmNoaWxkcmVuICYmIGdyb3VwSXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlR3JvdXBSZWN1cnNpdmUoZ3JvdXBJdGVtLCAhZ3JvdXBJdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIGlmICghZ3JvdXBJdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShncm91cEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2dnbGVDb250ZXh0TWVudSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVHcm91cFJlY3Vyc2l2ZShncm91cEl0ZW06IEV4cHJlc3Npb25Hcm91cEl0ZW0sIHNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChncm91cEl0ZW0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgICBncm91cEl0ZW0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgICAgICAgaWYgKGdyb3VwSXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JvdXBzLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5pbmRleE9mKGdyb3VwSXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcm91cHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZXhwciBvZiBncm91cEl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgRXhwcmVzc2lvbkdyb3VwSXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlR3JvdXBSZWN1cnNpdmUoZXhwciwgc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYW5kRXhwcmVzc2lvbiA9IGV4cHIgYXMgRXhwcmVzc2lvbk9wZXJhbmRJdGVtO1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYW5kRXhwcmVzc2lvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVFeHByZXNzaW9uKG9wZXJhbmRFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc2VsZWN0UGFyZW50UmVjdXJzaXZlKGV4cHJlc3Npb25JdGVtOiBFeHByZXNzaW9uSXRlbSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBleHByZXNzaW9uSXRlbS5wYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkR3JvdXBzLmluZGV4T2YocGFyZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEdyb3Vwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFBhcmVudFJlY3Vyc2l2ZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZXh0TWVudVRhcmdldCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZXhwcmVzc2lvbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY2hpcHMgPSB0aGlzLmNoaXBzLmZpbHRlcihjID0+IHRoaXMuc2VsZWN0ZWRFeHByZXNzaW9ucy5pbmRleE9mKGMuZGF0YSkgIT09IC0xKTtcbiAgICAgICAgbGV0IG1pblRvcCA9IGNoaXBzLnJlZHVjZSgodCwgYykgPT5cbiAgICAgICAgICAgIE1hdGgubWluKHQsIGMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgbWluVG9wID0gTWF0aC5tYXgoY29udGFpbmVyUmVjdC50b3AsIG1pblRvcCk7XG4gICAgICAgIG1pblRvcCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3QuYm90dG9tLCBtaW5Ub3ApO1xuICAgICAgICBsZXQgbWF4UmlnaHQgPSBjaGlwcy5yZWR1Y2UoKHIsIGMpID0+XG4gICAgICAgICAgICBNYXRoLm1heChyLCBjLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpLCAwKTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgY29udGFpbmVyUmVjdC5sZWZ0KTtcbiAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1pbihtYXhSaWdodCwgY29udGFpbmVyUmVjdC5yaWdodCk7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSBuZXcgUG9pbnQobWF4UmlnaHQsIG1pblRvcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxFbGVtZW50SW50b1ZpZXcodGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmV4cHJlc3Npb25zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhcmdldE9mZnNldCA9IHRhcmdldC5vZmZzZXRUb3AgLSBjb250YWluZXIub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCBkZWx0YSA9IDEwO1xuXG4gICAgICAgIGlmIChjb250YWluZXIuc2Nyb2xsVG9wICsgZGVsdGEgPiB0YXJnZXRPZmZzZXQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSB0YXJnZXRPZmZzZXQgLSBkZWx0YTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIuc2Nyb2xsVG9wICsgY29udGFpbmVyLmNsaWVudEhlaWdodCA8IHRhcmdldE9mZnNldCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyBkZWx0YSkge1xuICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHRhcmdldE9mZnNldCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyBkZWx0YSAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jYW5jZWxPcGVyYW5kQWRkKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsT3BlcmFuZEVkaXQoKTtcbiAgICAgICAgdGhpcy5yb290R3JvdXAgPSB0aGlzLmNyZWF0ZUV4cHJlc3Npb25Hcm91cEl0ZW0odGhpcy5leHByZXNzaW9uVHJlZSk7XG4gICAgICAgIHRoaXMuY3VycmVudEdyb3VwID0gdGhpcy5yb290R3JvdXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNWR0ljb25zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlZGl0b3JJY29ucyA9IGVkaXRvciBhcyBhbnlbXTtcbiAgICAgICAgZWRpdG9ySWNvbnMuZm9yRWFjaChpY29uID0+IHRoaXMuaWNvblNlcnZpY2UuYWRkU3ZnSWNvbkZyb21UZXh0KGljb24ubmFtZSwgaWNvbi52YWx1ZSwgJ2lteC1pY29ucycpKTtcbiAgICB9XG59XG5cbiIsIjxpZ3gtcXVlcnktYnVpbGRlci1oZWFkZXJcbiAgICAqbmdJZj1cIiFoZWFkZXJDb250ZW50XCJcbiAgICBbdGl0bGVdPVwidGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfdGl0bGVcIlxuPlxuPC9pZ3gtcXVlcnktYnVpbGRlci1oZWFkZXI+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cImlneC1xdWVyeS1idWlsZGVyLWhlYWRlclwiPjwvbmctY29udGVudD5cblxuPGRpdlxuICAgICNleHByZXNzaW9uc0NvbnRhaW5lclxuICAgIGNsYXNzPVwiaWd4LXF1ZXJ5LWJ1aWxkZXJfX21haW5cIlxuICAgIChzY3JvbGwpPVwib25FeHByZXNzaW9uc1Njcm9sbGVkKClcIlxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm9vdEdyb3VwXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAjYWRkUm9vdEFuZEdyb3VwQnV0dG9uXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kR3JvdXAoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYW5kX2dyb3VwIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZE9yR3JvdXAoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5hZGQ8L2lneC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfb3JfZ3JvdXAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5XCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJpZ3gtZmlsdGVyLWVtcHR5X190aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2luaXRpYWxfdGV4dCB9fVxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgI2FkZEV4cHJlc3Npb25zVGVtcGxhdGVcbiAgICAgICAgbGV0LWV4cHJlc3Npb25JdGVtXG4gICAgICAgIGxldC1hZnRlckV4cHJlc3Npb249XCJhZnRlckV4cHJlc3Npb25cIlxuICAgID5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICNhZGRDb25kaXRpb25CdXR0b25cbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRDb25kaXRpb24oZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+YWRkPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfYWRkX2NvbmRpdGlvblxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFzRWRpdGVkRXhwcmVzc2lvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0sIGFmdGVyRXhwcmVzc2lvbilcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aWd4LWljb24+YWRkPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2FuZF9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNFZGl0ZWRFeHByZXNzaW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRPckdyb3VwKGV4cHJlc3Npb25JdGVtLCBhZnRlckV4cHJlc3Npb24pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1pY29uPmFkZDwvaWd4LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9vcl9ncm91cCB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZmlsdGVyT3BlcmFuZFRlbXBsYXRlIGxldC1leHByZXNzaW9uSXRlbT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCIhZXhwcmVzc2lvbkl0ZW0uaW5FZGl0TW9kZVwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1pdGVtXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSB0cnVlXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImV4cHJlc3Npb25JdGVtLmhvdmVyZWQgPSBmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtY2hpcFxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImV4cHJlc3Npb25JdGVtXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlEZW5zaXR5ID09PSAnY29tcGFjdCcgPyAnY29zeScgOiBkaXNwbGF5RGVuc2l0eVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiZXhwcmVzc2lvbkl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoaXBDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCJvbkNoaXBEYmxDbGljayhleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgIChyZW1vdmUpPVwib25DaGlwUmVtb3ZlKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvbkNoaXBTZWxlY3Rpb25FbmQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWd4UHJlZml4IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19leHByZXNzaW9uLWNvbHVtblwiPnt7XG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmZpZWxkTGFiZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uZmllbGROYW1lXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlneC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uY29uZGl0aW9uLmljb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvaWd4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvbi1jb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGlneFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLmNvbmRpdGlvbi5pc1VuYXJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RhdGUoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5zZWFyY2hWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGV4cHJlc3Npb25JdGVtLmV4cHJlc3Npb24uc2VhcmNoVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWVsZEZvcm1hdHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uZXhwcmVzc2lvbi5maWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5sb2NhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHByZXNzaW9uSXRlbS5leHByZXNzaW9uLnNlYXJjaFZhbFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaWd4LWNoaXA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLXRyZWVfX2V4cHJlc3Npb24tYWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25JdGVtLnNlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkl0ZW0uaG92ZXJlZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uRWRpdChleHByZXNzaW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgZWRpdFxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW50ZXJFeHByZXNzaW9uQWRkKGV4cHJlc3Npb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhZXhwcmVzc2lvbkl0ZW0uaW5BZGRNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwcmVzc2lvbkl0ZW0ucGFyZW50ICE9PSBjdXJyZW50R3JvdXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uSXRlbSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLmNoaWxkcmVuLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIGFkZFxuICAgICAgICAgICAgICAgIDwvaWd4LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5pbkVkaXRNb2RlXCJcbiAgICAgICAgICAgICNlZGl0aW5nSW5wdXRzQ29udGFpbmVyXG4gICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9faW5wdXRzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlneC1zZWxlY3RcbiAgICAgICAgICAgICAgICAjZmllbGRTZWxlY3RcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbb3ZlcmxheVNldHRpbmdzXT1cImZpZWxkU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbHVtbl9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBbdmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfHwgZmllbGQuaGVhZGVyIHx8IGZpZWxkLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtc2VsZWN0XG4gICAgICAgICAgICAgICAgI2NvbmRpdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCInY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgIFtvdmVybGF5U2V0dGluZ3NdPVwiY29uZGl0aW9uU2VsZWN0T3ZlcmxheVNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2NvbmRpdGlvbl9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZEZpZWxkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LXByZWZpeFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2VsZWN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvblNlbGVjdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PVwiaW14LWljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblNlbGVjdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuaWNvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2lneC1wcmVmaXg+XG5cbiAgICAgICAgICAgICAgICA8aWd4LXNlbGVjdC1pdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb25kaXRpb24gb2YgZ2V0Q29uZGl0aW9uTGlzdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLWl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aWd4LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk9XCJpbXgtaWNvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fZmlsdGVyaW5nLWRyb3Bkb3duLXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmRpdGlvbkZyaWVuZGx5TmFtZShjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgICAgICAgICA8L2lneC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSAhPT0gJ2RhdGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlICE9PSAndGltZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgIT09ICdkYXRlVGltZScpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaFZhbHVlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWd4SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkLmZpbHRlcnMuY29uZGl0aW9uKHNlbGVjdGVkQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZpZWxkICYmIHNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RleHQnXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3ZhbHVlX3BsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2lneC1pbnB1dC1ncm91cD5cblxuICAgICAgICAgICAgPGlneC1kYXRlLXBpY2tlclxuICAgICAgICAgICAgICAgICNwaWNrZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRmllbGQgJiYgc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJveFwiXG4gICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCInY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGF0ZV9wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRmllbGQuZmlsdGVycy5jb25kaXRpb24oc2VsZWN0ZWRDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInRoaXMubG9jYWxlXCJcbiAgICAgICAgICAgICAgICBbb3V0bGV0XT1cInBpY2tlck91dGxldFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdHRlcl09XCJzZWxlY3RlZEZpZWxkLmZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgIFt3ZWVrU3RhcnRdPVwic2VsZWN0ZWRGaWVsZC5waXBlQXJncy53ZWVrU3RhcnRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBkZWZhdWx0IGljb25zIC0tPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLXRvZ2dsZT48L2lneC1waWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDxpZ3gtcGlja2VyLWNsZWFyPjwvaWd4LXBpY2tlci1jbGVhcj5cbiAgICAgICAgICAgIDwvaWd4LWRhdGUtcGlja2VyPlxuXG4gICAgICAgICAgICA8aWd4LXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgI3BpY2tlclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAndGltZSdcIlxuICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib3BlblBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX3RpbWVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZENvbmRpdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNVbmFyeSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwidGhpcy5sb2NhbGVcIlxuICAgICAgICAgICAgICAgIFtvdXRsZXRdPVwicGlja2VyT3V0bGV0XCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0dGVyXT1cInNlbGVjdGVkRmllbGQuZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXRdPVwic2VsZWN0ZWRGaWVsZC5kZWZhdWx0VGltZUZvcm1hdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIGRlZmF1bHQgaWNvbnMgLS0+XG4gICAgICAgICAgICAgICAgPGlneC1waWNrZXItdG9nZ2xlPjwvaWd4LXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgPGlneC1waWNrZXItY2xlYXI+PC9pZ3gtcGlja2VyLWNsZWFyPlxuICAgICAgICAgICAgPC9pZ3gtdGltZS1waWNrZXI+XG5cbiAgICAgICAgICAgIDxpZ3gtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgICAgICAjaW5wdXRHcm91cFxuICAgICAgICAgICAgICAgIHR5cGU9XCJib3hcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWVsZCAmJiBzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZVRpbWUnXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYm94XCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwiJ2NvbXBhY3QnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgICAgICAgIGlneElucHV0XG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RhdGVfcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRDb25kaXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZC5maWx0ZXJzLmNvbmRpdGlvbihzZWxlY3RlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzVW5hcnkpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZ3hEYXRlVGltZUVkaXRvcl09XCJzZWxlY3RlZEZpZWxkLmRlZmF1bHREYXRlVGltZUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19pbnB1dHMtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhb3BlcmFuZENhbkJlQ29tbWl0dGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29tbWl0T3BlcmFuZEVkaXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2hlY2s8L2lneC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxPcGVyYW5kRWRpdCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpZ3gtaWNvbj5jbG9zZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJleHByZXNzaW9uSXRlbS5pbkFkZE1vZGVcIlxuICAgICAgICAgICAgI2FkZE1vZGVDb250YWluZXJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19idXR0b25zXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIGFkZEV4cHJlc3Npb25zVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHQoZXhwcmVzc2lvbkl0ZW0ucGFyZW50LCBleHByZXNzaW9uSXRlbSlcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3BlcmFuZEFkZCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aWd4LWljb24+Y2xvc2U8L2lneC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2V4cHJlc3Npb25UcmVlVGVtcGxhdGUgbGV0LWV4cHJlc3Npb25JdGVtPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWZpbHRlci10cmVlXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fbGluZVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnaWd4LWZpbHRlci10cmVlX19saW5lLS1hbmQnOiBleHByZXNzaW9uSXRlbS5vcGVyYXRvciA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tb3InOiBleHByZXNzaW9uSXRlbS5vcGVyYXRvciA9PT0gMSxcbiAgICAgICAgICAgICAgICAgICAgJ2lneC1maWx0ZXItdHJlZV9fbGluZS0tc2VsZWN0ZWQnOiBleHByZXNzaW9uSXRlbS5zZWxlY3RlZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImludm9rZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkdyb3VwQ2xpY2soZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgID48L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlneC1maWx0ZXItdHJlZV9fZXhwcmVzc2lvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGV4cHIgb2YgZXhwcmVzc2lvbkl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4cHJlc3Npb25Hcm91cChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25UcmVlVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWx0ZXJPcGVyYW5kVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChleHByKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEdyb3VwID09PSBleHByZXNzaW9uSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICNjdXJyZW50R3JvdXBCdXR0b25zQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci10cmVlX19idXR0b25zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhwcmVzc2lvbnNUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0KGV4cHJlc3Npb25JdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlneEJ1dHRvbj1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXhwcmVzc2lvbkl0ZW0gIT09IHJvb3RHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRWRpdGVkRXhwcmVzc2lvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25JdGVtLmNoaWxkcmVuLmxlbmd0aCA8IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZW5kR3JvdXAoZXhwcmVzc2lvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9lbmRfZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvb3RHcm91cFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UcmVlVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogY29udGV4dChyb290R3JvdXApXG4gICAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2XG4gICAgICAgIGlneFRvZ2dsZVxuICAgICAgICBjbGFzcz1cImlneC1maWx0ZXItY29udGV4dHVhbC1tZW51XCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAoY2xvc2VkKT1cImNvbnRleHRNZW51Q2xvc2VkKClcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnUtLWNvc3knOiBkaXNwbGF5RGVuc2l0eSA9PT0gJ2Nvc3knLFxuICAgICAgICAgICAgJ2lneC1maWx0ZXItY29udGV4dHVhbC1tZW51LS1jb21wYWN0JzogZGlzcGxheURlbnNpdHkgPT09ICdjb21wYWN0J1xuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpZ3hCdXR0b249XCJpY29uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2Nsb3NlLWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpZ3gtaWNvbj5jbG9zZTwvaWd4LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZXh0dWFsR3JvdXBcIj5cbiAgICAgICAgICAgIDxpZ3gtYnV0dG9uZ3JvdXBcbiAgICAgICAgICAgICAgICBbZGlzcGxheURlbnNpdHldPVwidGhpcy5kaXNwbGF5RGVuc2l0eVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlc109XCJmaWx0ZXJpbmdMb2dpY3NcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0RmlsdGVyaW5nTG9naWMoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2lneC1idXR0b25ncm91cD5cblxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY29udGV4dHVhbEdyb3VwLnBhcmVudFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuZ3JvdXAoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uIGZhbWlseT1cImlteC1pY29uc1wiIG5hbWU9XCJ1bmdyb3VwXCI+PC9pZ3gtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl91bmdyb3VwXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlR3JvdXAoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZmlsdGVyLWNvbnRleHR1YWwtbWVudV9fZGVsZXRlLWJ0blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlneC1pY29uPmRlbGV0ZTwvaWd4LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X3F1ZXJ5X2J1aWxkZXJfZGVsZXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRleHR1YWxHcm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVBbmRHcm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jcmVhdGVfYW5kX2dyb3VwIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWd4QnV0dG9uPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJ0aGlzLmRpc3BsYXlEZW5zaXR5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlT3JHcm91cCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfcXVlcnlfYnVpbGRlcl9jcmVhdGVfb3JfZ3JvdXAgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZ3hCdXR0b249XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlEZW5zaXR5XT1cInRoaXMuZGlzcGxheURlbnNpdHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWd4LWZpbHRlci1jb250ZXh0dWFsLW1lbnVfX2RlbGV0ZS1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9xdWVyeV9idWlsZGVyX2RlbGV0ZV9maWx0ZXJzIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXZcbiAgICAjb3ZlcmxheU91dGxldFxuICAgIGlneE92ZXJsYXlPdXRsZXRcbiAgICBjbGFzcz1cImlneC1xdWVyeS1idWlsZGVyX19vdXRsZXRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbk91dGxldFBvaW50ZXJEb3duKCRldmVudClcIlxuPjwvZGl2PlxuIl19