barsa-calendar 1.0.423 → 1.0.424

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.
@@ -11,10 +11,11 @@ import * as i4 from "@angular/forms";
11
11
  import * as i5 from "@fundamental-ngx/core/bar";
12
12
  import * as i6 from "@fundamental-ngx/core/button";
13
13
  import * as i7 from "@fundamental-ngx/core/input-group";
14
- import * as i8 from "@fundamental-ngx/core/popover";
15
- import * as i9 from "@fundamental-ngx/core/time";
16
- import * as i10 from "@fundamental-ngx/core/toolbar";
17
- import * as i11 from "../calendar-month/calendar-month.component";
14
+ import * as i8 from "@fundamental-ngx/core/dialog";
15
+ import * as i9 from "@fundamental-ngx/core/popover";
16
+ import * as i10 from "@fundamental-ngx/core/time";
17
+ import * as i11 from "@fundamental-ngx/core/toolbar";
18
+ import * as i12 from "../calendar-month/calendar-month.component";
18
19
  export class TimeConfigI18n {
19
20
  constructor(_bbbTranslate) {
20
21
  this._bbbTranslate = _bbbTranslate;
@@ -50,11 +51,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImpor
50
51
  type: Injectable
51
52
  }], ctorParameters: function () { return [{ type: i1.BbbTranslatePipe }]; } });
52
53
  export class DateTimePickerComponent extends BaseComponent {
53
- constructor(_datetimeAdapter, _dateTimeToCaption, _logService, _portalService) {
54
+ constructor(_datetimeAdapter, _dateTimeToCaption, _logService, _dialogService, _portalService) {
54
55
  super();
55
56
  this._datetimeAdapter = _datetimeAdapter;
56
57
  this._dateTimeToCaption = _dateTimeToCaption;
57
58
  this._logService = _logService;
59
+ this._dialogService = _dialogService;
58
60
  this.rtl = true;
59
61
  this.rangeChange = new EventEmitter();
60
62
  this.valueChange = new EventEmitter();
@@ -128,13 +130,19 @@ export class DateTimePickerComponent extends BaseComponent {
128
130
  }
129
131
  }
130
132
  }
131
- onOpenPopover(popover) {
133
+ onOpenPopover(popover, dialogTemplate) {
132
134
  if (this.readonly || this.disabled) {
133
135
  return;
134
136
  }
135
137
  if (this.timeComponent) {
136
138
  setTimeout(() => this.timeComponent.refreshColumns(), 0);
137
139
  }
140
+ if (this.deviceSize === 's' || this.isMobile) {
141
+ this._dialogService.open(dialogTemplate, {
142
+ mobile: true
143
+ });
144
+ return;
145
+ }
138
146
  popover.open();
139
147
  }
140
148
  onMonthSelected(monthName, index) {
@@ -203,13 +211,13 @@ export class DateTimePickerComponent extends BaseComponent {
203
211
  }
204
212
  this._calendarService.gotoToday();
205
213
  }
206
- onDayClick(day, popover) {
214
+ onDayClick(day, popover, dialog) {
207
215
  this.isValid = true;
208
216
  this.startSelectedDay = this.endSelectedDay = day;
209
217
  if (this.showTime) {
210
218
  return;
211
219
  }
212
- this._setFirstAndEndDay(day, popover);
220
+ this._setFirstAndEndDay(day, popover, dialog);
213
221
  }
214
222
  onPopoverOpenChange(isOpen) {
215
223
  if (isOpen) {
@@ -219,25 +227,40 @@ export class DateTimePickerComponent extends BaseComponent {
219
227
  this._lastValue = undefined;
220
228
  }
221
229
  }
222
- onClear(popover) {
223
- popover.close();
230
+ onClear(popover, dialog) {
231
+ if (dialog) {
232
+ dialog.dismiss();
233
+ }
234
+ else {
235
+ popover.close();
236
+ }
224
237
  this.value = undefined;
225
238
  this._setFormattedDateToInput(this.value);
226
239
  this._raisValueChanged(this.value);
227
240
  }
228
- onOk(popover) {
229
- popover.close();
241
+ onOk(popover, dialog) {
242
+ if (dialog) {
243
+ dialog.dismiss();
244
+ }
245
+ else {
246
+ popover.close();
247
+ }
230
248
  if (!this.value) {
231
249
  this.value = new Date();
232
250
  }
233
251
  this._handleValueChange();
234
252
  }
235
- onCancel(popover) {
253
+ onCancel(popover, dialog) {
236
254
  if (this._lastValue !== this.value) {
237
255
  this.value = this._lastValue;
238
256
  this._setCaption(this.value);
239
257
  }
240
- popover.close();
258
+ if (dialog) {
259
+ dialog.dismiss();
260
+ }
261
+ else {
262
+ popover.close();
263
+ }
241
264
  }
242
265
  _setFormattedDateToInput(date) {
243
266
  if (date) {
@@ -287,7 +310,10 @@ export class DateTimePickerComponent extends BaseComponent {
287
310
  }
288
311
  this.valueChange.emit(date);
289
312
  }
290
- _setFirstAndEndDay(day, popover) {
313
+ _setFirstAndEndDay(day, popover, dialog) {
314
+ if (dialog) {
315
+ dialog.dismiss();
316
+ }
291
317
  if (popover) {
292
318
  popover.close();
293
319
  }
@@ -315,8 +341,8 @@ export class DateTimePickerComponent extends BaseComponent {
315
341
  }
316
342
  }
317
343
  }
318
- DateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i2.DatetimeAdapter }, { token: i1.DateTimeToCaptionPipe }, { token: i1.LogService }, { token: i1.PortalService }], target: i0.ɵɵFactoryTarget.Component });
319
- DateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: DateTimePickerComponent, selector: "bc-date-time-picker", inputs: { placeholder: "placeholder", primaryCalendarType: "primaryCalendarType", formatPattern: "formatPattern", value: "value", timeValue: "timeValue", startRangeDate: "startRangeDate", endRangeDate: "endRangeDate", isRangePicker: "isRangePicker", showTime: "showTime", showDate: "showDate", rtl: "rtl", readonly: "readonly", disabled: "disabled", buttonMenuMode: "buttonMenuMode" }, outputs: { rangeChange: "rangeChange", valueChange: "valueChange" }, providers: [
344
+ DateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i2.DatetimeAdapter }, { token: i1.DateTimeToCaptionPipe }, { token: i1.LogService }, { token: i2.DialogService }, { token: i1.PortalService }], target: i0.ɵɵFactoryTarget.Component });
345
+ DateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: DateTimePickerComponent, selector: "bc-date-time-picker", inputs: { placeholder: "placeholder", primaryCalendarType: "primaryCalendarType", formatPattern: "formatPattern", value: "value", timeValue: "timeValue", startRangeDate: "startRangeDate", endRangeDate: "endRangeDate", isRangePicker: "isRangePicker", showTime: "showTime", showDate: "showDate", rtl: "rtl", deviceSize: "deviceSize", isMobile: "isMobile", readonly: "readonly", disabled: "disabled", buttonMenuMode: "buttonMenuMode" }, outputs: { rangeChange: "rangeChange", valueChange: "valueChange" }, providers: [
320
346
  {
321
347
  provide: DatetimeAdapter,
322
348
  useClass: FdDatetimeAdapter
@@ -330,7 +356,7 @@ DateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
330
356
  useFactory: getDateService
331
357
  },
332
358
  CalendarService
333
- ], viewQueries: [{ propertyName: "timeComponent", first: true, predicate: TimeComponent, descendants: true }, { propertyName: "inputGroupComponent", first: true, predicate: InputGroupComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n [placeholder]=\"placeholder\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n (addOnButtonClicked)=\"onOpenPopover(popover)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode ? 'inherit' : 'none'\"\n>\n</fd-input-group>\n<button\n *ngIf=\"buttonMenuMode\"\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n<fd-popover\n #popover\n (isOpenChange)=\"onPopoverOpenChange($event)\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"true\"\n [mobile]=\"(deviceSize$ | async) === 's'\"\n>\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize$ | async,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer *ngIf=\"showTime\">\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-left *ngIf=\"rtl\">\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n <div fd-bar-right *ngIf=\"!rtl\">\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template #footerButtons>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover)\"></fd-button-bar>\n <fd-button-bar [label]=\"'Clear' | bbbTranslate\" fdType=\"standard\" (click)=\"onClear(popover)\"></fd-button-bar>\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n>\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n <div class=\"month-years-wrapper\" *ngIf=\"showDate\" fd-title fd-toolbar-item>\n <button\n *ngIf=\"selectionMode === 'day' || selectionMode === 'month'\"\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n </fd-toolbar>\n <div style=\"display: flex\">\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"'month'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 33%\"\n *ngFor=\"let month of months; let i = index\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 25%\"\n *ngFor=\"let year of years\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n </div>\n </ng-container>\n <div *ngSwitchDefault style=\"display: flex\">\n <bc-calendar-month\n *ngIf=\"showDate\"\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover)\"\n ></bc-calendar-month>\n <div class=\"seperator\"></div>\n <fd-time *ngIf=\"showTime\" [(ngModel)]=\"timeValue\" [displaySeconds]=\"false\"></fd-time>\n </div>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.MobileDirective, selector: "[mobile]" }, { kind: "component", type: i5.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i5.BarLeftDirective, selector: "[fd-bar-left]" }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabel", "ariaLabelledby", "id"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i7.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "component", type: i8.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "directive", type: i8.PopoverBodyFooterDirective, selector: "[fdPopoverBodyFooter], [fd-popover-body-footer]" }, { kind: "component", type: i8.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i9.TimeComponent, selector: "fd-time", inputs: ["meridian", "validate", "keepTwoDigits", "disabled", "displaySeconds", "displayMinutes", "displayHours", "tablet", "elementsAtOnce", "time", "spinnerButtons"] }, { kind: "component", type: i10.ToolbarComponent, selector: "fd-toolbar", inputs: ["class", "shouldOverflow", "fdType", "hasTitle", "title", "active", "clearBorder", "forceOverflow", "tabindex"] }, { kind: "directive", type: i10.ToolbarItemDirective, selector: "[fd-toolbar-item]" }, { kind: "component", type: i11.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
359
+ ], viewQueries: [{ propertyName: "timeComponent", first: true, predicate: TimeComponent, descendants: true }, { propertyName: "inputGroupComponent", first: true, predicate: InputGroupComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n [placeholder]=\"placeholder\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode ? 'inherit' : 'none'\"\n>\n</fd-input-group>\n<button\n *ngIf=\"buttonMenuMode\"\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n <div class=\"month-years-wrapper\" *ngIf=\"showDate\" fd-title fd-toolbar-item>\n <button\n *ngIf=\"selectionMode === 'day' || selectionMode === 'month'\"\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n </fd-toolbar>\n <div style=\"display: flex\">\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"'month'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 33%\"\n *ngFor=\"let month of months; let i = index\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 25%\"\n *ngFor=\"let year of years\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n </div>\n </ng-container>\n <div *ngSwitchDefault style=\"display: flex\">\n <bc-calendar-month\n *ngIf=\"showDate\"\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n <div class=\"seperator\"></div>\n <fd-time *ngIf=\"showTime\" [(ngModel)]=\"timeValue\" [displaySeconds]=\"false\"></fd-time>\n </div>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabel", "ariaLabelledby", "id"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i7.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "component", type: i8.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i8.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i8.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i9.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "directive", type: i9.PopoverBodyFooterDirective, selector: "[fdPopoverBodyFooter], [fd-popover-body-footer]" }, { kind: "component", type: i9.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i10.TimeComponent, selector: "fd-time", inputs: ["meridian", "validate", "keepTwoDigits", "disabled", "displaySeconds", "displayMinutes", "displayHours", "tablet", "elementsAtOnce", "time", "spinnerButtons"] }, { kind: "component", type: i11.ToolbarComponent, selector: "fd-toolbar", inputs: ["class", "shouldOverflow", "fdType", "hasTitle", "title", "active", "clearBorder", "forceOverflow", "tabindex"] }, { kind: "directive", type: i11.ToolbarItemDirective, selector: "[fd-toolbar-item]" }, { kind: "component", type: i12.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
334
360
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: DateTimePickerComponent, decorators: [{
335
361
  type: Component,
336
362
  args: [{ selector: 'bc-date-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
@@ -347,8 +373,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImpor
347
373
  useFactory: getDateService
348
374
  },
349
375
  CalendarService
350
- ], template: "<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n [placeholder]=\"placeholder\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n (addOnButtonClicked)=\"onOpenPopover(popover)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode ? 'inherit' : 'none'\"\n>\n</fd-input-group>\n<button\n *ngIf=\"buttonMenuMode\"\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n<fd-popover\n #popover\n (isOpenChange)=\"onPopoverOpenChange($event)\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"true\"\n [mobile]=\"(deviceSize$ | async) === 's'\"\n>\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize$ | async,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer *ngIf=\"showTime\">\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-left *ngIf=\"rtl\">\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n <div fd-bar-right *ngIf=\"!rtl\">\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template #footerButtons>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover)\"></fd-button-bar>\n <fd-button-bar [label]=\"'Clear' | bbbTranslate\" fdType=\"standard\" (click)=\"onClear(popover)\"></fd-button-bar>\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n>\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n <div class=\"month-years-wrapper\" *ngIf=\"showDate\" fd-title fd-toolbar-item>\n <button\n *ngIf=\"selectionMode === 'day' || selectionMode === 'month'\"\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n </fd-toolbar>\n <div style=\"display: flex\">\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"'month'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 33%\"\n *ngFor=\"let month of months; let i = index\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 25%\"\n *ngFor=\"let year of years\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n </div>\n </ng-container>\n <div *ngSwitchDefault style=\"display: flex\">\n <bc-calendar-month\n *ngIf=\"showDate\"\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover)\"\n ></bc-calendar-month>\n <div class=\"seperator\"></div>\n <fd-time *ngIf=\"showTime\" [(ngModel)]=\"timeValue\" [displaySeconds]=\"false\"></fd-time>\n </div>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"] }]
351
- }], ctorParameters: function () { return [{ type: i2.DatetimeAdapter }, { type: i1.DateTimeToCaptionPipe }, { type: i1.LogService }, { type: i1.PortalService }]; }, propDecorators: { placeholder: [{
376
+ ], template: "<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n [placeholder]=\"placeholder\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode ? 'inherit' : 'none'\"\n>\n</fd-input-group>\n<button\n *ngIf=\"buttonMenuMode\"\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n <button\n *ngIf=\"showDate\"\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n <div class=\"month-years-wrapper\" *ngIf=\"showDate\" fd-title fd-toolbar-item>\n <button\n *ngIf=\"selectionMode === 'day' || selectionMode === 'month'\"\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n </fd-toolbar>\n <div style=\"display: flex\">\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"'month'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 33%\"\n *ngFor=\"let month of months; let i = index\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 25%\"\n *ngFor=\"let year of years\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n </div>\n </ng-container>\n <div *ngSwitchDefault style=\"display: flex\">\n <bc-calendar-month\n *ngIf=\"showDate\"\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n <div class=\"seperator\"></div>\n <fd-time *ngIf=\"showTime\" [(ngModel)]=\"timeValue\" [displaySeconds]=\"false\"></fd-time>\n </div>\n </ng-container>\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"] }]
377
+ }], ctorParameters: function () { return [{ type: i2.DatetimeAdapter }, { type: i1.DateTimeToCaptionPipe }, { type: i1.LogService }, { type: i2.DialogService }, { type: i1.PortalService }]; }, propDecorators: { placeholder: [{
352
378
  type: Input
353
379
  }], primaryCalendarType: [{
354
380
  type: Input
@@ -370,6 +396,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImpor
370
396
  type: Input
371
397
  }], rtl: [{
372
398
  type: Input
399
+ }], deviceSize: [{
400
+ type: Input
401
+ }], isMobile: [{
402
+ type: Input
373
403
  }], readonly: [{
374
404
  type: Input
375
405
  }], disabled: [{
@@ -387,4 +417,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImpor
387
417
  type: ViewChild,
388
418
  args: [InputGroupComponent, { static: true }]
389
419
  }] } });
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0gsYUFBYSxFQUViLFdBQVcsRUFDWCxjQUFjLEVBR2QsUUFBUSxFQUVYLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDSCxlQUFlLEVBQ2YsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLFFBQVEsRUFDWCxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBRS9CLE1BQU0sT0FBTyxjQUFjO0lBb0N2QixZQUFvQixhQUErQjtRQUEvQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFuQ25ELGlEQUFpRDtRQUNqRCx1QkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUV0QyxtQ0FBbUM7UUFDbkMsZUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5ELGlEQUFpRDtRQUNqRCx1QkFBa0IsR0FBRyxn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O2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDbUIsYUFBYTtzQkFBdEMsU0FBUzt1QkFBQyxhQUFhO2dCQUMwQixtQkFBbUI7c0JBQXBFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdGFibGUsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEJhc2VDb21wb25lbnQsXG4gICAgQmJiVHJhbnNsYXRlUGlwZSxcbiAgICBEYXRlU2VydmljZSxcbiAgICBnZXREYXRlU2VydmljZSxcbiAgICBMb2dTZXJ2aWNlLFxuICAgIFBvcnRhbFNlcnZpY2UsXG4gICAgQmFyc2FBcGksXG4gICAgRGF0ZVRpbWVUb0NhcHRpb25QaXBlXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyTW9udGhJbmZvLCBEYXkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIERhdGV0aW1lQWRhcHRlcixcbiAgICBGZERhdGUsXG4gICAgRmREYXRldGltZUFkYXB0ZXIsXG4gICAgSW5wdXRHcm91cENvbXBvbmVudCxcbiAgICBUaW1lQ29tcG9uZW50LFxuICAgIFRpbWVJMThuXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZUNvbmZpZ0kxOG4ge1xuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIGhvdXJzJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZUhvdXJzTGFiZWwgPSAnSW5jcmVhc2UgaG91cnMnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ2hvdXJzJyBjb2x1bW4gKi9cbiAgICBob3Vyc0xhYmVsID0gdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnSG91cnMnKTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIGhvdXJzJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZUhvdXJzTGFiZWwgPSAnRGVjcmVhc2UgaG91cnMnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2UgbWludXRlcycgYnV0dG9uICovXG4gICAgaW5jcmVhc2VNaW51dGVzTGFiZWwgPSAnSW5jcmVhc2UgbWludXRlcyc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAnbWludXRlcycgY29sdW1uICovXG4gICAgbWludXRlc0xhYmVsID0gdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnTWludXRlcycpO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2UgbWludXRlcycgYnV0dG9uICovXG4gICAgZGVjcmVhc2VNaW51dGVzTGFiZWwgPSAnRGVjcmVhc2UgbWludXRlcyc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBzZWNvbmRzJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZVNlY29uZHNMYWJlbCA9ICdJbmNyZWFzZSBzZWNvbmRzJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdzZWNvbmRzJyBjb2x1bW4gKi9cbiAgICBzZWNvbmRzTGFiZWwgPSB0aGlzLl9iYmJUcmFuc2xhdGUudHJhbnNmb3JtKCdTZWMnKTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIHNlY29uZHMnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlU2Vjb25kc0xhYmVsID0gJ0RlY3JlYXNlIHNlY29uZHMnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2UgcGVyaW9kJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZVBlcmlvZExhYmVsID0gJ0luY3JlYXNlIHBlcmlvZCc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAncGVyaW9kJyBjb2x1bW4gKi9cbiAgICBwZXJpb2RMYWJlbCA9ICdQZXJpb2QnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2UgcGVyaW9kJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZVBlcmlvZExhYmVsID0gJ0RlY3JlYXNlIHBlcmlvZCc7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmJiVHJhbnNsYXRlOiBCYmJUcmFuc2xhdGVQaXBlKSB7fVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2JjLWRhdGUtdGltZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IERhdGV0aW1lQWRhcHRlcixcbiAgICAgICAgICAgIHVzZUNsYXNzOiBGZERhdGV0aW1lQWRhcHRlclxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUaW1lSTE4bixcbiAgICAgICAgICAgIHVzZUNsYXNzOiBUaW1lQ29uZmlnSTE4blxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRlU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldERhdGVTZXJ2aWNlXG4gICAgICAgIH0sXG4gICAgICAgIENhbGVuZGFyU2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHJpbWFyeUNhbGVuZGFyVHlwZTogJ0dyZWdvcmlhbicgfCAnUGVyc2lhbicgfCBzdHJpbmc7XG4gICAgQElucHV0KCkgZm9ybWF0UGF0dGVybjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIHRpbWVWYWx1ZTogRmREYXRlO1xuICAgIEBJbnB1dCgpIHN0YXJ0UmFuZ2VEYXRlOiBEYXRlO1xuICAgIEBJbnB1dCgpIGVuZFJhbmdlRGF0ZTogRGF0ZTtcbiAgICBASW5wdXQoKSBpc1JhbmdlUGlja2VyOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dUaW1lOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dEYXRlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJ0bCA9IHRydWU7XG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYnV0dG9uTWVudU1vZGU6IGJvb2xlYW47XG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0RGF5OiBEYXRlOyBlbmREYXk6IERhdGUgfT4oKTtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gICAgQFZpZXdDaGlsZChUaW1lQ29tcG9uZW50KSB0aW1lQ29tcG9uZW50OiBUaW1lQ29tcG9uZW50PEZkRGF0ZT47XG4gICAgQFZpZXdDaGlsZChJbnB1dEdyb3VwQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dEdyb3VwQ29tcG9uZW50OiBJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgIHZhbHVlQ2FwdGlvbiA9ICcnO1xuICAgIGVuZFNlbGVjdGVkRGF5OiBEYXkgfCBudWxsO1xuICAgIHN0YXJ0U2VsZWN0ZWREYXk6IERheSB8IG51bGw7XG4gICAgdmFsdWVEYXk6IERheSB8IG51bGw7XG5cbiAgICBzZWxlY3Rpb25Nb2RlOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF5JztcbiAgICB0b2RheUluZGV4ID0gLTE7XG4gICAgd2lkdGgkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRNb250aCQ6IE9ic2VydmFibGU8Q2FsZW5kYXJNb250aEluZm8+O1xuICAgIHJ0bCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgdG9kYXk6IERhdGU7XG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBkZXZpY2VTaXplJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgIGN1bHR1cmU6IHN0cmluZztcbiAgICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gICAgeWVhcnM6IHN0cmluZ1tdO1xuICAgIHRlbXBGb3JtbWF0ZWREYXRlID0gJyc7XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBfbGFzdFZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2RhdGV0aW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEZkRGF0ZT4sXG4gICAgICAgIHByaXZhdGUgX2RhdGVUaW1lVG9DYXB0aW9uOiBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgICAgIHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5ydGwkID0gX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy53aWR0aCQgPSBfcG9ydGFsU2VydmljZS5kZXZpY2VTaXplJC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1hcCgoZGV2aWNlU2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93RGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjYwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRldmljZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hsJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1NjA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyMDtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1MjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmhlaWdodCA9IDQyMDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgbGV0IGN1bHR1cmUgPSAnZW4tVVMnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJpbWFyeUNhbGVuZGFyVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSGlqcmlTaGFtc2knOlxuICAgICAgICAgICAgICAgIGN1bHR1cmUgPSAnZmEtSVInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VsdHVyZSA9IGN1bHR1cmU7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZSA9IG5ldyBDYWxlbmRhclNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgY3VsdHVyZSk7XG4gICAgICAgIHRoaXMud2Vla0RheXNNaW4gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla0RheXNNaW4oKTtcbiAgICAgICAgdGhpcy53ZWVrRGF5cyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5cygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTW9udGgkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNlbGVjdGVkJDtcbiAgICAgICAgdGhpcy50b2RheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUgPSBGZERhdGUuZ2V0RmREYXRlQnlEYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTW9udGhCeURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IEZkRGF0ZS5nZXRGZERhdGVCeURhdGUobmV3IERhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuaXNSYW5nZVBpY2tlcikge1xuICAgICAgICAvLyAgIGlmICh0aGlzLnN0YXJ0UmFuZ2VEYXRlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE1vbnRoQnlEYXRlKHRoaXMuc3RhcnRSYW5nZURhdGUpO1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gICBpZiAodGhpcy5lbmRSYW5nZURhdGUpIHtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWRNb250aEJ5RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLm1vbnRocyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5Nb250aHM7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXIpO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50LnJlZ2lzdGVyT25DaGFuZ2UodGhpcy5vbkNhcHRpb25DaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY2hhbmdlcztcbiAgICAgICAgaWYgKHZhbHVlICYmICF2YWx1ZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgY2FwdGlvbiA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUodmFsdWUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICE9PSB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQ/LmlucHV0VGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PcGVuUG9wb3Zlcihwb3BvdmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGltZUNvbXBvbmVudC5yZWZyZXNoQ29sdW1ucygpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uQ2FwdGlvbkNoYW5nZWQoZSk6IHZvaWQge1xuICAgICAgICBpZiAoZS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2xpc2hEYXRlU3RyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUZhVG9BckNoYXJjaHRlcihlKTtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdqWVlZWS9qTS9qRCc7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICBmb3JtYXQgKz0gJyBISDptbSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9tZW50ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5zdHJpbmdUb01vbWVudChlbmdsaXNoRGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IG1vbWVudC5pc1ZhbGlkKCk7Ly8g2KjYsdin24wg2LTZhdiz24wg2YfZhduM2LTZhyBmYWxzZSDZhti02YjZhiDZhduM2K/Zh1xuICAgICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZShlbmdsaXNoRGF0ZVN0cikpKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50LnRvRGF0ZSgpO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gdGhpcy5fZGF0ZXRpbWVBZGFwdGVyLnNldFRpbWUoXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSxcbiAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZpb3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzWzBdKSAtIDIwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0WWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IHRoaXMuX2RhdGV0aW1lQWRhcHRlci5zZXRUaW1lKFxuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUsXG4gICAgICAgICAgICB0b2RheS5nZXRIb3VycygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0U2Vjb25kcygpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheURheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IERheSwgcG9wb3Zlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVmFsaWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSB0aGlzLmVuZFNlbGVjdGVkRGF5ID0gZGF5O1xuICAgICAgICBpZiAodGhpcy5zaG93VGltZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEZpcnN0QW5kRW5kRGF5KGRheSwgcG9wb3Zlcik7XG4gICAgfVxuXG4gICAgb25Qb3BvdmVyT3BlbkNoYW5nZShpc09wZW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkNsZWFyKHBvcG92ZXIpOiB2b2lkIHtcbiAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgb25Payhwb3BvdmVyKTogdm9pZCB7XG4gICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcblxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG9uQ2FuY2VsKHBvcG92ZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RWYWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldENhcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRhdGU6IERhdGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLl9nZXRGb3JtYXR0ZWREYXRlKGRhdGUpO1xuICAgICAgICAgICAgdGhpcy50ZW1wRm9ybW1hdGVkRGF0ZSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQ/LndyaXRlVmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZW1wRm9ybW1hdGVkRGF0ZSA9ICcnO1xuICAgICAgICB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQ/LndyaXRlVmFsdWUoJycpO1xuICAgIH1cbiAgICBwcml2YXRlIF9nZXRGb3JtYXR0ZWREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVUb0NhcHRpb24udHJhbnNmb3JtKGRhdGUsIHRoaXMuZm9ybWF0UGF0dGVybiwgdGhpcy5jdWx0dXJlLCB0aGlzLnNob3dEYXRlLCB0aGlzLnNob3dUaW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc2hvd0RhdGUgPyB0aGlzLnN0YXJ0U2VsZWN0ZWREYXk/LmRhdGUgPz8gdGhpcy52YWx1ZSA6IG5ldyBEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3IERhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldEhvdXJzKHRoaXMudGltZVZhbHVlLmhvdXIpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXRNaW51dGVzKHRoaXMudGltZVZhbHVlLm1pbnV0ZSk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldFNlY29uZHModGhpcy50aW1lVmFsdWUuc2Vjb25kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcHJlcGFyZVllYXIoZnJvbTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHllYXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcbiAgICAgICAgICAgIHllYXJzLnB1c2goYCR7ZnJvbSArIGl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy55ZWFycyA9IHllYXJzO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRDYXB0aW9uKHZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDYXB0aW9uID0gJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvcm1hdFBhdHRlcm4gPSB0aGlzLmZvcm1hdFBhdHRlcm4ucmVwbGFjZSgnWVlZWScsICdqWVlZWScpO1xuICAgICAgICBmb3JtYXRQYXR0ZXJuID0gZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdNTScsICdqTU0nKTtcbiAgICAgICAgZm9ybWF0UGF0dGVybiA9IGZvcm1hdFBhdHRlcm4ucmVwbGFjZSgnREQnLCAnakREJyk7XG4gICAgICAgIHRoaXMudmFsdWVDYXB0aW9uID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5nZXRNb21lbnQodmFsdWUpLmZvcm1hdChmb3JtYXRQYXR0ZXJuKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcmFpc1ZhbHVlQ2hhbmdlZChkYXRlLCBzZXRDYXB0aW9uID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gZGF0ZTtcbiAgICAgICAgaWYgKHNldENhcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENhcHRpb24oZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEZpcnN0QW5kRW5kRGF5KGRheTogRGF5LCBwb3BvdmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gdGhpcy5lbmRTZWxlY3RlZERheS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheTtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LmRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGZkLWlucHV0LWdyb3VwXG4gICAgcGxhY2VtZW50PVwiYWZ0ZXJcIlxuICAgIGdseXBoPVwiY2FsZW5kYXJcIlxuICAgIGdseXBoQXJpYUxhYmVsPVwic2VsZWN0IGRheVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBhcmlhTGFiZWxsZWRCeT1cImZkLWlucHV0LWdyb3VwLWljb24tbGFiZWwtMlwiXG4gICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICBbc3RhdGVdPVwiaXNWYWxpZCA/ICdzdWNjZXNzJyA6ICdlcnJvcidcIlxuICAgIFtzaG93Rm9jdXNdPVwidHJ1ZVwiXG4gICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJvbk9wZW5Qb3BvdmVyKHBvcG92ZXIpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiIWJ1dHRvbk1lbnVNb2RlID8gJ2luaGVyaXQnIDogJ25vbmUnXCJcbj5cbjwvZmQtaW5wdXQtZ3JvdXA+XG48YnV0dG9uXG4gICAgKm5nSWY9XCJidXR0b25NZW51TW9kZVwiXG4gICAgZmQtYnV0dG9uXG4gICAgW2xhYmVsXT1cInRlbXBGb3JtbWF0ZWREYXRlIHx8IHBsYWNlaG9sZGVyXCJcbiAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmZFR5cGVdPVwidmFsdWUgPyAnc3RhbmRhcmQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgW2ZkTWVudV09XCJ0cnVlXCJcbiAgICAoY2xpY2spPVwib25PcGVuUG9wb3Zlcihwb3BvdmVyKVwiXG4gICAgW2NsYXNzLnBsYWNlaG9sZGVyLWN1c3RvbV09XCIhdmFsdWVcIlxuICAgIGNsYXNzPVwibWVudS1idXR0b24tZGF0ZXBpY2tlclwiXG4+PC9idXR0b24+XG48ZmQtcG9wb3ZlclxuICAgICNwb3BvdmVyXG4gICAgKGlzT3BlbkNoYW5nZSk9XCJvblBvcG92ZXJPcGVuQ2hhbmdlKCRldmVudClcIlxuICAgIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiXG4gICAgW2ZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiXG4gICAgW21vYmlsZV09XCIoZGV2aWNlU2l6ZSQgfCBhc3luYykgPT09ICdzJ1wiXG4+XG4gICAgPGZkLXBvcG92ZXItYm9keSBbc3R5bGUud2lkdGgucHhdPVwid2lkdGgkIHwgYXN5bmNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBtb250aDtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogc2VsZWN0ZWRNb250aCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgcnRsOiBydGwkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla0RheXNNaW46IHdlZWtEYXlzTWluLFxuICAgICAgICAgICAgICAgICAgICB0b2RheTogdG9kYXksXG4gICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHBvcG92ZXI6IHBvcG92ZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGZkLXBvcG92ZXItYm9keS1mb290ZXIgKm5nSWY9XCJzaG93VGltZVwiPlxuICAgICAgICAgICAgPGRpdiBmZC1iYXIgW2JhckRlc2lnbl09XCInZm9vdGVyJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLWxlZnQgKm5nSWY9XCJydGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnNcIj48L2NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1yaWdodCAqbmdJZj1cIiFydGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnNcIj48L2NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2ZkLXBvcG92ZXItYm9keT5cbjwvZmQtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSAjZm9vdGVyQnV0dG9ucz5cbiAgICA8ZmQtYnV0dG9uLWJhciBbbGFiZWxdPVwiJ0NhbmNlbCcgfCBiYmJUcmFuc2xhdGVcIiAoY2xpY2spPVwib25DYW5jZWwocG9wb3ZlcilcIj48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXIgW2xhYmVsXT1cIidDbGVhcicgfCBiYmJUcmFuc2xhdGVcIiBmZFR5cGU9XCJzdGFuZGFyZFwiIChjbGljayk9XCJvbkNsZWFyKHBvcG92ZXIpXCI+PC9mZC1idXR0b24tYmFyPlxuICAgIDxmZC1idXR0b24tYmFyIFtsYWJlbF09XCInT2snIHwgYmJiVHJhbnNsYXRlXCIgZmRUeXBlPVwiZW1waGFzaXplZFwiIChjbGljayk9XCJvbk9rKHBvcG92ZXIpXCI+PC9mZC1idXR0b24tYmFyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZVxuICAgICNtb250aFxuICAgIGxldC1zZWxlY3RlZE1vbnRoXG4gICAgbGV0LXdpZHRoPVwid2lkdGhcIlxuICAgIGxldC1oZWlnaHQ9XCJoZWlnaHRcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC10b2RheT1cInRvZGF5XCJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxuICAgIGxldC1kZXZpY2VTaXplPVwiZGV2aWNlU2l6ZVwiXG4gICAgbGV0LXBvcG92ZXI9XCJwb3BvdmVyXCJcbj5cbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtsYWJlbF09XCIoc2hvd0RhdGUgPyAnRGF0ZVJfVG9kYXknIDogJ05vdycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZGF5KClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0RhdGVcIlxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJldlRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNob3dEYXRlXCJcbiAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgW2dseXBoXT1cInJ0bCA/ICduYXZpZ2F0aW9uLWxlZnQtYXJyb3cnIDogJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5leHRUYXAoKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXJzLXdyYXBwZXJcIiAqbmdJZj1cInNob3dEYXRlXCIgZmQtdGl0bGUgZmQtdG9vbGJhci1pdGVtPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PT0gJ2RheScgfHwgc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ21vbnRoJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICd5ZWFyJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZmQtdG9vbGJhcj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzZWxlY3Rpb25Nb2RlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbW9udGgnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAzMyVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25Nb250aFNlbGVjdGVkKG1vbnRoLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3llYXInXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAyNSVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ5ZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ2RheSc7IG9uWWVhclNlbGVjdGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGJjLWNhbGVuZGFyLW1vbnRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbY29udGFpbmVySGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250YWluZXJXaWR0aF09XCJ3aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICAgICAgW21vbnRoV2Vla3NDb3VudF09XCJzZWxlY3RlZE1vbnRoLndlZWtzQ291bnRcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICAgICAgICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0ZVBpY2tlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGVSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkRGF0ZV09XCJzdGFydFNlbGVjdGVkRGF5ID8gc3RhcnRTZWxlY3RlZERheS5kYXRlIDogdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGF5c109XCJzZWxlY3RlZE1vbnRoLmRheXNcIlxuICAgICAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soJGV2ZW50LCBwb3BvdmVyKVwiXG4gICAgICAgICAgICAgICAgPjwvYmMtY2FsZW5kYXItbW9udGg+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGVyYXRvclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxmZC10aW1lICpuZ0lmPVwic2hvd1RpbWVcIiBbKG5nTW9kZWwpXT1cInRpbWVWYWx1ZVwiIFtkaXNwbGF5U2Vjb25kc109XCJmYWxzZVwiPjwvZmQtdGltZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0gsYUFBYSxFQUViLFdBQVcsRUFDWCxjQUFjLEVBR2QsUUFBUSxFQUdYLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDSCxlQUFlLEVBRWYsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLFFBQVEsRUFDWCxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7OztBQUUvQixNQUFNLE9BQU8sY0FBYztJQW9DdkIsWUFBb0IsYUFBK0I7UUFBL0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBbkNuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdCLENBQUM7UUFFdEMsbUNBQW1DO1FBQ25DLGVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcs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LEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgQmFzZUNvbXBvbmVudCxcbiAgICBCYmJUcmFuc2xhdGVQaXBlLFxuICAgIERhdGVTZXJ2aWNlLFxuICAgIGdldERhdGVTZXJ2aWNlLFxuICAgIExvZ1NlcnZpY2UsXG4gICAgUG9ydGFsU2VydmljZSxcbiAgICBCYXJzYUFwaSxcbiAgICBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgQWJicmV2YXRpb25EZXZpY2VTaXplXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyTW9udGhJbmZvLCBEYXkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIERhdGV0aW1lQWRhcHRlcixcbiAgICBEaWFsb2dTZXJ2aWNlLFxuICAgIEZkRGF0ZSxcbiAgICBGZERhdGV0aW1lQWRhcHRlcixcbiAgICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgIFRpbWVDb21wb25lbnQsXG4gICAgVGltZUkxOG5cbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlJztcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lQ29uZmlnSTE4biB7XG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2UgaG91cnMnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlSG91cnNMYWJlbCA9ICdJbmNyZWFzZSBob3Vycyc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAnaG91cnMnIGNvbHVtbiAqL1xuICAgIGhvdXJzTGFiZWwgPSB0aGlzLl9iYmJUcmFuc2xhdGUudHJhbnNmb3JtKCdIb3VycycpO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2UgaG91cnMnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlSG91cnNMYWJlbCA9ICdEZWNyZWFzZSBob3Vycyc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBtaW51dGVzJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZU1pbnV0ZXNMYWJlbCA9ICdJbmNyZWFzZSBtaW51dGVzJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdtaW51dGVzJyBjb2x1bW4gKi9cbiAgICBtaW51dGVzTGFiZWwgPSB0aGlzLl9iYmJUcmFuc2xhdGUudHJhbnNmb3JtKCdNaW51dGVzJyk7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBtaW51dGVzJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZU1pbnV0ZXNMYWJlbCA9ICdEZWNyZWFzZSBtaW51dGVzJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIHNlY29uZHMnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlU2Vjb25kc0xhYmVsID0gJ0luY3JlYXNlIHNlY29uZHMnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ3NlY29uZHMnIGNvbHVtbiAqL1xuICAgIHNlY29uZHNMYWJlbCA9IHRoaXMuX2JiYlRyYW5zbGF0ZS50cmFuc2Zvcm0oJ1NlYycpO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2Ugc2Vjb25kcycgYnV0dG9uICovXG4gICAgZGVjcmVhc2VTZWNvbmRzTGFiZWwgPSAnRGVjcmVhc2Ugc2Vjb25kcyc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBwZXJpb2QnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlUGVyaW9kTGFiZWwgPSAnSW5jcmVhc2UgcGVyaW9kJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdwZXJpb2QnIGNvbHVtbiAqL1xuICAgIHBlcmlvZExhYmVsID0gJ1BlcmlvZCc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBwZXJpb2QnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlUGVyaW9kTGFiZWwgPSAnRGVjcmVhc2UgcGVyaW9kJztcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYmJUcmFuc2xhdGU6IEJiYlRyYW5zbGF0ZVBpcGUpIHt9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYmMtZGF0ZS10aW1lLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRGF0ZXRpbWVBZGFwdGVyLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IEZkRGF0ZXRpbWVBZGFwdGVyXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRpbWVJMThuLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IFRpbWVDb25maWdJMThuXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IERhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgdXNlRmFjdG9yeTogZ2V0RGF0ZVNlcnZpY2VcbiAgICAgICAgfSxcbiAgICAgICAgQ2FsZW5kYXJTZXJ2aWNlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSBwcmltYXJ5Q2FsZW5kYXJUeXBlOiAnR3JlZ29yaWFuJyB8ICdQZXJzaWFuJyB8IHN0cmluZztcbiAgICBASW5wdXQoKSBmb3JtYXRQYXR0ZXJuOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgdGltZVZhbHVlOiBGZERhdGU7XG4gICAgQElucHV0KCkgc3RhcnRSYW5nZURhdGU6IERhdGU7XG4gICAgQElucHV0KCkgZW5kUmFuZ2VEYXRlOiBEYXRlO1xuICAgIEBJbnB1dCgpIGlzUmFuZ2VQaWNrZXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1RpbWU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd0RhdGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcnRsID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBkZXZpY2VTaXplOiBBYmJyZXZhdGlvbkRldmljZVNpemU7XG4gICAgQElucHV0KCkgaXNNb2JpbGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYnV0dG9uTWVudU1vZGU6IGJvb2xlYW47XG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0RGF5OiBEYXRlOyBlbmREYXk6IERhdGUgfT4oKTtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gICAgQFZpZXdDaGlsZChUaW1lQ29tcG9uZW50KSB0aW1lQ29tcG9uZW50OiBUaW1lQ29tcG9uZW50PEZkRGF0ZT47XG4gICAgQFZpZXdDaGlsZChJbnB1dEdyb3VwQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dEdyb3VwQ29tcG9uZW50OiBJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgIHZhbHVlQ2FwdGlvbiA9ICcnO1xuICAgIGVuZFNlbGVjdGVkRGF5OiBEYXkgfCBudWxsO1xuICAgIHN0YXJ0U2VsZWN0ZWREYXk6IERheSB8IG51bGw7XG4gICAgdmFsdWVEYXk6IERheSB8IG51bGw7XG5cbiAgICBzZWxlY3Rpb25Nb2RlOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF5JztcbiAgICB0b2RheUluZGV4ID0gLTE7XG4gICAgd2lkdGgkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRNb250aCQ6IE9ic2VydmFibGU8Q2FsZW5kYXJNb250aEluZm8+O1xuICAgIHJ0bCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgdG9kYXk6IERhdGU7XG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIHdlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgIGN1bHR1cmU6IHN0cmluZztcbiAgICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gICAgeWVhcnM6IHN0cmluZ1tdO1xuICAgIHRlbXBGb3JtbWF0ZWREYXRlID0gJyc7XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBfbGFzdFZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2RhdGV0aW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEZkRGF0ZT4sXG4gICAgICAgIHByaXZhdGUgX2RhdGVUaW1lVG9DYXB0aW9uOiBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgICAgIHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5ydGwkID0gX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy53aWR0aCQgPSBfcG9ydGFsU2VydmljZS5kZXZpY2VTaXplJC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1hcCgoZGV2aWNlU2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93RGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjYwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRldmljZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hsJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1NjA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyMDtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1MjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmhlaWdodCA9IDQyMDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgbGV0IGN1bHR1cmUgPSAnZW4tVVMnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJpbWFyeUNhbGVuZGFyVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSGlqcmlTaGFtc2knOlxuICAgICAgICAgICAgICAgIGN1bHR1cmUgPSAnZmEtSVInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VsdHVyZSA9IGN1bHR1cmU7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZSA9IG5ldyBDYWxlbmRhclNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgY3VsdHVyZSk7XG4gICAgICAgIHRoaXMud2Vla0RheXNNaW4gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla0RheXNNaW4oKTtcbiAgICAgICAgdGhpcy53ZWVrRGF5cyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5cygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTW9udGgkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNlbGVjdGVkJDtcbiAgICAgICAgdGhpcy50b2RheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUgPSBGZERhdGUuZ2V0RmREYXRlQnlEYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTW9udGhCeURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IEZkRGF0ZS5nZXRGZERhdGVCeURhdGUobmV3IERhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuaXNSYW5nZVBpY2tlcikge1xuICAgICAgICAvLyAgIGlmICh0aGlzLnN0YXJ0UmFuZ2VEYXRlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE1vbnRoQnlEYXRlKHRoaXMuc3RhcnRSYW5nZURhdGUpO1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gICBpZiAodGhpcy5lbmRSYW5nZURhdGUpIHtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWRNb250aEJ5RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLm1vbnRocyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5Nb250aHM7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXIpO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50LnJlZ2lzdGVyT25DaGFuZ2UodGhpcy5vbkNhcHRpb25DaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gY2hhbmdlcztcbiAgICAgICAgaWYgKHZhbHVlICYmICF2YWx1ZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgY2FwdGlvbiA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUodmFsdWUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICE9PSB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQ/LmlucHV0VGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50aW1lQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGltZUNvbXBvbmVudC5yZWZyZXNoQ29sdW1ucygpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXZpY2VTaXplID09PSAncycgfHwgdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgbW9iaWxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uQ2FwdGlvbkNoYW5nZWQoZSk6IHZvaWQge1xuICAgICAgICBpZiAoZS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2xpc2hEYXRlU3RyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUZhVG9BckNoYXJjaHRlcihlKTtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdqWVlZWS9qTS9qRCc7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICBmb3JtYXQgKz0gJyBISDptbSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9tZW50ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5zdHJpbmdUb01vbWVudChlbmdsaXNoRGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IG1vbWVudC5pc1ZhbGlkKCk7Ly8g2KjYsdin24wg2LTZhdiz24wg2YfZhduM2LTZhyBmYWxzZSDZhti02YjZhiDZhduM2K/Zh1xuICAgICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZShlbmdsaXNoRGF0ZVN0cikpKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50LnRvRGF0ZSgpO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gdGhpcy5fZGF0ZXRpbWVBZGFwdGVyLnNldFRpbWUoXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSxcbiAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZpb3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzWzBdKSAtIDIwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0WWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IHRoaXMuX2RhdGV0aW1lQWRhcHRlci5zZXRUaW1lKFxuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUsXG4gICAgICAgICAgICB0b2RheS5nZXRIb3VycygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0U2Vjb25kcygpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheURheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IERheSwgcG9wb3ZlciwgZGlhbG9nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRFbmREYXkoZGF5LCBwb3BvdmVyLCBkaWFsb2cpO1xuICAgIH1cblxuICAgIG9uUG9wb3Zlck9wZW5DaGFuZ2UoaXNPcGVuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGVhcihwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgb25Payhwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbGFzdFZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBGb3JtbWF0ZWREYXRlID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cENvbXBvbmVudD8ud3JpdGVWYWx1ZShmb3JtYXR0ZWREYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRlbXBGb3JtbWF0ZWREYXRlID0gJyc7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cENvbXBvbmVudD8ud3JpdGVWYWx1ZSgnJyk7XG4gICAgfVxuICAgIHByaXZhdGUgX2dldEZvcm1hdHRlZERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZVRvQ2FwdGlvbi50cmFuc2Zvcm0oZGF0ZSwgdGhpcy5mb3JtYXRQYXR0ZXJuLCB0aGlzLmN1bHR1cmUsIHRoaXMuc2hvd0RhdGUsIHRoaXMuc2hvd1RpbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zaG93RGF0ZSA/IHRoaXMuc3RhcnRTZWxlY3RlZERheT8uZGF0ZSA/PyB0aGlzLnZhbHVlIDogbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0SG91cnModGhpcy50aW1lVmFsdWUuaG91cik7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldE1pbnV0ZXModGhpcy50aW1lVmFsdWUubWludXRlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0U2Vjb25kcyh0aGlzLnRpbWVWYWx1ZS5zZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLl9yYWlzVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlWWVhcihmcm9tOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeWVhcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChgJHtmcm9tICsgaX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldENhcHRpb24odmFsdWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybWF0UGF0dGVybiA9IHRoaXMuZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdZWVlZJywgJ2pZWVlZJyk7XG4gICAgICAgIGZvcm1hdFBhdHRlcm4gPSBmb3JtYXRQYXR0ZXJuLnJlcGxhY2UoJ01NJywgJ2pNTScpO1xuICAgICAgICBmb3JtYXRQYXR0ZXJuID0gZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdERCcsICdqREQnKTtcbiAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh2YWx1ZSkuZm9ybWF0KGZvcm1hdFBhdHRlcm4pO1xuICAgIH1cbiAgICBwcml2YXRlIF9yYWlzVmFsdWVDaGFuZ2VkKGRhdGUsIHNldENhcHRpb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBkYXRlO1xuICAgICAgICBpZiAoc2V0Q2FwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbihkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rmlyc3RBbmRFbmREYXkoZGF5OiBEYXksIHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gdGhpcy5lbmRTZWxlY3RlZERheS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheTtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LmRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGZkLWlucHV0LWdyb3VwXG4gICAgcGxhY2VtZW50PVwiYWZ0ZXJcIlxuICAgIGdseXBoPVwiY2FsZW5kYXJcIlxuICAgIGdseXBoQXJpYUxhYmVsPVwic2VsZWN0IGRheVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBhcmlhTGFiZWxsZWRCeT1cImZkLWlucHV0LWdyb3VwLWljb24tbGFiZWwtMlwiXG4gICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICBbc3RhdGVdPVwiaXNWYWxpZCA/ICdzdWNjZXNzJyA6ICdlcnJvcidcIlxuICAgIFtzaG93Rm9jdXNdPVwidHJ1ZVwiXG4gICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJvbk9wZW5Qb3BvdmVyKHBvcG92ZXIsIGRpYWxvZ1RlbXBsYXRlKVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFidXR0b25NZW51TW9kZSA/ICdpbmhlcml0JyA6ICdub25lJ1wiXG4+XG48L2ZkLWlucHV0LWdyb3VwPlxuPGJ1dHRvblxuICAgICpuZ0lmPVwiYnV0dG9uTWVudU1vZGVcIlxuICAgIGZkLWJ1dHRvblxuICAgIFtsYWJlbF09XCJ0ZW1wRm9ybW1hdGVkRGF0ZSB8fCBwbGFjZWhvbGRlclwiXG4gICAgW3RpdGxlXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbZmRUeXBlXT1cInZhbHVlID8gJ3N0YW5kYXJkJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgIFtmZE1lbnVdPVwidHJ1ZVwiXG4gICAgKGNsaWNrKT1cIm9uT3BlblBvcG92ZXIocG9wb3ZlciwgZGlhbG9nVGVtcGxhdGUpXCJcbiAgICBbY2xhc3MucGxhY2Vob2xkZXItY3VzdG9tXT1cIiF2YWx1ZVwiXG4gICAgY2xhc3M9XCJtZW51LWJ1dHRvbi1kYXRlcGlja2VyXCJcbj48L2J1dHRvbj5cbjxmZC1wb3BvdmVyICNwb3BvdmVyIChpc09wZW5DaGFuZ2UpPVwib25Qb3BvdmVyT3BlbkNoYW5nZSgkZXZlbnQpXCIgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCIgW2ZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiPlxuICAgIDxmZC1wb3BvdmVyLWJvZHkgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoJCB8IGFzeW5jXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgbW9udGg7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkTW9udGgkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJ0bDogcnRsJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5czogd2Vla0RheXMsXG4gICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzTWluOiB3ZWVrRGF5c01pbixcbiAgICAgICAgICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VTaXplOiBkZXZpY2VTaXplLFxuICAgICAgICAgICAgICAgICAgICBwb3BvdmVyOiBwb3BvdmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBmZC1wb3BvdmVyLWJvZHktZm9vdGVyPlxuICAgICAgICAgICAgPGRpdiBmZC1iYXIgW2JhckRlc2lnbl09XCInZm9vdGVyJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgZmQtYmFyLXJpZ2h0PlxuICAgICAgICAgICAgICAgICAgICA8Y29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyQnV0dG9uc1wiPjwvY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuPC9mZC1wb3BvdmVyPlxuXG48bmctdGVtcGxhdGUgbGV0LWRpYWxvZyBsZXQtZGlhbG9nQ29uZmlnPVwiZGlhbG9nQ29uZmlnXCIgI2RpYWxvZ1RlbXBsYXRlPlxuICAgIDxmZC1kaWFsb2cgW2RpYWxvZ0NvbmZpZ109XCJkaWFsb2dDb25maWdcIiBbZGlhbG9nUmVmXT1cImRpYWxvZ1wiPlxuICAgICAgICA8ZmQtZGlhbG9nLWJvZHk+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogc2VsZWN0ZWRNb250aCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcnRsOiBydGwkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5czogd2Vla0RheXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2RheTogdG9kYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTaXplOiBkZXZpY2VTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZzogZGlhbG9nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZmQtZGlhbG9nLWJvZHk+XG4gICAgICAgIDxmZC1kaWFsb2ctZm9vdGVyPlxuICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnM7IGNvbnRleHQ6IHsgZGlhbG9nOiBkaWFsb2cgfVwiPjwvY29udGFpbmVyPlxuICAgICAgICA8L2ZkLWRpYWxvZy1mb290ZXI+XG4gICAgPC9mZC1kaWFsb2c+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNmb290ZXJCdXR0b25zIGxldC1kaWFsb2c9XCJkaWFsb2dcIj5cbiAgICA8ZmQtYnV0dG9uLWJhciBbbGFiZWxdPVwiJ09rJyB8IGJiYlRyYW5zbGF0ZVwiIGZkVHlwZT1cImVtcGhhc2l6ZWRcIiAoY2xpY2spPVwib25Payhwb3BvdmVyLCBkaWFsb2cpXCI+PC9mZC1idXR0b24tYmFyPlxuICAgIDxmZC1idXR0b24tYmFyXG4gICAgICAgIFtsYWJlbF09XCInQ2xlYXInIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgZmRUeXBlPVwic3RhbmRhcmRcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhcihwb3BvdmVyLCBkaWFsb2cpXCJcbiAgICA+PC9mZC1idXR0b24tYmFyPlxuICAgIDxmZC1idXR0b24tYmFyIFtsYWJlbF09XCInQ2FuY2VsJyB8IGJiYlRyYW5zbGF0ZVwiIChjbGljayk9XCJvbkNhbmNlbChwb3BvdmVyLCBkaWFsb2cpXCI+PC9mZC1idXR0b24tYmFyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZVxuICAgICNtb250aFxuICAgIGxldC1zZWxlY3RlZE1vbnRoXG4gICAgbGV0LXdpZHRoPVwid2lkdGhcIlxuICAgIGxldC1oZWlnaHQ9XCJoZWlnaHRcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC10b2RheT1cInRvZGF5XCJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxuICAgIGxldC1kZXZpY2VTaXplPVwiZGV2aWNlU2l6ZVwiXG4gICAgbGV0LXBvcG92ZXI9XCJwb3BvdmVyXCJcbiAgICBsZXQtZGlhbG9nPVwiZGlhbG9nXCJcbj5cbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtsYWJlbF09XCIoc2hvd0RhdGUgPyAnRGF0ZVJfVG9kYXknIDogJ05vdycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZGF5KClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0RhdGVcIlxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJldlRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNob3dEYXRlXCJcbiAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgW2dseXBoXT1cInJ0bCA/ICduYXZpZ2F0aW9uLWxlZnQtYXJyb3cnIDogJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5leHRUYXAoKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXJzLXdyYXBwZXJcIiAqbmdJZj1cInNob3dEYXRlXCIgZmQtdGl0bGUgZmQtdG9vbGJhci1pdGVtPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PT0gJ2RheScgfHwgc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ21vbnRoJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICd5ZWFyJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZmQtdG9vbGJhcj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzZWxlY3Rpb25Nb2RlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbW9udGgnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAzMyVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25Nb250aFNlbGVjdGVkKG1vbnRoLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3llYXInXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAyNSVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ5ZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ2RheSc7IG9uWWVhclNlbGVjdGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGJjLWNhbGVuZGFyLW1vbnRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbY29udGFpbmVySGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250YWluZXJXaWR0aF09XCJ3aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICAgICAgW21vbnRoV2Vla3NDb3VudF09XCJzZWxlY3RlZE1vbnRoLndlZWtzQ291bnRcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxuICAgICAgICAgICAgICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICAgICAgICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0ZVBpY2tlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGVSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkRGF0ZV09XCJzdGFydFNlbGVjdGVkRGF5ID8gc3RhcnRTZWxlY3RlZERheS5kYXRlIDogdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGF5c109XCJzZWxlY3RlZE1vbnRoLmRheXNcIlxuICAgICAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soJGV2ZW50LCBwb3BvdmVyLCBkaWFsb2cpXCJcbiAgICAgICAgICAgICAgICA+PC9iYy1jYWxlbmRhci1tb250aD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGZkLXRpbWUgKm5nSWY9XCJzaG93VGltZVwiIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCIgW2Rpc3BsYXlTZWNvbmRzXT1cImZhbHNlXCI+PC9mZC10aW1lPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==