mmhglobal-dynamicform 2.36.2 → 2.37.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +26 -0
  2. package/esm2020/lib/components/buttonfieldbase.component.mjs +10 -1
  3. package/esm2020/lib/components/datalistingfieldbase.component.mjs +37 -1
  4. package/esm2020/lib/components/fieldbase.component.mjs +3 -3
  5. package/esm2020/lib/dropdown_buttons/dropdown_buttons.component.mjs +109 -0
  6. package/esm2020/lib/kcard/kcard.component.mjs +2 -2
  7. package/esm2020/lib/ksplitter/ksplitter.component.mjs +19 -2
  8. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +10 -5
  9. package/esm2020/lib/services/main.service.mjs +83 -18
  10. package/esm2020/lib/services/zcomponent.debug.service.mjs +7 -3
  11. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +15 -23
  12. package/esm2020/lib/zbuttons/zbuttons.component.mjs +14 -25
  13. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +21 -13
  14. package/esm2020/lib/zgrid/zgrid.component.mjs +98 -98
  15. package/esm2020/lib/ztextarea/ztextarea.component.mjs +3 -7
  16. package/esm2020/lib/ztreelist/ztreelist.component.mjs +38 -16
  17. package/esm2020/lib/zudf/zudf.component.mjs +3 -3
  18. package/esm2020/public-api.mjs +2 -1
  19. package/fesm2015/mmhglobal-dynamicform.mjs +431 -191
  20. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
  21. package/fesm2020/mmhglobal-dynamicform.mjs +430 -192
  22. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
  23. package/lib/components/buttonfieldbase.component.d.ts +3 -0
  24. package/lib/components/datalistingfieldbase.component.d.ts +2 -0
  25. package/lib/dropdown_buttons/dropdown_buttons.component.d.ts +21 -0
  26. package/lib/ksplitter/ksplitter.component.d.ts +2 -0
  27. package/lib/mmhglobal-dynamicform.module.d.ts +42 -41
  28. package/lib/services/main.service.d.ts +8 -3
  29. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +4 -2
  30. package/lib/zbuttons/zbuttons.component.d.ts +1 -3
  31. package/lib/zgrid/zgrid.component.d.ts +4 -4
  32. package/lib/ztreelist/ztreelist.component.d.ts +2 -1
  33. package/package.json +1 -1
  34. package/public-api.d.ts +1 -0
@@ -5,7 +5,8 @@ import { Component } from '@angular/core';
5
5
  import { switchMap, tap } from 'rxjs/operators';
6
6
  /********** Component & Service **********/
7
7
  import { ButtonFieldBase } from '../components/buttonfieldbase.component';
8
- import { TriggerFromType, ZComponentHelper, } from 'mmhglobal-zcore';
8
+ import { ComponentType, TriggerFromType, ZComponentHelper, } from 'mmhglobal-zcore';
9
+ import { of } from 'rxjs';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "../services/zcomponent.service";
11
12
  import * as i2 from "mmhglobal-zcore";
@@ -34,8 +35,17 @@ export class ZbuttonsComponent extends ButtonFieldBase {
34
35
  ngAfterViewInit() {
35
36
  this.componentService.decrementComponentCounterForField(this.data);
36
37
  }
38
+ getFieldObByComponentType() {
39
+ if (this.data.Type == ComponentType.a) {
40
+ return of([this.data]);
41
+ }
42
+ if (this.data.Type == ComponentType.zbuttons_container && Array.isArray(this.data.Value)) {
43
+ return of(this.data.Value);
44
+ }
45
+ return this.fieldService.getFormFieldCode(this.data.Value, "FormField");
46
+ }
37
47
  loadButton() {
38
- const field$ = this.fieldService.getFormFieldCode(this.data.Value, "FormField");
48
+ let field$ = this.getFieldObByComponentType();
39
49
  this.group.zButtonsCount++;
40
50
  if (this.group.zButtonsCount === 1) {
41
51
  this.FirstZbtn = true;
@@ -113,7 +123,7 @@ export class ZbuttonsComponent extends ButtonFieldBase {
113
123
  // Create a deep clone of the item object
114
124
  const clonedButton = ZComponentHelper.deepClone(item);
115
125
  // Call a method to update the event ID (implementation not provided)
116
- this.updateEventId(item);
126
+ item.eventId = ZComponentHelper.generateTimeStampId();
117
127
  // Set the DismissType property of the group to the dismissType property of the item
118
128
  this.group['DismissType'] = item.dismissType;
119
129
  // Create an output event object with details about the button click
@@ -131,27 +141,6 @@ export class ZbuttonsComponent extends ButtonFieldBase {
131
141
  // Notify subscribers with the output event
132
142
  this.group.subject.next(outputEvent);
133
143
  }
134
- updateEventId(button) {
135
- const name = button.Name ?? button.name;
136
- const updateButtonEventId = (buttons) => {
137
- buttons.forEach(item => {
138
- if (item.name === name) {
139
- item.eventId = ZComponentHelper.generateTimeStampId();
140
- }
141
- });
142
- };
143
- updateButtonEventId(this.leftBtns);
144
- updateButtonEventId(this.rightBtns);
145
- }
146
- getButtonDisableTriggerValue(data, button) {
147
- return button.DisableTrigger != undefined ? button.DisableTrigger : (data.DisableTrigger != undefined ? data.DisableTrigger : false);
148
- }
149
- disableButton(buttonName, isDisabled = true) {
150
- const selectedButton = this.items.find(x => x.name == buttonName);
151
- if (selectedButton) {
152
- selectedButton.disabled = isDisabled;
153
- }
154
- }
155
144
  }
156
145
  ZbuttonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZbuttonsComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FieldService }, { token: i2.FontAweSomeService }], target: i0.ɵɵFactoryTarget.Component });
157
146
  ZbuttonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZbuttonsComponent, selector: "app-zbuttons", usesInheritance: true, ngImport: i0, template: "<div\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && items.length > 0\"\r\n [style]=\"componentProperties.style.style\" class=\"e1tag-style\">\r\n\r\n <div class=\"ion-margin-vertical e1tag-style1\" *ngIf=\"isMobileScreen() && items.length > 1 && FirstZbtn === false\"\r\n [style]=\"componentProperties.style.style1\">\r\n <kendo-dropdownbutton [data]=\"items\" size=\"large\" [look]=\"'outline'\"\r\n class=\"ion-activatable ripple-parent e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n Actions\r\n <ng-template kendoDropDownButtonItemTemplate let-dataItem>\r\n <!-- <span class=\"k-icon k-i-{{ dataItem.icon }}\"></span> -->\r\n <span (click)=\"buttonClick(dataItem)\">{{ dataItem.text }}</span>\r\n </ng-template>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </kendo-dropdownbutton>\r\n </div>\r\n\r\n <div *ngIf=\"!isMobileScreen() || items.length === 1 \" [ngClass]=\"data.DivClass\" class=\"btn-container e1tag-style3\"\r\n [style]=\"componentProperties.style.style3\">\r\n <div class=\"btn-left e1tag-style4\" [style]=\"componentProperties.style.style4\">\r\n <ng-container *ngFor=\"let item of leftBtns; let i = index\">\r\n <ion-button [fill]=\"item.fill\" *ngIf=\"item.Type === 'a'\" [size]=\"item.size\" [color]=\"item.color\" strong=\"true\"\r\n [ngClass]=\"item.class\" (click)=\"buttonClick(item)\" [hidden]=\"!isBtnVisible(item.visible)\"\r\n [disabled]=\"group.isTriggered || item.disabled\" [style]=\"componentProperties.style.style5 + ' ' + item.style\"\r\n class=\"e1tag-style5\">\r\n <div class=\"button-content-container e1tag-style8\" [style]=\"componentProperties.style.style8\">\r\n <fa-icon class=\"btn-icon e1tag-style9\" [style]=\"componentProperties.style.style9\" *ngIf=\"item.icon\"\r\n [icon]=\"getFontAwesome(item.icon, fontAweSomeService)\"></fa-icon>\r\n <span class=\"ion-text-capitalize e1tag-style10\" [style]=\"componentProperties.style.style10\"\r\n *ngIf=\"item.text && item.showLabel\" [class.btn-label]=\"item.icon\">{{item.text}}</span>\r\n </div>\r\n </ion-button>\r\n <app-zformcontrol *ngIf=\"item.Type !== 'a'\"\r\n [ngClass]=\"group[item['isVisibleField']] ? item.DivClass :((item.Visible === true) ? item.DivClass : 'flex-hide')\"\r\n [field]=\"item\" [group]=\"group\" [form]=\"form\" id=\"{{item.Type}}-{{item.Name}}\"></app-zformcontrol>\r\n </ng-container>\r\n </div>\r\n <div class=\"btn-right e1tag-style6\" [style]=\"componentProperties.style.style6\">\r\n <ng-container *ngFor=\"let item of rightBtns; let i = index\">\r\n <ion-button *ngIf=\"item.Type === 'a'\" [fill]=\"item.fill\" [size]=\"item.size\" [color]=\"item.color\" strong=\"true\"\r\n [ngClass]=\"item.class\" (click)=\"buttonClick(item)\" [hidden]=\"!isBtnVisible(item.visible)\"\r\n [disabled]=\"group.isTriggered || item.disabled\" [style]=\"componentProperties.style.style7 + ' ' + item.style\"\r\n class=\"e1tag-style7\">\r\n <div class=\"button-content-container e1tag-style8\" [style]=\"componentProperties.style.style8\">\r\n <fa-icon class=\"btn-icon e1tag-style9\" [style]=\"componentProperties.style.style9\" *ngIf=\"item.icon\"\r\n [icon]=\"getFontAwesome(item.icon, fontAweSomeService)\"></fa-icon>\r\n <span class=\"ion-text-capitalize e1tag-style10\" [style]=\"componentProperties.style.style10\"\r\n *ngIf=\"item.text && item.showLabel\" [class.btn-label]=\"item.icon\">{{item.text}}</span>\r\n </div>\r\n </ion-button>\r\n <app-zformcontrol *ngIf=\"item.Type !== 'a'\"\r\n [ngClass]=\"group[item['isVisibleField']] ? item.DivClass :((item.Visible === true) ? item.DivClass : 'flex-hide')\"\r\n [field]=\"item\" [group]=\"group\" [form]=\"form\" id=\"{{item.Type}}-{{item.Name}}\"></app-zformcontrol>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".ripple-parent{position:relative;overflow:hidden}.btn-container{padding:5px 0;display:flex;flex-direction:row;justify-content:space-between}ion-button{font-size:var(--button-font-size);margin-left:10px;--border-radius: var(--button-border-radius);--box-shadow: 1px 2px 4px 0px rgba(0, 0, 0, .25)}ion-button.useCustomClass{--background-hover-opacity: 1;--border-width: 2px;--border-style: solid;--background: #fff;--background-hover: rgba(var(--ion-color-primary-rgb), .05);--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}ion-button.primary-light{--background: rgba(var(--ion-color-primary-rgb), .05);--background-hover: #fff;--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}ion-button.primary{--background: var(--ion-color-primary);--background-hover: var(--ion-color-primary-tint);--color: var(--ion-color-primary-contrast);--border-color: var(--ion-color-primary-shade)}ion-button.success{--background: var(--ion-color-success);--background-hover: var(--ion-color-success-tint);--color: var(--ion-color-success-contrast);--border-color: var(--ion-color-success-shade)}ion-button.danger{--background: var(--ion-color-danger);--background-hover: var(--ion-color-danger-tint2);--color: var(--ion-color-danger-contrast);--border-color: var(--ion-color-danger-shade)}ion-button.warning{--background: var(--ion-color-warning);--background-hover: var(--ion-color-warning-tint);--color: #000;--border-color: var(--ion-color-warning-shade)}ion-button.no-shadow{--box-shadow: none}.btn-label{padding-left:8px}\n"], components: [{ type: i3.DropDownButtonComponent, selector: "kendo-dropdownbutton", inputs: ["icon", "iconClass", "imageUrl", "textField", "data", "size", "rounded", "fillMode", "themeColor"], outputs: ["itemClick", "focus", "blur"], exportAs: ["kendoDropDownButton"] }, { type: i4.IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }, { type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.ZformcontrolComponent, selector: "app-zformcontrol", inputs: ["field", "group", "form", "containerField"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ButtonItemTemplateDirective, selector: "[kendoDropDownButtonItemTemplate],[kendoSplitButtonItemTemplate]" }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
@@ -159,4 +148,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
159
148
  type: Component,
160
149
  args: [{ selector: "app-zbuttons", template: "<div\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible) && items.length > 0\"\r\n [style]=\"componentProperties.style.style\" class=\"e1tag-style\">\r\n\r\n <div class=\"ion-margin-vertical e1tag-style1\" *ngIf=\"isMobileScreen() && items.length > 1 && FirstZbtn === false\"\r\n [style]=\"componentProperties.style.style1\">\r\n <kendo-dropdownbutton [data]=\"items\" size=\"large\" [look]=\"'outline'\"\r\n class=\"ion-activatable ripple-parent e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n Actions\r\n <ng-template kendoDropDownButtonItemTemplate let-dataItem>\r\n <!-- <span class=\"k-icon k-i-{{ dataItem.icon }}\"></span> -->\r\n <span (click)=\"buttonClick(dataItem)\">{{ dataItem.text }}</span>\r\n </ng-template>\r\n <ion-ripple-effect></ion-ripple-effect>\r\n </kendo-dropdownbutton>\r\n </div>\r\n\r\n <div *ngIf=\"!isMobileScreen() || items.length === 1 \" [ngClass]=\"data.DivClass\" class=\"btn-container e1tag-style3\"\r\n [style]=\"componentProperties.style.style3\">\r\n <div class=\"btn-left e1tag-style4\" [style]=\"componentProperties.style.style4\">\r\n <ng-container *ngFor=\"let item of leftBtns; let i = index\">\r\n <ion-button [fill]=\"item.fill\" *ngIf=\"item.Type === 'a'\" [size]=\"item.size\" [color]=\"item.color\" strong=\"true\"\r\n [ngClass]=\"item.class\" (click)=\"buttonClick(item)\" [hidden]=\"!isBtnVisible(item.visible)\"\r\n [disabled]=\"group.isTriggered || item.disabled\" [style]=\"componentProperties.style.style5 + ' ' + item.style\"\r\n class=\"e1tag-style5\">\r\n <div class=\"button-content-container e1tag-style8\" [style]=\"componentProperties.style.style8\">\r\n <fa-icon class=\"btn-icon e1tag-style9\" [style]=\"componentProperties.style.style9\" *ngIf=\"item.icon\"\r\n [icon]=\"getFontAwesome(item.icon, fontAweSomeService)\"></fa-icon>\r\n <span class=\"ion-text-capitalize e1tag-style10\" [style]=\"componentProperties.style.style10\"\r\n *ngIf=\"item.text && item.showLabel\" [class.btn-label]=\"item.icon\">{{item.text}}</span>\r\n </div>\r\n </ion-button>\r\n <app-zformcontrol *ngIf=\"item.Type !== 'a'\"\r\n [ngClass]=\"group[item['isVisibleField']] ? item.DivClass :((item.Visible === true) ? item.DivClass : 'flex-hide')\"\r\n [field]=\"item\" [group]=\"group\" [form]=\"form\" id=\"{{item.Type}}-{{item.Name}}\"></app-zformcontrol>\r\n </ng-container>\r\n </div>\r\n <div class=\"btn-right e1tag-style6\" [style]=\"componentProperties.style.style6\">\r\n <ng-container *ngFor=\"let item of rightBtns; let i = index\">\r\n <ion-button *ngIf=\"item.Type === 'a'\" [fill]=\"item.fill\" [size]=\"item.size\" [color]=\"item.color\" strong=\"true\"\r\n [ngClass]=\"item.class\" (click)=\"buttonClick(item)\" [hidden]=\"!isBtnVisible(item.visible)\"\r\n [disabled]=\"group.isTriggered || item.disabled\" [style]=\"componentProperties.style.style7 + ' ' + item.style\"\r\n class=\"e1tag-style7\">\r\n <div class=\"button-content-container e1tag-style8\" [style]=\"componentProperties.style.style8\">\r\n <fa-icon class=\"btn-icon e1tag-style9\" [style]=\"componentProperties.style.style9\" *ngIf=\"item.icon\"\r\n [icon]=\"getFontAwesome(item.icon, fontAweSomeService)\"></fa-icon>\r\n <span class=\"ion-text-capitalize e1tag-style10\" [style]=\"componentProperties.style.style10\"\r\n *ngIf=\"item.text && item.showLabel\" [class.btn-label]=\"item.icon\">{{item.text}}</span>\r\n </div>\r\n </ion-button>\r\n <app-zformcontrol *ngIf=\"item.Type !== 'a'\"\r\n [ngClass]=\"group[item['isVisibleField']] ? item.DivClass :((item.Visible === true) ? item.DivClass : 'flex-hide')\"\r\n [field]=\"item\" [group]=\"group\" [form]=\"form\" id=\"{{item.Type}}-{{item.Name}}\"></app-zformcontrol>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".ripple-parent{position:relative;overflow:hidden}.btn-container{padding:5px 0;display:flex;flex-direction:row;justify-content:space-between}ion-button{font-size:var(--button-font-size);margin-left:10px;--border-radius: var(--button-border-radius);--box-shadow: 1px 2px 4px 0px rgba(0, 0, 0, .25)}ion-button.useCustomClass{--background-hover-opacity: 1;--border-width: 2px;--border-style: solid;--background: #fff;--background-hover: rgba(var(--ion-color-primary-rgb), .05);--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}ion-button.primary-light{--background: rgba(var(--ion-color-primary-rgb), .05);--background-hover: #fff;--color: var(--ion-color-primary);--border-color: var(--ion-color-primary)}ion-button.primary{--background: var(--ion-color-primary);--background-hover: var(--ion-color-primary-tint);--color: var(--ion-color-primary-contrast);--border-color: var(--ion-color-primary-shade)}ion-button.success{--background: var(--ion-color-success);--background-hover: var(--ion-color-success-tint);--color: var(--ion-color-success-contrast);--border-color: var(--ion-color-success-shade)}ion-button.danger{--background: var(--ion-color-danger);--background-hover: var(--ion-color-danger-tint2);--color: var(--ion-color-danger-contrast);--border-color: var(--ion-color-danger-shade)}ion-button.warning{--background: var(--ion-color-warning);--background-hover: var(--ion-color-warning-tint);--color: #000;--border-color: var(--ion-color-warning-shade)}ion-button.no-shadow{--box-shadow: none}.btn-label{padding-left:8px}\n"] }]
161
150
  }], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FieldService }, { type: i2.FontAweSomeService }]; } });
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemJ1dHRvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemJ1dHRvbnMvemJ1dHRvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemJ1dHRvbnMvemJ1dHRvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFMUUsT0FBTyxFQUM2QixlQUFlLEVBQ3JDLGdCQUFnQixHQUM3QixNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7O0FBU3pCLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBTXBELFlBQ1MsZ0JBQW1DLEVBQ2xDLFlBQTBCLEVBQzNCLGtCQUFzQztRQUU3QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUpqQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFSL0MsVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUN2QixhQUFRLEdBQWUsRUFBRSxDQUFDO1FBQzFCLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFDM0IsY0FBUyxHQUFHLEtBQUssQ0FBQztJQVFsQixDQUFDO0lBRUQsUUFBUTtRQUNOLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFF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YSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IEJ1dHRvbkZpZWxkQmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvYnV0dG9uZmllbGRiYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFpDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBGaWVsZFNlcnZpY2UsIEZvbnRBd2VTb21lU2VydmljZSwgVHJpZ2dlckZyb21UeXBlLFxyXG4gIFpDb21wb25lbnQsIFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkZpZWxkLFxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXpidXR0b25zXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96YnV0dG9ucy5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96YnV0dG9ucy5jb21wb25lbnQuc2Nzc1wiXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFpidXR0b25zQ29tcG9uZW50IGV4dGVuZHMgQnV0dG9uRmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0IHtcclxuICBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGxlZnRCdG5zOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcmlnaHRCdG5zOiBBcnJheTxhbnk+ID0gW107XHJcbiAgRmlyc3RaYnRuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHB1YmxpYyBmb250QXdlU29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoY29tcG9uZW50U2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLmluaXRDb21wb25lbnQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvYWRCdXR0b24oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQnV0dG9uKCkge1xyXG4gICAgY29uc3QgZmllbGQkID0gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZSh0aGlzLmRhdGEuVmFsdWUsIFwiRm9ybUZpZWxkXCIpO1xyXG5cclxuICAgIHRoaXMuZ3JvdXAuekJ1dHRvbnNDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuZ3JvdXAuekJ1dHRvbnNDb3VudCA9PT0gMSkge1xyXG4gICAgICB0aGlzLkZpcnN0WmJ0biA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgZmllbGQkLnBpcGUoXHJcbiAgICAgICAgdGFwKGRhdGEgPT4ge1xyXG4gICAgICAgICAgLy8gdGhpcy5pdGVtcyA9IGRhdGE7XHJcbiAgICAgICAgICBkYXRhLmZvckVhY2goKGJ1dHRvbjogWkZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBCdXR0b25BdHRyaWJ1dGVzKGJ1dHRvbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuaXRlbXMucHVzaCguLi50aGlzLmxlZnRCdG5zLCAuLi50aGlzLnJpZ2h0QnRucyk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIHJldHVybiBzdXBlci50cmFuc2xhdGVCdXR0b25zTGFiZWwodGhpcy5pdGVtcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogXCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBCdXR0b25BdHRyaWJ1dGVzKGJ1dHRvbjogWkZpZWxkKSB7XHJcbiAgICBsZXQgY29tcDogYW55ID0gYnV0dG9uO1xyXG4gICAgaWYgKGJ1dHRvbi5UeXBlID09ICdhJykge1xyXG4gICAgICBpZiAodGhpcy5kYXRhLlN1YlR5cGUpIHtcclxuICAgICAgICBidXR0b24uTmFtZSA9IHRoaXMuZGF0YS5TdWJUeXBlICsgJ18nICsgYnV0dG9uLk5hbWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEJ1dHRvbkxhYmVsKGJ1dHRvbik7XHJcblxyXG4gICAgICBsZXQgYnV0dG9uRGlzYWJsZWQgPSBudWxsO1xyXG5cclxuICAgICAgaWYgKGJ1dHRvblsnRGlzYWJsZWQnXSAhPSBcIlwiICYmIGJ1dHRvblsnRGlzYWJsZWQnXSkge1xyXG4gICAgICAgIGJ1dHRvbkRpc2FibGVkID0gYnV0dG9uWydEaXNhYmxlZCddID09PSAndHJ1ZScgPyB0cnVlIDogWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGJ1dHRvblsnRGlzYWJsZWQnXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGlzVXNlQ3VzdG9tQ2xhc3MgPSBidXR0b24uQ29sb3IgPyBmYWxzZSA6IHRydWU7XHJcbiAgICAgIGNvbXAgPSB7XHJcbiAgICAgICAgbmFtZTogYnV0dG9uLk5hbWUsXHJcbiAgICAgICAgdGV4dDogbGFiZWwsXHJcbiAgICAgICAgc2hvd0xhYmVsOiBidXR0b24uU2hvd0xhYmVsID8/IHRydWUsXHJcbiAgICAgICAgc3R5bGU6IGJ1dHRvbi5TdHlsZSxcclxuICAgICAgICBpY29uOiBaQ29tcG9uZW50SGVscGVyLmdldEljb24oYnV0dG9uLkljb24gYXMgc3RyaW5nKSxcclxuICAgICAgICB2aXNpYmxlOiBidXR0b24uVmlzaWJsZSxcclxuICAgICAgICBjb2xvcjogaXNVc2VDdXN0b21DbGFzcyA/ICcnIDogKGJ1dHRvbi5Db2xvciB8fCAncHJpbWFyeScpLFxyXG4gICAgICAgIGZpbGw6IGlzVXNlQ3VzdG9tQ2xhc3MgPyAnJyA6IChidXR0b25bJ0ZpbGwnXSB8fCAnc29saWQnKSxcclxuICAgICAgICBzaXplOiBidXR0b24uU2l6ZSB8fCAnZGVmYXVsdCcsXHJcbiAgICAgICAgY2xhc3M6IGlzVXNlQ3VzdG9tQ2xhc3MgPyBgJHtidXR0b24uQ2xhc3N9IHVzZUN1c3RvbUNsYXNzYCA6IGJ1dHRvbi5DbGFzcyxcclxuICAgICAgICBkaXNhYmxlZDogYnV0dG9uRGlzYWJsZWQsXHJcbiAgICAgICAgY2xpY2tFdmVudDogYnV0dG9uLkNsaWNrRXZlbnQsXHJcbiAgICAgICAgaWNvbk5hbWU6IGJ1dHRvbi5JY29uLFxyXG4gICAgICAgIGRpc21pc3NUeXBlOiBidXR0b24uRGlzbWlzc1R5cGUsXHJcbiAgICAgICAgZGlzYWJsZVRyaWdnZXJUaW1lcjogYnV0dG9uLkRpc2FibGVUcmlnZ2VyVGltZXIsXHJcbiAgICAgICAgZGlzYWJsZVRyaWdnZXI6IHRoaXMuZ2V0QnV0dG9uRGlzYWJsZVRyaWdnZXJWYWx1ZSh0aGlzLmRhdGEsIGJ1dHRvbiksXHJcbiAgICAgICAgU3ViVHlwZTogdGhpcy5kYXRhLlN1YlR5cGUsXHJcbiAgICAgICAgVHlwZTogYnV0dG9uLlR5cGUsXHJcbiAgICAgICAgYnV0dG9uRGF0YTogYnV0dG9uLFxyXG4gICAgICAgIGV2ZW50SWQ6IFpDb21wb25lbnRIZWxwZXIuZ2VuZXJhdGVUaW1lU3RhbXBJZCgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJ1dHRvblsnUG9zaXRpb25YJ10gJiYgYnV0dG9uWydQb3NpdGlvblgnXSA9PT0gXCJyaWdodFwiKSB7XHJcbiAgICAgIHRoaXMucmlnaHRCdG5zLnB1c2goY29tcCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5sZWZ0QnRucy5wdXNoKGNvbXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYnV0dG9uQ2xpY2soaXRlbTogYW55KSB7ICBcclxuICAgIC8vIFNldHMgdGhlIGlzVHJpZ2dlcmVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBkaXNhYmxlVHJpZ2dlciBwcm9wZXJ0eSBvZiB0aGUgaXRlbVxyXG4gICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGl0ZW0uZGlzYWJsZVRyaWdnZXIgIT0gdW5kZWZpbmVkID8gIWl0ZW0uZGlzYWJsZVRyaWdnZXIgOiB0cnVlO1xyXG5cclxuICAgIC8vIElmIHRoZSBpc1RyaWdnZXJlZCBwcm9wZXJ0eSBpcyB0cnVlLCBwcm9jZWVkIHdpdGggdGhlIGZvbGxvd2luZyBhY3Rpb25zXHJcbiAgICBpZiAodGhpcy5ncm91cC5pc1RyaWdnZXJlZCkge1xyXG4gICAgICBjb25zdCBtZSA9IHRoaXMuZ3JvdXA7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgZGlzYWJsZVRyaWdnZXJUaW1lciBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgc2V0IGEgdGltZW91dCB0byByZXNldCBpc1RyaWdnZXJlZCB0byBmYWxzZSBhZnRlciA1MDBtc1xyXG4gICAgICBpZiAoIWl0ZW1bJ2Rpc2FibGVUcmlnZ2VyVGltZXInXSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgbWVbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjbG9uZSBvZiB0aGUgaXRlbSBvYmplY3RcclxuICAgIGNvbnN0IGNsb25lZEJ1dHRvbiA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKGl0ZW0pO1xyXG5cclxuICAgIC8vIENhbGwgYSBtZXRob2QgdG8gdXBkYXRlIHRoZSBldmVudCBJRCAoaW1wbGVtZW50YXRpb24gbm90IHByb3ZpZGVkKVxyXG4gICAgdGhpcy51cGRhdGVFdmVudElkKGl0ZW0pO1xyXG5cclxuICAgIC8vIFNldCB0aGUgRGlzbWlzc1R5cGUgcHJvcGVydHkgb2YgdGhlIGdyb3VwIHRvIHRoZSBkaXNtaXNzVHlwZSBwcm9wZXJ0eSBvZiB0aGUgaXRlbVxyXG4gICAgdGhpcy5ncm91cFsnRGlzbWlzc1R5cGUnXSA9IGl0ZW0uZGlzbWlzc1R5cGU7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGFuIG91dHB1dCBldmVudCBvYmplY3Qgd2l0aCBkZXRhaWxzIGFib3V0IHRoZSBidXR0b24gY2xpY2tcclxuICAgIGNvbnN0IG91dHB1dEV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiBcImJ1dHRvbkNsaWNrXCIsXHJcbiAgICAgIHRhcmdldDogY2xvbmVkQnV0dG9uLmNsaWNrRXZlbnQsXHJcbiAgICAgIGRhdGE6IGNsb25lZEJ1dHRvbixcclxuICAgICAgdHJpZ2dlckZyb206IFRyaWdnZXJGcm9tVHlwZS5idXR0b25cclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50O1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgYnV0dG9uRXZlbnREZXRhaWwgcHJvcGVydHkgb2YgdGhlIGdyb3VwIHdpdGggdGhlIG91dHB1dCBldmVudCBkZXRhaWxzXHJcbiAgICB0aGlzLmdyb3VwWydidXR0b25FdmVudERldGFpbCddID0ge1xyXG4gICAgICBidXR0b25EZXRhaWw6IG91dHB1dEV2ZW50LFxyXG4gICAgICB0cmlnZ2VyRnJvbTogVHJpZ2dlckZyb21UeXBlLmJ1dHRvblxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnMgd2l0aCB0aGUgb3V0cHV0IGV2ZW50XHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dChvdXRwdXRFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUV2ZW50SWQoYnV0dG9uOiBhbnkpIHtcclxuICAgIGNvbnN0IG5hbWUgPSBidXR0b24uTmFtZSA/PyBidXR0b24ubmFtZTtcclxuICAgIGNvbnN0IHVwZGF0ZUJ1dHRvbkV2ZW50SWQgPSAoYnV0dG9uczogYW55W10pID0+IHtcclxuICAgICAgYnV0dG9ucy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLm5hbWUgPT09IG5hbWUpIHtcclxuICAgICAgICAgIGl0ZW0uZXZlbnRJZCA9IFpDb21wb25lbnRIZWxwZXIuZ2VuZXJhdGVUaW1lU3RhbXBJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZUJ1dHRvbkV2ZW50SWQodGhpcy5sZWZ0QnRucyk7XHJcbiAgICB1cGRhdGVCdXR0b25FdmVudElkKHRoaXMucmlnaHRCdG5zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QnV0dG9uRGlzYWJsZVRyaWdnZXJWYWx1ZShkYXRhOiBaRmllbGQsIGJ1dHRvbjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYnV0dG9uLkRpc2FibGVUcmlnZ2VyICE9IHVuZGVmaW5lZCA/IGJ1dHRvbi5EaXNhYmxlVHJpZ2dlciA6IChkYXRhLkRpc2FibGVUcmlnZ2VyICE9IHVuZGVmaW5lZCA/IGRhdGEuRGlzYWJsZVRyaWdnZXIgOiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGlzYWJsZUJ1dHRvbihidXR0b25OYW1lOiBzdHJpbmcsIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEJ1dHRvbiA9IHRoaXMuaXRlbXMuZmluZCh4ID0+IHgubmFtZSA9PSBidXR0b25OYW1lKTtcclxuICAgIGlmIChzZWxlY3RlZEJ1dHRvbikge1xyXG4gICAgICBzZWxlY3RlZEJ1dHRvbi5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAqbmdJZj1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKSAmJiBpdGVtcy5sZW5ndGggPiAwXCJcclxuICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiIGNsYXNzPVwiZTF0YWctc3R5bGVcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImlvbi1tYXJnaW4tdmVydGljYWwgZTF0YWctc3R5bGUxXCIgKm5nSWY9XCJpc01vYmlsZVNjcmVlbigpICYmIGl0ZW1zLmxlbmd0aCA+IDEgJiYgRmlyc3RaYnRuID09PSBmYWxzZVwiXHJcbiAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIj5cclxuICAgIDxrZW5kby1kcm9wZG93bmJ1dHRvbiBbZGF0YV09XCJpdGVtc1wiIHNpemU9XCJsYXJnZVwiIFtsb29rXT1cIidvdXRsaW5lJ1wiXHJcbiAgICAgIGNsYXNzPVwiaW9uLWFjdGl2YXRhYmxlIHJpcHBsZS1wYXJlbnQgZTF0YWctc3R5bGUyXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIEFjdGlvbnNcclxuICAgICAgPG5nLXRlbXBsYXRlIGtlbmRvRHJvcERvd25CdXR0b25JdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJrLWljb24gay1pLXt7IGRhdGFJdGVtLmljb24gfX1cIj48L3NwYW4+IC0tPlxyXG4gICAgICAgIDxzcGFuIChjbGljayk9XCJidXR0b25DbGljayhkYXRhSXRlbSlcIj57eyBkYXRhSXRlbS50ZXh0IH19PC9zcGFuPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8aW9uLXJpcHBsZS1lZmZlY3Q+PC9pb24tcmlwcGxlLWVmZmVjdD5cclxuICAgIDwva2VuZG8tZHJvcGRvd25idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCIhaXNNb2JpbGVTY3JlZW4oKSB8fCBpdGVtcy5sZW5ndGggPT09IDEgXCIgW25nQ2xhc3NdPVwiZGF0YS5EaXZDbGFzc1wiIGNsYXNzPVwiYnRuLWNvbnRhaW5lciBlMXRhZy1zdHlsZTNcIlxyXG4gICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUzXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWxlZnQgZTF0YWctc3R5bGU0XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGVmdEJ0bnM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICA8aW9uLWJ1dHRvbiBbZmlsbF09XCJpdGVtLmZpbGxcIiAqbmdJZj1cIml0ZW0uVHlwZSA9PT0gJ2EnXCIgW3NpemVdPVwiaXRlbS5zaXplXCIgW2NvbG9yXT1cIml0ZW0uY29sb3JcIiBzdHJvbmc9XCJ0cnVlXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3NcIiAoY2xpY2spPVwiYnV0dG9uQ2xpY2soaXRlbSlcIiBbaGlkZGVuXT1cIiFpc0J0blZpc2libGUoaXRlbS52aXNpYmxlKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuaXNUcmlnZ2VyZWQgfHwgaXRlbS5kaXNhYmxlZFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNSArICcgJyArIGl0ZW0uc3R5bGVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJlMXRhZy1zdHlsZTVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGVudC1jb250YWluZXIgZTF0YWctc3R5bGU4XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU4XCI+XHJcbiAgICAgICAgICAgIDxmYS1pY29uIGNsYXNzPVwiYnRuLWljb24gZTF0YWctc3R5bGU5XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU5XCIgKm5nSWY9XCJpdGVtLmljb25cIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKGl0ZW0uaWNvbiwgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpb24tdGV4dC1jYXBpdGFsaXplIGUxdGFnLXN0eWxlMTBcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEwXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udGV4dCAmJiBpdGVtLnNob3dMYWJlbFwiIFtjbGFzcy5idG4tbGFiZWxdPVwiaXRlbS5pY29uXCI+e3tpdGVtLnRleHR9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICA8YXBwLXpmb3JtY29udHJvbCAqbmdJZj1cIml0ZW0uVHlwZSAhPT0gJ2EnXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdyb3VwW2l0ZW1bJ2lzVmlzaWJsZUZpZWxkJ11dID8gaXRlbS5EaXZDbGFzcyA6KChpdGVtLlZpc2libGUgPT09IHRydWUpID8gIGl0ZW0uRGl2Q2xhc3MgOiAnZmxleC1oaWRlJylcIlxyXG4gICAgICAgICAgW2ZpZWxkXT1cIml0ZW1cIiBbZ3JvdXBdPVwiZ3JvdXBcIiBbZm9ybV09XCJmb3JtXCIgaWQ9XCJ7e2l0ZW0uVHlwZX19LXt7aXRlbS5OYW1lfX1cIj48L2FwcC16Zm9ybWNvbnRyb2w+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLXJpZ2h0IGUxdGFnLXN0eWxlNlwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNlwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJpZ2h0QnRuczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwiaXRlbS5UeXBlID09PSAnYSdcIiBbZmlsbF09XCJpdGVtLmZpbGxcIiBbc2l6ZV09XCJpdGVtLnNpemVcIiBbY29sb3JdPVwiaXRlbS5jb2xvclwiIHN0cm9uZz1cInRydWVcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc1wiIChjbGljayk9XCJidXR0b25DbGljayhpdGVtKVwiIFtoaWRkZW5dPVwiIWlzQnRuVmlzaWJsZShpdGVtLnZpc2libGUpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5pc1RyaWdnZXJlZCB8fCBpdGVtLmRpc2FibGVkXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU3ICsgJyAnICsgaXRlbS5zdHlsZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlN1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250ZW50LWNvbnRhaW5lciBlMXRhZy1zdHlsZThcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZThcIj5cclxuICAgICAgICAgICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvbiBlMXRhZy1zdHlsZTlcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTlcIiAqbmdJZj1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoaXRlbS5pY29uLCBmb250QXdlU29tZVNlcnZpY2UpXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlvbi10ZXh0LWNhcGl0YWxpemUgZTF0YWctc3R5bGUxMFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMTBcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50ZXh0ICYmIGl0ZW0uc2hvd0xhYmVsXCIgW2NsYXNzLmJ0bi1sYWJlbF09XCJpdGVtLmljb25cIj57e2l0ZW0udGV4dH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDxhcHAtemZvcm1jb250cm9sICpuZ0lmPVwiaXRlbS5UeXBlICE9PSAnYSdcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXBbaXRlbVsnaXNWaXNpYmxlRmllbGQnXV0gPyBpdGVtLkRpdkNsYXNzIDooKGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZSkgPyAgaXRlbS5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgICBbZmllbGRdPVwiaXRlbVwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImZvcm1cIiBpZD1cInt7aXRlbS5UeXBlfX0te3tpdGVtLk5hbWV9fVwiPjwvYXBwLXpmb3JtY29udHJvbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemJ1dHRvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemJ1dHRvbnMvemJ1dHRvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemJ1dHRvbnMvemJ1dHRvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFMUUsT0FBTyxFQUNMLGFBQWEsRUFDcUIsZUFBZSxFQUNyQyxnQkFBZ0IsR0FDN0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBUXRDLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBTXBELFlBQ1MsZ0JBQW1DLEVBQ2xDLFlBQTBCLEVBQzNCLGtCQUFzQztRQUU3QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUpqQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFSL0MsVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUN2QixhQUFRLEdBQWUsRUFBRSxDQUFDO1FBQzFCLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFDM0IsY0FBUyxHQUFHLEtBQUssQ0FBQztJQVFsQixDQUFDO0lBRUQsUUFB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QUFDLG1CQUFtQixFQUFFLENBQUM7UUFFdEQsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUU3QyxvRUFBb0U7UUFDcEUsTUFBTSxXQUFXLEdBQUc7WUFDbEIsSUFBSSxFQUFFLGFBQWE7WUFDbkIsTUFBTSxFQUFFLFlBQVksQ0FBQyxVQUFVO1lBQy9CLElBQUksRUFBRSxZQUFZO1lBQ2xCLFdBQVcsRUFBRSxlQUFlLENBQUMsTUFBTTtTQUNYLENBQUM7UUFFM0IsbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBRztZQUNoQyxZQUFZLEVBQUUsV0FBVztZQUN6QixXQUFXLEVBQUUsZUFBZSxDQUFDLE1BQU07U0FDcEMsQ0FBQztRQUVGLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQzs7OEdBdEpVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDJFQ3hCOUIsdWpJQXlEQTsyRkRqQ2EsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBCdXR0b25GaWVsZEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL2J1dHRvbmZpZWxkYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50VHlwZSxcclxuICBGaWVsZFNlcnZpY2UsIEZvbnRBd2VTb21lU2VydmljZSwgVHJpZ2dlckZyb21UeXBlLFxyXG4gIFpDb21wb25lbnQsIFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkZpZWxkLFxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtemJ1dHRvbnNcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3pidXR0b25zLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3pidXR0b25zLmNvbXBvbmVudC5zY3NzXCJdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgWmJ1dHRvbnNDb21wb25lbnQgZXh0ZW5kcyBCdXR0b25GaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG4gIGl0ZW1zOiBBcnJheTxhbnk+ID0gW107XHJcbiAgbGVmdEJ0bnM6IEFycmF5PGFueT4gPSBbXTtcclxuICByaWdodEJ0bnM6IEFycmF5PGFueT4gPSBbXTtcclxuICBGaXJzdFpidG4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHVibGljIGZvbnRBd2VTb21lU2VydmljZTogRm9udEF3ZVNvbWVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIuaW5pdENvbXBvbmVudCgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZEJ1dHRvbigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVjcmVtZW50Q29tcG9uZW50Q291bnRlckZvckZpZWxkKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkT2JCeUNvbXBvbmVudFR5cGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PSBDb21wb25lbnRUeXBlLmEpIHtcclxuICAgICAgcmV0dXJuIG9mKFt0aGlzLmRhdGFdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlR5cGUgPT0gQ29tcG9uZW50VHlwZS56YnV0dG9uc19jb250YWluZXIgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuVmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBvZih0aGlzLmRhdGEuVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKHRoaXMuZGF0YS5WYWx1ZSwgXCJGb3JtRmllbGRcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRCdXR0b24oKSB7XHJcbiAgICBsZXQgZmllbGQkID0gdGhpcy5nZXRGaWVsZE9iQnlDb21wb25lbnRUeXBlKCk7XHJcblxyXG4gICAgdGhpcy5ncm91cC56QnV0dG9uc0NvdW50Kys7XHJcbiAgICBpZiAodGhpcy5ncm91cC56QnV0dG9uc0NvdW50ID09PSAxKSB7XHJcbiAgICAgIHRoaXMuRmlyc3RaYnRuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBmaWVsZCQucGlwZShcclxuICAgICAgICB0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGlzLml0ZW1zID0gZGF0YTtcclxuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoYnV0dG9uOiBaRmllbGQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEJ1dHRvbkF0dHJpYnV0ZXMoYnV0dG9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKC4uLnRoaXMubGVmdEJ0bnMsIC4uLnRoaXMucmlnaHRCdG5zKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zbGF0ZUJ1dHRvbnNMYWJlbCh0aGlzLml0ZW1zKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcImVycm9yOiBcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEJ1dHRvbkF0dHJpYnV0ZXMoYnV0dG9uOiBaRmllbGQpIHtcclxuICAgIGxldCBjb21wOiBhbnkgPSBidXR0b247XHJcbiAgICBpZiAoYnV0dG9uLlR5cGUgPT0gJ2EnKSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGEuU3ViVHlwZSkge1xyXG4gICAgICAgIGJ1dHRvbi5OYW1lID0gdGhpcy5kYXRhLlN1YlR5cGUgKyAnXycgKyBidXR0b24uTmFtZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0QnV0dG9uTGFiZWwoYnV0dG9uKTtcclxuXHJcbiAgICAgIGxldCBidXR0b25EaXNhYmxlZCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAoYnV0dG9uWydEaXNhYmxlZCddICE9IFwiXCIgJiYgYnV0dG9uWydEaXNhYmxlZCddKSB7XHJcbiAgICAgICAgYnV0dG9uRGlzYWJsZWQgPSBidXR0b25bJ0Rpc2FibGVkJ10gPT09ICd0cnVlJyA/IHRydWUgOiBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgYnV0dG9uWydEaXNhYmxlZCddKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaXNVc2VDdXN0b21DbGFzcyA9IGJ1dHRvbi5Db2xvciA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgY29tcCA9IHtcclxuICAgICAgICBuYW1lOiBidXR0b24uTmFtZSxcclxuICAgICAgICB0ZXh0OiBsYWJlbCxcclxuICAgICAgICBzaG93TGFiZWw6IGJ1dHRvbi5TaG93TGFiZWwgPz8gdHJ1ZSxcclxuICAgICAgICBzdHlsZTogYnV0dG9uLlN0eWxlLFxyXG4gICAgICAgIGljb246IFpDb21wb25lbnRIZWxwZXIuZ2V0SWNvbihidXR0b24uSWNvbiBhcyBzdHJpbmcpLFxyXG4gICAgICAgIHZpc2libGU6IGJ1dHRvbi5WaXNpYmxlLFxyXG4gICAgICAgIGNvbG9yOiBpc1VzZUN1c3RvbUNsYXNzID8gJycgOiAoYnV0dG9uLkNvbG9yIHx8ICdwcmltYXJ5JyksXHJcbiAgICAgICAgZmlsbDogaXNVc2VDdXN0b21DbGFzcyA/ICcnIDogKGJ1dHRvblsnRmlsbCddIHx8ICdzb2xpZCcpLFxyXG4gICAgICAgIHNpemU6IGJ1dHRvbi5TaXplIHx8ICdkZWZhdWx0JyxcclxuICAgICAgICBjbGFzczogaXNVc2VDdXN0b21DbGFzcyA/IGAke2J1dHRvbi5DbGFzc30gdXNlQ3VzdG9tQ2xhc3NgIDogYnV0dG9uLkNsYXNzLFxyXG4gICAgICAgIGRpc2FibGVkOiBidXR0b25EaXNhYmxlZCxcclxuICAgICAgICBjbGlja0V2ZW50OiBidXR0b24uQ2xpY2tFdmVudCxcclxuICAgICAgICBpY29uTmFtZTogYnV0dG9uLkljb24sXHJcbiAgICAgICAgZGlzbWlzc1R5cGU6IGJ1dHRvbi5EaXNtaXNzVHlwZSxcclxuICAgICAgICBkaXNhYmxlVHJpZ2dlclRpbWVyOiBidXR0b24uRGlzYWJsZVRyaWdnZXJUaW1lcixcclxuICAgICAgICBkaXNhYmxlVHJpZ2dlcjogdGhpcy5nZXRCdXR0b25EaXNhYmxlVHJpZ2dlclZhbHVlKHRoaXMuZGF0YSwgYnV0dG9uKSxcclxuICAgICAgICBTdWJUeXBlOiB0aGlzLmRhdGEuU3ViVHlwZSxcclxuICAgICAgICBUeXBlOiBidXR0b24uVHlwZSxcclxuICAgICAgICBidXR0b25EYXRhOiBidXR0b24sXHJcbiAgICAgICAgZXZlbnRJZDogWkNvbXBvbmVudEhlbHBlci5nZW5lcmF0ZVRpbWVTdGFtcElkKClcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYnV0dG9uWydQb3NpdGlvblgnXSAmJiBidXR0b25bJ1Bvc2l0aW9uWCddID09PSBcInJpZ2h0XCIpIHtcclxuICAgICAgdGhpcy5yaWdodEJ0bnMucHVzaChjb21wKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmxlZnRCdG5zLnB1c2goY29tcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBidXR0b25DbGljayhpdGVtOiBhbnkpIHtcclxuICAgIC8vIFNldHMgdGhlIGlzVHJpZ2dlcmVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBkaXNhYmxlVHJpZ2dlciBwcm9wZXJ0eSBvZiB0aGUgaXRlbVxyXG4gICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IGl0ZW0uZGlzYWJsZVRyaWdnZXIgIT0gdW5kZWZpbmVkID8gIWl0ZW0uZGlzYWJsZVRyaWdnZXIgOiB0cnVlO1xyXG5cclxuICAgIC8vIElmIHRoZSBpc1RyaWdnZXJlZCBwcm9wZXJ0eSBpcyB0cnVlLCBwcm9jZWVkIHdpdGggdGhlIGZvbGxvd2luZyBhY3Rpb25zXHJcbiAgICBpZiAodGhpcy5ncm91cC5pc1RyaWdnZXJlZCkge1xyXG4gICAgICBjb25zdCBtZSA9IHRoaXMuZ3JvdXA7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgZGlzYWJsZVRyaWdnZXJUaW1lciBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgc2V0IGEgdGltZW91dCB0byByZXNldCBpc1RyaWdnZXJlZCB0byBmYWxzZSBhZnRlciA1MDBtc1xyXG4gICAgICBpZiAoIWl0ZW1bJ2Rpc2FibGVUcmlnZ2VyVGltZXInXSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgbWVbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjbG9uZSBvZiB0aGUgaXRlbSBvYmplY3RcclxuICAgIGNvbnN0IGNsb25lZEJ1dHRvbiA9IFpDb21wb25lbnRIZWxwZXIuZGVlcENsb25lKGl0ZW0pO1xyXG5cclxuICAgIC8vIENhbGwgYSBtZXRob2QgdG8gdXBkYXRlIHRoZSBldmVudCBJRCAoaW1wbGVtZW50YXRpb24gbm90IHByb3ZpZGVkKVxyXG4gICAgaXRlbS5ldmVudElkID0gWkNvbXBvbmVudEhlbHBlci5nZW5lcmF0ZVRpbWVTdGFtcElkKCk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBEaXNtaXNzVHlwZSBwcm9wZXJ0eSBvZiB0aGUgZ3JvdXAgdG8gdGhlIGRpc21pc3NUeXBlIHByb3BlcnR5IG9mIHRoZSBpdGVtXHJcbiAgICB0aGlzLmdyb3VwWydEaXNtaXNzVHlwZSddID0gaXRlbS5kaXNtaXNzVHlwZTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYW4gb3V0cHV0IGV2ZW50IG9iamVjdCB3aXRoIGRldGFpbHMgYWJvdXQgdGhlIGJ1dHRvbiBjbGlja1xyXG4gICAgY29uc3Qgb3V0cHV0RXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IFwiYnV0dG9uQ2xpY2tcIixcclxuICAgICAgdGFyZ2V0OiBjbG9uZWRCdXR0b24uY2xpY2tFdmVudCxcclxuICAgICAgZGF0YTogY2xvbmVkQnV0dG9uLFxyXG4gICAgICB0cmlnZ2VyRnJvbTogVHJpZ2dlckZyb21UeXBlLmJ1dHRvblxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQ7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBidXR0b25FdmVudERldGFpbCBwcm9wZXJ0eSBvZiB0aGUgZ3JvdXAgd2l0aCB0aGUgb3V0cHV0IGV2ZW50IGRldGFpbHNcclxuICAgIHRoaXMuZ3JvdXBbJ2J1dHRvbkV2ZW50RGV0YWlsJ10gPSB7XHJcbiAgICAgIGJ1dHRvbkRldGFpbDogb3V0cHV0RXZlbnQsXHJcbiAgICAgIHRyaWdnZXJGcm9tOiBUcmlnZ2VyRnJvbVR5cGUuYnV0dG9uXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIE5vdGlmeSBzdWJzY3JpYmVycyB3aXRoIHRoZSBvdXRwdXQgZXZlbnRcclxuICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KG91dHB1dEV2ZW50KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpICYmIGl0ZW1zLmxlbmd0aCA+IDBcIlxyXG4gIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlXCIgY2xhc3M9XCJlMXRhZy1zdHlsZVwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaW9uLW1hcmdpbi12ZXJ0aWNhbCBlMXRhZy1zdHlsZTFcIiAqbmdJZj1cImlzTW9iaWxlU2NyZWVuKCkgJiYgaXRlbXMubGVuZ3RoID4gMSAmJiBGaXJzdFpidG4gPT09IGZhbHNlXCJcclxuICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiPlxyXG4gICAgPGtlbmRvLWRyb3Bkb3duYnV0dG9uIFtkYXRhXT1cIml0ZW1zXCIgc2l6ZT1cImxhcmdlXCIgW2xvb2tdPVwiJ291dGxpbmUnXCJcclxuICAgICAgY2xhc3M9XCJpb24tYWN0aXZhdGFibGUgcmlwcGxlLXBhcmVudCBlMXRhZy1zdHlsZTJcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTJcIj5cclxuICAgICAgQWN0aW9uc1xyXG4gICAgICA8bmctdGVtcGxhdGUga2VuZG9Ecm9wRG93bkJ1dHRvbkl0ZW1UZW1wbGF0ZSBsZXQtZGF0YUl0ZW0+XHJcbiAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImstaWNvbiBrLWkte3sgZGF0YUl0ZW0uaWNvbiB9fVwiPjwvc3Bhbj4gLS0+XHJcbiAgICAgICAgPHNwYW4gKGNsaWNrKT1cImJ1dHRvbkNsaWNrKGRhdGFJdGVtKVwiPnt7IGRhdGFJdGVtLnRleHQgfX08L3NwYW4+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxpb24tcmlwcGxlLWVmZmVjdD48L2lvbi1yaXBwbGUtZWZmZWN0PlxyXG4gICAgPC9rZW5kby1kcm9wZG93bmJ1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMSBcIiBbbmdDbGFzc109XCJkYXRhLkRpdkNsYXNzXCIgY2xhc3M9XCJidG4tY29udGFpbmVyIGUxdGFnLXN0eWxlM1wiXHJcbiAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJidG4tbGVmdCBlMXRhZy1zdHlsZTRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsZWZ0QnRuczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxpb24tYnV0dG9uIFtmaWxsXT1cIml0ZW0uZmlsbFwiICpuZ0lmPVwiaXRlbS5UeXBlID09PSAnYSdcIiBbc2l6ZV09XCJpdGVtLnNpemVcIiBbY29sb3JdPVwiaXRlbS5jb2xvclwiIHN0cm9uZz1cInRydWVcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc1wiIChjbGljayk9XCJidXR0b25DbGljayhpdGVtKVwiIFtoaWRkZW5dPVwiIWlzQnRuVmlzaWJsZShpdGVtLnZpc2libGUpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5pc1RyaWdnZXJlZCB8fCBpdGVtLmRpc2FibGVkXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU1ICsgJyAnICsgaXRlbS5zdHlsZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlNVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250ZW50LWNvbnRhaW5lciBlMXRhZy1zdHlsZThcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZThcIj5cclxuICAgICAgICAgICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvbiBlMXRhZy1zdHlsZTlcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTlcIiAqbmdJZj1cIml0ZW0uaWNvblwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoaXRlbS5pY29uLCBmb250QXdlU29tZVNlcnZpY2UpXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlvbi10ZXh0LWNhcGl0YWxpemUgZTF0YWctc3R5bGUxMFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMTBcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50ZXh0ICYmIGl0ZW0uc2hvd0xhYmVsXCIgW2NsYXNzLmJ0bi1sYWJlbF09XCJpdGVtLmljb25cIj57e2l0ZW0udGV4dH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDxhcHAtemZvcm1jb250cm9sICpuZ0lmPVwiaXRlbS5UeXBlICE9PSAnYSdcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXBbaXRlbVsnaXNWaXNpYmxlRmllbGQnXV0gPyBpdGVtLkRpdkNsYXNzIDooKGl0ZW0uVmlzaWJsZSA9PT0gdHJ1ZSkgPyAgaXRlbS5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgICBbZmllbGRdPVwiaXRlbVwiIFtncm91cF09XCJncm91cFwiIFtmb3JtXT1cImZvcm1cIiBpZD1cInt7aXRlbS5UeXBlfX0te3tpdGVtLk5hbWV9fVwiPjwvYXBwLXpmb3JtY29udHJvbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJidG4tcmlnaHQgZTF0YWctc3R5bGU2XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU2XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcmlnaHRCdG5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJpdGVtLlR5cGUgPT09ICdhJ1wiIFtmaWxsXT1cIml0ZW0uZmlsbFwiIFtzaXplXT1cIml0ZW0uc2l6ZVwiIFtjb2xvcl09XCJpdGVtLmNvbG9yXCIgc3Ryb25nPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJpdGVtLmNsYXNzXCIgKGNsaWNrKT1cImJ1dHRvbkNsaWNrKGl0ZW0pXCIgW2hpZGRlbl09XCIhaXNCdG5WaXNpYmxlKGl0ZW0udmlzaWJsZSlcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwLmlzVHJpZ2dlcmVkIHx8IGl0ZW0uZGlzYWJsZWRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTcgKyAnICcgKyBpdGVtLnN0eWxlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZTF0YWctc3R5bGU3XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRlbnQtY29udGFpbmVyIGUxdGFnLXN0eWxlOFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlOFwiPlxyXG4gICAgICAgICAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uIGUxdGFnLXN0eWxlOVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlOVwiICpuZ0lmPVwiaXRlbS5pY29uXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJnZXRGb250QXdlc29tZShpdGVtLmljb24sIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW9uLXRleHQtY2FwaXRhbGl6ZSBlMXRhZy1zdHlsZTEwXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxMFwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnRleHQgJiYgaXRlbS5zaG93TGFiZWxcIiBbY2xhc3MuYnRuLWxhYmVsXT1cIml0ZW0uaWNvblwiPnt7aXRlbS50ZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgPGFwcC16Zm9ybWNvbnRyb2wgKm5nSWY9XCJpdGVtLlR5cGUgIT09ICdhJ1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJncm91cFtpdGVtWydpc1Zpc2libGVGaWVsZCddXSA/IGl0ZW0uRGl2Q2xhc3MgOigoaXRlbS5WaXNpYmxlID09PSB0cnVlKSA/ICBpdGVtLkRpdkNsYXNzIDogJ2ZsZXgtaGlkZScpXCJcclxuICAgICAgICAgIFtmaWVsZF09XCJpdGVtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiIGlkPVwie3tpdGVtLlR5cGV9fS17e2l0ZW0uTmFtZX19XCI+PC9hcHAtemZvcm1jb250cm9sPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19