@wemake4u/form-player-se 1.0.43 → 1.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/controls/control.mjs +8 -3
- package/esm2022/lib/controls/factory.mjs +33 -33
- package/esm2022/lib/directives/grid.directive.mjs +10 -2
- package/esm2022/lib/directives/tabcontrol.directive.mjs +17 -5
- package/esm2022/lib/dynamic-fields/dynamic-fields.component.mjs +12 -7
- package/esm2022/lib/dynamic-form/dynamic-form.component.mjs +27 -7
- package/esm2022/lib/services/builder.service.mjs +3 -1
- package/esm2022/lib/services/compute.service.mjs +2 -2
- package/esm2022/lib/services/disable.service.mjs +2 -2
- package/esm2022/lib/services/programmability.service.mjs +4 -3
- package/esm2022/lib/services/validation.service.mjs +2 -2
- package/esm2022/lib/utils/groupByRow.mjs +2 -1
- package/esm2022/public-api.mjs +33 -1
- package/fesm2022/wemake4u-form-player-se.mjs +78 -24
- package/fesm2022/wemake4u-form-player-se.mjs.map +1 -1
- package/lib/controls/factory.d.ts +1 -1
- package/lib/directives/tabcontrol.directive.d.ts +3 -1
- package/lib/dynamic-fields/dynamic-fields.component.d.ts +2 -1
- package/lib/dynamic-form/dynamic-form.component.d.ts +3 -0
- package/lib/services/programmability.service.d.ts +1 -1
- package/lib/utils/groupByRow.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +32 -0
- package/esm2022/lib/utils/patch.mjs +0 -17
- package/lib/utils/patch.d.ts +0 -1
|
@@ -88,6 +88,7 @@ export class DynamicFieldsComponent {
|
|
|
88
88
|
recursionLevel = 0;
|
|
89
89
|
identity;
|
|
90
90
|
identityIndex;
|
|
91
|
+
disableAutoFocus;
|
|
91
92
|
Texts = Texts;
|
|
92
93
|
constructor(sanitizer, markdown, mime, programmability, weak, register, metadata, languageService, global, formService, grid, chart, dialog, autoFocus, el) {
|
|
93
94
|
this.sanitizer = sanitizer;
|
|
@@ -118,9 +119,11 @@ export class DynamicFieldsComponent {
|
|
|
118
119
|
}
|
|
119
120
|
ngAfterViewInit() {
|
|
120
121
|
if (this.autoFocus.consume(this.formGroup)) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
if (this.disableAutoFocus !== true) {
|
|
123
|
+
setTimeout(() => {
|
|
124
|
+
setFocus(this.el.nativeElement);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
124
127
|
}
|
|
125
128
|
}
|
|
126
129
|
getRegister() {
|
|
@@ -669,12 +672,12 @@ export class DynamicFieldsComponent {
|
|
|
669
672
|
return formGroup['_autoFocus'] === true;
|
|
670
673
|
}
|
|
671
674
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldsComponent, deps: [{ token: i1.SanitizeService }, { token: i2.MarkdownService }, { token: i3.MimeService }, { token: i4.ProgrammabilityService }, { token: i5.WeakService }, { token: i6.RegisterService }, { token: i7.MetadataService }, { token: i8.LanguageService }, { token: i9.GlobalService }, { token: i10.FormService }, { token: i11.GridService }, { token: i12.ChartService }, { token: i13.DialogService }, { token: i14.AutoFocusService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
672
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFieldsComponent, isStandalone: true, selector: "app-dynamic-fields", inputs: { form: "form", rows: "rows", formGroup: "formGroup", alignment: "alignment", readOnly: "readOnly", recursionLevel: "recursionLevel", identity: "identity", identityIndex: "identityIndex" }, providers: [
|
|
675
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFieldsComponent, isStandalone: true, selector: "app-dynamic-fields", inputs: { form: "form", rows: "rows", formGroup: "formGroup", alignment: "alignment", readOnly: "readOnly", recursionLevel: "recursionLevel", identity: "identity", identityIndex: "identityIndex", disableAutoFocus: "disableAutoFocus" }, providers: [
|
|
673
676
|
RegisterService,
|
|
674
677
|
ProgrammabilityService,
|
|
675
678
|
GridService,
|
|
676
679
|
ChartService
|
|
677
|
-
], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"getFormClass()\">\r\n <ng-container *ngFor=\"let row of rows\" [formGroup]=\"formGroup\">\r\n <div class=\"row field-set\">\r\n <ng-container *ngFor=\"let component of row.components\">\r\n <ng-container [ngSwitch]=\"component.type\">\r\n <div [ngClass]=\"getComponentClass(component)\"\r\n [style]=\"getComponentStyle(component)\">\r\n <div [hide]=\"evaluateBoolean(component.conditional?.hide)\"\r\n [show]=\"evaluateBoolean(component.conditional?.show)\">\r\n <!-- #region textfield -->\r\n <ng-container *ngSwitchCase=\"'textfield'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"text\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textfield\r\n [register]=\"component\"\r\n [componentRef]=\"textfield\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region select -->\r\n <ng-container *ngSwitchCase=\"'select'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n dropdown\r\n [valueSync]=\"component.valueSync\"\r\n #select\r\n [register]=\"component\"\r\n [componentRef]=\"select\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-input *ngIf=\"component.searchable\" class=\"searchable\" type=\"text\" [placeholder]=\"locale(Texts, 'TypeToSearch')\"></ngx-sirio-input>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region taglist -->\r\n <ng-container *ngSwitchCase=\"'taglist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [isMultiple]=\"true\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #taglist\r\n [register]=\"component\"\r\n [componentRef]=\"taglist\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region number -->\r\n <ng-container *ngSwitchCase=\"'number'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"number\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n number\r\n [defaultValue]=\"evaluateNumber(component.defaultValue)\"\r\n [minimum]=\"evaluateNumber(component.minimum)\"\r\n [maximum]=\"evaluateNumber(component.maximum)\"\r\n [decimalDigits]=\"evaluateNumber(component.decimalDigits)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #number\r\n [register]=\"component\"\r\n [componentRef]=\"number\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n isoDate\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #date\r\n [register]=\"component\"\r\n [componentRef]=\"date\">\r\n </ngx-sirio-datepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #time\r\n [register]=\"component\"\r\n [componentRef]=\"time\">\r\n </ngx-sirio-timepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <div [formControlName]=\"component.key\"\r\n dateTimeCoordinator\r\n dateTimeValidator\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [datePicker]=\"date\"\r\n [timePicker]=\"time\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [valueSync]=\"component.valueSync\"\r\n #datetime\r\n [register]=\"component\"\r\n [componentRef]=\"datetime\"\r\n class=\"datetime-container\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n isoDate\r\n #date>\r\n </ngx-sirio-datepicker>\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n #time>\r\n </ngx-sirio-timepicker>\r\n </div>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region toggle -->\r\n <ng-container *ngSwitchCase=\"'toggle'\">\r\n <ngx-sirio-toggle [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #toggle\r\n [register]=\"component\"\r\n [componentRef]=\"toggle\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-toggle>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-checkbox>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipradio\r\n [register]=\"component\"\r\n [componentRef]=\"chipradio\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"radio\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #radio\r\n [register]=\"component\"\r\n [componentRef]=\"radio\">\r\n <ngx-sirio-radio-button *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-radio-button>\r\n </ngx-sirio-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checklist -->\r\n <ng-container *ngSwitchCase=\"'checklist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipcheckbox\r\n [register]=\"component\"\r\n [componentRef]=\"chipcheckbox\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"checkbox\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n <ngx-sirio-checkbox *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-checkbox>\r\n </ngx-sirio-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region textarea -->\r\n <ng-container *ngSwitchCase=\"'textarea'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"textarea\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textarea\r\n [register]=\"component\"\r\n [componentRef]=\"textarea\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region filepicker -->\r\n <ng-container *ngSwitchCase=\"'filepicker'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-file-upload [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [accept]=\"getMimeTypes(component.accept)\"\r\n [multiple]=\"evaluateBoolean(component.multiple)\"\r\n (fileUploadedEvent)=\"fileUploaded($event)\"\r\n [showFilelist]=\"!component.showDetails\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #filepicker\r\n [register]=\"component\"\r\n [componentRef]=\"filepicker\">\r\n <span class=\"fas fa-arrow-up\" aria-hidden=\"true\"></span>\r\n {{ locale(Texts, 'Upload') }}\r\n </ngx-sirio-file-upload>\r\n </div>\r\n <ng-container *ngIf=\"component.showDetails\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formGroup\"\r\n [rows]=\"createUploadTables(component)\"\r\n contextId=\"fileList\"></app-dynamic-fields>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region range -->\r\n <ng-container *ngSwitchCase=\"'range'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-slider [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [min]=\"evaluateNumber(component.range?.min) ?? 0\"\r\n [max]=\"evaluateNumber(component.range?.max) ?? 0\"\r\n [valueSync]=\"component.valueSync\"\r\n #range\r\n [register]=\"component\"\r\n [componentRef]=\"range\">\r\n </ngx-sirio-slider>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region displayfield -->\r\n <ng-container *ngSwitchCase=\"'displayfield'\">\r\n <div class=\"sirio-control\"\r\n [ngClass]=\"[getTextAlignment(component), getLightView(component) ]\"\r\n #displayfield\r\n [register]=\"component\"\r\n [componentRef]=\"displayfield\">\r\n <div *ngIf=\"component.label\" class=\"sirio-label\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <button *ngIf=\"component.tooltip\"\r\n sirioTooltip\r\n [content]=\"component.tooltip\"\r\n [hasPopover]=\"true\"\r\n [attr.aria-label]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n class=\"sirio-label-popover fas fa-info-circle\"></button>\r\n </div>\r\n <div class=\"sirio-form-control data-display\" [ngClass]=\"component.fieldtype\">\r\n <ng-container [ngSwitch]=\"component.fieldtype\">\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <i *ngIf=\"evaluate(component.expression)\" class=\"fas fa-check\"></i>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <ng-container *ngTemplateOutlet=\"formattedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"defaultTemplate\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultTemplate>\r\n <ng-container *ngIf=\"supportValues(component) && hasValues(component); else simpleTemplate\">\r\n <ng-container *ngIf=\"getValues(component) | async as values\">\r\n {{ toLabel(evaluate(component.expression), values) }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #simpleTemplate>\r\n {{ evaluate(component.expression) }}\r\n </ng-template>\r\n <ng-template #formattedTemplate>\r\n <div class=\"text-paragraph\" style=\"margin-top: -6px;\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(component.expression))\">\r\n </div>\r\n </ng-template>\r\n </div>\r\n <p *ngIf=\"component.description\" class=\"sirio-helper-text\">\r\n {{ evaluateString(locale(component, 'description')) }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region dynamiclist -->\r\n <ng-container *ngSwitchCase=\"'dynamiclist'\">\r\n <ng-container *ngIf=\"resolvePath(component.path) as formGroup\">\r\n <ng-container [formGroup]=\"formGroup\">\r\n <ng-container [formArrayName]=\"component.key\"\r\n [formGroup]=\"formGroup\"\r\n [recursion]=\"component\"\r\n #recursion=\"recursion\"\r\n [repeat]=\"evaluateNumber(component.repetitions)\"\r\n [allowAddRemove]=\"evaluateBoolean(component.allowAddRemove)\">\r\n <p *ngIf=\"component.description\">{{ evaluateString(locale(component, 'description')) }}</p>\r\n <ng-container *ngIf=\"getFormArray(resolvePath(component.path).get(component.key)) as formArray\">\r\n <ng-container *ngIf=\"component.subtype == 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"navigation; context: { formArray: formArray }\"></ng-container>\r\n </ng-container> \r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclisttab\">\r\n <ngx-sirio-tab [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [tabCount]=\"formArray.controls.length\"\r\n #dynamiclisttab>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\">\r\n <ng-container *ngIf=\"i === dynamiclisttab.activeIndex\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclistaccordion\">\r\n <ngx-sirio-accordion [accordionCount]=\"formArray.controls.length\"\r\n #dynamiclistaccordion>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-accordion-panel #panel accordionPanel>\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <ng-container *ngIf=\"panel.panelIsOpen\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <table class=\"dynamiclist-table\" [ngClass]=\"{ 'main': recursionLevel == 0 }\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"getFormGroup(item) as formItem\">\r\n <ng-container *ngIf=\"{ itemsArray: recursion.getItemsArray(formItem) } as recursionData\">\r\n <tr>\r\n <td class=\"content-cell\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true && component.subtype !== 'table', 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formItem\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"command-cell\">\r\n <div>\r\n <ng-container *ngIf=\"recursionData.itemsArray\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: recursionData.itemsArray, compact: true }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"recursionData.itemsArray && recursionData.itemsArray.length > 0\">\r\n <td colspan=\"2\" class=\"recursion-cell\">\r\n <div class=\"layout\">\r\n <div class=\"recursion-toggle\">\r\n <ngx-sirio-button [ngxSirioCollapseTrigger]=\"collapseTemplate\"\r\n [color]=\"null\" [icon]=\"collapse.isOpen ? 'fas fa-chevron-down' : 'fas fa-chevron-right' \" />\r\n </div>\r\n <div *ngIf=\"!collapse.isOpen\" class=\"recursion-title\">\r\n <div class=\"recursion-text\">\r\n <ng-container *ngIf=\"!collapse.isOpen\">\r\n {{ recursionData.itemsArray.length }} elementi presenti\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"recursion-content\">\r\n <ngx-sirio-collapse #collapseTemplate\r\n #collapse=\"collapseExtension\"\r\n collapseExtension>\r\n <div *ngIf=\"collapse.isOpen\" style=\"margin-bottom: -11px;\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"recursion.getFormGroup(formItem)\"\r\n [readOnly]=\"readOnly\"\r\n [recursionLevel]=\"recursionLevel+1\"\r\n [rows]=\"recursion.getComponentRows()\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ngx-sirio-collapse>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigation -->\r\n <ng-container *ngSwitchCase=\"'navigation'\">\r\n <div>\r\n <ng-container *ngIf=\"formArray.controls[navigationIndex] as item\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (navigationIndex + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"component.allowAddRemove || component.allowReorder\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length == 0\">\r\n <div class=\"dynamiclist-no-data\">{{ evaluateString(locale(component, 'noDataText')) || locale(Texts, 'NoData') }}</div>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"feedback\"></ng-container>\r\n <ng-container *ngIf=\"recursionLevel == 0 && component.subtype !== 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #region templates -->\r\n <ng-template #btnMoveUp let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveUp') as upLabel\">\r\n <ngx-sirio-button (click)=\"moveUpItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"upLabel\"\r\n [title]=\"upLabel\"\r\n [color]=\"null\" icon=\"fas fa-arrow-up\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ upLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnMoveDown let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveDown') as downLabel\">\r\n <ngx-sirio-button (click)=\"moveDownItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"downLabel\"\r\n [title]=\"downLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-arrow-down\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ downLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <ngx-sirio-button (click)=\"removeItem(formArray, i, true)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"removeLabel\"\r\n [title]=\"removeLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-trash\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ removeLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <ngx-sirio-button (click)=\"addItem(formArray)\"\r\n class=\"add-item\"\r\n [ariaLabel]=\"addLabel\"\r\n [title]=\"addLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-plus\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ addLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsReorder let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowReorder\">\r\n <ng-container *ngTemplateOutlet=\"btnMoveUp; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"btnMoveDown; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { formArray: formArray, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #feedback>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <div>\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <div>\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #navigation let-formArray=\"formArray\" > \r\n <nav class=\"sirio-pagination\">\r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <div class=\"sirio-pagination-page\">\r\n <select class=\"sirio-form-control\"\r\n [(ngModel)]=\"navigationIndex\"\r\n [ngModelOptions]=\"{ standalone: true }\">\r\n <option *ngFor=\"let _ of formArray.controls; let i = index\" [ngValue]=\"i\">\r\n {{ i + 1 }}\r\n </option>\r\n </select>\r\n {{ locale(Texts, 'Of') }}\r\n <span>{{ formArray.controls.length }}</span> {{ locale(Texts, 'Elements') }}\r\n </div>\r\n <div class=\"sirio-pagination-cursor\">\r\n <ul class=\"sirio-pagination-list\">\r\n <li [class.disabled]=\"navigationIndex == 0\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, -1)\"\r\n [title]=\"locale(Texts, 'PreviousElement')\"\r\n [class.disabled]=\"navigationIndex == 0\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-left\"></span>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, 1)\"\r\n [title]=\"locale(Texts, 'NextElement')\"\r\n [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-right\"></span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container> \r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && navigationIndex != -1\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: navigationIndex }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </nav>\r\n </ng-template>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region group -->\r\n <ng-container *ngSwitchCase=\"'group'\">\r\n <div [ngClass]=\"getGroupOutline(component)\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container> \r\n <div #group\r\n [register]=\"component\"\r\n [componentRef]=\"group\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-tab #tab\r\n [register]=\"component\"\r\n [componentRef]=\"tab\"\r\n [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [isNavLine]=\"component.navigation\"\r\n [isVertical]=\"component.vertical\"\r\n tabControl>\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(panel, 'label'))\"\r\n [icon]=\"evaluateString(panel.icon)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled) ?? false\"\r\n #tabPanel\r\n tabItem\r\n [componentRef]=\"tab\"\r\n *ngIf=\"evaluateConditional(panel.conditional)\">\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <div *ngIf=\"tabPanel.isActive\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-accordion #accordion\r\n [register]=\"component\"\r\n [componentRef]=\"accordion\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-accordion-panel *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled)\">\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(panel, 'label'))\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <div>\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </div>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion> \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [collapse]=\"component.collapseTo\"\r\n #text\r\n [register]=\"component\"\r\n [componentRef]=\"text\">\r\n <!--Reset View Context-->\r\n <div tabindex=\"0\" style=\"display:none\"></div>\r\n <div class=\"flex\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n <ng-container *ngIf=\"component.tooltip\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [attr.aria-label]=\"locale(Texts, 'Information')\"\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'tooltip')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region html -->\r\n <ng-container *ngSwitchCase=\"'html'\">\r\n <div class=\"html-paragraph\"\r\n [innerHTML]=\"sanitize(evaluateTemplate(locale(component, 'content')))\"\r\n #html\r\n [register]=\"component\"\r\n [componentRef]=\"html\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region image -->\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <img [src]=\"evaluateString(component.source)\"\r\n [alt]=\"evaluateString(locale(component, 'alt'))\"\r\n style=\"width: 100%;height: 100%;\"\r\n #image\r\n [register]=\"component\"\r\n [componentRef]=\"image\">\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-grid-angular [modules]=\"getGridModules(component)\"\r\n [gridOptions]=\"getGridOptions(component)\"\r\n [selectable]=\"evaluateBoolean(component.selectable)\"\r\n [multiSelect]=\"evaluateBoolean(component.multiSelect)\"\r\n (selectionChanged)=\"onGridSelectionChanged(component, $event)\"\r\n [suppressActions]=\"evaluateBoolean(component.suppressActions)\"\r\n [columnDefs]=\"component.columns || evaluate(component.columnsExpression) || []\"\r\n [rowSource]=\"getRowSource(component)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [style.height]=\"component.autoHeight ? null : evaluateHeight(component.height)\"\r\n [formGroup]=\"formGroup\"\r\n #table\r\n [register]=\"component\"\r\n [componentRef]=\"table\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region button -->\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-button (clickEvent)=\"clickButton(component, $event)\"\r\n [color]=\"evaluateColor(component.color)\"\r\n [disabled]=\"evaluateBoolean(component.disabled)\"\r\n #button\r\n [register]=\"component\"\r\n [componentRef]=\"button\">\r\n <ng-container *ngIf=\"evaluateString(component.icon) as icon; else noIcon\">\r\n <span *ngIf=\"component.iconPosition!='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <span *ngIf=\"component.iconPosition=='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n <ng-template #noIcon>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ng-template>\r\n </ngx-sirio-button>\r\n </div> \r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region separator -->\r\n <ng-container *ngSwitchCase=\"'separator'\">\r\n <div class=\"separator\"\r\n #separator\r\n [register]=\"component\"\r\n [componentRef]=\"separator\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region spacer -->\r\n <ng-container *ngSwitchCase=\"'spacer'\">\r\n <div style=\"width: 100%\"\r\n [style.height.px]=\"component.height\"\r\n #spacer\r\n [register]=\"component\"\r\n [componentRef]=\"spacer\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region iframe -->\r\n <ng-container *ngSwitchCase=\"'iframe'\">\r\n <label [for]=\"component.id\">{{ evaluateString(locale(component, 'label')) }}</label>\r\n <iframe [src]=\"evaluateUrl(component.url)\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [style.width]=\"'100%'\"\r\n [style.height.px]=\"component.height\"\r\n [frameSecurity]=\"component.security\"\r\n #iframe\r\n [register]=\"component\"\r\n [componentRef]=\"iframe\">\r\n </iframe>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region alert -->\r\n <ng-container *ngSwitchCase=\"'alert'\">\r\n <ngx-sirio-alert [type]=\"component.role\"\r\n [labelClose]=\"locale(Texts, 'Close')\"\r\n [preventClose]=\"evaluateBoolean(component.preventClose)\"\r\n #alert\r\n [register]=\"component\"\r\n [componentRef]=\"alert\">\r\n <ngx-sirio-alert-message>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-alert-message>\r\n </ngx-sirio-alert>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region notice -->\r\n <ng-container *ngSwitchCase=\"'notice'\">\r\n <ngx-sirio-notify #notice\r\n [register]=\"component\"\r\n [componentRef]=\"notice\">\r\n <ngx-sirio-notify-body [title]=\"evaluateString(locale(component, 'title'))\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-notify-body>\r\n </ngx-sirio-notify>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tooltip -->\r\n <ng-container *ngSwitchCase=\"'tooltip'\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"\r\n #tooltip\r\n [register]=\"component\"\r\n [componentRef]=\"tooltip\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <p *ngIf=\"component.title\" class=\"sirio-tooltip-heading sirio-space-down\">\r\n {{ evaluateString(locale(component, 'title')) }}\r\n </p>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region chart -->\r\n <ng-container *ngSwitchCase=\"'chart'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-charts [options]=\"(getChartOptions(component) | async) ?? {}\"\r\n [observe]=\"getChartData(component)\"\r\n [callback]=\"invalidateChart(component)\"\r\n [style.height.px]=\"component.height\"\r\n #chart\r\n [register]=\"component\"\r\n [componentRef]=\"chart\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region component -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <ng-container *ngIf=\"component.isInput; else noInputTemplate\">\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n <ng-template #noInputTemplate>\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n", styles: [".flex{display:flex}.field-set{align-items:start}.field-set>.col-host>*{margin-bottom:10px}.separator{border-bottom:2px solid #d9e4f7;width:100%;margin:10px 0}.group-outline{border:1px solid #d9e4f7;padding:15px;margin-top:2px;margin-bottom:2px}.group-outline-repeat{margin-top:8px;margin-bottom:8px}.valign-start>.row{align-items:start}.valign-center>.row{align-items:center}.valign-end>.row{align-items:end}.component-start{align-self:start}.component-center{align-self:center}.component-end{align-self:end}.text-paragraph p{margin-bottom:0!important}.sirio-tab.sirio-tab-vertical .sirio-tab-body{margin-left:10px;margin-right:10px}.sirio-tab:not(.sirio-tab-vertical) .sirio-tab-body{margin-top:10px;margin-bottom:10px}.sirio-label{cursor:default}.sirio-control.is-disabled .sirio-input-group .sirio-input-group-text,.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{border:0px}.sirio-control.is-readonly .sirio-form-control{background-color:#fff!important;color:#454d56}.sirio-form-control[type=number]:disabled{background-image:none}ngx-sirio-alert.prevent-close .sirio-alert-close{display:none}.col-host .sirio-accordion .sirio-accordion-body .sirio-accordion-content{padding:16px}.col-host .sirio-accordion-body{overflow:unset!important}.sirio-dialog-title{display:flex;margin-top:0}.sirio-dialog-title span{margin-right:10px;margin-bottom:0!important}.ag-header-cell.hide-filter .ag-header-cell-filter-button{display:none}.sirio-tab.sirio-tab-scroll{display:block}.sirio-dropdown .searchable{position:absolute;width:100%;display:none;left:0}.ag-cell-value .btn-small-group{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.ag-cell-value .btn-small .sirio-btn{padding:.25rem .0625rem;margin:2px}.ag-selection-checkbox .ag-checkbox-input-wrapper.ag-disabled{display:none}ag-charts{display:block;height:100%;border-radius:8px;background-color:var(--chart-bg);border:1px solid var(--chart-border);overflow:hidden}.ag-cell.cell-component{padding:1px}.ag-cell.row-numbers-cell{text-align:center;background:#f2f6fc}.ag-header-cell.row-numbers-header .ag-header-cell-label{justify-content:center;text-align:center}.ag-cell-auto-height .ag-cell-value{line-height:normal}\n", ".sirio-control.ng-invalid .sirio-form-feedback,.sirio-display-feedback{color:#aa224f;display:inline-block}.sirio-control.ng-invalid .sirio-input-group-text{color:#aa224f;border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label{color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label:before,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label{color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:before,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:after,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:after{background-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-upload.sirio-is-invalid button{background-color:#aa224f;border-color:#aa224f}\n", ".sirio-control.text-left input.sirio-form-control,.sirio-control.text-left textarea.sirio-form-control,.sirio-control.text-left div.sirio-form-control{text-align:left}.sirio-control.text-center input.sirio-form-control,.sirio-control.text-center textarea.sirio-form-control,.sirio-control.text-center div.sirio-form-control{text-align:center}.sirio-control.text-right input.sirio-form-control,.sirio-control.text-right textarea.sirio-form-control,.sirio-control.text-right div.sirio-form-control{text-align:right}.sirio-control.text-center input.sirio-datepicker,.sirio-control.text-center input.sirio-timepicker,.sirio-control.text-right input.sirio-datepicker,.sirio-control.text-right input.sirio-timepicker{padding-right:40px}.horizontal-left{display:flex;justify-content:left}.horizontal-center{display:flex;justify-content:center}.horizontal-right{display:flex;justify-content:right}.horizontal-fill button{width:100%}.horizontal-left legend,.horizontal-center legend,.horizontal-right legend,.horizontal-fill legend{float:none}.col-host.component-center ngx-sirio-toggle .sirio-form-toggle label{margin-bottom:0}\n", ".sirio-control .sirio-form-control.data-display{border-color:#e3e5e8}.sirio-control .sirio-form-control.data-display.textarea{white-space:pre;overflow:auto;height:auto;line-height:140%;min-height:3rem;padding:1rem}.sirio-control .sirio-form-control.data-display.text,.sirio-control .sirio-form-control:hover.data-display.text{overflow:auto;height:auto;margin-top:-6px;color:#454d56}.sirio-control .sirio-form-control.data-display.number{font-family:Roboto Mono,monospace}.sirio-control .sirio-form-control.data-display.checkbox{display:flex;justify-content:center;align-items:center}\n", ".sirio-control.light-readonly label:hover,.sirio-control.light-view div.sirio-label:hover{color:#454d56}.sirio-control.light-readonly input.sirio-form-control,.sirio-control.light-readonly .sirio-dropdown .sirio-dropdown-select,.sirio-control.light-readonly textarea.sirio-form-control,.sirio-control.light-view div.sirio-form-control{background:none!important;border:0px;padding-left:0}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{background:none}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text span{color:#5b6571}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text.prefix{padding-left:0}.sirio-upload.sirio-control.light-readonly label,.sirio-upload.sirio-control.is-disabled label{pointer-events:none}\n", ":root{--sirio-spinner-blue: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='%2300368F' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\");--sirio-spinner-white: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='white' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\")}.sirio-control .sirio-is-pending,.sirio-control.sirio-is-pending input.sirio-form-control,.sirio-control.sirio-is-pending .sirio-dropdown .sirio-form-control,.sirio-form-check.sirio-control.sirio-is-pending{background-image:var(--sirio-spinner-blue);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}textarea.sirio-form-control.sirio-is-pending{background-position:top .9375rem right .9375rem}.sirio-control.sirio-is-pending input.sirio-form-control{background-position:right .9375rem top 50%}.sirio-upload.sirio-control.sirio-is-pending ngx-sirio-button .sirio-btn-primary{background-image:var(--sirio-spinner-white);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}.sirio-control.sirio-is-pending fieldset{background-image:var(--sirio-spinner-blue);background-repeat:no-repeat;background-position:right .9375rem top 1rem;background-size:1rem;padding-right:2.25rem}\n", ":root{--dynamiclist-border: 1px solid #ccc}.dynamiclist-no-data{text-align:center;padding:20px;font-style:italic;border:var(--dynamiclist-border)}.dynamiclist-table{width:100%;border-collapse:collapse;border:none}.dynamiclist-table.main{border:var(--dynamiclist-border)}.dynamiclist-table.main .dynamiclist-table{border-left:var(--dynamiclist-border);border-bottom:var(--dynamiclist-border)}.dynamiclist-table td{border:var(--dynamiclist-border)}.dynamiclist-table tr:first-child td{border-top:none}.dynamiclist-table tr:last-child td{border-bottom:none}.dynamiclist-table tr td:first-child{border-left:none}.dynamiclist-table tr td:last-child{border-right:none}.dynamiclist-table td.content-cell{width:100%;padding-left:8px;padding-right:8px;border-left:var(--dynamiclist-border)}.dynamiclist-table td.content-cell .group-outline-repeat{margin-bottom:0}.dynamiclist-table td.command-cell{vertical-align:middle}.dynamiclist-table td.command-cell>div{display:flex;justify-content:right}.dynamiclist-table td.recursion-cell .layout{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;width:100%;height:100%}.dynamiclist-table td.recursion-cell .recursion-toggle{grid-row:1 / span 2;grid-column:1;background-color:#f5f5f5;align-items:center}.dynamiclist-table td.recursion-cell .recursion-title{grid-row:1;grid-column:2;background:#f5f5f5;display:flex;align-items:center;min-height:34px}.dynamiclist-table td.recursion-cell .recursion-title .recursion-text{flex:1;text-align:center}.dynamiclist-table td.recursion-cell .recursion-title .recursion-add{margin-left:auto}.dynamiclist-table td.recursion-cell .recursion-content{grid-row:2;grid-column:2}.dynamiclist-table td.recursion-cell .recursion-content .is-open{overflow:visible!important}.dynamiclist-table ngx-sirio-button button{padding:7px}\n", ".df-field-dynamiclist .sirio-pagination{width:100%;background-color:#f2f6fc;margin:0}.df-field-dynamiclist .sirio-pagination-page{background-color:#f2f6fc}.df-field-dynamiclist .sirio-pagination-cursor{margin-left:0}.df-field-dynamiclist .actions{margin-left:auto}\n", ".datetime-container{display:flex;gap:8px;align-items:flex-end}.datetime-container{display:flex;gap:8px}.datetime-container ngx-sirio-datepicker{flex:1}.datetime-container ngx-sirio-timepicker{flex:1}.datetime-container+.sirio-form-feedback{color:#aa224f;display:inline-block}\n", ".sirio-tab.sirio-tab-vertical .sirio-tab-item{width:100%}\n", ".sirio-tooltip .sirio-tooltip-body{white-space:pre-line}\n"], dependencies: [{ kind: "component", type: DynamicFieldsComponent, selector: "app-dynamic-fields", inputs: ["form", "rows", "formGroup", "alignment", "readOnly", "recursionLevel", "identity", "identityIndex"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i15.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i15.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i15.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i15.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i15.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i15.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i16.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i16.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i16.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i16.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i16.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i16.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i16.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i16.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i16.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AdornerDirective, selector: "[prefixAdorner], [suffixAdorner]", inputs: ["prefixAdorner", "suffixAdorner"] }, { kind: "directive", type: ReadOnlyDirective, selector: "[readonly]", inputs: ["readonly", "placeholder", "componentRef", "properties"] }, { kind: "directive", type: DisplayDirective, selector: "[hide], [show]", inputs: ["hide", "show"] }, { kind: "directive", type: FrameSecurityDirective, selector: "[frameSecurity]", inputs: ["frameSecurity"] }, { kind: "directive", type: ValidationPatchDirective, selector: "[validation]" }, { kind: "directive", type: DropdownDirective, selector: "[dropdown]" }, { kind: "directive", type: UpdateBlurDirective, selector: "[updateBlur]" }, { kind: "directive", type: RepeatDirective, selector: "[repeat], [allowAddRemove]", inputs: ["repeat", "allowAddRemove"] }, { kind: "directive", type: RecursionDirective, selector: "[recursion]", inputs: ["formGroup", "recursion"], exportAs: ["recursion"] }, { kind: "directive", type: TabDirective, selector: "[tabCount]", inputs: ["tabCount"] }, { kind: "directive", type: GridDirective, selector: "[rowSource], [columnDefs], [selectable], [multiSelect], [suppressActions]", inputs: ["rowSource", "columnDefs", "selectable", "multiSelect", "suppressActions", "formGroup", "register"] }, { kind: "directive", type: ChangeDirective, selector: "[observe]", inputs: ["observe", "callback"] }, { kind: "directive", type: RegisterDirective, selector: "[register]", inputs: ["register", "componentRef"] }, { kind: "directive", type: RefreshDirective, selector: "[refresh]", inputs: ["refresh", "componentRef"] }, { kind: "directive", type: AccordionDirective, selector: "[accordionCount]", inputs: ["accordionCount"] }, { kind: "directive", type: DateDirective, selector: "[isoDate]" }, { kind: "directive", type: NumberDirective, selector: "[number]", inputs: ["defaultValue", "minimum", "maximum", "decimalDigits"] }, { kind: "directive", type: TextDirective, selector: "[textcase], [maxlength]", inputs: ["textcase", "maxlength"] }, { kind: "directive", type: ValueSyncDirective, selector: "[valueSync]", inputs: ["valueSync"] }, { kind: "directive", type: TabControlDirective, selector: "[tabControl]" }, { kind: "directive", type: TabItemDirective, selector: "[tabItem]", inputs: ["componentRef", "disabled"] }, { kind: "directive", type: CollapseDirective, selector: "[collapse]", inputs: ["collapse"] }, { kind: "directive", type: AccordionPanelDirective, selector: "[accordionPanel]" }, { kind: "directive", type: CollapsePatchDirective, selector: "[collapseExtension]", exportAs: ["collapseExtension"] }, { kind: "directive", type: DateTimeCoordinatorDirective, selector: "[dateTimeCoordinator]", inputs: ["datePicker", "timePicker"] }, { kind: "directive", type: DateTimeValidationDirective, selector: "[dateTimeValidator]", inputs: ["isWarning", "showWhenValid"] }, { kind: "directive", type: AlertDirective, selector: "[preventClose]", inputs: ["preventClose"] }, { kind: "directive", type: RequiredOnInputDirective, selector: "[requiredOnInput]", inputs: ["requiredOnInput"] }, { kind: "component", type: SirioInputComponent, selector: "ngx-sirio-input", inputs: ["disabledState", "value", "label", "labelPopover", "ariaLabelPopoverButton", "type", "name", "placeholder", "textHelp", "textFeedback", "rows", "cols", "ariaLabel", "ariaAutocomplete", "ariaInvalid", "ariaDescribedBy", "role"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent"] }, { kind: "component", type: SirioSelectComponent, selector: "ngx-sirio-select", inputs: ["placeholder", "disabledState", "value", "label", "labelPopover", "ariaLabelPopoverButton", "isMultiple", "textHelp", "textFeedback", "ariaLabel", "ariaInvalid", "ariaDescribedBy"], outputs: ["focusEvent", "blurEvent", "keydownEvent"] }, { kind: "component", type: SirioSelectOptionComponent, selector: "ngx-sirio-select-option", inputs: ["value"], outputs: ["optionSelected", "blurEvent"] }, { kind: "component", type: SirioSelectPanelComponent, selector: "ngx-sirio-select-panel", outputs: ["optionSelected", "panelOpened", "panelClosed"] }, { kind: "component", type: SirioCheckboxGroupComponent, selector: "ngx-sirio-checkbox-group", inputs: ["textHelp", "textFeedback", "label", "labelPopover", "ariaLabelPopoverButton", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioCheckboxComponent, selector: "ngx-sirio-checkbox", inputs: ["disabled", "name", "textHelp", "textFeedback", "value", "ariaInvalid", "ariaDescribedBy", "disabledState", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioDatepickerComponent, selector: "ngx-sirio-datepicker", inputs: ["name", "placeholder", "textHelp", "textFeedback", "label", "labelPopover", "ariaLabelPopoverButton", "ariaLabel", "ariaAutocomplete", "ariaInvalid", "ariaDescribedBy", "value", "disabledState"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent", "datechangeEvent"] }, { kind: "component", type: SirioTimepickerComponent, selector: "ngx-sirio-timepicker", inputs: ["name", "label", "labelPopover", "ariaLabelPopoverButton", "placeholder", "textHelp", "textFeedback", "ariaLabel", "ariaAutocomplete", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent"] }, { kind: "component", type: SirioRadioGroupComponent, selector: "ngx-sirio-radio-group", inputs: ["label", "labelPopover", "ariaLabelPopoverButton", "textHelp", "textFeedback", "items", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioRadioButtonComponent, selector: "ngx-sirio-radio-button", inputs: ["disabledState", "label", "name", "textHelp", "textFeedback", "ariaInvalid", "ariaDescribedBy", "value", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioTabComponent, selector: "ngx-sirio-tab", inputs: ["isVertical", "isNavLine", "leftArrowLabel", "rightArrowLabel", "tabActive"], outputs: ["tabChange"] }, { kind: "component", type: SirioTabItemComponent, selector: "ngx-sirio-tab-item", inputs: ["label", "disabled", "icon"] }, { kind: "component", type: SirioAccordionComponent, selector: "ngx-sirio-accordion", inputs: ["dark"] }, { kind: "component", type: SirioAccordionPanelComponent, selector: "ngx-sirio-accordion-panel", inputs: ["active", "disabled"], outputs: ["opened", "closed"] }, { kind: "component", type: SirioAccordionHeaderComponent, selector: "ngx-sirio-accordion-header" }, { kind: "component", type: SirioAccordionBodyComponent, selector: "ngx-sirio-accordion-body" }, { kind: "component", type: SirioButtonComponent, selector: "ngx-sirio-button", inputs: ["ariaExpanded", "ariaControls", "ariaActivedescendant", "ariaHaspopup", "ariaLabel", "ariaRequired", "ariaInvalid", "ariaDescribedby", "icon", "title", "role", "color", "isFloating", "isExtended", "isLight", "isSmall", "disabled", "isDropdown", "type", "dismissType", "isBtnBlock"], outputs: ["clickEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: SirioFileUploadComponent, selector: "ngx-sirio-file-upload", inputs: ["multiple", "color", "accept", "maxFiles", "showFilelist", "label", "labelPopover", "ariaLabelPopoverButton", "name", "textHelp", "textFeedback", "ariaLabel", "ariaLabelDeleteFileButton", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "fileUploadedEvent", "fileDeletedEvent", "uploadErrorEvent", "blurEvent"] }, { kind: "component", type: SirioToggleComponent, selector: "ngx-sirio-toggle", inputs: ["name", "textHelp", "textFeedback", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioChipCheckboxGroupComponent, selector: "ngx-sirio-chip-checkbox-group", inputs: ["label", "labelPopover", "ariaLabelPopoverButton", "textHelp", "textFeedback", "items", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioChipRadioGroupComponent, selector: "ngx-sirio-chip-radio-group", inputs: ["label", "labelPopover", "ariaLabelPopoverButton", "textHelp", "textFeedback", "items", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioInputChipComponent, selector: "ngx-sirio-input-chip", inputs: ["disabledState", "name", "textHelp", "textFeedback", "value", "ariaInvalid", "ariaDescribedBy", "type", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioAlertComponent, selector: "ngx-sirio-alert", inputs: ["type", "labelClose", "isVisible"], outputs: ["closeEvent"] }, { kind: "component", type: SirioAlertMessageComponent, selector: "ngx-sirio-alert-message" }, { kind: "component", type: SirioSliderComponent, selector: "ngx-sirio-slider", inputs: ["disabledState", "value", "label", "labelPopover", "ariaLabelPopoverButton", "description", "min", "max", "ariaInvalid", "ariaDescribedBy", "textHelp", "textFeedback"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent"] }, { kind: "component", type: SirioNotifyComponent, selector: "ngx-sirio-notify", inputs: ["isDark"] }, { kind: "component", type: SirioNotifyBodyComponent, selector: "ngx-sirio-notify-body", inputs: ["title"] }, { kind: "directive", type: SirioTooltipDirective, selector: "[sirioTooltip]", inputs: ["sirioTooltip", "content", "hasAction", "hasPopover", "actionLabel", "actionIconClass", "clickOutside", "position", "customTemplate"], outputs: ["clickEvent"] }, { kind: "component", type: SirioCollapseComponent, selector: "ngx-sirio-collapse", inputs: ["isOpen"], outputs: ["opened", "closed"] }, { kind: "directive", type: SirioCollapseTriggerDirective, selector: "[ngxSirioCollapseTrigger]", inputs: ["id", "ngxSirioCollapseTrigger"] }, { kind: "component", type: TemplateWrapperComponent, selector: "app-template-wrapper", inputs: ["template", "context"] }, { kind: "component", type: DynamicHostComponent, selector: "app-dynamic-host", inputs: ["register", "properties", "formGroup"] }, { kind: "component", type: AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "enableStrictPivotColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressMoveWhenColumnDragging", "suppressDragLeaveHidesColumns", "suppressGroupChangesColumnVisibility", "suppressMakeColumnVisibleAfterUnGroup", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "findSearchValue", "findOptions", "quickFilterText", "cacheQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "alwaysPassFilter", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "suppressSetFilterByDefault", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressTouch", "suppressFocusAfterRefresh", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "loading", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "cellFlashDuration", "cellFadeDuration", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableCellSpan", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "dragAndDropImageComponent", "dragAndDropImageComponentParams", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupHideParentOfSingleChild", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "treeData", "treeDataChildrenField", "treeDataParentIdField", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "enableRowPinning", "isRowPinnable", "isRowPinned", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "cellSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "selectionColumnDef", "rowNumbers", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "enableGroupEdit", "initialState", "theme", "loadThemeGoogleFonts", "themeCssLayer", "styleNonce", "themeStyleContainer", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "focusGridInnerElement", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "cellSelectionDeleteStart", "cellSelectionDeleteEnd", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "findChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "dragCancelled", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "rowDragCancel", "rowResizeStarted", "rowResizeEnded", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "pinnedRowsChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "headerFocused", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "cellSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged"] }, { kind: "component", type: AgCharts, selector: "ag-charts", inputs: ["options"], outputs: ["onChartReady"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
680
|
+
], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"getFormClass()\">\r\n <ng-container *ngFor=\"let row of rows\" [formGroup]=\"formGroup\">\r\n <div class=\"row field-set\">\r\n <ng-container *ngFor=\"let component of row.components\">\r\n <ng-container [ngSwitch]=\"component.type\">\r\n <div [ngClass]=\"getComponentClass(component)\"\r\n [style]=\"getComponentStyle(component)\">\r\n <div [hide]=\"evaluateBoolean(component.conditional?.hide)\"\r\n [show]=\"evaluateBoolean(component.conditional?.show)\">\r\n <!-- #region textfield -->\r\n <ng-container *ngSwitchCase=\"'textfield'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"text\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textfield\r\n [register]=\"component\"\r\n [componentRef]=\"textfield\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region select -->\r\n <ng-container *ngSwitchCase=\"'select'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n dropdown\r\n [valueSync]=\"component.valueSync\"\r\n #select\r\n [register]=\"component\"\r\n [componentRef]=\"select\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-input *ngIf=\"component.searchable\" class=\"searchable\" type=\"text\" [placeholder]=\"locale(Texts, 'TypeToSearch')\"></ngx-sirio-input>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region taglist -->\r\n <ng-container *ngSwitchCase=\"'taglist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [isMultiple]=\"true\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #taglist\r\n [register]=\"component\"\r\n [componentRef]=\"taglist\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region number -->\r\n <ng-container *ngSwitchCase=\"'number'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"number\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n number\r\n [defaultValue]=\"evaluateNumber(component.defaultValue)\"\r\n [minimum]=\"evaluateNumber(component.minimum)\"\r\n [maximum]=\"evaluateNumber(component.maximum)\"\r\n [decimalDigits]=\"evaluateNumber(component.decimalDigits)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #number\r\n [register]=\"component\"\r\n [componentRef]=\"number\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n isoDate\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #date\r\n [register]=\"component\"\r\n [componentRef]=\"date\">\r\n </ngx-sirio-datepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #time\r\n [register]=\"component\"\r\n [componentRef]=\"time\">\r\n </ngx-sirio-timepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <div [formControlName]=\"component.key\"\r\n dateTimeCoordinator\r\n dateTimeValidator\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [datePicker]=\"date\"\r\n [timePicker]=\"time\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [valueSync]=\"component.valueSync\"\r\n #datetime\r\n [register]=\"component\"\r\n [componentRef]=\"datetime\"\r\n class=\"datetime-container\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n isoDate\r\n #date>\r\n </ngx-sirio-datepicker>\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n #time>\r\n </ngx-sirio-timepicker>\r\n </div>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region toggle -->\r\n <ng-container *ngSwitchCase=\"'toggle'\">\r\n <ngx-sirio-toggle [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #toggle\r\n [register]=\"component\"\r\n [componentRef]=\"toggle\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-toggle>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-checkbox>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipradio\r\n [register]=\"component\"\r\n [componentRef]=\"chipradio\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"radio\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #radio\r\n [register]=\"component\"\r\n [componentRef]=\"radio\">\r\n <ngx-sirio-radio-button *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-radio-button>\r\n </ngx-sirio-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checklist -->\r\n <ng-container *ngSwitchCase=\"'checklist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipcheckbox\r\n [register]=\"component\"\r\n [componentRef]=\"chipcheckbox\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"checkbox\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n <ngx-sirio-checkbox *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-checkbox>\r\n </ngx-sirio-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region textarea -->\r\n <ng-container *ngSwitchCase=\"'textarea'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"textarea\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textarea\r\n [register]=\"component\"\r\n [componentRef]=\"textarea\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region filepicker -->\r\n <ng-container *ngSwitchCase=\"'filepicker'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-file-upload [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [accept]=\"getMimeTypes(component.accept)\"\r\n [multiple]=\"evaluateBoolean(component.multiple)\"\r\n (fileUploadedEvent)=\"fileUploaded($event)\"\r\n [showFilelist]=\"!component.showDetails\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #filepicker\r\n [register]=\"component\"\r\n [componentRef]=\"filepicker\">\r\n <span class=\"fas fa-arrow-up\" aria-hidden=\"true\"></span>\r\n {{ locale(Texts, 'Upload') }}\r\n </ngx-sirio-file-upload>\r\n </div>\r\n <ng-container *ngIf=\"component.showDetails\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formGroup\"\r\n [rows]=\"createUploadTables(component)\"\r\n contextId=\"fileList\"></app-dynamic-fields>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region range -->\r\n <ng-container *ngSwitchCase=\"'range'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-slider [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [min]=\"evaluateNumber(component.range?.min) ?? 0\"\r\n [max]=\"evaluateNumber(component.range?.max) ?? 0\"\r\n [valueSync]=\"component.valueSync\"\r\n #range\r\n [register]=\"component\"\r\n [componentRef]=\"range\">\r\n </ngx-sirio-slider>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region displayfield -->\r\n <ng-container *ngSwitchCase=\"'displayfield'\">\r\n <div class=\"sirio-control\"\r\n [ngClass]=\"[getTextAlignment(component), getLightView(component) ]\"\r\n #displayfield\r\n [register]=\"component\"\r\n [componentRef]=\"displayfield\">\r\n <div *ngIf=\"component.label\" class=\"sirio-label\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <button *ngIf=\"component.tooltip\"\r\n sirioTooltip\r\n [content]=\"component.tooltip\"\r\n [hasPopover]=\"true\"\r\n [attr.aria-label]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n class=\"sirio-label-popover fas fa-info-circle\"></button>\r\n </div>\r\n <div class=\"sirio-form-control data-display\" [ngClass]=\"component.fieldtype\">\r\n <ng-container [ngSwitch]=\"component.fieldtype\">\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <i *ngIf=\"evaluate(component.expression)\" class=\"fas fa-check\"></i>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <ng-container *ngTemplateOutlet=\"formattedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"defaultTemplate\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultTemplate>\r\n <ng-container *ngIf=\"supportValues(component) && hasValues(component); else simpleTemplate\">\r\n <ng-container *ngIf=\"getValues(component) | async as values\">\r\n {{ toLabel(evaluate(component.expression), values) }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #simpleTemplate>\r\n {{ evaluate(component.expression) }}\r\n </ng-template>\r\n <ng-template #formattedTemplate>\r\n <div class=\"text-paragraph\" style=\"margin-top: -6px;\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(component.expression))\">\r\n </div>\r\n </ng-template>\r\n </div>\r\n <p *ngIf=\"component.description\" class=\"sirio-helper-text\">\r\n {{ evaluateString(locale(component, 'description')) }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region dynamiclist -->\r\n <ng-container *ngSwitchCase=\"'dynamiclist'\">\r\n <ng-container *ngIf=\"resolvePath(component.path) as formGroup\">\r\n <ng-container [formGroup]=\"formGroup\">\r\n <ng-container [formArrayName]=\"component.key\"\r\n [formGroup]=\"formGroup\"\r\n [recursion]=\"component\"\r\n #recursion=\"recursion\"\r\n [repeat]=\"evaluateNumber(component.repetitions)\"\r\n [allowAddRemove]=\"evaluateBoolean(component.allowAddRemove)\">\r\n <p *ngIf=\"component.description\">{{ evaluateString(locale(component, 'description')) }}</p>\r\n <ng-container *ngIf=\"getFormArray(resolvePath(component.path).get(component.key)) as formArray\">\r\n <ng-container *ngIf=\"component.subtype == 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"navigation; context: { formArray: formArray }\"></ng-container>\r\n </ng-container> \r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclisttab\">\r\n <ngx-sirio-tab [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [tabCount]=\"formArray.controls.length\"\r\n #dynamiclisttab>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\">\r\n <ng-container *ngIf=\"i === dynamiclisttab.activeIndex\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclistaccordion\">\r\n <ngx-sirio-accordion [accordionCount]=\"formArray.controls.length\"\r\n #dynamiclistaccordion>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-accordion-panel #panel accordionPanel>\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <ng-container *ngIf=\"panel.panelIsOpen\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <table class=\"dynamiclist-table\" [ngClass]=\"{ 'main': recursionLevel == 0 }\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"getFormGroup(item) as formItem\">\r\n <ng-container *ngIf=\"{ itemsArray: recursion.getItemsArray(formItem) } as recursionData\">\r\n <tr>\r\n <td class=\"content-cell\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true && component.subtype !== 'table', 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formItem\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"command-cell\">\r\n <div>\r\n <ng-container *ngIf=\"recursionData.itemsArray\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: recursionData.itemsArray, compact: true }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"recursionData.itemsArray && recursionData.itemsArray.length > 0\">\r\n <td colspan=\"2\" class=\"recursion-cell\">\r\n <div class=\"layout\">\r\n <div class=\"recursion-toggle\">\r\n <ngx-sirio-button [ngxSirioCollapseTrigger]=\"collapseTemplate\"\r\n [color]=\"null\" [icon]=\"collapse.isOpen ? 'fas fa-chevron-down' : 'fas fa-chevron-right' \" />\r\n </div>\r\n <div *ngIf=\"!collapse.isOpen\" class=\"recursion-title\">\r\n <div class=\"recursion-text\">\r\n <ng-container *ngIf=\"!collapse.isOpen\">\r\n {{ recursionData.itemsArray.length }} elementi presenti\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"recursion-content\">\r\n <ngx-sirio-collapse #collapseTemplate\r\n #collapse=\"collapseExtension\"\r\n collapseExtension>\r\n <div *ngIf=\"collapse.isOpen\" style=\"margin-bottom: -11px;\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"recursion.getFormGroup(formItem)\"\r\n [readOnly]=\"readOnly\"\r\n [recursionLevel]=\"recursionLevel+1\"\r\n [rows]=\"recursion.getComponentRows()\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ngx-sirio-collapse>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigation -->\r\n <ng-container *ngSwitchCase=\"'navigation'\">\r\n <div>\r\n <ng-container *ngIf=\"formArray.controls[navigationIndex] as item\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (navigationIndex + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"component.allowAddRemove || component.allowReorder\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length == 0\">\r\n <div class=\"dynamiclist-no-data\">{{ evaluateString(locale(component, 'noDataText')) || locale(Texts, 'NoData') }}</div>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"feedback\"></ng-container>\r\n <ng-container *ngIf=\"recursionLevel == 0 && component.subtype !== 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #region templates -->\r\n <ng-template #btnMoveUp let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveUp') as upLabel\">\r\n <ngx-sirio-button (click)=\"moveUpItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"upLabel\"\r\n [title]=\"upLabel\"\r\n [color]=\"null\" icon=\"fas fa-arrow-up\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ upLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnMoveDown let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveDown') as downLabel\">\r\n <ngx-sirio-button (click)=\"moveDownItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"downLabel\"\r\n [title]=\"downLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-arrow-down\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ downLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <ngx-sirio-button (click)=\"removeItem(formArray, i, true)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"removeLabel\"\r\n [title]=\"removeLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-trash\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ removeLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <ngx-sirio-button (click)=\"addItem(formArray)\"\r\n class=\"add-item\"\r\n [ariaLabel]=\"addLabel\"\r\n [title]=\"addLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-plus\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ addLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsReorder let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowReorder\">\r\n <ng-container *ngTemplateOutlet=\"btnMoveUp; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"btnMoveDown; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { formArray: formArray, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #feedback>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <div>\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <div>\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #navigation let-formArray=\"formArray\" > \r\n <nav class=\"sirio-pagination\">\r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <div class=\"sirio-pagination-page\">\r\n <select class=\"sirio-form-control\"\r\n [(ngModel)]=\"navigationIndex\"\r\n [ngModelOptions]=\"{ standalone: true }\">\r\n <option *ngFor=\"let _ of formArray.controls; let i = index\" [ngValue]=\"i\">\r\n {{ i + 1 }}\r\n </option>\r\n </select>\r\n {{ locale(Texts, 'Of') }}\r\n <span>{{ formArray.controls.length }}</span> {{ locale(Texts, 'Elements') }}\r\n </div>\r\n <div class=\"sirio-pagination-cursor\">\r\n <ul class=\"sirio-pagination-list\">\r\n <li [class.disabled]=\"navigationIndex == 0\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, -1)\"\r\n [title]=\"locale(Texts, 'PreviousElement')\"\r\n [class.disabled]=\"navigationIndex == 0\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-left\"></span>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, 1)\"\r\n [title]=\"locale(Texts, 'NextElement')\"\r\n [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-right\"></span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container> \r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && navigationIndex != -1\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: navigationIndex }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </nav>\r\n </ng-template>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region group -->\r\n <ng-container *ngSwitchCase=\"'group'\">\r\n <div [ngClass]=\"getGroupOutline(component)\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container> \r\n <div #group\r\n [register]=\"component\"\r\n [componentRef]=\"group\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-tab #tab\r\n [register]=\"component\"\r\n [componentRef]=\"tab\"\r\n [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [isNavLine]=\"component.navigation\"\r\n [isVertical]=\"component.vertical\"\r\n tabControl>\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(panel, 'label'))\"\r\n [icon]=\"evaluateString(panel.icon)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled) ?? false\"\r\n #tabPanel\r\n tabItem\r\n [componentRef]=\"tab\"\r\n *ngIf=\"evaluateConditional(panel.conditional)\">\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <div *ngIf=\"tabPanel.isActive\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [disableAutoFocus]=\"template?.disableAutoFocus\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-accordion #accordion\r\n [register]=\"component\"\r\n [componentRef]=\"accordion\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-accordion-panel *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled)\">\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(panel, 'label'))\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <div>\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [disableAutoFocus]=\"template?.disableAutoFocus\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </div>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion> \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [collapse]=\"component.collapseTo\"\r\n #text\r\n [register]=\"component\"\r\n [componentRef]=\"text\">\r\n <!--Reset View Context-->\r\n <div tabindex=\"0\" style=\"display:none\"></div>\r\n <div class=\"flex\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n <ng-container *ngIf=\"component.tooltip\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [attr.aria-label]=\"locale(Texts, 'Information')\"\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'tooltip')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region html -->\r\n <ng-container *ngSwitchCase=\"'html'\">\r\n <div class=\"html-paragraph\"\r\n [innerHTML]=\"sanitize(evaluateTemplate(locale(component, 'content')))\"\r\n #html\r\n [register]=\"component\"\r\n [componentRef]=\"html\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region image -->\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <img [src]=\"evaluateString(component.source)\"\r\n [alt]=\"evaluateString(locale(component, 'alt'))\"\r\n style=\"width: 100%;height: 100%;\"\r\n #image\r\n [register]=\"component\"\r\n [componentRef]=\"image\">\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-grid-angular [modules]=\"getGridModules(component)\"\r\n [gridOptions]=\"getGridOptions(component)\"\r\n [selectable]=\"evaluateBoolean(component.selectable)\"\r\n [multiSelect]=\"evaluateBoolean(component.multiSelect)\"\r\n (selectionChanged)=\"onGridSelectionChanged(component, $event)\"\r\n [suppressActions]=\"evaluateBoolean(component.suppressActions)\"\r\n [columnDefs]=\"component.columns || evaluate(component.columnsExpression) || []\"\r\n [rowSource]=\"getRowSource(component)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [style.height]=\"component.autoHeight ? null : evaluateHeight(component.height)\"\r\n [formGroup]=\"formGroup\"\r\n #table\r\n [register]=\"component\"\r\n [componentRef]=\"table\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region button -->\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-button (clickEvent)=\"clickButton(component, $event)\"\r\n [color]=\"evaluateColor(component.color)\"\r\n [disabled]=\"evaluateBoolean(component.disabled)\"\r\n #button\r\n [register]=\"component\"\r\n [componentRef]=\"button\">\r\n <ng-container *ngIf=\"evaluateString(component.icon) as icon; else noIcon\">\r\n <span *ngIf=\"component.iconPosition!='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <span *ngIf=\"component.iconPosition=='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n <ng-template #noIcon>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ng-template>\r\n </ngx-sirio-button>\r\n </div> \r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region separator -->\r\n <ng-container *ngSwitchCase=\"'separator'\">\r\n <div class=\"separator\"\r\n #separator\r\n [register]=\"component\"\r\n [componentRef]=\"separator\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region spacer -->\r\n <ng-container *ngSwitchCase=\"'spacer'\">\r\n <div style=\"width: 100%\"\r\n [style.height.px]=\"component.height\"\r\n #spacer\r\n [register]=\"component\"\r\n [componentRef]=\"spacer\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region iframe -->\r\n <ng-container *ngSwitchCase=\"'iframe'\">\r\n <label [for]=\"component.id\">{{ evaluateString(locale(component, 'label')) }}</label>\r\n <iframe [src]=\"evaluateUrl(component.url)\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [style.width]=\"'100%'\"\r\n [style.height.px]=\"component.height\"\r\n [frameSecurity]=\"component.security\"\r\n #iframe\r\n [register]=\"component\"\r\n [componentRef]=\"iframe\">\r\n </iframe>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region alert -->\r\n <ng-container *ngSwitchCase=\"'alert'\">\r\n <ngx-sirio-alert [type]=\"component.role\"\r\n [labelClose]=\"locale(Texts, 'Close')\"\r\n [preventClose]=\"evaluateBoolean(component.preventClose)\"\r\n #alert\r\n [register]=\"component\"\r\n [componentRef]=\"alert\">\r\n <ngx-sirio-alert-message>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-alert-message>\r\n </ngx-sirio-alert>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region notice -->\r\n <ng-container *ngSwitchCase=\"'notice'\">\r\n <ngx-sirio-notify #notice\r\n [register]=\"component\"\r\n [componentRef]=\"notice\">\r\n <ngx-sirio-notify-body [title]=\"evaluateString(locale(component, 'title'))\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-notify-body>\r\n </ngx-sirio-notify>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tooltip -->\r\n <ng-container *ngSwitchCase=\"'tooltip'\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"\r\n #tooltip\r\n [register]=\"component\"\r\n [componentRef]=\"tooltip\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <p *ngIf=\"component.title\" class=\"sirio-tooltip-heading sirio-space-down\">\r\n {{ evaluateString(locale(component, 'title')) }}\r\n </p>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region chart -->\r\n <ng-container *ngSwitchCase=\"'chart'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-charts [options]=\"(getChartOptions(component) | async) ?? {}\"\r\n [observe]=\"getChartData(component)\"\r\n [callback]=\"invalidateChart(component)\"\r\n [style.height.px]=\"component.height\"\r\n #chart\r\n [register]=\"component\"\r\n [componentRef]=\"chart\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region component -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <ng-container *ngIf=\"component.isInput; else noInputTemplate\">\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n <ng-template #noInputTemplate>\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n", styles: [".flex{display:flex}.field-set{align-items:start}.field-set>.col-host>*{margin-bottom:10px}.separator{border-bottom:2px solid #d9e4f7;width:100%;margin:10px 0}.group-outline{border:1px solid #d9e4f7;padding:15px;margin-top:2px;margin-bottom:2px}.group-outline-repeat{margin-top:8px;margin-bottom:8px}.valign-start>.row{align-items:start}.valign-center>.row{align-items:center}.valign-end>.row{align-items:end}.component-start{align-self:start}.component-center{align-self:center}.component-end{align-self:end}.text-paragraph p{margin-bottom:0!important}.sirio-tab.sirio-tab-vertical .sirio-tab-body{margin-left:10px;margin-right:10px}.sirio-tab:not(.sirio-tab-vertical) .sirio-tab-body{margin-top:10px;margin-bottom:10px}.sirio-label{cursor:default}.sirio-control.is-disabled .sirio-input-group .sirio-input-group-text,.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{border:0px}.sirio-control.is-readonly .sirio-form-control{background-color:#fff!important;color:#454d56}.sirio-form-control[type=number]:disabled{background-image:none}ngx-sirio-alert.prevent-close .sirio-alert-close{display:none}.col-host .sirio-accordion .sirio-accordion-body .sirio-accordion-content{padding:16px}.col-host .sirio-accordion-body{overflow:unset!important}.sirio-dialog-title{display:flex;margin-top:0}.sirio-dialog-title span{margin-right:10px;margin-bottom:0!important}.ag-header-cell.hide-filter .ag-header-cell-filter-button{display:none}.sirio-tab.sirio-tab-scroll{display:block}.sirio-dropdown .searchable{position:absolute;width:100%;display:none;left:0}.ag-cell-value .btn-small-group{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.ag-cell-value .btn-small .sirio-btn{padding:.25rem .0625rem;margin:2px}.ag-selection-checkbox .ag-checkbox-input-wrapper.ag-disabled{display:none}ag-charts{display:block;height:100%;border-radius:8px;background-color:var(--chart-bg);border:1px solid var(--chart-border);overflow:hidden}.ag-cell.cell-component{padding:1px}.ag-cell.row-numbers-cell{text-align:center;background:#f2f6fc}.ag-header-cell.row-numbers-header .ag-header-cell-label{justify-content:center;text-align:center}.ag-cell-auto-height .ag-cell-value{line-height:normal}\n", ".sirio-control.ng-invalid .sirio-form-feedback,.sirio-display-feedback{color:#aa224f;display:inline-block}.sirio-control.ng-invalid .sirio-input-group-text{color:#aa224f;border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label{color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label:before,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label{color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:before,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:after,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:after{background-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-upload.sirio-is-invalid button{background-color:#aa224f;border-color:#aa224f}\n", ".sirio-control.text-left input.sirio-form-control,.sirio-control.text-left textarea.sirio-form-control,.sirio-control.text-left div.sirio-form-control{text-align:left}.sirio-control.text-center input.sirio-form-control,.sirio-control.text-center textarea.sirio-form-control,.sirio-control.text-center div.sirio-form-control{text-align:center}.sirio-control.text-right input.sirio-form-control,.sirio-control.text-right textarea.sirio-form-control,.sirio-control.text-right div.sirio-form-control{text-align:right}.sirio-control.text-center input.sirio-datepicker,.sirio-control.text-center input.sirio-timepicker,.sirio-control.text-right input.sirio-datepicker,.sirio-control.text-right input.sirio-timepicker{padding-right:40px}.horizontal-left{display:flex;justify-content:left}.horizontal-center{display:flex;justify-content:center}.horizontal-right{display:flex;justify-content:right}.horizontal-fill button{width:100%}.horizontal-left legend,.horizontal-center legend,.horizontal-right legend,.horizontal-fill legend{float:none}.col-host.component-center ngx-sirio-toggle .sirio-form-toggle label{margin-bottom:0}\n", ".sirio-control .sirio-form-control.data-display{border-color:#e3e5e8}.sirio-control .sirio-form-control.data-display.textarea{white-space:pre;overflow:auto;height:auto;line-height:140%;min-height:3rem;padding:1rem}.sirio-control .sirio-form-control.data-display.text,.sirio-control .sirio-form-control:hover.data-display.text{overflow:auto;height:auto;margin-top:-6px;color:#454d56}.sirio-control .sirio-form-control.data-display.number{font-family:Roboto Mono,monospace}.sirio-control .sirio-form-control.data-display.checkbox{display:flex;justify-content:center;align-items:center}\n", ".sirio-control.light-readonly label:hover,.sirio-control.light-view div.sirio-label:hover{color:#454d56}.sirio-control.light-readonly input.sirio-form-control,.sirio-control.light-readonly .sirio-dropdown .sirio-dropdown-select,.sirio-control.light-readonly textarea.sirio-form-control,.sirio-control.light-view div.sirio-form-control{background:none!important;border:0px;padding-left:0}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{background:none}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text span{color:#5b6571}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text.prefix{padding-left:0}.sirio-upload.sirio-control.light-readonly label,.sirio-upload.sirio-control.is-disabled label{pointer-events:none}\n", ":root{--sirio-spinner-blue: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='%2300368F' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\");--sirio-spinner-white: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='white' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\")}.sirio-control .sirio-is-pending,.sirio-control.sirio-is-pending input.sirio-form-control,.sirio-control.sirio-is-pending .sirio-dropdown .sirio-form-control,.sirio-form-check.sirio-control.sirio-is-pending{background-image:var(--sirio-spinner-blue);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}textarea.sirio-form-control.sirio-is-pending{background-position:top .9375rem right .9375rem}.sirio-control.sirio-is-pending input.sirio-form-control{background-position:right .9375rem top 50%}.sirio-upload.sirio-control.sirio-is-pending ngx-sirio-button .sirio-btn-primary{background-image:var(--sirio-spinner-white);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}.sirio-control.sirio-is-pending fieldset{background-image:var(--sirio-spinner-blue);background-repeat:no-repeat;background-position:right .9375rem top 1rem;background-size:1rem;padding-right:2.25rem}\n", ":root{--dynamiclist-border: 1px solid #ccc}.dynamiclist-no-data{text-align:center;padding:20px;font-style:italic;border:var(--dynamiclist-border)}.dynamiclist-table{width:100%;border-collapse:collapse;border:none}.dynamiclist-table.main{border:var(--dynamiclist-border)}.dynamiclist-table.main .dynamiclist-table{border-left:var(--dynamiclist-border);border-bottom:var(--dynamiclist-border)}.dynamiclist-table td{border:var(--dynamiclist-border)}.dynamiclist-table tr:first-child td{border-top:none}.dynamiclist-table tr:last-child td{border-bottom:none}.dynamiclist-table tr td:first-child{border-left:none}.dynamiclist-table tr td:last-child{border-right:none}.dynamiclist-table td.content-cell{width:100%;padding-left:8px;padding-right:8px;border-left:var(--dynamiclist-border)}.dynamiclist-table td.content-cell .group-outline-repeat{margin-bottom:0}.dynamiclist-table td.command-cell{vertical-align:middle}.dynamiclist-table td.command-cell>div{display:flex;justify-content:right}.dynamiclist-table td.recursion-cell .layout{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;width:100%;height:100%}.dynamiclist-table td.recursion-cell .recursion-toggle{grid-row:1 / span 2;grid-column:1;background-color:#f5f5f5;align-items:center}.dynamiclist-table td.recursion-cell .recursion-title{grid-row:1;grid-column:2;background:#f5f5f5;display:flex;align-items:center;min-height:34px}.dynamiclist-table td.recursion-cell .recursion-title .recursion-text{flex:1;text-align:center}.dynamiclist-table td.recursion-cell .recursion-title .recursion-add{margin-left:auto}.dynamiclist-table td.recursion-cell .recursion-content{grid-row:2;grid-column:2}.dynamiclist-table td.recursion-cell .recursion-content .is-open{overflow:visible!important}.dynamiclist-table ngx-sirio-button button{padding:7px}\n", ".df-field-dynamiclist .sirio-pagination{width:100%;background-color:#f2f6fc;margin:0}.df-field-dynamiclist .sirio-pagination-page{background-color:#f2f6fc}.df-field-dynamiclist .sirio-pagination-cursor{margin-left:0}.df-field-dynamiclist .actions{margin-left:auto}\n", ".datetime-container{display:flex;gap:8px;align-items:flex-end}.datetime-container{display:flex;gap:8px}.datetime-container ngx-sirio-datepicker{flex:1}.datetime-container ngx-sirio-timepicker{flex:1}.datetime-container+.sirio-form-feedback{color:#aa224f;display:inline-block}\n", ".sirio-tab.sirio-tab-vertical .sirio-tab-item{width:100%}\n", ".sirio-tooltip .sirio-tooltip-body{white-space:pre-line}\n"], dependencies: [{ kind: "component", type: DynamicFieldsComponent, selector: "app-dynamic-fields", inputs: ["form", "rows", "formGroup", "alignment", "readOnly", "recursionLevel", "identity", "identityIndex", "disableAutoFocus"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i15.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i15.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i15.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i15.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i15.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i15.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i16.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i16.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i16.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i16.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i16.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i16.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i16.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i16.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i16.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i16.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i16.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AdornerDirective, selector: "[prefixAdorner], [suffixAdorner]", inputs: ["prefixAdorner", "suffixAdorner"] }, { kind: "directive", type: ReadOnlyDirective, selector: "[readonly]", inputs: ["readonly", "placeholder", "componentRef", "properties"] }, { kind: "directive", type: DisplayDirective, selector: "[hide], [show]", inputs: ["hide", "show"] }, { kind: "directive", type: FrameSecurityDirective, selector: "[frameSecurity]", inputs: ["frameSecurity"] }, { kind: "directive", type: ValidationPatchDirective, selector: "[validation]" }, { kind: "directive", type: DropdownDirective, selector: "[dropdown]" }, { kind: "directive", type: UpdateBlurDirective, selector: "[updateBlur]" }, { kind: "directive", type: RepeatDirective, selector: "[repeat], [allowAddRemove]", inputs: ["repeat", "allowAddRemove"] }, { kind: "directive", type: RecursionDirective, selector: "[recursion]", inputs: ["formGroup", "recursion"], exportAs: ["recursion"] }, { kind: "directive", type: TabDirective, selector: "[tabCount]", inputs: ["tabCount"] }, { kind: "directive", type: GridDirective, selector: "[rowSource], [columnDefs], [selectable], [multiSelect], [suppressActions]", inputs: ["rowSource", "columnDefs", "selectable", "multiSelect", "suppressActions", "formGroup", "register"] }, { kind: "directive", type: ChangeDirective, selector: "[observe]", inputs: ["observe", "callback"] }, { kind: "directive", type: RegisterDirective, selector: "[register]", inputs: ["register", "componentRef"] }, { kind: "directive", type: RefreshDirective, selector: "[refresh]", inputs: ["refresh", "componentRef"] }, { kind: "directive", type: AccordionDirective, selector: "[accordionCount]", inputs: ["accordionCount"] }, { kind: "directive", type: DateDirective, selector: "[isoDate]" }, { kind: "directive", type: NumberDirective, selector: "[number]", inputs: ["defaultValue", "minimum", "maximum", "decimalDigits"] }, { kind: "directive", type: TextDirective, selector: "[textcase], [maxlength]", inputs: ["textcase", "maxlength"] }, { kind: "directive", type: ValueSyncDirective, selector: "[valueSync]", inputs: ["valueSync"] }, { kind: "directive", type: TabControlDirective, selector: "[tabControl]", inputs: ["register"] }, { kind: "directive", type: TabItemDirective, selector: "[tabItem]", inputs: ["componentRef", "disabled"] }, { kind: "directive", type: CollapseDirective, selector: "[collapse]", inputs: ["collapse"] }, { kind: "directive", type: AccordionPanelDirective, selector: "[accordionPanel]" }, { kind: "directive", type: CollapsePatchDirective, selector: "[collapseExtension]", exportAs: ["collapseExtension"] }, { kind: "directive", type: DateTimeCoordinatorDirective, selector: "[dateTimeCoordinator]", inputs: ["datePicker", "timePicker"] }, { kind: "directive", type: DateTimeValidationDirective, selector: "[dateTimeValidator]", inputs: ["isWarning", "showWhenValid"] }, { kind: "directive", type: AlertDirective, selector: "[preventClose]", inputs: ["preventClose"] }, { kind: "directive", type: RequiredOnInputDirective, selector: "[requiredOnInput]", inputs: ["requiredOnInput"] }, { kind: "component", type: SirioInputComponent, selector: "ngx-sirio-input", inputs: ["disabledState", "value", "label", "labelPopover", "ariaLabelPopoverButton", "type", "name", "placeholder", "textHelp", "textFeedback", "rows", "cols", "ariaLabel", "ariaAutocomplete", "ariaInvalid", "ariaDescribedBy", "role"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent"] }, { kind: "component", type: SirioSelectComponent, selector: "ngx-sirio-select", inputs: ["placeholder", "disabledState", "value", "label", "labelPopover", "ariaLabelPopoverButton", "isMultiple", "textHelp", "textFeedback", "ariaLabel", "ariaInvalid", "ariaDescribedBy"], outputs: ["focusEvent", "blurEvent", "keydownEvent"] }, { kind: "component", type: SirioSelectOptionComponent, selector: "ngx-sirio-select-option", inputs: ["value"], outputs: ["optionSelected", "blurEvent"] }, { kind: "component", type: SirioSelectPanelComponent, selector: "ngx-sirio-select-panel", outputs: ["optionSelected", "panelOpened", "panelClosed"] }, { kind: "component", type: SirioCheckboxGroupComponent, selector: "ngx-sirio-checkbox-group", inputs: ["textHelp", "textFeedback", "label", "labelPopover", "ariaLabelPopoverButton", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioCheckboxComponent, selector: "ngx-sirio-checkbox", inputs: ["disabled", "name", "textHelp", "textFeedback", "value", "ariaInvalid", "ariaDescribedBy", "disabledState", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioDatepickerComponent, selector: "ngx-sirio-datepicker", inputs: ["name", "placeholder", "textHelp", "textFeedback", "label", "labelPopover", "ariaLabelPopoverButton", "ariaLabel", "ariaAutocomplete", "ariaInvalid", "ariaDescribedBy", "value", "disabledState"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent", "datechangeEvent"] }, { kind: "component", type: SirioTimepickerComponent, selector: "ngx-sirio-timepicker", inputs: ["name", "label", "labelPopover", "ariaLabelPopoverButton", "placeholder", "textHelp", "textFeedback", "ariaLabel", "ariaAutocomplete", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent"] }, { kind: "component", type: SirioRadioGroupComponent, selector: "ngx-sirio-radio-group", inputs: ["label", "labelPopover", "ariaLabelPopoverButton", "textHelp", "textFeedback", "items", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioRadioButtonComponent, selector: "ngx-sirio-radio-button", inputs: ["disabledState", "label", "name", "textHelp", "textFeedback", "ariaInvalid", "ariaDescribedBy", "value", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioTabComponent, selector: "ngx-sirio-tab", inputs: ["isVertical", "isNavLine", "leftArrowLabel", "rightArrowLabel", "tabActive"], outputs: ["tabChange"] }, { kind: "component", type: SirioTabItemComponent, selector: "ngx-sirio-tab-item", inputs: ["label", "disabled", "icon"] }, { kind: "component", type: SirioAccordionComponent, selector: "ngx-sirio-accordion", inputs: ["dark"] }, { kind: "component", type: SirioAccordionPanelComponent, selector: "ngx-sirio-accordion-panel", inputs: ["active", "disabled"], outputs: ["opened", "closed"] }, { kind: "component", type: SirioAccordionHeaderComponent, selector: "ngx-sirio-accordion-header" }, { kind: "component", type: SirioAccordionBodyComponent, selector: "ngx-sirio-accordion-body" }, { kind: "component", type: SirioButtonComponent, selector: "ngx-sirio-button", inputs: ["ariaExpanded", "ariaControls", "ariaActivedescendant", "ariaHaspopup", "ariaLabel", "ariaRequired", "ariaInvalid", "ariaDescribedby", "icon", "title", "role", "color", "isFloating", "isExtended", "isLight", "isSmall", "disabled", "isDropdown", "type", "dismissType", "isBtnBlock"], outputs: ["clickEvent", "focusEvent", "blurEvent"] }, { kind: "component", type: SirioFileUploadComponent, selector: "ngx-sirio-file-upload", inputs: ["multiple", "color", "accept", "maxFiles", "showFilelist", "label", "labelPopover", "ariaLabelPopoverButton", "name", "textHelp", "textFeedback", "ariaLabel", "ariaLabelDeleteFileButton", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "fileUploadedEvent", "fileDeletedEvent", "uploadErrorEvent", "blurEvent"] }, { kind: "component", type: SirioToggleComponent, selector: "ngx-sirio-toggle", inputs: ["name", "textHelp", "textFeedback", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioChipCheckboxGroupComponent, selector: "ngx-sirio-chip-checkbox-group", inputs: ["label", "labelPopover", "ariaLabelPopoverButton", "textHelp", "textFeedback", "items", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioChipRadioGroupComponent, selector: "ngx-sirio-chip-radio-group", inputs: ["label", "labelPopover", "ariaLabelPopoverButton", "textHelp", "textFeedback", "items", "ariaLabel", "ariaInvalid", "ariaDescribedBy", "disabledState", "value"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioInputChipComponent, selector: "ngx-sirio-input-chip", inputs: ["disabledState", "name", "textHelp", "textFeedback", "value", "ariaInvalid", "ariaDescribedBy", "type", "checked"], outputs: ["focusEvent", "blurEvent", "changeEvent"] }, { kind: "component", type: SirioAlertComponent, selector: "ngx-sirio-alert", inputs: ["type", "labelClose", "isVisible"], outputs: ["closeEvent"] }, { kind: "component", type: SirioAlertMessageComponent, selector: "ngx-sirio-alert-message" }, { kind: "component", type: SirioSliderComponent, selector: "ngx-sirio-slider", inputs: ["disabledState", "value", "label", "labelPopover", "ariaLabelPopoverButton", "description", "min", "max", "ariaInvalid", "ariaDescribedBy", "textHelp", "textFeedback"], outputs: ["focusEvent", "inputEvent", "blurEvent", "keyupEvent", "keydownEvent"] }, { kind: "component", type: SirioNotifyComponent, selector: "ngx-sirio-notify", inputs: ["isDark"] }, { kind: "component", type: SirioNotifyBodyComponent, selector: "ngx-sirio-notify-body", inputs: ["title"] }, { kind: "directive", type: SirioTooltipDirective, selector: "[sirioTooltip]", inputs: ["sirioTooltip", "content", "hasAction", "hasPopover", "actionLabel", "actionIconClass", "clickOutside", "position", "customTemplate"], outputs: ["clickEvent"] }, { kind: "component", type: SirioCollapseComponent, selector: "ngx-sirio-collapse", inputs: ["isOpen"], outputs: ["opened", "closed"] }, { kind: "directive", type: SirioCollapseTriggerDirective, selector: "[ngxSirioCollapseTrigger]", inputs: ["id", "ngxSirioCollapseTrigger"] }, { kind: "component", type: TemplateWrapperComponent, selector: "app-template-wrapper", inputs: ["template", "context"] }, { kind: "component", type: DynamicHostComponent, selector: "app-dynamic-host", inputs: ["register", "properties", "formGroup"] }, { kind: "component", type: AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "columnMenu", "suppressMenuHide", "enableBrowserTooltips", "tooltipTrigger", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "tooltipShowMode", "tooltipInteraction", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "suppressCutToClipboard", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "dataTypeDefinitions", "maintainColumnOrder", "enableStrictPivotColumnOrder", "suppressFieldDotNotation", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressMoveWhenColumnDragging", "suppressDragLeaveHidesColumns", "suppressGroupChangesColumnVisibility", "suppressMakeColumnVisibleAfterUnGroup", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "autoSizeStrategy", "components", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterNavigatesVertically", "enterNavigatesVerticallyAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "findSearchValue", "findOptions", "quickFilterText", "cacheQuickFilter", "includeHiddenColumnsInQuickFilter", "quickFilterParser", "quickFilterMatcher", "applyQuickFilterBeforePivotOrAgg", "excludeChildrenWhenTreeDataFiltering", "enableAdvancedFilter", "alwaysPassFilter", "includeHiddenColumnsInAdvancedFilter", "advancedFilterParent", "advancedFilterBuilderParams", "suppressAdvancedFilterEval", "suppressSetFilterByDefault", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "chartToolPanelsDef", "chartMenuItems", "loadingCellRenderer", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressTouch", "suppressFocusAfterRefresh", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "loading", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationPageSizeSelector", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotMaxGeneratedColumns", "pivotDefaultExpanded", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "alwaysAggregateAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "cellFlashDuration", "cellFadeDuration", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableCellSpan", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "dragAndDropImageComponent", "dragAndDropImageComponentParams", "fullWidthCellRenderer", "fullWidthCellRendererParams", "embedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupLockGroupColumns", "groupAggFiltering", "groupTotalRow", "grandTotalRow", "suppressStickyTotalRow", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupHideParentOfSingleChild", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "groupAllowUnbalanced", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererParams", "treeData", "treeDataChildrenField", "treeDataParentIdField", "rowGroupPanelSuppressSort", "suppressGroupRowsSticky", "pinnedTopRowData", "pinnedBottomRowData", "enableRowPinning", "isRowPinnable", "isRowPinned", "rowModelType", "rowData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "suppressServerSideFullWidthLoadingRow", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideEnableClientSideSort", "serverSideOnlyRefreshFilteredGroups", "serverSidePivotResultFieldSeparator", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "cellSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellFocus", "suppressHeaderFocus", "selectionColumnDef", "rowNumbers", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "gridId", "deltaSort", "treeDataDisplayType", "enableGroupEdit", "initialState", "theme", "loadThemeGoogleFonts", "themeCssLayer", "styleNonce", "themeStyleContainer", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processUnpinnedColumns", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "focusGridInnerElement", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "getLocaleText", "getDocument", "paginationNumberFormatter", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "getChildCount", "getServerSideGroupLevelParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "columnMenuVisibleChanged", "contextMenuVisibleChanged", "cutStart", "cutEnd", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "columnHeaderMouseOver", "columnHeaderMouseLeave", "columnHeaderClicked", "columnHeaderContextMenu", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "undoStarted", "undoEnded", "redoStarted", "redoEnded", "cellSelectionDeleteStart", "cellSelectionDeleteEnd", "rangeDeleteStart", "rangeDeleteEnd", "fillStart", "fillEnd", "filterOpened", "filterChanged", "filterModified", "advancedFilterBuilderVisibleChanged", "findChanged", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "dragCancelled", "stateUpdated", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "rowDragCancel", "rowResizeStarted", "rowResizeEnded", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pivotMaxColumnsExceeded", "pinnedRowDataChanged", "pinnedRowsChanged", "rowDataUpdated", "asyncTransactionsFlushed", "storeRefreshed", "headerFocused", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "cellSelectionChanged", "tooltipShow", "tooltipHide", "sortChanged"] }, { kind: "component", type: AgCharts, selector: "ag-charts", inputs: ["options"], outputs: ["onChartReady"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
678
681
|
}
|
|
679
682
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldsComponent, decorators: [{
|
|
680
683
|
type: Component,
|
|
@@ -701,7 +704,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
701
704
|
ProgrammabilityService,
|
|
702
705
|
GridService,
|
|
703
706
|
ChartService
|
|
704
|
-
], encapsulation: ViewEncapsulation.None, template: "<div [ngClass]=\"getFormClass()\">\r\n <ng-container *ngFor=\"let row of rows\" [formGroup]=\"formGroup\">\r\n <div class=\"row field-set\">\r\n <ng-container *ngFor=\"let component of row.components\">\r\n <ng-container [ngSwitch]=\"component.type\">\r\n <div [ngClass]=\"getComponentClass(component)\"\r\n [style]=\"getComponentStyle(component)\">\r\n <div [hide]=\"evaluateBoolean(component.conditional?.hide)\"\r\n [show]=\"evaluateBoolean(component.conditional?.show)\">\r\n <!-- #region textfield -->\r\n <ng-container *ngSwitchCase=\"'textfield'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"text\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textfield\r\n [register]=\"component\"\r\n [componentRef]=\"textfield\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region select -->\r\n <ng-container *ngSwitchCase=\"'select'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n dropdown\r\n [valueSync]=\"component.valueSync\"\r\n #select\r\n [register]=\"component\"\r\n [componentRef]=\"select\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-input *ngIf=\"component.searchable\" class=\"searchable\" type=\"text\" [placeholder]=\"locale(Texts, 'TypeToSearch')\"></ngx-sirio-input>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region taglist -->\r\n <ng-container *ngSwitchCase=\"'taglist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [isMultiple]=\"true\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #taglist\r\n [register]=\"component\"\r\n [componentRef]=\"taglist\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region number -->\r\n <ng-container *ngSwitchCase=\"'number'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"number\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n number\r\n [defaultValue]=\"evaluateNumber(component.defaultValue)\"\r\n [minimum]=\"evaluateNumber(component.minimum)\"\r\n [maximum]=\"evaluateNumber(component.maximum)\"\r\n [decimalDigits]=\"evaluateNumber(component.decimalDigits)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #number\r\n [register]=\"component\"\r\n [componentRef]=\"number\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n isoDate\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #date\r\n [register]=\"component\"\r\n [componentRef]=\"date\">\r\n </ngx-sirio-datepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #time\r\n [register]=\"component\"\r\n [componentRef]=\"time\">\r\n </ngx-sirio-timepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <div [formControlName]=\"component.key\"\r\n dateTimeCoordinator\r\n dateTimeValidator\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [datePicker]=\"date\"\r\n [timePicker]=\"time\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [valueSync]=\"component.valueSync\"\r\n #datetime\r\n [register]=\"component\"\r\n [componentRef]=\"datetime\"\r\n class=\"datetime-container\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n isoDate\r\n #date>\r\n </ngx-sirio-datepicker>\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n #time>\r\n </ngx-sirio-timepicker>\r\n </div>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region toggle -->\r\n <ng-container *ngSwitchCase=\"'toggle'\">\r\n <ngx-sirio-toggle [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #toggle\r\n [register]=\"component\"\r\n [componentRef]=\"toggle\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-toggle>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-checkbox>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipradio\r\n [register]=\"component\"\r\n [componentRef]=\"chipradio\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"radio\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #radio\r\n [register]=\"component\"\r\n [componentRef]=\"radio\">\r\n <ngx-sirio-radio-button *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-radio-button>\r\n </ngx-sirio-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checklist -->\r\n <ng-container *ngSwitchCase=\"'checklist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipcheckbox\r\n [register]=\"component\"\r\n [componentRef]=\"chipcheckbox\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"checkbox\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n <ngx-sirio-checkbox *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-checkbox>\r\n </ngx-sirio-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region textarea -->\r\n <ng-container *ngSwitchCase=\"'textarea'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"textarea\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textarea\r\n [register]=\"component\"\r\n [componentRef]=\"textarea\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region filepicker -->\r\n <ng-container *ngSwitchCase=\"'filepicker'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-file-upload [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [accept]=\"getMimeTypes(component.accept)\"\r\n [multiple]=\"evaluateBoolean(component.multiple)\"\r\n (fileUploadedEvent)=\"fileUploaded($event)\"\r\n [showFilelist]=\"!component.showDetails\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #filepicker\r\n [register]=\"component\"\r\n [componentRef]=\"filepicker\">\r\n <span class=\"fas fa-arrow-up\" aria-hidden=\"true\"></span>\r\n {{ locale(Texts, 'Upload') }}\r\n </ngx-sirio-file-upload>\r\n </div>\r\n <ng-container *ngIf=\"component.showDetails\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formGroup\"\r\n [rows]=\"createUploadTables(component)\"\r\n contextId=\"fileList\"></app-dynamic-fields>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region range -->\r\n <ng-container *ngSwitchCase=\"'range'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-slider [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [min]=\"evaluateNumber(component.range?.min) ?? 0\"\r\n [max]=\"evaluateNumber(component.range?.max) ?? 0\"\r\n [valueSync]=\"component.valueSync\"\r\n #range\r\n [register]=\"component\"\r\n [componentRef]=\"range\">\r\n </ngx-sirio-slider>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region displayfield -->\r\n <ng-container *ngSwitchCase=\"'displayfield'\">\r\n <div class=\"sirio-control\"\r\n [ngClass]=\"[getTextAlignment(component), getLightView(component) ]\"\r\n #displayfield\r\n [register]=\"component\"\r\n [componentRef]=\"displayfield\">\r\n <div *ngIf=\"component.label\" class=\"sirio-label\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <button *ngIf=\"component.tooltip\"\r\n sirioTooltip\r\n [content]=\"component.tooltip\"\r\n [hasPopover]=\"true\"\r\n [attr.aria-label]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n class=\"sirio-label-popover fas fa-info-circle\"></button>\r\n </div>\r\n <div class=\"sirio-form-control data-display\" [ngClass]=\"component.fieldtype\">\r\n <ng-container [ngSwitch]=\"component.fieldtype\">\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <i *ngIf=\"evaluate(component.expression)\" class=\"fas fa-check\"></i>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <ng-container *ngTemplateOutlet=\"formattedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"defaultTemplate\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultTemplate>\r\n <ng-container *ngIf=\"supportValues(component) && hasValues(component); else simpleTemplate\">\r\n <ng-container *ngIf=\"getValues(component) | async as values\">\r\n {{ toLabel(evaluate(component.expression), values) }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #simpleTemplate>\r\n {{ evaluate(component.expression) }}\r\n </ng-template>\r\n <ng-template #formattedTemplate>\r\n <div class=\"text-paragraph\" style=\"margin-top: -6px;\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(component.expression))\">\r\n </div>\r\n </ng-template>\r\n </div>\r\n <p *ngIf=\"component.description\" class=\"sirio-helper-text\">\r\n {{ evaluateString(locale(component, 'description')) }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region dynamiclist -->\r\n <ng-container *ngSwitchCase=\"'dynamiclist'\">\r\n <ng-container *ngIf=\"resolvePath(component.path) as formGroup\">\r\n <ng-container [formGroup]=\"formGroup\">\r\n <ng-container [formArrayName]=\"component.key\"\r\n [formGroup]=\"formGroup\"\r\n [recursion]=\"component\"\r\n #recursion=\"recursion\"\r\n [repeat]=\"evaluateNumber(component.repetitions)\"\r\n [allowAddRemove]=\"evaluateBoolean(component.allowAddRemove)\">\r\n <p *ngIf=\"component.description\">{{ evaluateString(locale(component, 'description')) }}</p>\r\n <ng-container *ngIf=\"getFormArray(resolvePath(component.path).get(component.key)) as formArray\">\r\n <ng-container *ngIf=\"component.subtype == 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"navigation; context: { formArray: formArray }\"></ng-container>\r\n </ng-container> \r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclisttab\">\r\n <ngx-sirio-tab [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [tabCount]=\"formArray.controls.length\"\r\n #dynamiclisttab>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\">\r\n <ng-container *ngIf=\"i === dynamiclisttab.activeIndex\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclistaccordion\">\r\n <ngx-sirio-accordion [accordionCount]=\"formArray.controls.length\"\r\n #dynamiclistaccordion>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-accordion-panel #panel accordionPanel>\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <ng-container *ngIf=\"panel.panelIsOpen\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <table class=\"dynamiclist-table\" [ngClass]=\"{ 'main': recursionLevel == 0 }\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"getFormGroup(item) as formItem\">\r\n <ng-container *ngIf=\"{ itemsArray: recursion.getItemsArray(formItem) } as recursionData\">\r\n <tr>\r\n <td class=\"content-cell\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true && component.subtype !== 'table', 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formItem\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"command-cell\">\r\n <div>\r\n <ng-container *ngIf=\"recursionData.itemsArray\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: recursionData.itemsArray, compact: true }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"recursionData.itemsArray && recursionData.itemsArray.length > 0\">\r\n <td colspan=\"2\" class=\"recursion-cell\">\r\n <div class=\"layout\">\r\n <div class=\"recursion-toggle\">\r\n <ngx-sirio-button [ngxSirioCollapseTrigger]=\"collapseTemplate\"\r\n [color]=\"null\" [icon]=\"collapse.isOpen ? 'fas fa-chevron-down' : 'fas fa-chevron-right' \" />\r\n </div>\r\n <div *ngIf=\"!collapse.isOpen\" class=\"recursion-title\">\r\n <div class=\"recursion-text\">\r\n <ng-container *ngIf=\"!collapse.isOpen\">\r\n {{ recursionData.itemsArray.length }} elementi presenti\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"recursion-content\">\r\n <ngx-sirio-collapse #collapseTemplate\r\n #collapse=\"collapseExtension\"\r\n collapseExtension>\r\n <div *ngIf=\"collapse.isOpen\" style=\"margin-bottom: -11px;\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"recursion.getFormGroup(formItem)\"\r\n [readOnly]=\"readOnly\"\r\n [recursionLevel]=\"recursionLevel+1\"\r\n [rows]=\"recursion.getComponentRows()\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ngx-sirio-collapse>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigation -->\r\n <ng-container *ngSwitchCase=\"'navigation'\">\r\n <div>\r\n <ng-container *ngIf=\"formArray.controls[navigationIndex] as item\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (navigationIndex + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"component.allowAddRemove || component.allowReorder\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length == 0\">\r\n <div class=\"dynamiclist-no-data\">{{ evaluateString(locale(component, 'noDataText')) || locale(Texts, 'NoData') }}</div>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"feedback\"></ng-container>\r\n <ng-container *ngIf=\"recursionLevel == 0 && component.subtype !== 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #region templates -->\r\n <ng-template #btnMoveUp let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveUp') as upLabel\">\r\n <ngx-sirio-button (click)=\"moveUpItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"upLabel\"\r\n [title]=\"upLabel\"\r\n [color]=\"null\" icon=\"fas fa-arrow-up\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ upLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnMoveDown let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveDown') as downLabel\">\r\n <ngx-sirio-button (click)=\"moveDownItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"downLabel\"\r\n [title]=\"downLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-arrow-down\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ downLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <ngx-sirio-button (click)=\"removeItem(formArray, i, true)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"removeLabel\"\r\n [title]=\"removeLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-trash\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ removeLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <ngx-sirio-button (click)=\"addItem(formArray)\"\r\n class=\"add-item\"\r\n [ariaLabel]=\"addLabel\"\r\n [title]=\"addLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-plus\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ addLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsReorder let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowReorder\">\r\n <ng-container *ngTemplateOutlet=\"btnMoveUp; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"btnMoveDown; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { formArray: formArray, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #feedback>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <div>\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <div>\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #navigation let-formArray=\"formArray\" > \r\n <nav class=\"sirio-pagination\">\r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <div class=\"sirio-pagination-page\">\r\n <select class=\"sirio-form-control\"\r\n [(ngModel)]=\"navigationIndex\"\r\n [ngModelOptions]=\"{ standalone: true }\">\r\n <option *ngFor=\"let _ of formArray.controls; let i = index\" [ngValue]=\"i\">\r\n {{ i + 1 }}\r\n </option>\r\n </select>\r\n {{ locale(Texts, 'Of') }}\r\n <span>{{ formArray.controls.length }}</span> {{ locale(Texts, 'Elements') }}\r\n </div>\r\n <div class=\"sirio-pagination-cursor\">\r\n <ul class=\"sirio-pagination-list\">\r\n <li [class.disabled]=\"navigationIndex == 0\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, -1)\"\r\n [title]=\"locale(Texts, 'PreviousElement')\"\r\n [class.disabled]=\"navigationIndex == 0\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-left\"></span>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, 1)\"\r\n [title]=\"locale(Texts, 'NextElement')\"\r\n [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-right\"></span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container> \r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && navigationIndex != -1\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: navigationIndex }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </nav>\r\n </ng-template>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region group -->\r\n <ng-container *ngSwitchCase=\"'group'\">\r\n <div [ngClass]=\"getGroupOutline(component)\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container> \r\n <div #group\r\n [register]=\"component\"\r\n [componentRef]=\"group\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-tab #tab\r\n [register]=\"component\"\r\n [componentRef]=\"tab\"\r\n [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [isNavLine]=\"component.navigation\"\r\n [isVertical]=\"component.vertical\"\r\n tabControl>\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(panel, 'label'))\"\r\n [icon]=\"evaluateString(panel.icon)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled) ?? false\"\r\n #tabPanel\r\n tabItem\r\n [componentRef]=\"tab\"\r\n *ngIf=\"evaluateConditional(panel.conditional)\">\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <div *ngIf=\"tabPanel.isActive\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-accordion #accordion\r\n [register]=\"component\"\r\n [componentRef]=\"accordion\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-accordion-panel *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled)\">\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(panel, 'label'))\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <div>\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </div>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion> \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [collapse]=\"component.collapseTo\"\r\n #text\r\n [register]=\"component\"\r\n [componentRef]=\"text\">\r\n <!--Reset View Context-->\r\n <div tabindex=\"0\" style=\"display:none\"></div>\r\n <div class=\"flex\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n <ng-container *ngIf=\"component.tooltip\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [attr.aria-label]=\"locale(Texts, 'Information')\"\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'tooltip')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region html -->\r\n <ng-container *ngSwitchCase=\"'html'\">\r\n <div class=\"html-paragraph\"\r\n [innerHTML]=\"sanitize(evaluateTemplate(locale(component, 'content')))\"\r\n #html\r\n [register]=\"component\"\r\n [componentRef]=\"html\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region image -->\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <img [src]=\"evaluateString(component.source)\"\r\n [alt]=\"evaluateString(locale(component, 'alt'))\"\r\n style=\"width: 100%;height: 100%;\"\r\n #image\r\n [register]=\"component\"\r\n [componentRef]=\"image\">\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-grid-angular [modules]=\"getGridModules(component)\"\r\n [gridOptions]=\"getGridOptions(component)\"\r\n [selectable]=\"evaluateBoolean(component.selectable)\"\r\n [multiSelect]=\"evaluateBoolean(component.multiSelect)\"\r\n (selectionChanged)=\"onGridSelectionChanged(component, $event)\"\r\n [suppressActions]=\"evaluateBoolean(component.suppressActions)\"\r\n [columnDefs]=\"component.columns || evaluate(component.columnsExpression) || []\"\r\n [rowSource]=\"getRowSource(component)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [style.height]=\"component.autoHeight ? null : evaluateHeight(component.height)\"\r\n [formGroup]=\"formGroup\"\r\n #table\r\n [register]=\"component\"\r\n [componentRef]=\"table\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region button -->\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-button (clickEvent)=\"clickButton(component, $event)\"\r\n [color]=\"evaluateColor(component.color)\"\r\n [disabled]=\"evaluateBoolean(component.disabled)\"\r\n #button\r\n [register]=\"component\"\r\n [componentRef]=\"button\">\r\n <ng-container *ngIf=\"evaluateString(component.icon) as icon; else noIcon\">\r\n <span *ngIf=\"component.iconPosition!='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <span *ngIf=\"component.iconPosition=='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n <ng-template #noIcon>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ng-template>\r\n </ngx-sirio-button>\r\n </div> \r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region separator -->\r\n <ng-container *ngSwitchCase=\"'separator'\">\r\n <div class=\"separator\"\r\n #separator\r\n [register]=\"component\"\r\n [componentRef]=\"separator\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region spacer -->\r\n <ng-container *ngSwitchCase=\"'spacer'\">\r\n <div style=\"width: 100%\"\r\n [style.height.px]=\"component.height\"\r\n #spacer\r\n [register]=\"component\"\r\n [componentRef]=\"spacer\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region iframe -->\r\n <ng-container *ngSwitchCase=\"'iframe'\">\r\n <label [for]=\"component.id\">{{ evaluateString(locale(component, 'label')) }}</label>\r\n <iframe [src]=\"evaluateUrl(component.url)\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [style.width]=\"'100%'\"\r\n [style.height.px]=\"component.height\"\r\n [frameSecurity]=\"component.security\"\r\n #iframe\r\n [register]=\"component\"\r\n [componentRef]=\"iframe\">\r\n </iframe>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region alert -->\r\n <ng-container *ngSwitchCase=\"'alert'\">\r\n <ngx-sirio-alert [type]=\"component.role\"\r\n [labelClose]=\"locale(Texts, 'Close')\"\r\n [preventClose]=\"evaluateBoolean(component.preventClose)\"\r\n #alert\r\n [register]=\"component\"\r\n [componentRef]=\"alert\">\r\n <ngx-sirio-alert-message>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-alert-message>\r\n </ngx-sirio-alert>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region notice -->\r\n <ng-container *ngSwitchCase=\"'notice'\">\r\n <ngx-sirio-notify #notice\r\n [register]=\"component\"\r\n [componentRef]=\"notice\">\r\n <ngx-sirio-notify-body [title]=\"evaluateString(locale(component, 'title'))\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-notify-body>\r\n </ngx-sirio-notify>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tooltip -->\r\n <ng-container *ngSwitchCase=\"'tooltip'\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"\r\n #tooltip\r\n [register]=\"component\"\r\n [componentRef]=\"tooltip\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <p *ngIf=\"component.title\" class=\"sirio-tooltip-heading sirio-space-down\">\r\n {{ evaluateString(locale(component, 'title')) }}\r\n </p>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region chart -->\r\n <ng-container *ngSwitchCase=\"'chart'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-charts [options]=\"(getChartOptions(component) | async) ?? {}\"\r\n [observe]=\"getChartData(component)\"\r\n [callback]=\"invalidateChart(component)\"\r\n [style.height.px]=\"component.height\"\r\n #chart\r\n [register]=\"component\"\r\n [componentRef]=\"chart\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region component -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <ng-container *ngIf=\"component.isInput; else noInputTemplate\">\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n <ng-template #noInputTemplate>\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n", styles: [".flex{display:flex}.field-set{align-items:start}.field-set>.col-host>*{margin-bottom:10px}.separator{border-bottom:2px solid #d9e4f7;width:100%;margin:10px 0}.group-outline{border:1px solid #d9e4f7;padding:15px;margin-top:2px;margin-bottom:2px}.group-outline-repeat{margin-top:8px;margin-bottom:8px}.valign-start>.row{align-items:start}.valign-center>.row{align-items:center}.valign-end>.row{align-items:end}.component-start{align-self:start}.component-center{align-self:center}.component-end{align-self:end}.text-paragraph p{margin-bottom:0!important}.sirio-tab.sirio-tab-vertical .sirio-tab-body{margin-left:10px;margin-right:10px}.sirio-tab:not(.sirio-tab-vertical) .sirio-tab-body{margin-top:10px;margin-bottom:10px}.sirio-label{cursor:default}.sirio-control.is-disabled .sirio-input-group .sirio-input-group-text,.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{border:0px}.sirio-control.is-readonly .sirio-form-control{background-color:#fff!important;color:#454d56}.sirio-form-control[type=number]:disabled{background-image:none}ngx-sirio-alert.prevent-close .sirio-alert-close{display:none}.col-host .sirio-accordion .sirio-accordion-body .sirio-accordion-content{padding:16px}.col-host .sirio-accordion-body{overflow:unset!important}.sirio-dialog-title{display:flex;margin-top:0}.sirio-dialog-title span{margin-right:10px;margin-bottom:0!important}.ag-header-cell.hide-filter .ag-header-cell-filter-button{display:none}.sirio-tab.sirio-tab-scroll{display:block}.sirio-dropdown .searchable{position:absolute;width:100%;display:none;left:0}.ag-cell-value .btn-small-group{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.ag-cell-value .btn-small .sirio-btn{padding:.25rem .0625rem;margin:2px}.ag-selection-checkbox .ag-checkbox-input-wrapper.ag-disabled{display:none}ag-charts{display:block;height:100%;border-radius:8px;background-color:var(--chart-bg);border:1px solid var(--chart-border);overflow:hidden}.ag-cell.cell-component{padding:1px}.ag-cell.row-numbers-cell{text-align:center;background:#f2f6fc}.ag-header-cell.row-numbers-header .ag-header-cell-label{justify-content:center;text-align:center}.ag-cell-auto-height .ag-cell-value{line-height:normal}\n", ".sirio-control.ng-invalid .sirio-form-feedback,.sirio-display-feedback{color:#aa224f;display:inline-block}.sirio-control.ng-invalid .sirio-input-group-text{color:#aa224f;border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label{color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label:before,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label{color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:before,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:after,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:after{background-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-upload.sirio-is-invalid button{background-color:#aa224f;border-color:#aa224f}\n", ".sirio-control.text-left input.sirio-form-control,.sirio-control.text-left textarea.sirio-form-control,.sirio-control.text-left div.sirio-form-control{text-align:left}.sirio-control.text-center input.sirio-form-control,.sirio-control.text-center textarea.sirio-form-control,.sirio-control.text-center div.sirio-form-control{text-align:center}.sirio-control.text-right input.sirio-form-control,.sirio-control.text-right textarea.sirio-form-control,.sirio-control.text-right div.sirio-form-control{text-align:right}.sirio-control.text-center input.sirio-datepicker,.sirio-control.text-center input.sirio-timepicker,.sirio-control.text-right input.sirio-datepicker,.sirio-control.text-right input.sirio-timepicker{padding-right:40px}.horizontal-left{display:flex;justify-content:left}.horizontal-center{display:flex;justify-content:center}.horizontal-right{display:flex;justify-content:right}.horizontal-fill button{width:100%}.horizontal-left legend,.horizontal-center legend,.horizontal-right legend,.horizontal-fill legend{float:none}.col-host.component-center ngx-sirio-toggle .sirio-form-toggle label{margin-bottom:0}\n", ".sirio-control .sirio-form-control.data-display{border-color:#e3e5e8}.sirio-control .sirio-form-control.data-display.textarea{white-space:pre;overflow:auto;height:auto;line-height:140%;min-height:3rem;padding:1rem}.sirio-control .sirio-form-control.data-display.text,.sirio-control .sirio-form-control:hover.data-display.text{overflow:auto;height:auto;margin-top:-6px;color:#454d56}.sirio-control .sirio-form-control.data-display.number{font-family:Roboto Mono,monospace}.sirio-control .sirio-form-control.data-display.checkbox{display:flex;justify-content:center;align-items:center}\n", ".sirio-control.light-readonly label:hover,.sirio-control.light-view div.sirio-label:hover{color:#454d56}.sirio-control.light-readonly input.sirio-form-control,.sirio-control.light-readonly .sirio-dropdown .sirio-dropdown-select,.sirio-control.light-readonly textarea.sirio-form-control,.sirio-control.light-view div.sirio-form-control{background:none!important;border:0px;padding-left:0}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{background:none}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text span{color:#5b6571}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text.prefix{padding-left:0}.sirio-upload.sirio-control.light-readonly label,.sirio-upload.sirio-control.is-disabled label{pointer-events:none}\n", ":root{--sirio-spinner-blue: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='%2300368F' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\");--sirio-spinner-white: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='white' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\")}.sirio-control .sirio-is-pending,.sirio-control.sirio-is-pending input.sirio-form-control,.sirio-control.sirio-is-pending .sirio-dropdown .sirio-form-control,.sirio-form-check.sirio-control.sirio-is-pending{background-image:var(--sirio-spinner-blue);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}textarea.sirio-form-control.sirio-is-pending{background-position:top .9375rem right .9375rem}.sirio-control.sirio-is-pending input.sirio-form-control{background-position:right .9375rem top 50%}.sirio-upload.sirio-control.sirio-is-pending ngx-sirio-button .sirio-btn-primary{background-image:var(--sirio-spinner-white);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}.sirio-control.sirio-is-pending fieldset{background-image:var(--sirio-spinner-blue);background-repeat:no-repeat;background-position:right .9375rem top 1rem;background-size:1rem;padding-right:2.25rem}\n", ":root{--dynamiclist-border: 1px solid #ccc}.dynamiclist-no-data{text-align:center;padding:20px;font-style:italic;border:var(--dynamiclist-border)}.dynamiclist-table{width:100%;border-collapse:collapse;border:none}.dynamiclist-table.main{border:var(--dynamiclist-border)}.dynamiclist-table.main .dynamiclist-table{border-left:var(--dynamiclist-border);border-bottom:var(--dynamiclist-border)}.dynamiclist-table td{border:var(--dynamiclist-border)}.dynamiclist-table tr:first-child td{border-top:none}.dynamiclist-table tr:last-child td{border-bottom:none}.dynamiclist-table tr td:first-child{border-left:none}.dynamiclist-table tr td:last-child{border-right:none}.dynamiclist-table td.content-cell{width:100%;padding-left:8px;padding-right:8px;border-left:var(--dynamiclist-border)}.dynamiclist-table td.content-cell .group-outline-repeat{margin-bottom:0}.dynamiclist-table td.command-cell{vertical-align:middle}.dynamiclist-table td.command-cell>div{display:flex;justify-content:right}.dynamiclist-table td.recursion-cell .layout{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;width:100%;height:100%}.dynamiclist-table td.recursion-cell .recursion-toggle{grid-row:1 / span 2;grid-column:1;background-color:#f5f5f5;align-items:center}.dynamiclist-table td.recursion-cell .recursion-title{grid-row:1;grid-column:2;background:#f5f5f5;display:flex;align-items:center;min-height:34px}.dynamiclist-table td.recursion-cell .recursion-title .recursion-text{flex:1;text-align:center}.dynamiclist-table td.recursion-cell .recursion-title .recursion-add{margin-left:auto}.dynamiclist-table td.recursion-cell .recursion-content{grid-row:2;grid-column:2}.dynamiclist-table td.recursion-cell .recursion-content .is-open{overflow:visible!important}.dynamiclist-table ngx-sirio-button button{padding:7px}\n", ".df-field-dynamiclist .sirio-pagination{width:100%;background-color:#f2f6fc;margin:0}.df-field-dynamiclist .sirio-pagination-page{background-color:#f2f6fc}.df-field-dynamiclist .sirio-pagination-cursor{margin-left:0}.df-field-dynamiclist .actions{margin-left:auto}\n", ".datetime-container{display:flex;gap:8px;align-items:flex-end}.datetime-container{display:flex;gap:8px}.datetime-container ngx-sirio-datepicker{flex:1}.datetime-container ngx-sirio-timepicker{flex:1}.datetime-container+.sirio-form-feedback{color:#aa224f;display:inline-block}\n", ".sirio-tab.sirio-tab-vertical .sirio-tab-item{width:100%}\n", ".sirio-tooltip .sirio-tooltip-body{white-space:pre-line}\n"] }]
|
|
707
|
+
], encapsulation: ViewEncapsulation.None, template: "<div [ngClass]=\"getFormClass()\">\r\n <ng-container *ngFor=\"let row of rows\" [formGroup]=\"formGroup\">\r\n <div class=\"row field-set\">\r\n <ng-container *ngFor=\"let component of row.components\">\r\n <ng-container [ngSwitch]=\"component.type\">\r\n <div [ngClass]=\"getComponentClass(component)\"\r\n [style]=\"getComponentStyle(component)\">\r\n <div [hide]=\"evaluateBoolean(component.conditional?.hide)\"\r\n [show]=\"evaluateBoolean(component.conditional?.show)\">\r\n <!-- #region textfield -->\r\n <ng-container *ngSwitchCase=\"'textfield'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"text\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textfield\r\n [register]=\"component\"\r\n [componentRef]=\"textfield\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region select -->\r\n <ng-container *ngSwitchCase=\"'select'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n dropdown\r\n [valueSync]=\"component.valueSync\"\r\n #select\r\n [register]=\"component\"\r\n [componentRef]=\"select\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-input *ngIf=\"component.searchable\" class=\"searchable\" type=\"text\" [placeholder]=\"locale(Texts, 'TypeToSearch')\"></ngx-sirio-input>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region taglist -->\r\n <ng-container *ngSwitchCase=\"'taglist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-select [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [isMultiple]=\"true\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #taglist\r\n [register]=\"component\"\r\n [componentRef]=\"taglist\">\r\n <ngx-sirio-select-panel>\r\n <ngx-sirio-select-option *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">{{ locale(option, 'label') }}</ngx-sirio-select-option>\r\n </ngx-sirio-select-panel>\r\n </ngx-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region number -->\r\n <ng-container *ngSwitchCase=\"'number'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"number\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [prefixAdorner]=\"evaluateString(component.appearance?.prefixAdorner)\"\r\n [suffixAdorner]=\"evaluateString(component.appearance?.suffixAdorner)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n number\r\n [defaultValue]=\"evaluateNumber(component.defaultValue)\"\r\n [minimum]=\"evaluateNumber(component.minimum)\"\r\n [maximum]=\"evaluateNumber(component.maximum)\"\r\n [decimalDigits]=\"evaluateNumber(component.decimalDigits)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #number\r\n [register]=\"component\"\r\n [componentRef]=\"number\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n isoDate\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #date\r\n [register]=\"component\"\r\n [componentRef]=\"date\">\r\n </ngx-sirio-datepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #time\r\n [register]=\"component\"\r\n [componentRef]=\"time\">\r\n </ngx-sirio-timepicker>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <div [formControlName]=\"component.key\"\r\n dateTimeCoordinator\r\n dateTimeValidator\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [datePicker]=\"date\"\r\n [timePicker]=\"time\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [valueSync]=\"component.valueSync\"\r\n #datetime\r\n [register]=\"component\"\r\n [componentRef]=\"datetime\"\r\n class=\"datetime-container\">\r\n <ngx-sirio-datepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel') || locale(component, 'dateLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'dateLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n isoDate\r\n #date>\r\n </ngx-sirio-datepicker>\r\n <ngx-sirio-timepicker [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel') || locale(component, 'timeLabel'))\"\r\n [label]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n #time>\r\n </ngx-sirio-timepicker>\r\n </div>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region toggle -->\r\n <ng-container *ngSwitchCase=\"'toggle'\">\r\n <ngx-sirio-toggle [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #toggle\r\n [register]=\"component\"\r\n [componentRef]=\"toggle\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-toggle>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ngx-sirio-checkbox>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipradio\r\n [register]=\"component\"\r\n [componentRef]=\"chipradio\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"radio\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-radio-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #radio\r\n [register]=\"component\"\r\n [componentRef]=\"radio\">\r\n <ngx-sirio-radio-button *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-radio-button>\r\n </ngx-sirio-radio-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checklist -->\r\n <ng-container *ngSwitchCase=\"'checklist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region chip -->\r\n <ng-container *ngSwitchCase=\"'chip'\">\r\n <ngx-sirio-chip-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #chipcheckbox\r\n [register]=\"component\"\r\n [componentRef]=\"chipcheckbox\">\r\n <ngx-sirio-input-chip *ngFor=\"let option of (getValues(component) | async) || []\"\r\n type=\"checkbox\"\r\n [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-input-chip>\r\n </ngx-sirio-chip-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <ngx-sirio-checkbox-group [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\">\r\n <ngx-sirio-checkbox *ngFor=\"let option of (getValues(component) | async) || []\" [value]=\"option.value\">\r\n {{ locale(option, 'label') }}\r\n </ngx-sirio-checkbox>\r\n </ngx-sirio-checkbox-group>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region textarea -->\r\n <ng-container *ngSwitchCase=\"'textarea'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-input type=\"textarea\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [placeholder]=\"locale(component, 'placeholder') || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [formControlName]=\"component.key\"\r\n [textcase]=\"component.textCase\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [ngClass]=\"getTextAlignment(component)\"\r\n updateBlur\r\n [requiredOnInput]=\"component.validate?.required\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #textarea\r\n [register]=\"component\"\r\n [componentRef]=\"textarea\">\r\n </ngx-sirio-input>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region filepicker -->\r\n <ng-container *ngSwitchCase=\"'filepicker'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-file-upload [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [accept]=\"getMimeTypes(component.accept)\"\r\n [multiple]=\"evaluateBoolean(component.multiple)\"\r\n (fileUploadedEvent)=\"fileUploaded($event)\"\r\n [showFilelist]=\"!component.showDetails\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [valueSync]=\"component.valueSync\"\r\n #filepicker\r\n [register]=\"component\"\r\n [componentRef]=\"filepicker\">\r\n <span class=\"fas fa-arrow-up\" aria-hidden=\"true\"></span>\r\n {{ locale(Texts, 'Upload') }}\r\n </ngx-sirio-file-upload>\r\n </div>\r\n <ng-container *ngIf=\"component.showDetails\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formGroup\"\r\n [rows]=\"createUploadTables(component)\"\r\n contextId=\"fileList\"></app-dynamic-fields>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region range -->\r\n <ng-container *ngSwitchCase=\"'range'\" [formGroup]=\"resolvePath(component.path)\">\r\n <ngx-sirio-slider [label]=\"evaluateString(locale(component, 'label'))\"\r\n [labelPopover]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [textHelp]=\"evaluateString(locale(component, 'description'))\"\r\n [textFeedback]=\"getTextFeedback(component)\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n validation\r\n [canValidate]=\"true\"\r\n [isWarning]=\"isWarning(component)\"\r\n [showWhenValid]=\"false\"\r\n [min]=\"evaluateNumber(component.range?.min) ?? 0\"\r\n [max]=\"evaluateNumber(component.range?.max) ?? 0\"\r\n [valueSync]=\"component.valueSync\"\r\n #range\r\n [register]=\"component\"\r\n [componentRef]=\"range\">\r\n </ngx-sirio-slider>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region displayfield -->\r\n <ng-container *ngSwitchCase=\"'displayfield'\">\r\n <div class=\"sirio-control\"\r\n [ngClass]=\"[getTextAlignment(component), getLightView(component) ]\"\r\n #displayfield\r\n [register]=\"component\"\r\n [componentRef]=\"displayfield\">\r\n <div *ngIf=\"component.label\" class=\"sirio-label\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <button *ngIf=\"component.tooltip\"\r\n sirioTooltip\r\n [content]=\"component.tooltip\"\r\n [hasPopover]=\"true\"\r\n [attr.aria-label]=\"evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"\r\n class=\"sirio-label-popover fas fa-info-circle\"></button>\r\n </div>\r\n <div class=\"sirio-form-control data-display\" [ngClass]=\"component.fieldtype\">\r\n <ng-container [ngSwitch]=\"component.fieldtype\">\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <i *ngIf=\"evaluate(component.expression)\" class=\"fas fa-check\"></i>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <ng-container *ngTemplateOutlet=\"formattedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"defaultTemplate\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultTemplate>\r\n <ng-container *ngIf=\"supportValues(component) && hasValues(component); else simpleTemplate\">\r\n <ng-container *ngIf=\"getValues(component) | async as values\">\r\n {{ toLabel(evaluate(component.expression), values) }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #simpleTemplate>\r\n {{ evaluate(component.expression) }}\r\n </ng-template>\r\n <ng-template #formattedTemplate>\r\n <div class=\"text-paragraph\" style=\"margin-top: -6px;\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(component.expression))\">\r\n </div>\r\n </ng-template>\r\n </div>\r\n <p *ngIf=\"component.description\" class=\"sirio-helper-text\">\r\n {{ evaluateString(locale(component, 'description')) }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region dynamiclist -->\r\n <ng-container *ngSwitchCase=\"'dynamiclist'\">\r\n <ng-container *ngIf=\"resolvePath(component.path) as formGroup\">\r\n <ng-container [formGroup]=\"formGroup\">\r\n <ng-container [formArrayName]=\"component.key\"\r\n [formGroup]=\"formGroup\"\r\n [recursion]=\"component\"\r\n #recursion=\"recursion\"\r\n [repeat]=\"evaluateNumber(component.repetitions)\"\r\n [allowAddRemove]=\"evaluateBoolean(component.allowAddRemove)\">\r\n <p *ngIf=\"component.description\">{{ evaluateString(locale(component, 'description')) }}</p>\r\n <ng-container *ngIf=\"getFormArray(resolvePath(component.path).get(component.key)) as formArray\">\r\n <ng-container *ngIf=\"component.subtype == 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"navigation; context: { formArray: formArray }\"></ng-container>\r\n </ng-container> \r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclisttab\">\r\n <ngx-sirio-tab [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [tabCount]=\"formArray.controls.length\"\r\n #dynamiclisttab>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\">\r\n <ng-container *ngIf=\"i === dynamiclisttab.activeIndex\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclistaccordion\">\r\n <ngx-sirio-accordion [accordionCount]=\"formArray.controls.length\"\r\n #dynamiclistaccordion>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ngx-sirio-accordion-panel #panel accordionPanel>\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(component, 'label')) + ' ' + (i + 1)\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <ng-container *ngIf=\"panel.panelIsOpen\">\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <table class=\"dynamiclist-table\" [ngClass]=\"{ 'main': recursionLevel == 0 }\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"getFormGroup(item) as formItem\">\r\n <ng-container *ngIf=\"{ itemsArray: recursion.getItemsArray(formItem) } as recursionData\">\r\n <tr>\r\n <td class=\"content-cell\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true && component.subtype !== 'table', 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formItem\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"command-cell\">\r\n <div>\r\n <ng-container *ngIf=\"recursionData.itemsArray\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: recursionData.itemsArray, compact: true }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"recursionData.itemsArray && recursionData.itemsArray.length > 0\">\r\n <td colspan=\"2\" class=\"recursion-cell\">\r\n <div class=\"layout\">\r\n <div class=\"recursion-toggle\">\r\n <ngx-sirio-button [ngxSirioCollapseTrigger]=\"collapseTemplate\"\r\n [color]=\"null\" [icon]=\"collapse.isOpen ? 'fas fa-chevron-down' : 'fas fa-chevron-right' \" />\r\n </div>\r\n <div *ngIf=\"!collapse.isOpen\" class=\"recursion-title\">\r\n <div class=\"recursion-text\">\r\n <ng-container *ngIf=\"!collapse.isOpen\">\r\n {{ recursionData.itemsArray.length }} elementi presenti\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"recursion-content\">\r\n <ngx-sirio-collapse #collapseTemplate\r\n #collapse=\"collapseExtension\"\r\n collapseExtension>\r\n <div *ngIf=\"collapse.isOpen\" style=\"margin-bottom: -11px;\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"recursion.getFormGroup(formItem)\"\r\n [readOnly]=\"readOnly\"\r\n [recursionLevel]=\"recursionLevel+1\"\r\n [rows]=\"recursion.getComponentRows()\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ngx-sirio-collapse>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigation -->\r\n <ng-container *ngSwitchCase=\"'navigation'\">\r\n <div>\r\n <ng-container *ngIf=\"formArray.controls[navigationIndex] as item\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (navigationIndex + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <label *ngIf=\"component.label\">{{ evaluateString(locale(component, 'label')) + ' ' + (i + 1) }}</label>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"component.allowAddRemove || component.allowReorder\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length == 0\">\r\n <div class=\"dynamiclist-no-data\">{{ evaluateString(locale(component, 'noDataText')) || locale(Texts, 'NoData') }}</div>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"feedback\"></ng-container>\r\n <ng-container *ngIf=\"recursionLevel == 0 && component.subtype !== 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #region templates -->\r\n <ng-template #btnMoveUp let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveUp') as upLabel\">\r\n <ngx-sirio-button (click)=\"moveUpItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"upLabel\"\r\n [title]=\"upLabel\"\r\n [color]=\"null\" icon=\"fas fa-arrow-up\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ upLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnMoveDown let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveDown') as downLabel\">\r\n <ngx-sirio-button (click)=\"moveDownItem(formArray, i)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"downLabel\"\r\n [title]=\"downLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-arrow-down\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ downLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <ngx-sirio-button (click)=\"removeItem(formArray, i, true)\"\r\n class=\"remove-item\"\r\n [ariaLabel]=\"removeLabel\"\r\n [title]=\"removeLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-trash\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ removeLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <ngx-sirio-button (click)=\"addItem(formArray)\"\r\n class=\"add-item\"\r\n [ariaLabel]=\"addLabel\"\r\n [title]=\"addLabel\"\r\n [color]=\"null\"\r\n icon=\"fas fa-plus\">\r\n <ng-container *ngIf=\"!compact\">\r\n {{ addLabel }}\r\n </ng-container>\r\n </ngx-sirio-button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsReorder let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowReorder\">\r\n <ng-container *ngTemplateOutlet=\"btnMoveUp; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"btnMoveDown; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsAdd let-formArray=\"formArray\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { formArray: formArray, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #feedback>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <div>\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <div>\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #navigation let-formArray=\"formArray\" > \r\n <nav class=\"sirio-pagination\">\r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <div class=\"sirio-pagination-page\">\r\n <select class=\"sirio-form-control\"\r\n [(ngModel)]=\"navigationIndex\"\r\n [ngModelOptions]=\"{ standalone: true }\">\r\n <option *ngFor=\"let _ of formArray.controls; let i = index\" [ngValue]=\"i\">\r\n {{ i + 1 }}\r\n </option>\r\n </select>\r\n {{ locale(Texts, 'Of') }}\r\n <span>{{ formArray.controls.length }}</span> {{ locale(Texts, 'Elements') }}\r\n </div>\r\n <div class=\"sirio-pagination-cursor\">\r\n <ul class=\"sirio-pagination-list\">\r\n <li [class.disabled]=\"navigationIndex == 0\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, -1)\"\r\n [title]=\"locale(Texts, 'PreviousElement')\"\r\n [class.disabled]=\"navigationIndex == 0\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-left\"></span>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"navigateItem(formArray, 1)\"\r\n [title]=\"locale(Texts, 'NextElement')\"\r\n [class.disabled]=\"navigationIndex == formArray.controls.length - 1\">\r\n <span aria-hidden=\"true\" class=\"fas fa-angle-right\"></span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container> \r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray }\"></ng-container>\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && navigationIndex != -1\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, i: navigationIndex }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </nav>\r\n </ng-template>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region group -->\r\n <ng-container *ngSwitchCase=\"'group'\">\r\n <div [ngClass]=\"getGroupOutline(component)\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container> \r\n <div #group\r\n [register]=\"component\"\r\n [componentRef]=\"group\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-tab #tab\r\n [register]=\"component\"\r\n [componentRef]=\"tab\"\r\n [leftArrowLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [rightArrowLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [isNavLine]=\"component.navigation\"\r\n [isVertical]=\"component.vertical\"\r\n tabControl>\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-tab-item [label]=\"evaluateString(locale(panel, 'label'))\"\r\n [icon]=\"evaluateString(panel.icon)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled) ?? false\"\r\n #tabPanel\r\n tabItem\r\n [componentRef]=\"tab\"\r\n *ngIf=\"evaluateConditional(panel.conditional)\">\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <div *ngIf=\"tabPanel.isActive\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [disableAutoFocus]=\"template?.disableAutoFocus\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ng-container>\r\n </ngx-sirio-tab-item>\r\n </ng-container>\r\n </ngx-sirio-tab>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <ngx-sirio-accordion #accordion\r\n [register]=\"component\"\r\n [componentRef]=\"accordion\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ngx-sirio-accordion-panel *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled)\">\r\n <ngx-sirio-accordion-header>\r\n <span [innerText]=\"evaluateString(locale(panel, 'label'))\"></span>\r\n </ngx-sirio-accordion-header>\r\n <ngx-sirio-accordion-body>\r\n <div>\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [disableAutoFocus]=\"template?.disableAutoFocus\"\r\n [alignment]=\"template?.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </div>\r\n </ngx-sirio-accordion-body>\r\n </ngx-sirio-accordion-panel>\r\n </ng-container>\r\n </ngx-sirio-accordion> \r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [collapse]=\"component.collapseTo\"\r\n #text\r\n [register]=\"component\"\r\n [componentRef]=\"text\">\r\n <!--Reset View Context-->\r\n <div tabindex=\"0\" style=\"display:none\"></div>\r\n <div class=\"flex\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n <ng-container *ngIf=\"component.tooltip\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [attr.aria-label]=\"locale(Texts, 'Information')\"\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'tooltip')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region html -->\r\n <ng-container *ngSwitchCase=\"'html'\">\r\n <div class=\"html-paragraph\"\r\n [innerHTML]=\"sanitize(evaluateTemplate(locale(component, 'content')))\"\r\n #html\r\n [register]=\"component\"\r\n [componentRef]=\"html\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region image -->\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <img [src]=\"evaluateString(component.source)\"\r\n [alt]=\"evaluateString(locale(component, 'alt'))\"\r\n style=\"width: 100%;height: 100%;\"\r\n #image\r\n [register]=\"component\"\r\n [componentRef]=\"image\">\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-grid-angular [modules]=\"getGridModules(component)\"\r\n [gridOptions]=\"getGridOptions(component)\"\r\n [selectable]=\"evaluateBoolean(component.selectable)\"\r\n [multiSelect]=\"evaluateBoolean(component.multiSelect)\"\r\n (selectionChanged)=\"onGridSelectionChanged(component, $event)\"\r\n [suppressActions]=\"evaluateBoolean(component.suppressActions)\"\r\n [columnDefs]=\"component.columns || evaluate(component.columnsExpression) || []\"\r\n [rowSource]=\"getRowSource(component)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [style.height]=\"component.autoHeight ? null : evaluateHeight(component.height)\"\r\n [formGroup]=\"formGroup\"\r\n #table\r\n [register]=\"component\"\r\n [componentRef]=\"table\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region button -->\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <ngx-sirio-button (clickEvent)=\"clickButton(component, $event)\"\r\n [color]=\"evaluateColor(component.color)\"\r\n [disabled]=\"evaluateBoolean(component.disabled)\"\r\n #button\r\n [register]=\"component\"\r\n [componentRef]=\"button\">\r\n <ng-container *ngIf=\"evaluateString(component.icon) as icon; else noIcon\">\r\n <span *ngIf=\"component.iconPosition!='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <span *ngIf=\"component.iconPosition=='right'\" [class]=\"icon\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n <ng-template #noIcon>\r\n {{ evaluateString(locale(component, 'label')) }}\r\n </ng-template>\r\n </ngx-sirio-button>\r\n </div> \r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region separator -->\r\n <ng-container *ngSwitchCase=\"'separator'\">\r\n <div class=\"separator\"\r\n #separator\r\n [register]=\"component\"\r\n [componentRef]=\"separator\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region spacer -->\r\n <ng-container *ngSwitchCase=\"'spacer'\">\r\n <div style=\"width: 100%\"\r\n [style.height.px]=\"component.height\"\r\n #spacer\r\n [register]=\"component\"\r\n [componentRef]=\"spacer\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region iframe -->\r\n <ng-container *ngSwitchCase=\"'iframe'\">\r\n <label [for]=\"component.id\">{{ evaluateString(locale(component, 'label')) }}</label>\r\n <iframe [src]=\"evaluateUrl(component.url)\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [style.width]=\"'100%'\"\r\n [style.height.px]=\"component.height\"\r\n [frameSecurity]=\"component.security\"\r\n #iframe\r\n [register]=\"component\"\r\n [componentRef]=\"iframe\">\r\n </iframe>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region alert -->\r\n <ng-container *ngSwitchCase=\"'alert'\">\r\n <ngx-sirio-alert [type]=\"component.role\"\r\n [labelClose]=\"locale(Texts, 'Close')\"\r\n [preventClose]=\"evaluateBoolean(component.preventClose)\"\r\n #alert\r\n [register]=\"component\"\r\n [componentRef]=\"alert\">\r\n <ngx-sirio-alert-message>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-alert-message>\r\n </ngx-sirio-alert>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region notice -->\r\n <ng-container *ngSwitchCase=\"'notice'\">\r\n <ngx-sirio-notify #notice\r\n [register]=\"component\"\r\n [componentRef]=\"notice\">\r\n <ngx-sirio-notify-body [title]=\"evaluateString(locale(component, 'title'))\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </ngx-sirio-notify-body>\r\n </ngx-sirio-notify>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tooltip -->\r\n <ng-container *ngSwitchCase=\"'tooltip'\">\r\n <app-template-wrapper #tooltipWrapper [template]=\"tooltipTemplate\" [context]=\"{ component: component }\"></app-template-wrapper>\r\n <button class=\"sirio-label-popover fas fa-info-circle\"\r\n sirioTooltip\r\n [hasPopover]=\"true\"\r\n [customTemplate]=\"tooltipWrapper.getTemplateRef()\"\r\n #tooltip\r\n [register]=\"component\"\r\n [componentRef]=\"tooltip\"></button>\r\n <ng-template #tooltipTemplate let-component=\"component\">\r\n <div class=\"sirio-tooltip-body\">\r\n <p *ngIf=\"component.title\" class=\"sirio-tooltip-heading sirio-space-down\">\r\n {{ evaluateString(locale(component, 'title')) }}\r\n </p>\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region chart -->\r\n <ng-container *ngSwitchCase=\"'chart'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-charts [options]=\"(getChartOptions(component) | async) ?? {}\"\r\n [observe]=\"getChartData(component)\"\r\n [callback]=\"invalidateChart(component)\"\r\n [style.height.px]=\"component.height\"\r\n #chart\r\n [register]=\"component\"\r\n [componentRef]=\"chart\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region component -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <ng-container *ngIf=\"component.isInput; else noInputTemplate\">\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback sirio-display-feedback\">{{textFeedback}}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-helper-text\">{{textHelp}}</p>\r\n </ng-container>\r\n <ng-template #noInputTemplate>\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n", styles: [".flex{display:flex}.field-set{align-items:start}.field-set>.col-host>*{margin-bottom:10px}.separator{border-bottom:2px solid #d9e4f7;width:100%;margin:10px 0}.group-outline{border:1px solid #d9e4f7;padding:15px;margin-top:2px;margin-bottom:2px}.group-outline-repeat{margin-top:8px;margin-bottom:8px}.valign-start>.row{align-items:start}.valign-center>.row{align-items:center}.valign-end>.row{align-items:end}.component-start{align-self:start}.component-center{align-self:center}.component-end{align-self:end}.text-paragraph p{margin-bottom:0!important}.sirio-tab.sirio-tab-vertical .sirio-tab-body{margin-left:10px;margin-right:10px}.sirio-tab:not(.sirio-tab-vertical) .sirio-tab-body{margin-top:10px;margin-bottom:10px}.sirio-label{cursor:default}.sirio-control.is-disabled .sirio-input-group .sirio-input-group-text,.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{border:0px}.sirio-control.is-readonly .sirio-form-control{background-color:#fff!important;color:#454d56}.sirio-form-control[type=number]:disabled{background-image:none}ngx-sirio-alert.prevent-close .sirio-alert-close{display:none}.col-host .sirio-accordion .sirio-accordion-body .sirio-accordion-content{padding:16px}.col-host .sirio-accordion-body{overflow:unset!important}.sirio-dialog-title{display:flex;margin-top:0}.sirio-dialog-title span{margin-right:10px;margin-bottom:0!important}.ag-header-cell.hide-filter .ag-header-cell-filter-button{display:none}.sirio-tab.sirio-tab-scroll{display:block}.sirio-dropdown .searchable{position:absolute;width:100%;display:none;left:0}.ag-cell-value .btn-small-group{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.ag-cell-value .btn-small .sirio-btn{padding:.25rem .0625rem;margin:2px}.ag-selection-checkbox .ag-checkbox-input-wrapper.ag-disabled{display:none}ag-charts{display:block;height:100%;border-radius:8px;background-color:var(--chart-bg);border:1px solid var(--chart-border);overflow:hidden}.ag-cell.cell-component{padding:1px}.ag-cell.row-numbers-cell{text-align:center;background:#f2f6fc}.ag-header-cell.row-numbers-header .ag-header-cell-label{justify-content:center;text-align:center}.ag-cell-auto-height .ag-cell-value{line-height:normal}\n", ".sirio-control.ng-invalid .sirio-form-feedback,.sirio-display-feedback{color:#aa224f;display:inline-block}.sirio-control.ng-invalid .sirio-input-group-text{color:#aa224f;border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label{color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]~label:before,.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-is-invalid input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label{color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:before,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:before{border-color:#aa224f}.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid~label:after,.sirio-form-check.sirio-form-toggle input[type=checkbox].sirio-is-invalid:checked~label:after{background-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=checkbox]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=checkbox]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label{color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]~label:before,.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:before{border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-form-check input[type=radio]:checked~label:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3e%3cpath fill='%23AA224F' d='M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z'/%3e%3c/svg%3e\");background-size:12px}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]+label{color:#aa224f;border-color:#aa224f}.sirio-control.sirio-is-invalid fieldset .sirio-chip-selection input[type=radio]:checked+label{color:#fff;background-color:#aa224f;border-color:#aa224f}.sirio-upload.sirio-is-invalid button{background-color:#aa224f;border-color:#aa224f}\n", ".sirio-control.text-left input.sirio-form-control,.sirio-control.text-left textarea.sirio-form-control,.sirio-control.text-left div.sirio-form-control{text-align:left}.sirio-control.text-center input.sirio-form-control,.sirio-control.text-center textarea.sirio-form-control,.sirio-control.text-center div.sirio-form-control{text-align:center}.sirio-control.text-right input.sirio-form-control,.sirio-control.text-right textarea.sirio-form-control,.sirio-control.text-right div.sirio-form-control{text-align:right}.sirio-control.text-center input.sirio-datepicker,.sirio-control.text-center input.sirio-timepicker,.sirio-control.text-right input.sirio-datepicker,.sirio-control.text-right input.sirio-timepicker{padding-right:40px}.horizontal-left{display:flex;justify-content:left}.horizontal-center{display:flex;justify-content:center}.horizontal-right{display:flex;justify-content:right}.horizontal-fill button{width:100%}.horizontal-left legend,.horizontal-center legend,.horizontal-right legend,.horizontal-fill legend{float:none}.col-host.component-center ngx-sirio-toggle .sirio-form-toggle label{margin-bottom:0}\n", ".sirio-control .sirio-form-control.data-display{border-color:#e3e5e8}.sirio-control .sirio-form-control.data-display.textarea{white-space:pre;overflow:auto;height:auto;line-height:140%;min-height:3rem;padding:1rem}.sirio-control .sirio-form-control.data-display.text,.sirio-control .sirio-form-control:hover.data-display.text{overflow:auto;height:auto;margin-top:-6px;color:#454d56}.sirio-control .sirio-form-control.data-display.number{font-family:Roboto Mono,monospace}.sirio-control .sirio-form-control.data-display.checkbox{display:flex;justify-content:center;align-items:center}\n", ".sirio-control.light-readonly label:hover,.sirio-control.light-view div.sirio-label:hover{color:#454d56}.sirio-control.light-readonly input.sirio-form-control,.sirio-control.light-readonly .sirio-dropdown .sirio-dropdown-select,.sirio-control.light-readonly textarea.sirio-form-control,.sirio-control.light-view div.sirio-form-control{background:none!important;border:0px;padding-left:0}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text{background:none}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text span{color:#5b6571}.sirio-control.light-readonly .sirio-input-group .sirio-input-group-text.prefix{padding-left:0}.sirio-upload.sirio-control.light-readonly label,.sirio-upload.sirio-control.is-disabled label{pointer-events:none}\n", ":root{--sirio-spinner-blue: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='%2300368F' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\");--sirio-spinner-white: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' stroke='white' stroke-width='10' fill='none' stroke-linecap='round' stroke-dasharray='62.8 62.8' transform='rotate(-90 50 50)'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 50 50' to='360 50 50' dur='1s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/svg%3E\")}.sirio-control .sirio-is-pending,.sirio-control.sirio-is-pending input.sirio-form-control,.sirio-control.sirio-is-pending .sirio-dropdown .sirio-form-control,.sirio-form-check.sirio-control.sirio-is-pending{background-image:var(--sirio-spinner-blue);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}textarea.sirio-form-control.sirio-is-pending{background-position:top .9375rem right .9375rem}.sirio-control.sirio-is-pending input.sirio-form-control{background-position:right .9375rem top 50%}.sirio-upload.sirio-control.sirio-is-pending ngx-sirio-button .sirio-btn-primary{background-image:var(--sirio-spinner-white);background-position:right .9375rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2.25rem}.sirio-control.sirio-is-pending fieldset{background-image:var(--sirio-spinner-blue);background-repeat:no-repeat;background-position:right .9375rem top 1rem;background-size:1rem;padding-right:2.25rem}\n", ":root{--dynamiclist-border: 1px solid #ccc}.dynamiclist-no-data{text-align:center;padding:20px;font-style:italic;border:var(--dynamiclist-border)}.dynamiclist-table{width:100%;border-collapse:collapse;border:none}.dynamiclist-table.main{border:var(--dynamiclist-border)}.dynamiclist-table.main .dynamiclist-table{border-left:var(--dynamiclist-border);border-bottom:var(--dynamiclist-border)}.dynamiclist-table td{border:var(--dynamiclist-border)}.dynamiclist-table tr:first-child td{border-top:none}.dynamiclist-table tr:last-child td{border-bottom:none}.dynamiclist-table tr td:first-child{border-left:none}.dynamiclist-table tr td:last-child{border-right:none}.dynamiclist-table td.content-cell{width:100%;padding-left:8px;padding-right:8px;border-left:var(--dynamiclist-border)}.dynamiclist-table td.content-cell .group-outline-repeat{margin-bottom:0}.dynamiclist-table td.command-cell{vertical-align:middle}.dynamiclist-table td.command-cell>div{display:flex;justify-content:right}.dynamiclist-table td.recursion-cell .layout{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto 1fr;width:100%;height:100%}.dynamiclist-table td.recursion-cell .recursion-toggle{grid-row:1 / span 2;grid-column:1;background-color:#f5f5f5;align-items:center}.dynamiclist-table td.recursion-cell .recursion-title{grid-row:1;grid-column:2;background:#f5f5f5;display:flex;align-items:center;min-height:34px}.dynamiclist-table td.recursion-cell .recursion-title .recursion-text{flex:1;text-align:center}.dynamiclist-table td.recursion-cell .recursion-title .recursion-add{margin-left:auto}.dynamiclist-table td.recursion-cell .recursion-content{grid-row:2;grid-column:2}.dynamiclist-table td.recursion-cell .recursion-content .is-open{overflow:visible!important}.dynamiclist-table ngx-sirio-button button{padding:7px}\n", ".df-field-dynamiclist .sirio-pagination{width:100%;background-color:#f2f6fc;margin:0}.df-field-dynamiclist .sirio-pagination-page{background-color:#f2f6fc}.df-field-dynamiclist .sirio-pagination-cursor{margin-left:0}.df-field-dynamiclist .actions{margin-left:auto}\n", ".datetime-container{display:flex;gap:8px;align-items:flex-end}.datetime-container{display:flex;gap:8px}.datetime-container ngx-sirio-datepicker{flex:1}.datetime-container ngx-sirio-timepicker{flex:1}.datetime-container+.sirio-form-feedback{color:#aa224f;display:inline-block}\n", ".sirio-tab.sirio-tab-vertical .sirio-tab-item{width:100%}\n", ".sirio-tooltip .sirio-tooltip-body{white-space:pre-line}\n"] }]
|
|
705
708
|
}], ctorParameters: () => [{ type: i1.SanitizeService }, { type: i2.MarkdownService }, { type: i3.MimeService }, { type: i4.ProgrammabilityService }, { type: i5.WeakService }, { type: i6.RegisterService }, { type: i7.MetadataService }, { type: i8.LanguageService }, { type: i9.GlobalService }, { type: i10.FormService }, { type: i11.GridService }, { type: i12.ChartService }, { type: i13.DialogService }, { type: i14.AutoFocusService }, { type: i0.ElementRef }], propDecorators: { form: [{
|
|
706
709
|
type: Input
|
|
707
710
|
}], rows: [{
|
|
@@ -718,5 +721,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
718
721
|
type: Input
|
|
719
722
|
}], identityIndex: [{
|
|
720
723
|
type: Input
|
|
724
|
+
}], disableAutoFocus: [{
|
|
725
|
+
type: Input
|
|
721
726
|
}] } });
|
|
722
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvZHluYW1pYy1maWVsZHMvZHluYW1pYy1maWVsZHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvZHluYW1pYy1maWVsZHMvZHluYW1pYy1maWVsZHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsaUJBQWlCLEVBQXVELE1BQU0sZUFBZSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUkvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDN0csT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXpELE9BQU8sRUFDTCxtQkFBbUIsRUFDakIsb0JBQW9CLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCLEVBQzNFLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLHdCQUF3QixFQUN2Ryx3QkFBd0IsRUFBRSx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFDN0YsdUJBQXVCLEVBQUUsNEJBQTRCLEVBQUUsNkJBQTZCLEVBQUUsMkJBQTJCLEVBQ2pILG9CQUFvQixFQUFFLHdCQUF3QixFQUM5QyxvQkFBb0IsRUFBRSwrQkFBK0IsRUFBRSw0QkFBNEIsRUFBRSx1QkFBdUIsRUFDNUcsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQ3JFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUNwRyxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSw2QkFBNkIsRUFDNUUsdUJBQXVCLEVBRTFCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEM5QyxNQUFNLE9BQU8sc0JBQXNCO0lBWWI7SUFDUjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBekJILElBQUksQ0FBd0I7SUFDNUIsSUFBSSxDQUF5QjtJQUM3QixTQUFTLENBQWE7SUFDdEIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixRQUFRLEdBQW1CLElBQUksQ0FBQztJQUNoQyxjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBQzNCLFFBQVEsQ0FBVTtJQUNsQixhQUFhLENBQVU7SUFFaEMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUVkLFlBQW9CLFNBQTBCLEVBQ2xDLFFBQXlCLEVBQ3pCLElBQWlCLEVBQ2pCLGVBQXVDLEVBQ3ZDLElBQWlCLEVBQ2pCLFFBQXlCLEVBQ3pCLFFBQXlCLEVBQ3pCLGVBQWdDLEVBQ2hDLE1BQXFCLEVBQ3JCLFdBQXdCLEVBQ3hCLElBQWlCLEVBQ2pCLEtBQW1CLEVBQ25CLE1BQXFCLEVBQ3JCLFNBQTJCLEVBQzNCLEVBQWM7UUFkTixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLE9BQUUsR0FBRixFQUFFLENBQVk7SUFHMUIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBNEIsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlLENBQUMsU0FBYztRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNqRCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLENBQUMsU0FBYztRQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQTtJQUMxRSxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQWMsRUFBRSxHQUFXO1FBQ2hDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxjQUFjLENBQUMsS0FBb0I7UUFDakMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBOEI7UUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBNkI7UUFDMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBb0I7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxNQUFNLFFBQVEsR0FBRyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ25ELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQTZCO1FBQzFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUM7YUFDSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBb0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFtQixFQUFFLFlBQXFCLElBQUk7UUFDckQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRTtZQUN6RCxTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQW9CO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLEtBQUssR0FBRyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ25ELElBQUksS0FBSyxLQUFLLE9BQU87Z0JBQ25CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsTUFBTSxXQUFXLEdBQW1CLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckcsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUUsS0FBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLFdBQWdCO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXJELE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBK0I7UUFDMUMsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQStCO1FBQzFDLElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFtQjtRQUM3QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxHQUFHLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFBLENBQUM7SUFFRixRQUFRLENBQUMsSUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUFBLENBQUM7SUFFRixZQUFZLENBQUMsVUFBa0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQUEsQ0FBQztJQUVGLFdBQVcsQ0FBQyxTQUFjLEVBQUUsS0FBVTtRQUNwQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsU0FBYztRQUN0QixJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQzFELE9BQU8sQ0FDTCxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3BCLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDdkIsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQy9CLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQWM7UUFDdEIsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsU0FBUztZQUNULE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixDQUFDO2FBQ0ksSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0IsY0FBYztZQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxDQUFDO2FBQ0ksSUFBSSxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUNJLENBQUM7WUFDSixVQUFVO1lBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLFNBQWM7UUFDMUIsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFDSSxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQVUsRUFBRSxJQUEwQztRQUM1RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuQyxDQUFDLENBQUE7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUNJLENBQUM7WUFDSixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxTQUFjO1FBQzFCLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsZUFBZSxDQUFDLFNBQWM7UUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDL0QsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxlQUFlLENBQUMsU0FBYztRQUM1QixPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFjO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxjQUFjLENBQUMsU0FBYztRQUMzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUNwRCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGNBQWMsQ0FBQyxTQUFjO1FBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsc0JBQXNCLENBQUMsU0FBYyxFQUFFLEtBQVU7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQWM7UUFDekIsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekIsYUFBYTtZQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFDSSxDQUFDO1lBQ0osVUFBVTtZQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQWM7UUFDN0IsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLENBQUMsU0FBb0I7UUFDMUIsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxTQUFvQixFQUFFLEtBQWEsRUFBRSxXQUFvQjtRQUNsRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFO2dCQUN2RCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO2dCQUN0QyxTQUFTLEVBQUUsZUFBZTtnQkFDMUIsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ3JCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQzt3QkFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDL0IsQ0FBQztnQkFDSCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUNJLENBQUM7WUFDSixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLFlBQVksQ0FBQyxTQUFvQixFQUFFLFFBQWdCLENBQUM7UUFDbEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQzdCLFNBQVMsRUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FBQyxTQUFvQixFQUFFLEtBQWE7UUFDNUMsTUFBTSxPQUFPLEdBQW9CLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFvQixFQUFFLEtBQWE7UUFDOUMsTUFBTSxPQUFPLEdBQW9CLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFNBQWM7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1lBQzFELE9BQU87Z0JBQ0w7b0JBQ0UsVUFBVSxFQUFFO3dCQUNWOzRCQUNFLE1BQU0sRUFBRSxPQUFPOzRCQUNmLFFBQVEsRUFBRTtnQ0FDUixTQUFTLEVBQUUsSUFBSTs2QkFDaEI7NEJBQ0QsU0FBUyxFQUFFO2dDQUNUO29DQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7b0NBQ25DLEtBQUssRUFBRSxNQUFNO29DQUNiLE1BQU0sRUFBRSxDQUFDO2lDQUNWO2dDQUNEO29DQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7b0NBQ25DLEtBQUssRUFBRSxNQUFNO29DQUNiLFFBQVEsRUFBRSxTQUFTO29DQUNuQixPQUFPLEVBQUUsT0FBTztpQ0FDakI7Z0NBQ0Q7b0NBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztvQ0FDbkMsS0FBSyxFQUFFLE1BQU07aUNBQ2Q7Z0NBQ0Q7b0NBQ0UsS0FBSyxFQUFFLEtBQUs7b0NBQ1osT0FBTyxFQUFFLEVBQUU7b0NBQ1gsT0FBTyxFQUFFLEVBQUU7b0NBQ1gsT0FBTyxFQUFFLFFBQVE7b0NBQ2pCLFFBQVEsRUFBRSxXQUFXO2lDQUN0QjtnQ0FDRDtvQ0FDRSxPQUFPLEVBQUUsRUFBRTtvQ0FDWCxPQUFPLEVBQUUsRUFBRTtvQ0FDWCxPQUFPLEVBQUUsUUFBUTtvQ0FDakIsUUFBUSxFQUFFLFdBQVc7aUNBQ3RCOzZCQUNGOzRCQUNELFlBQVksRUFBRSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUc7NEJBQ2pDLFFBQVEsRUFBRSxHQUFHOzRCQUNiLGFBQWEsRUFBRSxTQUFTLENBQUMsV0FBVzs0QkFDcEMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRO3lCQUMvQjtxQkFDRjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBK0M7UUFDMUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFVLEVBQUUsRUFBRTtZQUNoQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQTtRQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDbEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDcEMsS0FBSyxFQUFFOzRCQUNMLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbkIsQ0FBQzt3QkFDRCxRQUFRLEVBQUUsS0FBSzt3QkFDZixVQUFVLEVBQUUsS0FBSztxQkFDbEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxTQUFjO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDeEMsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4RixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7YUFDSSxDQUFDO1lBQ0osT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxTQUFjO1FBQzVCLE9BQU87WUFDTCxlQUFlLEVBQUUsU0FBUyxDQUFDLFdBQVcsS0FBSyxJQUFJO1NBQ2hELENBQUM7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU87WUFDTCxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUk7WUFDdkIsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU87WUFDNUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVE7WUFDOUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUs7U0FDekMsQ0FBQTtJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxTQUFjO1FBQzlCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJO1lBQ2xCLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUNwRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUNyQyxDQUFDLFlBQVksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSTtZQUNwQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxDQUFDLGFBQWEsS0FBSyxPQUFPO1lBQ3hELENBQUMsa0JBQWtCLENBQUMsRUFBRSxTQUFTLENBQUMsYUFBYSxLQUFLLFFBQVE7WUFDMUQsQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLENBQUMsYUFBYSxLQUFLLEtBQUs7U0FDckQsQ0FBQTtRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBYztRQUU5QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQztRQUVkLE9BQU8sTUFBTSxDQUFDO1FBRWQsa0NBQWtDO1FBQ2xDLDRDQUE0QztRQUM1QyxnQkFBZ0I7UUFDaEIsR0FBRztRQUNILFVBQVU7UUFDViwwREFBMEQ7UUFDMUQsMkRBQTJEO1FBQzNELG9FQUFvRTtRQUNwRSx1RUFBdUU7UUFDdkUsSUFBSTtJQUNOLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFjO1FBQzdCLFFBQVEsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUE7WUFDL0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLGFBQWEsQ0FBQTtZQUNuQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFBO1lBQ2pDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsU0FBYztRQUNuQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDO1FBQzlCLE9BQU87WUFDTCxDQUFDLEdBQUcsUUFBUSxPQUFPLENBQUMsRUFBRSxTQUFTLEtBQUssTUFBTTtZQUMxQyxDQUFDLEdBQUcsUUFBUSxTQUFTLENBQUMsRUFBRSxTQUFTLEtBQUssUUFBUTtZQUM5QyxDQUFDLEdBQUcsUUFBUSxRQUFRLENBQUMsRUFBRSxTQUFTLEtBQUssT0FBTztZQUM1QyxDQUFDLEdBQUcsUUFBUSxPQUFPLENBQUMsRUFBRSxTQUFTLEtBQUssTUFBTTtTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFjO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLGdCQUFnQjtlQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLElBQUk7WUFDbkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsT0FBTyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxTQUFjO1FBQ3RCLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLFNBQVM7WUFDVCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQzthQUNJLElBQUksU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsYUFBYTtZQUNiLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFDSSxDQUFDO1lBQ0osVUFBVTtZQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sR0FBb0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLElBQVksUUFBUTtRQUNsQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFtQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFtQjtRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJO1lBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFbkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBVTtRQUNoQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDckIsT0FBTyxLQUFLLENBQUM7UUFDZixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQStCLEVBQUUsUUFBYTtRQUVwRSxJQUFJLENBQUMsUUFBUTtZQUNYLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsUUFBUTtZQUNYLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBRTNCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDakMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUNJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDckIsQ0FBQzthQUNJLENBQUM7WUFDSixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNyQixPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU87YUFDSixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXRDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE1BQTJCLEVBQUUsS0FBVTtRQUUvRCxJQUFJLENBQUMsS0FBSztZQUNSLE9BQU8sS0FBSyxDQUFDO1FBRWYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsVUFBVTtZQUNiLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxNQUFNLEdBQStCLElBQUksQ0FBQztRQUU5QyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFFWixVQUFVO2lCQUNQLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDO2lCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDZCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hELElBQUksR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNqQixNQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQ0ksSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2lCQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUNqQyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM3QyxPQUFPLEtBQUssQ0FBQztRQUVmLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLGVBQWU7SUFDZixrREFBa0Q7SUFDbEQsR0FBRztJQUVLLG1CQUFtQjtRQUN4QixVQUFVLENBQUMsT0FBZSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2xDLElBQUksRUFBRTtnQkFDSixVQUFVO2dCQUNWLFFBQVE7Z0JBQ1IsU0FBUztnQkFDVCxXQUFXO2dCQUNYLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxRQUFRO2FBQ1Q7WUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDMUQsTUFBTSxFQUFFO2dCQUNOLFNBQVM7Z0JBQ1QsVUFBVTtnQkFDVixPQUFPO2dCQUNQLFFBQVE7Z0JBQ1IsUUFBUTtnQkFDUixRQUFRO2dCQUNSLFFBQVE7Z0JBQ1IsUUFBUTtnQkFDUixXQUFXO2dCQUNYLFNBQVM7Z0JBQ1QsVUFBVTtnQkFDVixVQUFVO2FBQ1g7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxLQUFLO2dCQUNMLEtBQUs7YUFDTjtZQUNELEtBQUssRUFBRSxNQUFNO1lBQ2IsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFLFlBQVk7WUFDcEIsU0FBUyxFQUFFLENBQUM7U0FDYixDQUFDO0lBQ0osQ0FBQztJQUFBLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxTQUFvQjtRQUMxQyxTQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsU0FBb0I7UUFDM0MsT0FBUSxTQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztJQUNuRCxDQUFDO3dHQTdxQlUsc0JBQXNCOzRGQUF0QixzQkFBc0IsdVFBUnRCO1lBQ1QsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixXQUFXO1lBQ1gsWUFBWTtTQUNiLCtDQ3pISCx3aGpGQW1xQ0Esa21hRHZpQ2Esc0JBQXNCLDZLQTNCdkIsWUFBWSw2MEJBQUUsbUJBQW1CLHkyQ0FBRSxXQUFXLHdQQUNwRCxnQkFBZ0IseUhBQUUsaUJBQWlCLDBIQUFFLGdCQUFnQixxRkFBRSxzQkFBc0IsdUZBQUUsd0JBQXdCLHlEQUN2RyxpQkFBaUIsdURBQUUsbUJBQW1CLHlEQUFFLGVBQWUsNkdBQUUsa0JBQWtCLHFIQUFFLFlBQVksNkVBQUUsYUFBYSxvT0FBRSxlQUFlLHVGQUN6SCxpQkFBaUIsNkZBQUUsZ0JBQWdCLDJGQUFFLGtCQUFrQix5RkFBRSxhQUFhLHNEQUFFLGVBQWUsc0hBQUUsYUFBYSx1R0FBRSxrQkFBa0IsK0VBQzFILG1CQUFtQix5REFBRSxnQkFBZ0IsNEZBQUUsaUJBQWlCLDZFQUFFLHVCQUF1Qiw2REFBRSxzQkFBc0IsaUdBQ3pHLDRCQUE0Qix3R0FBRSwyQkFBMkIsd0dBQUUsY0FBYyxxRkFBRSx3QkFBd0IsMkZBQ25HLG1CQUFtQiwyWEFDbkIsb0JBQW9CLGtUQUFFLDBCQUEwQixpSUFBRSx5QkFBeUIsOEhBQzNFLDJCQUEyQiw0UkFBRSxzQkFBc0IscVBBQUUsd0JBQXdCLG1YQUFFLHdCQUF3QixnV0FDdkcsd0JBQXdCLGtTQUFFLHlCQUF5QixzUEFBRSxpQkFBaUIseUtBQUUscUJBQXFCLHNHQUM3Rix1QkFBdUIsa0ZBQUUsNEJBQTRCLHFJQUFFLDZCQUE2Qix1RUFBRSwyQkFBMkIscUVBQ2pILG9CQUFvQixxWkFBRSx3QkFBd0IsdWFBQzlDLG9CQUFvQixvUEFBRSwrQkFBK0IsMFNBQUUsNEJBQTRCLHVTQUFFLHVCQUF1QixtUEFDNUcsbUJBQW1CLGtJQUFFLDBCQUEwQixvRUFBRSxvQkFBb0IsaVVBQ3JFLG9CQUFvQixpRkFBRSx3QkFBd0IscUZBQzlDLHFCQUFxQixvT0FBRSxzQkFBc0Isa0hBQUUsNkJBQTZCLGlIQUU1RSx3QkFBd0Isa0dBQUUsb0JBQW9CLDhHQUM5QyxhQUFhLHVyU0FBRSxRQUFROzs0RkFTaEIsc0JBQXNCO2tCQTNDbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FjbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFdBQVc7d0JBQ3BELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLHdCQUF3Qjt3QkFDdkcsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsZUFBZTt3QkFDekgsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCO3dCQUMxSCxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxzQkFBc0I7d0JBQ3pHLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLGNBQWMsRUFBRSx3QkFBd0I7d0JBQ25HLG1CQUFtQjt3QkFDbkIsb0JBQW9CLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCO3dCQUMzRSwyQkFBMkIsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0I7d0JBQ3ZHLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLGlCQUFpQixFQUFFLHFCQUFxQjt3QkFDN0YsdUJBQXVCLEVBQUUsNEJBQTRCLEVBQUUsNkJBQTZCLEVBQUUsMkJBQTJCO3dCQUNqSCxvQkFBb0IsRUFBRSx3QkFBd0I7d0JBQzlDLG9CQUFvQixFQUFFLCtCQUErQixFQUFFLDRCQUE0QixFQUFFLHVCQUF1Qjt3QkFDNUcsbUJBQW1CLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CO3dCQUNyRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSx3QkFBd0I7d0JBQ3BHLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLDZCQUE2Qjt3QkFDNUUsdUJBQXVCO3dCQUN2Qix3QkFBd0IsRUFBRSxvQkFBb0I7d0JBQzlDLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFDakI7d0JBQ1QsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLFdBQVc7d0JBQ1gsWUFBWTtxQkFDYixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJO3llQUc1QixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJRHluYW1pY0ZpZWxkc0NvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1maWVsZHMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQXJyYXksIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU2FmZUh0bWwsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBEYXRlcGlja2VyIH0gZnJvbSAndmFuaWxsYWpzLWRhdGVwaWNrZXInO1xyXG5pbXBvcnQgeyBTYW5pdGl6ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zYW5pdGl6ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWFya2Rvd25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWFya2Rvd24uc2VydmljZSc7XHJcbmltcG9ydCB7IE1pbWVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWltZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUHJvZ3JhbW1hYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2dyYW1tYWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgV2Vha1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy93ZWFrLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZWdpc3RlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZWdpc3Rlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JhbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9nbG9iYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGFydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jaGFydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0b0ZvY3VzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dG9mb2N1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvblBhdGNoRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy92YWxpZGF0aW9ucGF0Y2guZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29sbGFwc2VQYXRjaERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY29sbGFwc2VwYXRjaC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBBZG9ybmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9hZG9ybmVyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFJlYWRPbmx5RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yZWFkb25seS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEaXNwbGF5RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kaXNwbGF5LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFJlcGVhdERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVwZWF0LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFJlY3Vyc2lvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVjdXJzaW9uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEZyYW1lU2VjdXJpdHlEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2ZyYW1lc2VjdXJpdHkuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2Ryb3Bkb3duLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFRhYkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGFiLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEFjY29yZGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYWNjb3JkaW9uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEFsZXJ0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9hbGVydC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBHcmlkRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9ncmlkLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENoYW5nZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY2hhbmdlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFJlZ2lzdGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yZWdpc3Rlci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZWZyZXNoRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yZWZyZXNoLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFVwZGF0ZUJsdXJEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3VwZGF0ZWJsdXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBOdW1iZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL251bWJlci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90ZXh0LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFZhbHVlU3luY0RpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdmFsdWVzeW5jLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFRhYkNvbnRyb2xEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RhYmNvbnRyb2wuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVGFiSXRlbURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGFiaXRlbS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb2xsYXBzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY29sbGFwc2UuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQWNjb3JkaW9uUGFuZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FjY29yZGlvbnBhbmVsLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lQ29vcmRpbmF0b3JEaXJlY3RpdmUsIERhdGVUaW1lVmFsaWRhdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGF0ZXRpbWUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUmVxdWlyZWRPbklucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yZXF1aXJlZC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvdGVtcGxhdGUtd3JhcHBlci90ZW1wbGF0ZS13cmFwcGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IER5bmFtaWNIb3N0Q29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1ob3N0L2R5bmFtaWMtaG9zdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyB0b0V4cHJlc3Npb24gfSBmcm9tICcuLi91dGlscy9mZWVsYWJsZSc7XHJcbmltcG9ydCB7IGlzTWVhbmluZ2Z1bCB9IGZyb20gJy4uL3V0aWxzL2lzTWVhbmluZ2Z1bCc7XHJcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc2V0Rm9jdXMgfSBmcm9tICcuLi91dGlscy9mb2N1c2FibGUnO1xyXG5pbXBvcnQgeyBoYXNGYWN0b3J5IH0gZnJvbSAnLi4vc2VydmljZXMvYnVpbGRlci5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgU2lyaW9JbnB1dENvbXBvbmVudFxyXG4gICwgU2lyaW9TZWxlY3RDb21wb25lbnQsIFNpcmlvU2VsZWN0T3B0aW9uQ29tcG9uZW50LCBTaXJpb1NlbGVjdFBhbmVsQ29tcG9uZW50XHJcbiAgLCBTaXJpb0NoZWNrYm94R3JvdXBDb21wb25lbnQsIFNpcmlvQ2hlY2tib3hDb21wb25lbnQsIFNpcmlvRGF0ZXBpY2tlckNvbXBvbmVudCwgU2lyaW9UaW1lcGlja2VyQ29tcG9uZW50XHJcbiAgLCBTaXJpb1JhZGlvR3JvdXBDb21wb25lbnQsIFNpcmlvUmFkaW9CdXR0b25Db21wb25lbnQsIFNpcmlvVGFiQ29tcG9uZW50LCBTaXJpb1RhYkl0ZW1Db21wb25lbnRcclxuICAsIFNpcmlvQWNjb3JkaW9uQ29tcG9uZW50LCBTaXJpb0FjY29yZGlvblBhbmVsQ29tcG9uZW50LCBTaXJpb0FjY29yZGlvbkhlYWRlckNvbXBvbmVudCwgU2lyaW9BY2NvcmRpb25Cb2R5Q29tcG9uZW50XHJcbiAgLCBTaXJpb0J1dHRvbkNvbXBvbmVudCwgU2lyaW9GaWxlVXBsb2FkQ29tcG9uZW50XHJcbiAgLCBTaXJpb1RvZ2dsZUNvbXBvbmVudCwgU2lyaW9DaGlwQ2hlY2tib3hHcm91cENvbXBvbmVudCwgU2lyaW9DaGlwUmFkaW9Hcm91cENvbXBvbmVudCwgU2lyaW9JbnB1dENoaXBDb21wb25lbnRcclxuICAsIFNpcmlvQWxlcnRDb21wb25lbnQsIFNpcmlvQWxlcnRNZXNzYWdlQ29tcG9uZW50LCBTaXJpb1NsaWRlckNvbXBvbmVudFxyXG4gICwgU2lyaW9Ob3RpZnlDb21wb25lbnQsIFNpcmlvTm90aWZ5Qm9keUNvbXBvbmVudCwgU2lyaW9Ob3RpZnlBY3Rpb25Db21wb25lbnQsIFNpcmlvTm90aWZ5TGlua0NvbXBvbmVudFxyXG4gICwgU2lyaW9Ub29sdGlwRGlyZWN0aXZlLCBTaXJpb0NvbGxhcHNlQ29tcG9uZW50LCBTaXJpb0NvbGxhcHNlVHJpZ2dlckRpcmVjdGl2ZVxyXG4gICwgU2lyaW9QYWdpbmF0b3JDb21wb25lbnRcclxuICAsIE5neFNpcmlvRXZlbnQsIEJ1dHRvbkNvbG9yc1xyXG59IGZyb20gJ25neC1zaXJpby1saWInO1xyXG5cclxuaW1wb3J0IHsgQWdHcmlkQW5ndWxhciB9IGZyb20gJ2FnLWdyaWQtYW5ndWxhcic7XHJcbmltcG9ydCB7IE1vZHVsZSwgR3JpZE9wdGlvbnMgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcbmltcG9ydCB7IEFnQ2hhcnRzIH0gZnJvbSBcImFnLWNoYXJ0cy1hbmd1bGFyXCI7XHJcbmltcG9ydCB7IEFnQ2hhcnRPcHRpb25zIH0gZnJvbSAnYWctY2hhcnRzLWNvbW11bml0eSc7XHJcblxyXG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAd2VtYWtlNHUvaW50ZXJhY3QnO1xyXG5pbXBvcnQgeyBUZXh0cyB9IGZyb20gJy4uL2xvY2FsZS9sb2NhbGUnO1xyXG5pbXBvcnQgeyBsb2NhbGl6ZSB9IGZyb20gJy4uL2xvY2FsZS9sb2NhbGl6ZSc7XHJcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZHluYW1pYy1maWVsZHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLWZpZWxkcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbXHJcbiAgICAnLi9keW5hbWljLWZpZWxkcy5jb21wb25lbnQuY3NzJyxcclxuICAgICcuL3N0eWxlcy92YWxpZGF0aW9uLmNzcycsXHJcbiAgICAnLi9zdHlsZXMvYWxpZ25tZW50LmNzcycsXHJcbiAgICAnLi9zdHlsZXMvZGF0YS1kaXNwbGF5LmNzcycsXHJcbiAgICAnLi9zdHlsZXMvbGlnaHQtcmVhZG9ubHkuY3NzJyxcclxuICAgICcuL3N0eWxlcy9wZW5kaW5nLXN0YXRlLmNzcycsXHJcbiAgICAnLi9zdHlsZXMvZHluYW1pY2xpc3QtdGFibGUuY3NzJyxcclxuICAgICcuL3N0eWxlcy9keW5hbWljbGlzdC1uYXYuY3NzJyxcclxuICAgICcuL3N0eWxlcy9kYXRlLXRpbWUuY3NzJyxcclxuICAgICcuL3N0eWxlcy90YWIuY3NzJyxcclxuICAgICcuL3N0eWxlcy90b29sdGlwLmNzcyddLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGVcclxuICAgICwgQWRvcm5lckRpcmVjdGl2ZSwgUmVhZE9ubHlEaXJlY3RpdmUsIERpc3BsYXlEaXJlY3RpdmUsIEZyYW1lU2VjdXJpdHlEaXJlY3RpdmUsIFZhbGlkYXRpb25QYXRjaERpcmVjdGl2ZVxyXG4gICAgLCBEcm9wZG93bkRpcmVjdGl2ZSwgVXBkYXRlQmx1ckRpcmVjdGl2ZSwgUmVwZWF0RGlyZWN0aXZlLCBSZWN1cnNpb25EaXJlY3RpdmUsIFRhYkRpcmVjdGl2ZSwgR3JpZERpcmVjdGl2ZSwgQ2hhbmdlRGlyZWN0aXZlXHJcbiAgICAsIFJlZ2lzdGVyRGlyZWN0aXZlLCBSZWZyZXNoRGlyZWN0aXZlLCBBY2NvcmRpb25EaXJlY3RpdmUsIERhdGVEaXJlY3RpdmUsIE51bWJlckRpcmVjdGl2ZSwgVGV4dERpcmVjdGl2ZSwgVmFsdWVTeW5jRGlyZWN0aXZlXHJcbiAgICAsIFRhYkNvbnRyb2xEaXJlY3RpdmUsIFRhYkl0ZW1EaXJlY3RpdmUsIENvbGxhcHNlRGlyZWN0aXZlLCBBY2NvcmRpb25QYW5lbERpcmVjdGl2ZSwgQ29sbGFwc2VQYXRjaERpcmVjdGl2ZVxyXG4gICAgLCBEYXRlVGltZUNvb3JkaW5hdG9yRGlyZWN0aXZlLCBEYXRlVGltZVZhbGlkYXRpb25EaXJlY3RpdmUsIEFsZXJ0RGlyZWN0aXZlLCBSZXF1aXJlZE9uSW5wdXREaXJlY3RpdmVcclxuICAgICwgU2lyaW9JbnB1dENvbXBvbmVudFxyXG4gICAgLCBTaXJpb1NlbGVjdENvbXBvbmVudCwgU2lyaW9TZWxlY3RPcHRpb25Db21wb25lbnQsIFNpcmlvU2VsZWN0UGFuZWxDb21wb25lbnRcclxuICAgICwgU2lyaW9DaGVja2JveEdyb3VwQ29tcG9uZW50LCBTaXJpb0NoZWNrYm94Q29tcG9uZW50LCBTaXJpb0RhdGVwaWNrZXJDb21wb25lbnQsIFNpcmlvVGltZXBpY2tlckNvbXBvbmVudFxyXG4gICAgLCBTaXJpb1JhZGlvR3JvdXBDb21wb25lbnQsIFNpcmlvUmFkaW9CdXR0b25Db21wb25lbnQsIFNpcmlvVGFiQ29tcG9uZW50LCBTaXJpb1RhYkl0ZW1Db21wb25lbnRcclxuICAgICwgU2lyaW9BY2NvcmRpb25Db21wb25lbnQsIFNpcmlvQWNjb3JkaW9uUGFuZWxDb21wb25lbnQsIFNpcmlvQWNjb3JkaW9uSGVhZGVyQ29tcG9uZW50LCBTaXJpb0FjY29yZGlvbkJvZHlDb21wb25lbnRcclxuICAgICwgU2lyaW9CdXR0b25Db21wb25lbnQsIFNpcmlvRmlsZVVwbG9hZENvbXBvbmVudFxyXG4gICAgLCBTaXJpb1RvZ2dsZUNvbXBvbmVudCwgU2lyaW9DaGlwQ2hlY2tib3hHcm91cENvbXBvbmVudCwgU2lyaW9DaGlwUmFkaW9Hcm91cENvbXBvbmVudCwgU2lyaW9JbnB1dENoaXBDb21wb25lbnRcclxuICAgICwgU2lyaW9BbGVydENvbXBvbmVudCwgU2lyaW9BbGVydE1lc3NhZ2VDb21wb25lbnQsIFNpcmlvU2xpZGVyQ29tcG9uZW50XHJcbiAgICAsIFNpcmlvTm90aWZ5Q29tcG9uZW50LCBTaXJpb05vdGlmeUJvZHlDb21wb25lbnQsIFNpcmlvTm90aWZ5QWN0aW9uQ29tcG9uZW50LCBTaXJpb05vdGlmeUxpbmtDb21wb25lbnRcclxuICAgICwgU2lyaW9Ub29sdGlwRGlyZWN0aXZlLCBTaXJpb0NvbGxhcHNlQ29tcG9uZW50LCBTaXJpb0NvbGxhcHNlVHJpZ2dlckRpcmVjdGl2ZVxyXG4gICAgLCBTaXJpb1BhZ2luYXRvckNvbXBvbmVudFxyXG4gICAgLCBUZW1wbGF0ZVdyYXBwZXJDb21wb25lbnQsIER5bmFtaWNIb3N0Q29tcG9uZW50XHJcbiAgICAsIEFnR3JpZEFuZ3VsYXIsIEFnQ2hhcnRzXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIFJlZ2lzdGVyU2VydmljZSxcclxuICAgIFByb2dyYW1tYWJpbGl0eVNlcnZpY2UsXHJcbiAgICBHcmlkU2VydmljZSxcclxuICAgIENoYXJ0U2VydmljZVxyXG4gIF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0ZpZWxkc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBJRHluYW1pY0ZpZWxkc0NvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgZm9ybSE6IER5bmFtaWNGb3JtQ29tcG9uZW50O1xyXG4gIEBJbnB1dCgpIHJvd3M6IEFycmF5PGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIGFsaWdubWVudDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoKSByZWFkT25seTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHJlY3Vyc2lvbkxldmVsOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIGlkZW50aXR5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlkZW50aXR5SW5kZXg/OiBudW1iZXI7XHJcbiAgXHJcbiAgVGV4dHMgPSBUZXh0cztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IFNhbml0aXplU2VydmljZVxyXG4gICAgLCBwcml2YXRlIG1hcmtkb3duOiBNYXJrZG93blNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBtaW1lOiBNaW1lU2VydmljZVxyXG4gICAgLCBwcml2YXRlIHByb2dyYW1tYWJpbGl0eTogUHJvZ3JhbW1hYmlsaXR5U2VydmljZVxyXG4gICAgLCBwcml2YXRlIHdlYWs6IFdlYWtTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgcmVnaXN0ZXI6IFJlZ2lzdGVyU2VydmljZVxyXG4gICAgLCBwcml2YXRlIG1ldGFkYXRhOiBNZXRhZGF0YVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxyXG4gICAgLCBwcml2YXRlIGdsb2JhbDogR2xvYmFsU2VydmljZVxyXG4gICAgLCBwcml2YXRlIGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZVxyXG4gICAgLCBwcml2YXRlIGdyaWQ6IEdyaWRTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgY2hhcnQ6IENoYXJ0U2VydmljZVxyXG4gICAgLCBwcml2YXRlIGRpYWxvZzogRGlhbG9nU2VydmljZVxyXG4gICAgLCBwcml2YXRlIGF1dG9Gb2N1czogQXV0b0ZvY3VzU2VydmljZVxyXG4gICAgLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmXHJcbiAgKVxyXG4gIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWdpc3Rlci5pZGVudGlmeSh0aGlzLmlkZW50aXR5LCB0aGlzLmlkZW50aXR5SW5kZXgpO1xyXG4gICAgdGhpcy5wcm9ncmFtbWFiaWxpdHkuYWRkRXZhbHVhdG9yUHJvdmlkZXJzKHRoaXMuZm9ybSk7XHJcbiAgICB0aGlzLmNvbmZpZ3VyZURhdGVwaWNrZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydmb3JtR3JvdXAnXSkge1xyXG4gICAgICB0aGlzLnByb2dyYW1tYWJpbGl0eS5pbnZhbGlkYXRlQWxsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdXRvRm9jdXMuY29uc3VtZSh0aGlzLmZvcm1Hcm91cCkpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgc2V0Rm9jdXModGhpcy5lbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWdpc3RlcigpOiBSZWdpc3RlclNlcnZpY2Uge1xyXG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXI7XHJcbiAgfVxyXG5cclxuICBnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybVNlcnZpY2UuZ2V0Q29udHJvbCh0aGlzLmZvcm1Hcm91cCwgW2NvbXBvbmVudC5wYXRoLCBjb21wb25lbnQua2V5XSk7XHJcbiAgICByZXR1cm4gIWNvbnRyb2wgfHwgY29udHJvbC52YWxpZCB8fCAhY29udHJvbC5lcnJvcnNcclxuICAgICAgPyAnJ1xyXG4gICAgICA6IGNvbnRyb2wuZXJyb3JzWydtZXNzYWdlJ107IFxyXG4gIH1cclxuXHJcbiAgaXNXYXJuaW5nKGNvbXBvbmVudDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtU2VydmljZS5nZXRDb250cm9sKHRoaXMuZm9ybUdyb3VwLCBbY29tcG9uZW50LnBhdGgsIGNvbXBvbmVudC5rZXldKTtcclxuICAgIHJldHVybiAoY29udHJvbCAmJiBjb250cm9sLmVycm9ycyAmJiBjb250cm9sLmVycm9yc1snd2FybmluZyddKSB8fCBmYWxzZVxyXG4gIH1cclxuXHJcbiAgbG9jYWxlKGNvbXBvbmVudDogYW55LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbG9jYWxpemUodGhpcy5sYW5ndWFnZSwgY29tcG9uZW50LCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVTdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlU3RyaW5nKHRoaXMuZm9ybUdyb3VwLCB2YWx1ZSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVCb29sZWFuKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnByb2dyYW1tYWJpbGl0eS5ldmFsdWF0ZUJvb2xlYW4odGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtbWFiaWxpdHkuZXZhbHVhdGVOdW1iZXIodGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlVXJsKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogU2FmZVJlc291cmNlVXJsIHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlU3RyaW5nKHRoaXMuZm9ybUdyb3VwLCB2YWx1ZSk7XHJcbiAgICBjb25zdCB3YXRjaEtleSA9IGA6c2FmZVVybCgke3VybH0pYDtcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbCh0aGlzLmZvcm1Hcm91cCwgd2F0Y2hLZXksICgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLnNhbml0aXplU2FmZVVybCh1cmwpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZUhlaWdodCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gdmFsdWUgKyBcInB4XCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9ncmFtbWFiaWxpdHkuZXZhbHVhdGUodGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCJweFwiO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlVGVtcGxhdGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlVGVtcGxhdGUodGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlKHRleHQ6IHN0cmluZyB8IG51bGwsIGNhY2hlYWJsZTogYm9vbGVhbiA9IHRydWUpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlKHRoaXMuZm9ybUdyb3VwLCB0ZXh0LCB7XHJcbiAgICAgIGNhY2hlYWJsZTogY2FjaGVhYmxlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlQ29sb3IodmFsdWU6IHN0cmluZyB8IG51bGwpOiBCdXR0b25Db2xvcnMgfCBudWxsIHtcclxuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5ldmFsdWF0ZVN0cmluZyh2YWx1ZSk7XHJcbiAgICBjb25zdCB3YXRjaEtleSA9IGA6YnV0dG9uQ29sb3IoJHtjb2xvcn0pYDtcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbCh0aGlzLmZvcm1Hcm91cCwgd2F0Y2hLZXksICgpID0+IHtcclxuICAgICAgaWYgKGNvbG9yID09PSBcImdob3N0XCIpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGNvbnN0IHZhbGlkQ29sb3JzOiBCdXR0b25Db2xvcnNbXSA9IFsncHJpbWFyeScsICdzZWNvbmRhcnknLCAndGVydGlhcnknLCAndGVydGlhcnktbGlnaHQnLCAnZGFuZ2VyJ107XHJcbiAgICAgIHJldHVybiB2YWxpZENvbG9ycy5pbmNsdWRlcyhjb2xvciBhcyBCdXR0b25Db2xvcnMpID8gKGNvbG9yIGFzIEJ1dHRvbkNvbG9ycykgOiAncHJpbWFyeSc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlQ29uZGl0aW9uYWwoY29uZGl0aW9uYWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaGlkZSA9IHRoaXMuZXZhbHVhdGVCb29sZWFuKGNvbmRpdGlvbmFsPy5oaWRlKTtcclxuICAgIGNvbnN0IHNob3cgPSB0aGlzLmV2YWx1YXRlQm9vbGVhbihjb25kaXRpb25hbD8uc2hvdyk7XHJcbiAgICBcclxuICAgIHJldHVybiAhKGhpZGUgPT09IHRydWUgfHwgc2hvdyA9PT0gZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVtcGxhdGUodmFsdWU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5nZXRGb3JtQnlOYW1lKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1Hcm91cChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsKTogRm9ybUdyb3VwIHtcclxuICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29udHJvbCBpcyBub3QgYSBGb3JtR3JvdXAnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUFycmF5KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwpOiBGb3JtQXJyYXkge1xyXG4gICAgaWYgKCEoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250cm9sIGlzIG5vdCBhIEZvcm1BcnJheScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcgfCBudWxsKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm1Hcm91cCh0aGlzLmdldENvbnRyb2xGcm9tUGF0aChwYXRoKSlcclxuICB9XHJcblxyXG4gIHRvSFRNTCh0ZXh0OiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICBjb25zdCB3YXRjaEtleSA9IGA6c2FmZUh0bWwoJHt0ZXh0fSlgO1xyXG4gICAgcmV0dXJuIHRoaXMud2Vhay5jYWxsKHRoaXMuZm9ybUdyb3VwLCB3YXRjaEtleSwgKCkgPT4ge1xyXG4gICAgICBjb25zdCBodG1sID0gdGhpcy5tYXJrZG93bi50b0h0bWwodGV4dCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5zYW5pdGl6ZVNhZmVIdG1sKGh0bWwpO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgc2FuaXRpemUoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLnNhbml0aXplU2FmZUh0bWwoaHRtbCk7XHJcbiAgfTtcclxuXHJcbiAgZ2V0TWltZVR5cGVzKGV4dGVuc2lvbnM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5taW1lLmdldE1pbWVUeXBlcyhleHRlbnNpb25zKTtcclxuICB9O1xyXG5cclxuICBjbGlja0J1dHRvbihjb21wb25lbnQ6IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGNvbXBvbmVudC5jbGljaykge1xyXG4gICAgICB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC5jbGljaywgZmFsc2UpO1xyXG4gICAgfSAgICBcclxuICB9XHJcblxyXG4gIGhhc1ZhbHVlcyhjb21wb25lbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjb21wb25lbnQpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHsgdmFsdWVzLCB2YWx1ZXNLZXksIHZhbHVlc0V4cHJlc3Npb24gfSA9IGNvbXBvbmVudDtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGlzTWVhbmluZ2Z1bCh2YWx1ZXMpIHx8XHJcbiAgICAgIGlzTWVhbmluZ2Z1bCh2YWx1ZXNLZXkpIHx8XHJcbiAgICAgIGlzTWVhbmluZ2Z1bCh2YWx1ZXNFeHByZXNzaW9uKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlcyhjb21wb25lbnQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoY29tcG9uZW50LnZhbHVlcykge1xyXG4gICAgICAvLyBTdGF0aWNcclxuICAgICAgcmV0dXJuIG9mKGNvbXBvbmVudC52YWx1ZXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29tcG9uZW50LnZhbHVlc0tleSkge1xyXG4gICAgICAvLyBGaWVsZCB2YWx1ZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC52YWx1ZXNLZXkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRBc09ic2VydmFibGUocmVzdWx0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNvbXBvbmVudC52YWx1ZXNFeHByZXNzaW9uKSB7XHJcbiAgICAgIC8vIEV4cHJlc3Npb25cclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ldmFsdWF0ZShjb21wb25lbnQudmFsdWVzRXhwcmVzc2lvbik7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEFzT2JzZXJ2YWJsZShyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vdGhpbmdcclxuICAgICAgcmV0dXJuIHRoaXMubm9EYXRhO1xyXG4gICAgfSAgICBcclxuICB9XHJcblxyXG4gIHJlZnJlc2hWYWx1ZXMoY29tcG9uZW50OiBhbnkpOiAoKSA9PiB2b2lkIHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudmFsdWVzS2V5KSB7XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKGNvbXBvbmVudC52YWx1ZXNLZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC52YWx1ZXNFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKGNvbXBvbmVudC52YWx1ZXNFeHByZXNzaW9uKTtcclxuICAgICAgfSAgXHJcbiAgICB9OyAgXHJcbiAgfVxyXG5cclxuICB0b0xhYmVsKHZhbHVlOiBhbnksIGxpc3Q6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGFueSB9Pik6IGFueSB7XHJcbiAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkgfHwgbGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0TGFiZWwgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gbGlzdC5maW5kKHggPT4geC52YWx1ZSA9PT0gdmFsdWUpO1xyXG4gICAgICByZXR1cm4gaXRlbSA/IGl0ZW0ubGFiZWwgOiB2YWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKHYgPT4gZ2V0TGFiZWwodikpLmpvaW4oJywgJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGdldExhYmVsKHZhbHVlKTsgICAgICBcclxuICAgIH0gICAgXHJcbiAgfVxyXG5cclxuICBzdXBwb3J0VmFsdWVzKGNvbXBvbmVudDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWNvbXBvbmVudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIGNvbXBvbmVudC5maWVsZHR5cGUgPT09ICdzZWxlY3QnIHx8IGNvbXBvbmVudC5maWVsZHR5cGUgPT09ICd0YWdsaXN0JztcclxuICB9XHJcblxyXG4gIGdldENoYXJ0T3B0aW9ucyhjb21wb25lbnQ6IGFueSk6IE9ic2VydmFibGU8QWdDaGFydE9wdGlvbnM+IHtcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbChjb21wb25lbnQsIGBnZXRDaGFydE9wdGlvbnNfJHt0aGlzLmxhbmd1YWdlfWBcclxuICAgICAgLCAoKSA9PiB0aGlzLmNoYXJ0LmdldE9wdGlvbnMoY29tcG9uZW50LCB0aGlzLmZvcm1Hcm91cCkpO1xyXG4gIH1cclxuXHJcbiAgaW52YWxpZGF0ZUNoYXJ0KGNvbXBvbmVudDogYW55KTogKCkgPT4gdm9pZCB7XHJcbiAgICByZXR1cm4gKCkgPT4gdGhpcy53ZWFrLmludmFsaWRhdGUoY29tcG9uZW50LCBgZ2V0Q2hhcnRPcHRpb25zXyR7dGhpcy5sYW5ndWFnZX1gKTtcclxuICB9XHJcblxyXG4gIGdldENoYXJ0RGF0YShjb21wb25lbnQ6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5jaGFydC5nZXREYXRhRXhwcmVzc2lvbihjb21wb25lbnQpO1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlKHRoaXMuZm9ybUdyb3VwLCBleHByZXNzaW9uKTtcclxuICB9XHJcblxyXG4gIGdldEdyaWRPcHRpb25zKGNvbXBvbmVudDogYW55KTogR3JpZE9wdGlvbnMgeyAgICBcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbChjb21wb25lbnQsIHRoaXMuZ3JpZC5nZXRDYWNoZUtleSgpXHJcbiAgICAgICwgKCkgPT4gdGhpcy5ncmlkLmdldE9wdGlvbnMoY29tcG9uZW50LCB0aGlzLmZvcm1Hcm91cCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZE1vZHVsZXMoY29tcG9uZW50OiBhbnkpOiBNb2R1bGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy53ZWFrLmNhbGwoY29tcG9uZW50LCAnZ2V0R3JpZE1vZHVsZXMnLCAoKSA9PiB0aGlzLmdyaWQuZ2V0TW9kdWxlcygpKTtcclxuICB9XHJcblxyXG4gIG9uR3JpZFNlbGVjdGlvbkNoYW5nZWQoY29tcG9uZW50OiBhbnksIGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JpZC5vblNlbGVjdGlvbkNoYW5nZWQoY29tcG9uZW50LCB0aGlzLmZvcm1Hcm91cCwgZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Um93U291cmNlKGNvbXBvbmVudDogYW55KTogYW55IHtcclxuICAgIGlmIChjb21wb25lbnQuZGF0YVNvdXJjZSkge1xyXG4gICAgICAvLyBFeHByZXNzaW9uXHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC5kYXRhU291cmNlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBOb3RoaW5nXHJcbiAgICAgIHJldHVybiB0aGlzLm5vRGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hSb3dTb3VyY2UoY29tcG9uZW50OiBhbnkpOiAoKSA9PiB2b2lkIHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChjb21wb25lbnQuZGF0YVNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZShjb21wb25lbnQuZGF0YVNvdXJjZSk7XHJcbiAgICAgIH0gIFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFkZEl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXkpIHtcclxuICAgIGlmIChoYXNGYWN0b3J5KGZvcm1BcnJheSkpIHtcclxuICAgICAgY29uc3QgYWRkZWRJdGVtID0gZm9ybUFycmF5LmFkZEl0ZW0oKTtcclxuICAgICAgdGhpcy5hdXRvRm9jdXMubWFyayhhZGRlZEl0ZW0pO1xyXG4gICAgICB0aGlzLm5hdmlnYXRlSXRlbShmb3JtQXJyYXkpO1xyXG4gICAgfSAgICBcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXksIGluZGV4OiBudW1iZXIsIHdpdGhDb25maXJtOiBib29sZWFuKSB7XHJcbiAgICBpZiAod2l0aENvbmZpcm0pIHtcclxuICAgICAgdGhpcy5kaWFsb2cuY29uZmlybSh0aGlzLmxvY2FsZShUZXh0cywgJ0NvbmZpcm1EZWxldGUnKSwge1xyXG4gICAgICAgIFwidGl0bGVcIjogdGhpcy5sb2NhbGUoVGV4dHMsICdDb25maXJtJyksXHJcbiAgICAgICAgXCJidXR0b25zXCI6IFwiQ29uZmlybUNhbmNlbFwiLFxyXG4gICAgICAgIFwib25SZXN1bHRcIjogKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUl0ZW0oZm9ybUFycmF5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVJdGVtKGZvcm1BcnJheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0aW9uSW5kZXggPSAwO1xyXG5cclxuICBuYXZpZ2F0ZUl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXksIGRlbHRhOiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICBpZiAoIWZvcm1BcnJheSB8fCBmb3JtQXJyYXkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbkluZGV4ID0gLTE7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYXN0SW5kZXggPSBmb3JtQXJyYXkubGVuZ3RoIC0gMTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRpb25JbmRleCA9IE1hdGgubWluKFxyXG4gICAgICBsYXN0SW5kZXgsXHJcbiAgICAgIE1hdGgubWF4KDAsIHRoaXMubmF2aWdhdGlvbkluZGV4ICsgZGVsdGEpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbW92ZVVwSXRlbShmb3JtQXJyYXk6IEZvcm1BcnJheSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY29udHJvbDogQWJzdHJhY3RDb250cm9sID0gZm9ybUFycmF5LmF0KGluZGV4KTtcclxuICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICBmb3JtQXJyYXkuaW5zZXJ0KGluZGV4IC0gMSwgY29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBtb3ZlRG93bkl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCA9IGZvcm1BcnJheS5hdChpbmRleCk7XHJcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgZm9ybUFycmF5Lmluc2VydChpbmRleCArIDEsIGNvbnRyb2wpOyAgICBcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVwbG9hZFRhYmxlcyhjb21wb25lbnQ6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy53ZWFrLmNhbGwoY29tcG9uZW50LCAnY3JlYXRlVXBsb2FkVGFibGVzJywgKCkgPT4ge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbXBvbmVudHM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInRhYmxlXCIsXHJcbiAgICAgICAgICAgICAgXCJsYXlvdXRcIjoge1xyXG4gICAgICAgICAgICAgICAgXCJjb2x1bW5zXCI6IG51bGxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIFwiY29sdW1uc1wiOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sb2NhbGUoVGV4dHMsICdOYW1lJyksXHJcbiAgICAgICAgICAgICAgICAgIFwia2V5XCI6IFwibmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgICBcImZsZXhcIjogMVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxvY2FsZShUZXh0cywgJ1NpemUnKSxcclxuICAgICAgICAgICAgICAgICAgXCJrZXlcIjogXCJzaXplXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiZm9ybWF0XCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICAgICAgICBcImFsaWduXCI6IFwicmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxvY2FsZShUZXh0cywgJ1R5cGUnKSxcclxuICAgICAgICAgICAgICAgICAgXCJrZXlcIjogXCJ0eXBlXCIgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIFwia2V5XCI6IFwidXJsXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiA1MCxcclxuICAgICAgICAgICAgICAgICAgXCJhbGlnblwiOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgICBcImZvcm1hdFwiOiBcIm9iamVjdFVSTFwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwid2lkdGhcIjogNTAsXHJcbiAgICAgICAgICAgICAgICAgIFwiYWxpZ25cIjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICAgICAgXCJmb3JtYXRcIjogXCJkZWxldGVSb3dcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgXCJkYXRhU291cmNlXCI6IFwiPVwiICsgY29tcG9uZW50LmtleSxcclxuICAgICAgICAgICAgICBcImhlaWdodFwiOiAyMDAsXHJcbiAgICAgICAgICAgICAgXCJjb25kaXRpb25hbFwiOiBjb21wb25lbnQuY29uZGl0aW9uYWwsXHJcbiAgICAgICAgICAgICAgXCJkaXNhYmxlZFwiOiBjb21wb25lbnQuZGlzYWJsZWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZmlsZVVwbG9hZGVkKCRldmVudDogTmd4U2lyaW9FdmVudDxTaXJpb0ZpbGVVcGxvYWRDb21wb25lbnQ+KSB7XHJcbiAgICBjb25zdCByZW1vdmVGaWxlID0gKGZpbGU6IEZpbGUpID0+IHtcclxuICAgICAgaWYgKCRldmVudC5jb21wb25lbnQuY29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IG5ld0ZpbGVzID0gJGV2ZW50LmNvbXBvbmVudC5maWxlTGlzdC5maWx0ZXIoZiA9PiBmICE9PSBmaWxlKTtcclxuICAgICAgICAkZXZlbnQuY29tcG9uZW50LmNvbnRyb2wuc2V0VmFsdWUobmV3RmlsZXMpO1xyXG4gICAgICAgIGFkZFJlbW92ZShuZXdGaWxlcyk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0ZpbGVzO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhZGRSZW1vdmUgPSAoZmlsZXM6IEZpbGVbXSkgPT4ge1xyXG4gICAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgIGlmICghKCdyZW1vdmUnIGluIGZpbGUpKSB7XHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmlsZSwgJ3JlbW92ZScsIHtcclxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICByZW1vdmVGaWxlKHRoaXMpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgfSk7IFxyXG4gICAgfTtcclxuXHJcbiAgICBhZGRSZW1vdmUoJGV2ZW50LmNvbXBvbmVudC5maWxlTGlzdCk7XHJcbiAgfVxyXG5cclxuICBnZXRGZWVsYWJsZVByb3BlcnRpZXMoY29tcG9uZW50OiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXM7XHJcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdvYmplY3QnICYmIHByb3BlcnRpZXMgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocHJvcGVydGllcykpIHtcclxuICAgICAgY29uc3QgZmVlbGFibGUgPSB0b0V4cHJlc3Npb24ocHJvcGVydGllcyk7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2dyYW1tYWJpbGl0eS5ldmFsdWF0ZSh0aGlzLmZvcm1Hcm91cCwgZmVlbGFibGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBPdXRsaW5lKGNvbXBvbmVudDogYW55KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnZ3JvdXAtb3V0bGluZSc6IGNvbXBvbmVudC5zaG93T3V0bGluZSA9PT0gdHJ1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1DbGFzcygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIFtcImRmLWNvbXBvbmVudHNcIl06IHRydWUsXHJcbiAgICAgIFtcInZhbGlnbi1zdGFydFwiXTogdGhpcy5hbGlnbm1lbnQgPT09ICdzdGFydCcsXHJcbiAgICAgIFtcInZhbGlnbi1jZW50ZXJcIl06IHRoaXMuYWxpZ25tZW50ID09PSAnY2VudGVyJyxcclxuICAgICAgW1widmFsaWduLWVuZFwiXTogdGhpcy5hbGlnbm1lbnQgPT09ICdlbmQnXHJcbiAgICB9ICAgIFxyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcG9uZW50Q2xhc3MoY29tcG9uZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSB7XHJcbiAgICAgIFtcImNvbC1ob3N0XCJdOiB0cnVlLFxyXG4gICAgICBbXCJjb2wtbWQtXCIgKyBjb21wb25lbnQubGF5b3V0Py5jb2x1bW5zXTogKGNvbXBvbmVudC5sYXlvdXQ/LmNvbHVtbnMpLFxyXG4gICAgICBbXCJjb2xcIl06ICEoY29tcG9uZW50LmxheW91dD8uY29sdW1ucyksXHJcbiAgICAgIFtgZGYtZmllbGQtJHtjb21wb25lbnQudHlwZX1gXTogdHJ1ZSxcclxuICAgICAgW1wiY29tcG9uZW50LXN0YXJ0XCJdOiBjb21wb25lbnQuc2VsZkFsaWdubWVudCA9PT0gJ3N0YXJ0JyxcclxuICAgICAgW1wiY29tcG9uZW50LWNlbnRlclwiXTogY29tcG9uZW50LnNlbGZBbGlnbm1lbnQgPT09ICdjZW50ZXInLFxyXG4gICAgICBbXCJjb21wb25lbnQtZW5kXCJdOiBjb21wb25lbnQuc2VsZkFsaWdubWVudCA9PT0gJ2VuZCdcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHlDc3NDbGFzc2VzKGNsYXNzZXMsIGNvbXBvbmVudC5jc3NDbGFzcyk7XHJcbiAgICByZXR1cm4gY2xhc3NlcztcclxuICB9XHJcblxyXG4gIGdldENvbXBvbmVudFN0eWxlKGNvbXBvbmVudDogYW55KTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwge1xyXG5cclxuICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5hcHBseUlubGluZVN0eWxlcyhzdHlsZXMsIGNvbXBvbmVudC5pbmxpbmVTdHlsZSkpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHJldHVybiBzdHlsZXM7XHJcblxyXG4gICAgLy9jb25zdCBsYXlvdXQgPSBjb21wb25lbnQubGF5b3V0O1xyXG4gICAgLy9pZiAoIXRoaXMuaGFzUG9zaXRpb24oY29tcG9uZW50LmxheW91dCkpIHtcclxuICAgIC8vICByZXR1cm4gbnVsbDtcclxuICAgIC8vfVxyXG4gICAgLy9yZXR1cm4ge1xyXG4gICAgLy8gIC4uLihsYXlvdXQueSAhPSBudWxsID8geyB0b3A6IGAke2xheW91dC55fXB4YCB9IDoge30pLFxyXG4gICAgLy8gIC4uLihsYXlvdXQueCAhPSBudWxsID8geyBsZWZ0OiBgJHtsYXlvdXQueH1weGAgfSA6IHt9KSxcclxuICAgIC8vICAuLi4obGF5b3V0LndpZHRoICE9IG51bGwgPyB7IHdpZHRoOiBgJHtsYXlvdXQud2lkdGh9cHhgIH0gOiB7fSksXHJcbiAgICAvLyAgLi4uKGxheW91dC5oZWlnaHQgIT0gbnVsbCA/IHsgaGVpZ2h0OiBgJHtsYXlvdXQuaGVpZ2h0fXB4YCB9IDoge30pLFxyXG4gICAgLy99O1xyXG4gIH1cclxuXHJcbiAgZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQ6IGFueSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50ZXh0QWxpZ24pIHtcclxuICAgICAgY2FzZSAnbGVmdCc6IHJldHVybiBcInRleHQtbGVmdFwiXHJcbiAgICAgIGNhc2UgJ2NlbnRlcic6IHJldHVybiBcInRleHQtY2VudGVyXCJcclxuICAgICAgY2FzZSAncmlnaHQnOiByZXR1cm4gXCJ0ZXh0LXJpZ2h0XCJcclxuICAgICAgZGVmYXVsdDogcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIb3Jpem9udGFsQWxpZ25tZW50KGNvbXBvbmVudDogYW55KSB7XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSBjb21wb25lbnQuaG9yaXpvbnRhbEFsaWdubWVudDtcclxuICAgIGNvbnN0IHJ1bGVOYW1lID0gXCJob3Jpem9udGFsXCI7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBbYCR7cnVsZU5hbWV9LWxlZnRgXTogYWxpZ25tZW50ID09PSAnbGVmdCcsXHJcbiAgICAgIFtgJHtydWxlTmFtZX0tY2VudGVyYF06IGFsaWdubWVudCA9PT0gJ2NlbnRlcicsXHJcbiAgICAgIFtgJHtydWxlTmFtZX0tcmlnaHRgXTogYWxpZ25tZW50ID09PSAncmlnaHQnLFxyXG4gICAgICBbYCR7cnVsZU5hbWV9LWZpbGxgXTogYWxpZ25tZW50ID09PSAnZmlsbCdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRMaWdodFZpZXcoY29tcG9uZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2xhc3NOYW1lID0gJ2xpZ2h0LXZpZXcnO1xyXG4gICAgY29uc3QgdmFsdWUgPSBjb21wb25lbnQucHJvcGVydGllcz8udXNlTGlnaHRSZWFkb25seVxyXG4gICAgICB8fCB0aGlzLmdsb2JhbC5nZXRQcm9wZXJ0eShcInVzZUxpZ2h0UmVhZG9ubHlcIiwgXCJ5ZXNcIik7XHJcbiAgICBpZiAodmFsdWUgIT09IFwieWVzXCIgJiYgdmFsdWUgIT09IFwibm9cIilcclxuICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcclxuICAgIHJldHVybiAodmFsdWUgPT09IFwieWVzXCIpID8gY2xhc3NOYW1lIDogXCJcIjtcclxuICB9XHJcblxyXG4gIGdldFBhbmVscyhjb21wb25lbnQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoY29tcG9uZW50LnBhbmVscykge1xyXG4gICAgICAvLyBTdGF0aWNcclxuICAgICAgcmV0dXJuIG9mKGNvbXBvbmVudC5wYW5lbHMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29tcG9uZW50LnBhbmVsc0V4cHJlc3Npb24pIHtcclxuICAgICAgLy8gRXhwcmVzc2lvblxyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC5wYW5lbHNFeHByZXNzaW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXNPYnNlcnZhYmxlKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gTm90aGluZ1xyXG4gICAgICByZXR1cm4gdGhpcy5ub0RhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vRGF0YTogT2JzZXJ2YWJsZTxhbnk+ID0gb2YoW10pO1xyXG5cclxuICBwcml2YXRlIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLmdldExhbmd1YWdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludmFsaWRhdGUodGV4dDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmludmFsaWRhdGUodGV4dCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xGcm9tUGF0aChwYXRoOiBzdHJpbmcgfCBudWxsKTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gcGF0aFxyXG4gICAgICA/IHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKVxyXG4gICAgICA6IHRoaXMuZm9ybUdyb3VwO1xyXG5cclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcm1Hcm91cCBkb2VzIG5vdCBjb250YWluIGEgY29udHJvbCB3aXRoIHBhdGggJyR7cGF0aH0nYCwgeyBjYXVzZTogdGhpcy5mb3JtR3JvdXAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QXNPYnNlcnZhYmxlKHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIHJldHVybiBvZih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q3NzQ2xhc3Nlcyh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCBjc3NDbGFzczogYW55KTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCFjc3NDbGFzcylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHZhciBjc3NWYWx1ZSA9IHRoaXMuZXZhbHVhdGUoY3NzQ2xhc3MpO1xyXG5cclxuICAgIGlmICghY3NzVmFsdWUpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIGNzc1ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjbGFzc2VzID0gY3NzVmFsdWUuc3BsaXQoL1xccysvKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3NzQ2xhc3MpKSB7XHJcbiAgICAgIGNsYXNzZXMgPSBjc3NWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNsYXNzZXMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjbGFzc2VzXHJcbiAgICAgIC5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgJiYgYy50cmltKCkubGVuZ3RoID4gMClcclxuICAgICAgLmZvckVhY2goY2xzID0+IHRhcmdldFtjbHNdID0gdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5SW5saW5lU3R5bGVzKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55Piwgc3R5bGU6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghc3R5bGUpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBzdHlsZVZhbHVlID0gdGhpcy5ldmFsdWF0ZShzdHlsZSk7XHJcblxyXG4gICAgaWYgKCFzdHlsZVZhbHVlKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHN0eWxlczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgc3R5bGVzID0ge307XHJcblxyXG4gICAgICBzdHlsZVZhbHVlXHJcbiAgICAgICAgLnNwbGl0KCc7JylcclxuICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXHJcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxyXG4gICAgICAgIC5mb3JFYWNoKHJ1bGUgPT4ge1xyXG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcnVsZS5zcGxpdCgnOicpLm1hcChwID0+IHAudHJpbSgpKTtcclxuICAgICAgICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcclxuICAgICAgICAgICAgc3R5bGVzIVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc3R5bGVWYWx1ZSkpIHtcclxuICAgICAgc3R5bGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHN0eWxlVmFsdWUpXHJcbiAgICAgICAgICAuZmlsdGVyKChbXywgdl0pID0+IHYgIT0gbnVsbClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXN0eWxlcyB8fCBPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzdHlsZXMpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvL3ByaXZhdGUgaGFzUG9zaXRpb24obGF5b3V0Pzoge1xyXG4gIC8vICB4PzogbnVtYmVyIHwgbnVsbDtcclxuICAvLyAgeT86IG51bWJlciB8IG51bGw7XHJcbiAgLy99KTogYm9vbGVhbiB7XHJcbiAgLy8gIHJldHVybiBsYXlvdXQ/LnggIT0gbnVsbCB8fCBsYXlvdXQ/LnkgIT0gbnVsbDtcclxuICAvL31cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVEYXRlcGlja2VyKCkge1xyXG4gICAgKERhdGVwaWNrZXIubG9jYWxlcyBhcyBhbnkpWydpdCddID0ge1xyXG4gICAgICBkYXlzOiBbXHJcbiAgICAgICAgJ0RvbWVuaWNhJyxcclxuICAgICAgICAnTHVuZWTDrCcsXHJcbiAgICAgICAgJ01hcnRlZMOsJyxcclxuICAgICAgICAnTWVyY29sZWTDrCcsXHJcbiAgICAgICAgJ0dpb3ZlZMOsJyxcclxuICAgICAgICAnVmVuZXJkw6wnLFxyXG4gICAgICAgICdTYWJhdG8nLFxyXG4gICAgICBdLFxyXG4gICAgICBkYXlzTWluOiBbJ0RvbScsICdMdW4nLCAnTWFyJywgJ01lcicsICdHaW8nLCAnVmVuJywgJ1NhYiddLFxyXG4gICAgICBtb250aHM6IFtcclxuICAgICAgICAnR2VubmFpbycsXHJcbiAgICAgICAgJ0ZlYmJyYWlvJyxcclxuICAgICAgICAnTWFyem8nLFxyXG4gICAgICAgICdBcHJpbGUnLFxyXG4gICAgICAgICdNYWdnaW8nLFxyXG4gICAgICAgICdHaXVnbm8nLFxyXG4gICAgICAgICdMdWdsaW8nLFxyXG4gICAgICAgICdBZ29zdG8nLFxyXG4gICAgICAgICdTZXR0ZW1icmUnLFxyXG4gICAgICAgICdPdHRvYnJlJyxcclxuICAgICAgICAnTm92ZW1icmUnLFxyXG4gICAgICAgICdEaWNlbWJyZScsXHJcbiAgICAgIF0sXHJcbiAgICAgIG1vbnRoc1Nob3J0OiBbXHJcbiAgICAgICAgJ0dlbicsXHJcbiAgICAgICAgJ0ZlYicsXHJcbiAgICAgICAgJ01hcicsXHJcbiAgICAgICAgJ0FwcicsXHJcbiAgICAgICAgJ01hZycsXHJcbiAgICAgICAgJ0dpdScsXHJcbiAgICAgICAgJ0x1ZycsXHJcbiAgICAgICAgJ0FnbycsXHJcbiAgICAgICAgJ1NldCcsXHJcbiAgICAgICAgJ090dCcsXHJcbiAgICAgICAgJ05vdicsXHJcbiAgICAgICAgJ0RpYycsXHJcbiAgICAgIF0sXHJcbiAgICAgIHRvZGF5OiAnT2dnaScsXHJcbiAgICAgIGNsZWFyOiAnUHVsaXNjaScsXHJcbiAgICAgIGZvcm1hdDogJ2RkL21tL3l5eXknLFxyXG4gICAgICB3ZWVrU3RhcnQ6IDFcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBtYXJrRm9yQXV0b0ZvY3VzKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICAoZm9ybUdyb3VwIGFzIGFueSlbJ19hdXRvRm9jdXMnXSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVpcmVBdXRvRm9jdXMoZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoZm9ybUdyb3VwIGFzIGFueSlbJ19hdXRvRm9jdXMnXSA9PT0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbbmdDbGFzc109XCJnZXRGb3JtQ2xhc3MoKVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZmllbGQtc2V0XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbXBvbmVudCBvZiByb3cuY29tcG9uZW50c1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC50eXBlXCI+XHJcbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldENvbXBvbmVudENsYXNzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICBbc3R5bGVdPVwiZ2V0Q29tcG9uZW50U3R5bGUoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRlXT1cImV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQuY29uZGl0aW9uYWw/LmhpZGUpXCJcclxuICAgICAgICAgICAgICAgICBbc2hvd109XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LmNvbmRpdGlvbmFsPy5zaG93KVwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0ZXh0ZmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRmaWVsZCdcIiBbZm9ybUdyb3VwXT1cInJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5neC1zaXJpby1pbnB1dCB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmVlZGJhY2tdPVwiZ2V0VGV4dEZlZWRiYWNrKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZml4QWRvcm5lcl09XCJldmFsdWF0ZVN0cmluZyhjb21wb25lbnQuYXBwZWFyYW5jZT8ucHJlZml4QWRvcm5lcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VmZml4QWRvcm5lcl09XCJldmFsdWF0ZVN0cmluZyhjb21wb25lbnQuYXBwZWFyYW5jZT8uc3VmZml4QWRvcm5lcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Y2FzZV09XCJjb21wb25lbnQudGV4dENhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cImV2YWx1YXRlTnVtYmVyKGNvbXBvbmVudC5tYXhMZW5ndGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmx1clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRPbklucHV0XT1cImNvbXBvbmVudC52YWxpZGF0ZT8ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RleHRmaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0ZXh0ZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gc2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tc2VsZWN0IFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0SGVscF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZnJlc2hdPVwicmVmcmVzaFZhbHVlcyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNlbGVjdC1wYW5lbD5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWlucHV0ICpuZ0lmPVwiY29tcG9uZW50LnNlYXJjaGFibGVcIiBjbGFzcz1cInNlYXJjaGFibGVcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJsb2NhbGUoVGV4dHMsICdUeXBlVG9TZWFyY2gnKVwiPjwvbmd4LXNpcmlvLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tc2VsZWN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIChnZXRWYWx1ZXMoY29tcG9uZW50KSB8IGFzeW5jKSB8fCBbXVwiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBsb2NhbGUob3B0aW9uLCAnbGFiZWwnKSB9fTwvbmd4LXNpcmlvLXNlbGVjdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLXNlbGVjdC1wYW5lbD5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHRhZ2xpc3QgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RhZ2xpc3QnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tc2VsZWN0IFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0SGVscF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoVmFsdWVzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0YWdsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwidGFnbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNlbGVjdC1wYW5lbD5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNlbGVjdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiAoZ2V0VmFsdWVzKGNvbXBvbmVudCkgfCBhc3luYykgfHwgW11cIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgbG9jYWxlKG9wdGlvbiwgJ2xhYmVsJykgfX08L25neC1zaXJpby1zZWxlY3Qtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1zZWxlY3QtcGFuZWw+XHJcbiAgICAgICAgICAgICAgICA8L25neC1zaXJpby1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBudW1iZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIiBbZm9ybUdyb3VwXT1cInJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5neC1zaXJpby1pbnB1dCB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmVmaXhBZG9ybmVyXT1cImV2YWx1YXRlU3RyaW5nKGNvbXBvbmVudC5hcHBlYXJhbmNlPy5wcmVmaXhBZG9ybmVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhBZG9ybmVyXT1cImV2YWx1YXRlU3RyaW5nKGNvbXBvbmVudC5hcHBlYXJhbmNlPy5zdWZmaXhBZG9ybmVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZXZhbHVhdGVOdW1iZXIoY29tcG9uZW50LmRlZmF1bHRWYWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluaW11bV09XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQubWluaW11bSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4aW11bV09XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQubWF4aW11bSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVjaW1hbERpZ2l0c109XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQuZGVjaW1hbERpZ2l0cylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCbHVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZE9uSW5wdXRdPVwiY29tcG9uZW50LnZhbGlkYXRlPy5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNXYXJuaW5nXT1cImlzV2FybmluZyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cIm51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8taW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkYXRldGltZSAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZXRpbWUnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWRhdGVwaWNrZXIgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYURhdGVMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdkYXRlTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2RhdGVMYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0aW1lIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRpbWVwaWNrZXIgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYVRpbWVMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICd0aW1lTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3RpbWVMYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0aW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRpbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZGF0ZXRpbWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlVGltZUNvb3JkaW5hdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlVGltZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZVBpY2tlcl09XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lUGlja2VyXT1cInRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAjZGF0ZXRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJkYXRldGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1kYXRlcGlja2VyIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFEYXRlTGFiZWwnKSB8fCBsb2NhbGUoY29tcG9uZW50LCAnZGF0ZUxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2RhdGVMYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsUG9wb3Zlcl09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAndG9vbHRpcCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRUZXh0QWxpZ25tZW50KGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb0RhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRpbWVwaWNrZXIgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYVRpbWVMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICd0aW1lTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAndGltZUxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFRleHRBbGlnbm1lbnQoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RpbWU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KSBhcyB0ZXh0RmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2lyaW8tZm9ybS1mZWVkYmFja1wiPnt7dGV4dEZlZWRiYWNrfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKSBhcyB0ZXh0SGVscFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzaXJpby1oZWxwZXItdGV4dFwiPnt7dGV4dEhlbHB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gY2hlY2tib3ggLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEhvcml6b250YWxBbGlnbm1lbnQoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb21wb25lbnQuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0b2dnbGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RvZ2dsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tdG9nZ2xlIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmVlZGJhY2tdPVwiZ2V0VGV4dEZlZWRiYWNrKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNXYXJuaW5nXT1cImlzV2FybmluZyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwidG9nZ2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWNoZWNrYm94IFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0SGVscF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZlZWRiYWNrXT1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gcmFkaW8gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEhvcml6b250YWxBbGlnbm1lbnQoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb21wb25lbnQuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBjaGlwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGlwJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1jaGlwLXJhZGlvLWdyb3VwIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsUG9wb3Zlcl09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAndG9vbHRpcCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoVmFsdWVzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NoaXByYWRpb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiY2hpcHJhZGlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8taW5wdXQtY2hpcCAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIChnZXRWYWx1ZXMoY29tcG9uZW50KSB8IGFzeW5jKSB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZShvcHRpb24sICdsYWJlbCcpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWlucHV0LWNoaXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1jaGlwLXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXJhZGlvLWdyb3VwIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmVlZGJhY2tdPVwiZ2V0VGV4dEZlZWRiYWNrKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNXYXJuaW5nXT1cImlzV2FybmluZyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoVmFsdWVzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcmFkaW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwicmFkaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1yYWRpby1idXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiAoZ2V0VmFsdWVzKGNvbXBvbmVudCkgfCBhc3luYykgfHwgW11cIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKG9wdGlvbiwgJ2xhYmVsJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gY2hlY2tsaXN0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2xpc3QnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudChjb21wb25lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGNoaXAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoaXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWNoaXAtY2hlY2tib3gtZ3JvdXAgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZlZWRiYWNrXT1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hWYWx1ZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY2hpcGNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJjaGlwY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1pbnB1dC1jaGlwICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgKGdldFZhbHVlcyhjb21wb25lbnQpIHwgYXN5bmMpIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKG9wdGlvbiwgJ2xhYmVsJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8taW5wdXQtY2hpcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWNoaXAtY2hlY2tib3gtZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkZWZhdWx0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tY2hlY2tib3gtZ3JvdXAgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hWYWx1ZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWNoZWNrYm94ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgKGdldFZhbHVlcyhjb21wb25lbnQpIHwgYXN5bmMpIHx8IFtdXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZShvcHRpb24sICdsYWJlbCcpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tY2hlY2tib3gtZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gdGV4dGFyZWEgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWlucHV0IHR5cGU9XCJ0ZXh0YXJlYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Y2FzZV09XCJjb21wb25lbnQudGV4dENhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cImV2YWx1YXRlTnVtYmVyKGNvbXBvbmVudC5tYXhMZW5ndGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmx1clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRPbklucHV0XT1cImNvbXBvbmVudC52YWxpZGF0ZT8ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RleHRhcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRleHRhcmVhXCI+XHJcbiAgICAgICAgICAgICAgICA8L25neC1zaXJpby1pbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGZpbGVwaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGVwaWNrZXInXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudChjb21wb25lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tZmlsZS11cGxvYWQgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImdldE1pbWVUeXBlcyhjb21wb25lbnQuYWNjZXB0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQubXVsdGlwbGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVwbG9hZGVkRXZlbnQpPVwiZmlsZVVwbG9hZGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RmlsZWxpc3RdPVwiIWNvbXBvbmVudC5zaG93RGV0YWlsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmaWxlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJmaWxlcGlja2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYXMgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKFRleHRzLCAnVXBsb2FkJykgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tZmlsZS11cGxvYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBvbmVudC5zaG93RGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjcmVhdGVVcGxvYWRUYWJsZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElkPVwiZmlsZUxpc3RcIj48L2FwcC1keW5hbWljLWZpZWxkcz5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gcmFuZ2UgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhbmdlJ1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNsaWRlciBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZlZWRiYWNrXT1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImV2YWx1YXRlTnVtYmVyKGNvbXBvbmVudC5yYW5nZT8ubWluKSA/PyAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiZXZhbHVhdGVOdW1iZXIoY29tcG9uZW50LnJhbmdlPy5tYXgpID8/IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNyYW5nZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInJhbmdlXCI+XHJcbiAgICAgICAgICAgICAgICA8L25neC1zaXJpby1zbGlkZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkaXNwbGF5ZmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Rpc3BsYXlmaWVsZCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXJpby1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltnZXRUZXh0QWxpZ25tZW50KGNvbXBvbmVudCksIGdldExpZ2h0Vmlldyhjb21wb25lbnQpIF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgI2Rpc3BsYXlmaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImRpc3BsYXlmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29tcG9uZW50LmxhYmVsXCIgY2xhc3M9XCJzaXJpby1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjb21wb25lbnQudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXJpb1Rvb2x0aXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50XT1cImNvbXBvbmVudC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNQb3BvdmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2lyaW8tbGFiZWwtcG9wb3ZlciBmYXMgZmEtaW5mby1jaXJjbGVcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXJpby1mb3JtLWNvbnRyb2wgZGF0YS1kaXNwbGF5XCIgW25nQ2xhc3NdPVwiY29tcG9uZW50LmZpZWxkdHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC5maWVsZHR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJldmFsdWF0ZShjb21wb25lbnQuZXhwcmVzc2lvbilcIiBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtYXR0ZWRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1cHBvcnRWYWx1ZXMoY29tcG9uZW50KSAmJiBoYXNWYWx1ZXMoY29tcG9uZW50KTsgZWxzZSBzaW1wbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0VmFsdWVzKGNvbXBvbmVudCkgfCBhc3luYyBhcyB2YWx1ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b0xhYmVsKGV2YWx1YXRlKGNvbXBvbmVudC5leHByZXNzaW9uKSwgdmFsdWVzKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW1wbGVUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlKGNvbXBvbmVudC5leHByZXNzaW9uKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtYXR0ZWRUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiIHN0eWxlPVwibWFyZ2luLXRvcDogLTZweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGNvbXBvbmVudC5leHByZXNzaW9uKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImNvbXBvbmVudC5kZXNjcmlwdGlvblwiIGNsYXNzPVwic2lyaW8taGVscGVyLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkeW5hbWljbGlzdCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHluYW1pY2xpc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpIGFzIGZvcm1Hcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUFycmF5TmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWN1cnNpb25dPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNyZWN1cnNpb249XCJyZWN1cnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcGVhdF09XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQucmVwZXRpdGlvbnMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0FkZFJlbW92ZV09XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjb21wb25lbnQuZGVzY3JpcHRpb25cIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSkgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybUFycmF5KHJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKS5nZXQoY29tcG9uZW50LmtleSkpIGFzIGZvcm1BcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcG9uZW50LnN1YnR5cGUgPT0gJ25hdmlnYXRpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5hdmlnYXRpb247IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheS5jb250cm9scy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29tcG9uZW50LnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0YWIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFiJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZHluYW1pY2xpc3R0YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRhYiBbbGVmdEFycm93TGFiZWxdPVwibG9jYWxlKFRleHRzLCAnU2Nyb2xsTGVmdCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmlnaHRBcnJvd0xhYmVsXT1cImxvY2FsZShUZXh0cywgJ1Njcm9sbFJpZ2h0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJDb3VudF09XCJmb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZHluYW1pY2xpc3R0YWI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZvcm1BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tdGFiLWl0ZW0gW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSArICcgJyArIChpICsgMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA9PT0gZHluYW1pY2xpc3R0YWIuYWN0aXZlSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjb21wb25lbnQucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiY29tcG9uZW50LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KSkgJiYgY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidG5SZW1vdmU7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10YWItaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLXRhYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBhY2NvcmRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWNjb3JkaW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZHluYW1pY2xpc3RhY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFjY29yZGlvbiBbYWNjb3JkaW9uQ291bnRdPVwiZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2R5bmFtaWNsaXN0YWNjb3JkaW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmb3JtQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFjY29yZGlvbi1wYW5lbCAjcGFuZWwgYWNjb3JkaW9uUGFuZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1hY2NvcmRpb24taGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVyVGV4dF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgKyAnICcgKyAoaSArIDEpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFjY29yZGlvbi1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5wYW5lbElzT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImdldEZvcm1Hcm91cChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cImNvbXBvbmVudC5yb3dzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cImNvbXBvbmVudC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiY29tcG9uZW50LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEocmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSkpICYmIGNvbXBvbmVudC5hbGxvd0FkZFJlbW92ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ0blJlbW92ZTsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgaTogaSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWNjb3JkaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWNjb3JkaW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHRhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RhYmxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICNkeW5hbWljbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZHluYW1pY2xpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkeW5hbWljbGlzdC10YWJsZVwiIFtuZ0NsYXNzXT1cInsgJ21haW4nOiByZWN1cnNpb25MZXZlbCA9PSAwIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvcm1Hcm91cChpdGVtKSBhcyBmb3JtSXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ7IGl0ZW1zQXJyYXk6IHJlY3Vyc2lvbi5nZXRJdGVtc0FycmF5KGZvcm1JdGVtKSB9IGFzIHJlY3Vyc2lvbkRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29udGVudC1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2dyb3VwLW91dGxpbmUnOiBjb21wb25lbnQuc2hvd091dGxpbmUgPT09IHRydWUgJiYgY29tcG9uZW50LnN1YnR5cGUgIT09ICd0YWJsZScsICdncm91cC1vdXRsaW5lLXJlcGVhdCc6IHRydWUgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiY29tcG9uZW50LmxhYmVsXCI+e3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpICsgJyAnICsgKGkgKyAxKSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cImNvbXBvbmVudC5yb3dzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eV09XCJjb21wb25lbnQuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsaWdubWVudF09XCJjb21wb25lbnQudmVydGljYWxBbGlnbm1lbnRcIj48L2FwcC1keW5hbWljLWZpZWxkcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29tbWFuZC1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWN1cnNpb25EYXRhLml0ZW1zQXJyYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNBZGQ7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiByZWN1cnNpb25EYXRhLml0ZW1zQXJyYXksIGNvbXBhY3Q6IHRydWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1Jlb3JkZXI7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGksIGNvbXBhY3Q6IHRydWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNSZW1vdmU7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGksIGNvbXBhY3Q6IHRydWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cInJlY3Vyc2lvbkRhdGEuaXRlbXNBcnJheSAmJiByZWN1cnNpb25EYXRhLml0ZW1zQXJyYXkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIiBjbGFzcz1cInJlY3Vyc2lvbi1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY3Vyc2lvbi10b2dnbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1idXR0b24gW25neFNpcmlvQ29sbGFwc2VUcmlnZ2VyXT1cImNvbGxhcHNlVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwibnVsbFwiIFtpY29uXT1cImNvbGxhcHNlLmlzT3BlbiA/ICdmYXMgZmEtY2hldnJvbi1kb3duJyA6ICdmYXMgZmEtY2hldnJvbi1yaWdodCcgXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2xsYXBzZS5pc09wZW5cIiBjbGFzcz1cInJlY3Vyc2lvbi10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjdXJzaW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbGxhcHNlLmlzT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmVjdXJzaW9uRGF0YS5pdGVtc0FycmF5Lmxlbmd0aCB9fSBlbGVtZW50aSBwcmVzZW50aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY3Vyc2lvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tY29sbGFwc2UgI2NvbGxhcHNlVGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sbGFwc2U9XCJjb2xsYXBzZUV4dGVuc2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VFeHRlbnNpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbGxhcHNlLmlzT3BlblwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogLTExcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cInJlY3Vyc2lvbi5nZXRGb3JtR3JvdXAoZm9ybUl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlY3Vyc2lvbkxldmVsXT1cInJlY3Vyc2lvbkxldmVsKzFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJyZWN1cnNpb24uZ2V0Q29tcG9uZW50Um93cygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cImNvbXBvbmVudC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiY29tcG9uZW50LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gbmF2aWdhdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduYXZpZ2F0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXkuY29udHJvbHNbbmF2aWdhdGlvbkluZGV4XSBhcyBpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnZ3JvdXAtb3V0bGluZSc6IGNvbXBvbmVudC5zaG93T3V0bGluZSA9PT0gdHJ1ZSwgJ2dyb3VwLW91dGxpbmUtcmVwZWF0JzogdHJ1ZSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiY29tcG9uZW50LmxhYmVsXCI+e3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpICsgJyAnICsgKG5hdmlnYXRpb25JbmRleCArIDEpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJnZXRGb3JtR3JvdXAoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjb21wb25lbnQucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eV09XCJjb21wb25lbnQuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImNvbXBvbmVudC52ZXJ0aWNhbEFsaWdubWVudFwiPjwvYXBwLWR5bmFtaWMtZmllbGRzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGRlZmF1bHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgI2R5bmFtaWNsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJkeW5hbWljbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydncm91cC1vdXRsaW5lJzogY29tcG9uZW50LnNob3dPdXRsaW5lID09PSB0cnVlLCAnZ3JvdXAtb3V0bGluZS1yZXBlYXQnOiB0cnVlIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJjb21wb25lbnQubGFiZWxcIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgKyAnICcgKyAoaSArIDEpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJnZXRGb3JtR3JvdXAoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjb21wb25lbnQucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eV09XCJjb21wb25lbnQuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImNvbXBvbmVudC52ZXJ0aWNhbEFsaWdubWVudFwiPjwvYXBwLWR5bmFtaWMtZmllbGRzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wb25lbnQuYWxsb3dBZGRSZW1vdmUgfHwgY29tcG9uZW50LmFsbG93UmVvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNSZW9yZGVyOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5LCBpOiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNSZW1vdmU7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWNsaXN0LW5vLWRhdGFcIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbm9EYXRhVGV4dCcpKSB8fCBsb2NhbGUoVGV4dHMsICdOb0RhdGEnKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZlZWRiYWNrXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWN1cnNpb25MZXZlbCA9PSAwICYmIGNvbXBvbmVudC5zdWJ0eXBlICE9PSAnbmF2aWdhdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc0FkZDsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gdGVtcGxhdGVzIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidG5Nb3ZlVXAgbGV0LWZvcm1BcnJheT1cImZvcm1BcnJheVwiIGxldC1pPVwiaVwiIGxldC1jb21wYWN0PVwiY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9jYWxlKFRleHRzLCAnTW92ZVVwJykgYXMgdXBMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYnV0dG9uIChjbGljayk9XCJtb3ZlVXBJdGVtKGZvcm1BcnJheSwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVtb3ZlLWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwidXBMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInVwTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJudWxsXCIgaWNvbj1cImZhcyBmYS1hcnJvdy11cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVwTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidG5Nb3ZlRG93biBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgbGV0LWk9XCJpXCIgbGV0LWNvbXBhY3Q9XCJjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2NhbGUoVGV4dHMsICdNb3ZlRG93bicpIGFzIGRvd25MYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYnV0dG9uIChjbGljayk9XCJtb3ZlRG93bkl0ZW0oZm9ybUFycmF5LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJkb3duTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJkb3duTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmFzIGZhLWFycm93LWRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkb3duTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidG5SZW1vdmUgbGV0LWZvcm1BcnJheT1cImZvcm1BcnJheVwiIGxldC1pPVwiaVwiIGxldC1jb21wYWN0PVwiY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3JlbW92ZUxhYmVsJykgfHwgbG9jYWxlKFRleHRzLCAnUmVtb3ZlSXRlbScpKSBhcyByZW1vdmVMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYnV0dG9uIChjbGljayk9XCJyZW1vdmVJdGVtKGZvcm1BcnJheSwgaSwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVtb3ZlLWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwicmVtb3ZlTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyZW1vdmVMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIm51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJmYXMgZmEtdHJhc2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByZW1vdmVMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J0bkFkZCBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgbGV0LWNvbXBhY3Q9XCJjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYWRkTGFiZWwnKSB8fCBsb2NhbGUoVGV4dHMsICdBZGRJdGVtJykpIGFzIGFkZExhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1idXR0b24gKGNsaWNrKT1cImFkZEl0ZW0oZm9ybUFycmF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGQtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJhZGRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImFkZExhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwibnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhcyBmYS1wbHVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYWRkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidXR0b25zUmVvcmRlciBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgbGV0LWk9XCJpXCIgbGV0LWNvbXBhY3Q9XCJjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpKSAmJiBjb21wb25lbnQuYWxsb3dSZW9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ0bk1vdmVVcDsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgaTogaSwgY29tcGFjdDogY29tcGFjdCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ0bk1vdmVEb3duOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5LCBpOiBpLCBjb21wYWN0OiBjb21wYWN0IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidXR0b25zUmVtb3ZlIGxldC1mb3JtQXJyYXk9XCJmb3JtQXJyYXlcIiBsZXQtaT1cImlcIiBsZXQtY29tcGFjdD1cImNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEocmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSkpICYmIGNvbXBvbmVudC5hbGxvd0FkZFJlbW92ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidG5SZW1vdmU7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGksIGNvbXBhY3Q6IGNvbXBhY3QgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1dHRvbnNBZGQgbGV0LWZvcm1BcnJheT1cImZvcm1BcnJheVwiIGxldC1jb21wYWN0PVwiY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KSkgJiYgY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ0bkFkZDsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgY29tcGFjdDogY29tcGFjdCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZmVlZGJhY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KSBhcyB0ZXh0RmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaXJpby1mb3JtLWZlZWRiYWNrIHNpcmlvLWRpc3BsYXktZmVlZGJhY2tcIj57e3RleHRGZWVkYmFja319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKSBhcyB0ZXh0SGVscFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNpcmlvLWhlbHBlci10ZXh0XCI+e3t0ZXh0SGVscH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25hdmlnYXRpb24gbGV0LWZvcm1BcnJheT1cImZvcm1BcnJheVwiID4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPG5hdiBjbGFzcz1cInNpcmlvLXBhZ2luYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXJpby1wYWdpbmF0aW9uLXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNpcmlvLWZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuYXZpZ2F0aW9uSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IF8gb2YgZm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZShUZXh0cywgJ09mJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCB9fTwvc3Bhbj4ge3sgbG9jYWxlKFRleHRzLCAnRWxlbWVudHMnKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lyaW8tcGFnaW5hdGlvbi1jdXJzb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwic2lyaW8tcGFnaW5hdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5kaXNhYmxlZF09XCJuYXZpZ2F0aW9uSW5kZXggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVJdGVtKGZvcm1BcnJheSwgLTEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsb2NhbGUoVGV4dHMsICdQcmV2aW91c0VsZW1lbnQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibmF2aWdhdGlvbkluZGV4ID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJmYXMgZmEtYW5nbGUtbGVmdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuZGlzYWJsZWRdPVwibmF2aWdhdGlvbkluZGV4ID09IGZvcm1BcnJheS5jb250cm9scy5sZW5ndGggLSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZUl0ZW0oZm9ybUFycmF5LCAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwibG9jYWxlKFRleHRzLCAnTmV4dEVsZW1lbnQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibmF2aWdhdGlvbkluZGV4ID09IGZvcm1BcnJheS5jb250cm9scy5sZW5ndGggLSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiZmFzIGZhLWFuZ2xlLXJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc0FkZDsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KSkgJiYgY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlICYmIG5hdmlnYXRpb25JbmRleCAhPSAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuUmVtb3ZlOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5LCBpOiBuYXZpZ2F0aW9uSW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmF2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGdyb3VwIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidncm91cCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0R3JvdXBPdXRsaW5lKGNvbXBvbmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSBhcyBsYWJlbFRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgbGFiZWxUZXh0IH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgI2dyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtZHluYW1pYy1maWVsZHMgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cInJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiY29tcG9uZW50LnJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cImNvbXBvbmVudC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImNvbXBvbmVudC52ZXJ0aWNhbEFsaWdubWVudFwiPjwvYXBwLWR5bmFtaWMtZmllbGRzPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gdGFiIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0YWInXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGdldFBhbmVscyhjb21wb25lbnQpIHwgYXN5bmMpIGFzIHBhbmVsc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWxzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRhYiAjdGFiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0YWJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZWZ0QXJyb3dMYWJlbF09XCJsb2NhbGUoVGV4dHMsICdTY3JvbGxMZWZ0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyaWdodEFycm93TGFiZWxdPVwibG9jYWxlKFRleHRzLCAnU2Nyb2xsUmlnaHQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmF2TGluZV09XCJjb21wb25lbnQubmF2aWdhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmVydGljYWxdPVwiY29tcG9uZW50LnZlcnRpY2FsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJDb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGFuZWwgb2YgcGFuZWxzOyBsZXQgaSA9IGluZGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRhYi1pdGVtIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUocGFuZWwsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiZXZhbHVhdGVTdHJpbmcocGFuZWwuaWNvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJldmFsdWF0ZUJvb2xlYW4ocGFuZWwuZGlzYWJsZWQpID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGFiUGFuZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJJdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0YWJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXZhbHVhdGVDb25kaXRpb25hbChwYW5lbC5jb25kaXRpb25hbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0VGVtcGxhdGUocGFuZWwudGVtcGxhdGUpIGFzIHRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGFiUGFuZWwuaXNBY3RpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cInJlc29sdmVQYXRoKHBhbmVsLnBhdGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJ0ZW1wbGF0ZT8ucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cImNvbXBvbmVudC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5SW5kZXhdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihwYW5lbC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwidGVtcGxhdGU/LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tdGFiLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10YWI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBhY2NvcmRpb24gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjY29yZGlvbidcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZ2V0UGFuZWxzKGNvbXBvbmVudCkgfCBhc3luYykgYXMgcGFuZWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYWNjb3JkaW9uICNhY2NvcmRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lbCBvZiBwYW5lbHM7IGxldCBpID0gaW5kZXg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYWNjb3JkaW9uLXBhbmVsICpuZ0lmPVwiZXZhbHVhdGVDb25kaXRpb25hbChwYW5lbC5jb25kaXRpb25hbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImV2YWx1YXRlQm9vbGVhbihwYW5lbC5kaXNhYmxlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFjY29yZGlvbi1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJUZXh0XT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShwYW5lbCwgJ2xhYmVsJykpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFjY29yZGlvbi1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZW1wbGF0ZShwYW5lbC50ZW1wbGF0ZSkgYXMgdGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChwYW5lbC5wYXRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKHBhbmVsLnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJ0ZW1wbGF0ZT8ucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eUluZGV4XT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsaWdubWVudF09XCJ0ZW1wbGF0ZT8udmVydGljYWxBbGlnbm1lbnRcIj48L2FwcC1keW5hbWljLWZpZWxkcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWNjb3JkaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWNjb3JkaW9uPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0ZXh0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbY29sbGFwc2VdPVwiY29tcG9uZW50LmNvbGxhcHNlVG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAjdGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS1SZXNldCBWaWV3IENvbnRleHQtLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB0YWJpbmRleD1cIjBcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0ZXh0JykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wb25lbnQudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS13cmFwcGVyICN0b29sdGlwV3JhcHBlciBbdGVtcGxhdGVdPVwidG9vbHRpcFRlbXBsYXRlXCIgW2NvbnRleHRdPVwieyBjb21wb25lbnQ6IGNvbXBvbmVudCB9XCI+PC9hcHAtdGVtcGxhdGUtd3JhcHBlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaXJpby1sYWJlbC1wb3BvdmVyIGZhcyBmYS1pbmZvLWNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpcmlvVG9vbHRpcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsZShUZXh0cywgJ0luZm9ybWF0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzUG9wb3Zlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbVRlbXBsYXRlXT1cInRvb2x0aXBXcmFwcGVyLmdldFRlbXBsYXRlUmVmKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbHRpcFRlbXBsYXRlIGxldC1jb21wb25lbnQ9XCJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpcmlvLXRvb2x0aXAtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBodG1sIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidodG1sJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh0bWwtcGFyYWdyYXBoXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZShldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICdjb250ZW50JykpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICNodG1sXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImh0bWxcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gaW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImV2YWx1YXRlU3RyaW5nKGNvbXBvbmVudC5zb3VyY2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYWx0JykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgI2ltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImltYWdlXCI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0YWJsZSAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFibGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgW21vZHVsZXNdPVwiZ2V0R3JpZE1vZHVsZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkT3B0aW9uc109XCJnZXRHcmlkT3B0aW9ucyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwiZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5zZWxlY3RhYmxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aVNlbGVjdF09XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50Lm11bHRpU2VsZWN0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2VkKT1cIm9uR3JpZFNlbGVjdGlvbkNoYW5nZWQoY29tcG9uZW50LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1cHByZXNzQWN0aW9uc109XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnN1cHByZXNzQWN0aW9ucylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRGVmc109XCJjb21wb25lbnQuY29sdW1ucyB8fCBldmFsdWF0ZShjb21wb25lbnQuY29sdW1uc0V4cHJlc3Npb24pIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NvdXJjZV09XCJnZXRSb3dTb3VyY2UoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hSb3dTb3VyY2UoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiY29tcG9uZW50LmF1dG9IZWlnaHQgPyBudWxsIDogZXZhbHVhdGVIZWlnaHQoY29tcG9uZW50LmhlaWdodClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0YWJsZVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBidXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudChjb21wb25lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYnV0dG9uIChjbGlja0V2ZW50KT1cImNsaWNrQnV0dG9uKGNvbXBvbmVudCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJldmFsdWF0ZUNvbG9yKGNvbXBvbmVudC5jb2xvcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5kaXNhYmxlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJldmFsdWF0ZVN0cmluZyhjb21wb25lbnQuaWNvbikgYXMgaWNvbjsgZWxzZSBub0ljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29tcG9uZW50Lmljb25Qb3NpdGlvbiE9J3JpZ2h0J1wiIFtjbGFzc109XCJpY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbXBvbmVudC5pY29uUG9zaXRpb249PSdyaWdodCdcIiBbY2xhc3NdPVwiaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHNlcGFyYXRvciAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VwYXJhdG9yJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICNzZXBhcmF0b3JcclxuICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwic2VwYXJhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHNwYWNlciAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3BhY2VyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb21wb25lbnQuaGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgI3NwYWNlclxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJzcGFjZXJcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gaWZyYW1lIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpZnJhbWUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJjb21wb25lbnQuaWRcIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlmcmFtZSBbc3JjXT1cImV2YWx1YXRlVXJsKGNvbXBvbmVudC51cmwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5oZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJhbWVTZWN1cml0eV09XCJjb21wb25lbnQuc2VjdXJpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjaWZyYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImlmcmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9pZnJhbWU+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBhbGVydCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWxlcnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFsZXJ0IFt0eXBlXT1cImNvbXBvbmVudC5yb2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ2xvc2VdPVwibG9jYWxlKFRleHRzLCAnQ2xvc2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmV2ZW50Q2xvc2VdPVwiZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5wcmV2ZW50Q2xvc2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FsZXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImFsZXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYWxlcnQtbWVzc2FnZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1wYXJhZ3JhcGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ0b0hUTUwoZXZhbHVhdGVUZW1wbGF0ZShsb2NhbGUoY29tcG9uZW50LCAndGV4dCcpKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWxlcnQtbWVzc2FnZT5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFsZXJ0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gbm90aWNlIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidub3RpY2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLW5vdGlmeSAjbm90aWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwibm90aWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tbm90aWZ5LWJvZHkgW3RpdGxlXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0aXRsZScpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0ZXh0JykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1ub3RpZnktYm9keT5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLW5vdGlmeT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHRvb2x0aXAgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Rvb2x0aXAnXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXdyYXBwZXIgI3Rvb2x0aXBXcmFwcGVyIFt0ZW1wbGF0ZV09XCJ0b29sdGlwVGVtcGxhdGVcIiBbY29udGV4dF09XCJ7IGNvbXBvbmVudDogY29tcG9uZW50IH1cIj48L2FwcC10ZW1wbGF0ZS13cmFwcGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpcmlvLWxhYmVsLXBvcG92ZXIgZmFzIGZhLWluZm8tY2lyY2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2lyaW9Ub29sdGlwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNQb3BvdmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY3VzdG9tVGVtcGxhdGVdPVwidG9vbHRpcFdyYXBwZXIuZ2V0VGVtcGxhdGVSZWYoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICN0b29sdGlwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRvb2x0aXBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbHRpcFRlbXBsYXRlIGxldC1jb21wb25lbnQ9XCJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpcmlvLXRvb2x0aXAtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY29tcG9uZW50LnRpdGxlXCIgY2xhc3M9XCJzaXJpby10b29sdGlwLWhlYWRpbmcgc2lyaW8tc3BhY2UtZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3RpdGxlJykpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0ZXh0JykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBjaGFydCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hhcnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxhZy1jaGFydHMgW29wdGlvbnNdPVwiKGdldENoYXJ0T3B0aW9ucyhjb21wb25lbnQpIHwgYXN5bmMpID8/IHt9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW29ic2VydmVdPVwiZ2V0Q2hhcnREYXRhKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsbGJhY2tdPVwiaW52YWxpZGF0ZUNoYXJ0KGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5oZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAjY2hhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiY2hhcnRcIiAvPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gY29tcG9uZW50IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjb21wb25lbnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIGFzIGxhYmVsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgbGFiZWxUZXh0IH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBvbmVudC5pc0lucHV0OyBlbHNlIG5vSW5wdXRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtaG9zdCBbcHJvcGVydGllc109XCJnZXRGZWVsYWJsZVByb3BlcnRpZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbXBvbmVudEhvc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiY29tcG9uZW50SG9zdFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KSBhcyB0ZXh0RmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpcmlvLWZvcm0tZmVlZGJhY2sgc2lyaW8tZGlzcGxheS1mZWVkYmFja1wiPnt7dGV4dEZlZWRiYWNrfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpIGFzIHRleHRIZWxwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2lyaW8taGVscGVyLXRleHRcIj57e3RleHRIZWxwfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbnB1dFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtaG9zdCBbcHJvcGVydGllc109XCJnZXRGZWVsYWJsZVByb3BlcnRpZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb21wb25lbnRIb3N0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImNvbXBvbmVudEhvc3RcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuIl19
|
|
727
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvZHluYW1pYy1maWVsZHMvZHluYW1pYy1maWVsZHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvZHluYW1pYy1maWVsZHMvZHluYW1pYy1maWVsZHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsaUJBQWlCLEVBQXVELE1BQU0sZUFBZSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUkvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIs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LHNCQUFzQixFQUFFLDZCQUE2Qjt3QkFDNUUsdUJBQXVCO3dCQUN2Qix3QkFBd0IsRUFBRSxvQkFBb0I7d0JBQzlDLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFDakI7d0JBQ1QsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLFdBQVc7d0JBQ1gsWUFBWTtxQkFDYixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJO3llQUc1QixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24sIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSUR5bmFtaWNGaWVsZHNDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGRzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUFycmF5LCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNhZmVIdG1sLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgRGF0ZXBpY2tlciB9IGZyb20gJ3ZhbmlsbGFqcy1kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgU2FuaXRpemVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc2FuaXRpemUuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hcmtkb3duU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21hcmtkb3duLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNaW1lU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21pbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb2dyYW1tYWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9ncmFtbWFiaWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFdlYWtTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvd2Vhay5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVnaXN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcmVnaXN0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL21ldGFkYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZ2xvYmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dG9Gb2N1c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRvZm9jdXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25QYXRjaERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdmFsaWRhdGlvbnBhdGNoLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbGxhcHNlUGF0Y2hEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NvbGxhcHNlcGF0Y2guZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQWRvcm5lckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYWRvcm5lci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZWFkT25seURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVhZG9ubHkuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRGlzcGxheURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZGlzcGxheS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZXBlYXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JlcGVhdC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZWN1cnNpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JlY3Vyc2lvbi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBGcmFtZVNlY3VyaXR5RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mcmFtZXNlY3VyaXR5LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IERyb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kcm9wZG93bi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUYWJEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RhYi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBBY2NvcmRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FjY29yZGlvbi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBBbGVydERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYWxlcnQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR3JpZERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NoYW5nZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBSZWdpc3RlckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVnaXN0ZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUmVmcmVzaERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVmcmVzaC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBVcGRhdGVCbHVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy91cGRhdGVibHVyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IERhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2RhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTnVtYmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9udW1iZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGV4dC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBWYWx1ZVN5bmNEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ZhbHVlc3luYy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUYWJDb250cm9sRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90YWJjb250cm9sLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFRhYkl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RhYml0ZW0uZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29sbGFwc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NvbGxhcHNlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEFjY29yZGlvblBhbmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9hY2NvcmRpb25wYW5lbC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZUNvb3JkaW5hdG9yRGlyZWN0aXZlLCBEYXRlVGltZVZhbGlkYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2RhdGV0aW1lLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFJlcXVpcmVkT25JbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmVxdWlyZWQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVXcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2hhcmVkL3RlbXBsYXRlLXdyYXBwZXIvdGVtcGxhdGUtd3JhcHBlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEeW5hbWljSG9zdENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtaG9zdC9keW5hbWljLWhvc3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgdG9FeHByZXNzaW9uIH0gZnJvbSAnLi4vdXRpbHMvZmVlbGFibGUnO1xyXG5pbXBvcnQgeyBpc01lYW5pbmdmdWwgfSBmcm9tICcuLi91dGlscy9pc01lYW5pbmdmdWwnO1xyXG5pbXBvcnQgeyBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHNldEZvY3VzIH0gZnJvbSAnLi4vdXRpbHMvZm9jdXNhYmxlJztcclxuaW1wb3J0IHsgaGFzRmFjdG9yeSB9IGZyb20gJy4uL3NlcnZpY2VzL2J1aWxkZXIuc2VydmljZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFNpcmlvSW5wdXRDb21wb25lbnRcclxuICAsIFNpcmlvU2VsZWN0Q29tcG9uZW50LCBTaXJpb1NlbGVjdE9wdGlvbkNvbXBvbmVudCwgU2lyaW9TZWxlY3RQYW5lbENvbXBvbmVudFxyXG4gICwgU2lyaW9DaGVja2JveEdyb3VwQ29tcG9uZW50LCBTaXJpb0NoZWNrYm94Q29tcG9uZW50LCBTaXJpb0RhdGVwaWNrZXJDb21wb25lbnQsIFNpcmlvVGltZXBpY2tlckNvbXBvbmVudFxyXG4gICwgU2lyaW9SYWRpb0dyb3VwQ29tcG9uZW50LCBTaXJpb1JhZGlvQnV0dG9uQ29tcG9uZW50LCBTaXJpb1RhYkNvbXBvbmVudCwgU2lyaW9UYWJJdGVtQ29tcG9uZW50XHJcbiAgLCBTaXJpb0FjY29yZGlvbkNvbXBvbmVudCwgU2lyaW9BY2NvcmRpb25QYW5lbENvbXBvbmVudCwgU2lyaW9BY2NvcmRpb25IZWFkZXJDb21wb25lbnQsIFNpcmlvQWNjb3JkaW9uQm9keUNvbXBvbmVudFxyXG4gICwgU2lyaW9CdXR0b25Db21wb25lbnQsIFNpcmlvRmlsZVVwbG9hZENvbXBvbmVudFxyXG4gICwgU2lyaW9Ub2dnbGVDb21wb25lbnQsIFNpcmlvQ2hpcENoZWNrYm94R3JvdXBDb21wb25lbnQsIFNpcmlvQ2hpcFJhZGlvR3JvdXBDb21wb25lbnQsIFNpcmlvSW5wdXRDaGlwQ29tcG9uZW50XHJcbiAgLCBTaXJpb0FsZXJ0Q29tcG9uZW50LCBTaXJpb0FsZXJ0TWVzc2FnZUNvbXBvbmVudCwgU2lyaW9TbGlkZXJDb21wb25lbnRcclxuICAsIFNpcmlvTm90aWZ5Q29tcG9uZW50LCBTaXJpb05vdGlmeUJvZHlDb21wb25lbnQsIFNpcmlvTm90aWZ5QWN0aW9uQ29tcG9uZW50LCBTaXJpb05vdGlmeUxpbmtDb21wb25lbnRcclxuICAsIFNpcmlvVG9vbHRpcERpcmVjdGl2ZSwgU2lyaW9Db2xsYXBzZUNvbXBvbmVudCwgU2lyaW9Db2xsYXBzZVRyaWdnZXJEaXJlY3RpdmVcclxuICAsIFNpcmlvUGFnaW5hdG9yQ29tcG9uZW50XHJcbiAgLCBOZ3hTaXJpb0V2ZW50LCBCdXR0b25Db2xvcnNcclxufSBmcm9tICduZ3gtc2lyaW8tbGliJztcclxuXHJcbmltcG9ydCB7IEFnR3JpZEFuZ3VsYXIgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBNb2R1bGUsIEdyaWRPcHRpb25zIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG5pbXBvcnQgeyBBZ0NoYXJ0cyB9IGZyb20gXCJhZy1jaGFydHMtYW5ndWxhclwiO1xyXG5pbXBvcnQgeyBBZ0NoYXJ0T3B0aW9ucyB9IGZyb20gJ2FnLWNoYXJ0cy1jb21tdW5pdHknO1xyXG5cclxuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQHdlbWFrZTR1L2ludGVyYWN0JztcclxuaW1wb3J0IHsgVGV4dHMgfSBmcm9tICcuLi9sb2NhbGUvbG9jYWxlJztcclxuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tICcuLi9sb2NhbGUvbG9jYWxpemUnO1xyXG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWR5bmFtaWMtZmllbGRzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHluYW1pYy1maWVsZHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vZHluYW1pYy1maWVsZHMuY29tcG9uZW50LmNzcycsXHJcbiAgICAnLi9zdHlsZXMvdmFsaWRhdGlvbi5jc3MnLFxyXG4gICAgJy4vc3R5bGVzL2FsaWdubWVudC5jc3MnLFxyXG4gICAgJy4vc3R5bGVzL2RhdGEtZGlzcGxheS5jc3MnLFxyXG4gICAgJy4vc3R5bGVzL2xpZ2h0LXJlYWRvbmx5LmNzcycsXHJcbiAgICAnLi9zdHlsZXMvcGVuZGluZy1zdGF0ZS5jc3MnLFxyXG4gICAgJy4vc3R5bGVzL2R5bmFtaWNsaXN0LXRhYmxlLmNzcycsXHJcbiAgICAnLi9zdHlsZXMvZHluYW1pY2xpc3QtbmF2LmNzcycsXHJcbiAgICAnLi9zdHlsZXMvZGF0ZS10aW1lLmNzcycsXHJcbiAgICAnLi9zdHlsZXMvdGFiLmNzcycsXHJcbiAgICAnLi9zdHlsZXMvdG9vbHRpcC5jc3MnXSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlXHJcbiAgICAsIEFkb3JuZXJEaXJlY3RpdmUsIFJlYWRPbmx5RGlyZWN0aXZlLCBEaXNwbGF5RGlyZWN0aXZlLCBGcmFtZVNlY3VyaXR5RGlyZWN0aXZlLCBWYWxpZGF0aW9uUGF0Y2hEaXJlY3RpdmVcclxuICAgICwgRHJvcGRvd25EaXJlY3RpdmUsIFVwZGF0ZUJsdXJEaXJlY3RpdmUsIFJlcGVhdERpcmVjdGl2ZSwgUmVjdXJzaW9uRGlyZWN0aXZlLCBUYWJEaXJlY3RpdmUsIEdyaWREaXJlY3RpdmUsIENoYW5nZURpcmVjdGl2ZVxyXG4gICAgLCBSZWdpc3RlckRpcmVjdGl2ZSwgUmVmcmVzaERpcmVjdGl2ZSwgQWNjb3JkaW9uRGlyZWN0aXZlLCBEYXRlRGlyZWN0aXZlLCBOdW1iZXJEaXJlY3RpdmUsIFRleHREaXJlY3RpdmUsIFZhbHVlU3luY0RpcmVjdGl2ZVxyXG4gICAgLCBUYWJDb250cm9sRGlyZWN0aXZlLCBUYWJJdGVtRGlyZWN0aXZlLCBDb2xsYXBzZURpcmVjdGl2ZSwgQWNjb3JkaW9uUGFuZWxEaXJlY3RpdmUsIENvbGxhcHNlUGF0Y2hEaXJlY3RpdmVcclxuICAgICwgRGF0ZVRpbWVDb29yZGluYXRvckRpcmVjdGl2ZSwgRGF0ZVRpbWVWYWxpZGF0aW9uRGlyZWN0aXZlLCBBbGVydERpcmVjdGl2ZSwgUmVxdWlyZWRPbklucHV0RGlyZWN0aXZlXHJcbiAgICAsIFNpcmlvSW5wdXRDb21wb25lbnRcclxuICAgICwgU2lyaW9TZWxlY3RDb21wb25lbnQsIFNpcmlvU2VsZWN0T3B0aW9uQ29tcG9uZW50LCBTaXJpb1NlbGVjdFBhbmVsQ29tcG9uZW50XHJcbiAgICAsIFNpcmlvQ2hlY2tib3hHcm91cENvbXBvbmVudCwgU2lyaW9DaGVja2JveENvbXBvbmVudCwgU2lyaW9EYXRlcGlja2VyQ29tcG9uZW50LCBTaXJpb1RpbWVwaWNrZXJDb21wb25lbnRcclxuICAgICwgU2lyaW9SYWRpb0dyb3VwQ29tcG9uZW50LCBTaXJpb1JhZGlvQnV0dG9uQ29tcG9uZW50LCBTaXJpb1RhYkNvbXBvbmVudCwgU2lyaW9UYWJJdGVtQ29tcG9uZW50XHJcbiAgICAsIFNpcmlvQWNjb3JkaW9uQ29tcG9uZW50LCBTaXJpb0FjY29yZGlvblBhbmVsQ29tcG9uZW50LCBTaXJpb0FjY29yZGlvbkhlYWRlckNvbXBvbmVudCwgU2lyaW9BY2NvcmRpb25Cb2R5Q29tcG9uZW50XHJcbiAgICAsIFNpcmlvQnV0dG9uQ29tcG9uZW50LCBTaXJpb0ZpbGVVcGxvYWRDb21wb25lbnRcclxuICAgICwgU2lyaW9Ub2dnbGVDb21wb25lbnQsIFNpcmlvQ2hpcENoZWNrYm94R3JvdXBDb21wb25lbnQsIFNpcmlvQ2hpcFJhZGlvR3JvdXBDb21wb25lbnQsIFNpcmlvSW5wdXRDaGlwQ29tcG9uZW50XHJcbiAgICAsIFNpcmlvQWxlcnRDb21wb25lbnQsIFNpcmlvQWxlcnRNZXNzYWdlQ29tcG9uZW50LCBTaXJpb1NsaWRlckNvbXBvbmVudFxyXG4gICAgLCBTaXJpb05vdGlmeUNvbXBvbmVudCwgU2lyaW9Ob3RpZnlCb2R5Q29tcG9uZW50LCBTaXJpb05vdGlmeUFjdGlvbkNvbXBvbmVudCwgU2lyaW9Ob3RpZnlMaW5rQ29tcG9uZW50XHJcbiAgICAsIFNpcmlvVG9vbHRpcERpcmVjdGl2ZSwgU2lyaW9Db2xsYXBzZUNvbXBvbmVudCwgU2lyaW9Db2xsYXBzZVRyaWdnZXJEaXJlY3RpdmVcclxuICAgICwgU2lyaW9QYWdpbmF0b3JDb21wb25lbnRcclxuICAgICwgVGVtcGxhdGVXcmFwcGVyQ29tcG9uZW50LCBEeW5hbWljSG9zdENvbXBvbmVudFxyXG4gICAgLCBBZ0dyaWRBbmd1bGFyLCBBZ0NoYXJ0c10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBSZWdpc3RlclNlcnZpY2UsXHJcbiAgICBQcm9ncmFtbWFiaWxpdHlTZXJ2aWNlLFxyXG4gICAgR3JpZFNlcnZpY2UsXHJcbiAgICBDaGFydFNlcnZpY2VcclxuICBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuZXhwb3J0IGNsYXNzIER5bmFtaWNGaWVsZHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgSUR5bmFtaWNGaWVsZHNDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGZvcm0hOiBEeW5hbWljRm9ybUNvbXBvbmVudDtcclxuICBASW5wdXQoKSByb3dzOiBBcnJheTxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBhbGlnbm1lbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcmVhZE9ubHk6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSByZWN1cnNpb25MZXZlbDogbnVtYmVyID0gMDtcclxuICBASW5wdXQoKSBpZGVudGl0eSE6IHN0cmluZztcclxuICBASW5wdXQoKSBpZGVudGl0eUluZGV4PzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVBdXRvRm9jdXM/OiBib29sZWFuO1xyXG4gIFxyXG4gIFRleHRzID0gVGV4dHM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBTYW5pdGl6ZVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBtYXJrZG93bjogTWFya2Rvd25TZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgbWltZTogTWltZVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBwcm9ncmFtbWFiaWxpdHk6IFByb2dyYW1tYWJpbGl0eVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSB3ZWFrOiBXZWFrU2VydmljZVxyXG4gICAgLCBwcml2YXRlIHJlZ2lzdGVyOiBSZWdpc3RlclNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBtZXRhZGF0YTogTWV0YWRhdGFTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBnbG9iYWw6IEdsb2JhbFNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBncmlkOiBHcmlkU2VydmljZVxyXG4gICAgLCBwcml2YXRlIGNoYXJ0OiBDaGFydFNlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBkaWFsb2c6IERpYWxvZ1NlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBhdXRvRm9jdXM6IEF1dG9Gb2N1c1NlcnZpY2VcclxuICAgICwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZlxyXG4gIClcclxuICB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVnaXN0ZXIuaWRlbnRpZnkodGhpcy5pZGVudGl0eSwgdGhpcy5pZGVudGl0eUluZGV4KTtcclxuICAgIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmFkZEV2YWx1YXRvclByb3ZpZGVycyh0aGlzLmZvcm0pO1xyXG4gICAgdGhpcy5jb25maWd1cmVEYXRlcGlja2VyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snZm9ybUdyb3VwJ10pIHtcclxuICAgICAgdGhpcy5wcm9ncmFtbWFiaWxpdHkuaW52YWxpZGF0ZUFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzLmNvbnN1bWUodGhpcy5mb3JtR3JvdXApKSB7XHJcbiAgICAgIGlmICh0aGlzLmRpc2FibGVBdXRvRm9jdXMgIT09IHRydWUpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHNldEZvY3VzKHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZWdpc3RlcigpOiBSZWdpc3RlclNlcnZpY2Uge1xyXG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXI7XHJcbiAgfVxyXG5cclxuICBnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybVNlcnZpY2UuZ2V0Q29udHJvbCh0aGlzLmZvcm1Hcm91cCwgW2NvbXBvbmVudC5wYXRoLCBjb21wb25lbnQua2V5XSk7XHJcbiAgICByZXR1cm4gIWNvbnRyb2wgfHwgY29udHJvbC52YWxpZCB8fCAhY29udHJvbC5lcnJvcnNcclxuICAgICAgPyAnJ1xyXG4gICAgICA6IGNvbnRyb2wuZXJyb3JzWydtZXNzYWdlJ107IFxyXG4gIH1cclxuXHJcbiAgaXNXYXJuaW5nKGNvbXBvbmVudDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtU2VydmljZS5nZXRDb250cm9sKHRoaXMuZm9ybUdyb3VwLCBbY29tcG9uZW50LnBhdGgsIGNvbXBvbmVudC5rZXldKTtcclxuICAgIHJldHVybiAoY29udHJvbCAmJiBjb250cm9sLmVycm9ycyAmJiBjb250cm9sLmVycm9yc1snd2FybmluZyddKSB8fCBmYWxzZVxyXG4gIH1cclxuXHJcbiAgbG9jYWxlKGNvbXBvbmVudDogYW55LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbG9jYWxpemUodGhpcy5sYW5ndWFnZSwgY29tcG9uZW50LCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVTdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlU3RyaW5nKHRoaXMuZm9ybUdyb3VwLCB2YWx1ZSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVCb29sZWFuKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnByb2dyYW1tYWJpbGl0eS5ldmFsdWF0ZUJvb2xlYW4odGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtbWFiaWxpdHkuZXZhbHVhdGVOdW1iZXIodGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlVXJsKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogU2FmZVJlc291cmNlVXJsIHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlU3RyaW5nKHRoaXMuZm9ybUdyb3VwLCB2YWx1ZSk7XHJcbiAgICBjb25zdCB3YXRjaEtleSA9IGA6c2FmZVVybCgke3VybH0pYDtcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbCh0aGlzLmZvcm1Hcm91cCwgd2F0Y2hLZXksICgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLnNhbml0aXplU2FmZVVybCh1cmwpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZUhlaWdodCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gdmFsdWUgKyBcInB4XCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9ncmFtbWFiaWxpdHkuZXZhbHVhdGUodGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCJweFwiO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlVGVtcGxhdGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlVGVtcGxhdGUodGhpcy5mb3JtR3JvdXAsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlKHRleHQ6IHN0cmluZyB8IG51bGwsIGNhY2hlYWJsZTogYm9vbGVhbiA9IHRydWUpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlKHRoaXMuZm9ybUdyb3VwLCB0ZXh0LCB7XHJcbiAgICAgIGNhY2hlYWJsZTogY2FjaGVhYmxlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlQ29sb3IodmFsdWU6IHN0cmluZyB8IG51bGwpOiBCdXR0b25Db2xvcnMgfCBudWxsIHtcclxuICAgIGNvbnN0IGNvbG9yID0gdGhpcy5ldmFsdWF0ZVN0cmluZyh2YWx1ZSk7XHJcbiAgICBjb25zdCB3YXRjaEtleSA9IGA6YnV0dG9uQ29sb3IoJHtjb2xvcn0pYDtcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbCh0aGlzLmZvcm1Hcm91cCwgd2F0Y2hLZXksICgpID0+IHtcclxuICAgICAgaWYgKGNvbG9yID09PSBcImdob3N0XCIpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGNvbnN0IHZhbGlkQ29sb3JzOiBCdXR0b25Db2xvcnNbXSA9IFsncHJpbWFyeScsICdzZWNvbmRhcnknLCAndGVydGlhcnknLCAndGVydGlhcnktbGlnaHQnLCAnZGFuZ2VyJ107XHJcbiAgICAgIHJldHVybiB2YWxpZENvbG9ycy5pbmNsdWRlcyhjb2xvciBhcyBCdXR0b25Db2xvcnMpID8gKGNvbG9yIGFzIEJ1dHRvbkNvbG9ycykgOiAncHJpbWFyeSc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlQ29uZGl0aW9uYWwoY29uZGl0aW9uYWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaGlkZSA9IHRoaXMuZXZhbHVhdGVCb29sZWFuKGNvbmRpdGlvbmFsPy5oaWRlKTtcclxuICAgIGNvbnN0IHNob3cgPSB0aGlzLmV2YWx1YXRlQm9vbGVhbihjb25kaXRpb25hbD8uc2hvdyk7XHJcbiAgICBcclxuICAgIHJldHVybiAhKGhpZGUgPT09IHRydWUgfHwgc2hvdyA9PT0gZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVtcGxhdGUodmFsdWU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5nZXRGb3JtQnlOYW1lKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1Hcm91cChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsKTogRm9ybUdyb3VwIHtcclxuICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29udHJvbCBpcyBub3QgYSBGb3JtR3JvdXAnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUFycmF5KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwpOiBGb3JtQXJyYXkge1xyXG4gICAgaWYgKCEoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250cm9sIGlzIG5vdCBhIEZvcm1BcnJheScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcgfCBudWxsKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm1Hcm91cCh0aGlzLmdldENvbnRyb2xGcm9tUGF0aChwYXRoKSlcclxuICB9XHJcblxyXG4gIHRvSFRNTCh0ZXh0OiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICBjb25zdCB3YXRjaEtleSA9IGA6c2FmZUh0bWwoJHt0ZXh0fSlgO1xyXG4gICAgcmV0dXJuIHRoaXMud2Vhay5jYWxsKHRoaXMuZm9ybUdyb3VwLCB3YXRjaEtleSwgKCkgPT4ge1xyXG4gICAgICBjb25zdCBodG1sID0gdGhpcy5tYXJrZG93bi50b0h0bWwodGV4dCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5zYW5pdGl6ZVNhZmVIdG1sKGh0bWwpO1xyXG4gICAgfSk7XHJcbiAgfTtcclxuXHJcbiAgc2FuaXRpemUoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLnNhbml0aXplU2FmZUh0bWwoaHRtbCk7XHJcbiAgfTtcclxuXHJcbiAgZ2V0TWltZVR5cGVzKGV4dGVuc2lvbnM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5taW1lLmdldE1pbWVUeXBlcyhleHRlbnNpb25zKTtcclxuICB9O1xyXG5cclxuICBjbGlja0J1dHRvbihjb21wb25lbnQ6IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGNvbXBvbmVudC5jbGljaykge1xyXG4gICAgICB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC5jbGljaywgZmFsc2UpO1xyXG4gICAgfSAgICBcclxuICB9XHJcblxyXG4gIGhhc1ZhbHVlcyhjb21wb25lbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjb21wb25lbnQpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHsgdmFsdWVzLCB2YWx1ZXNLZXksIHZhbHVlc0V4cHJlc3Npb24gfSA9IGNvbXBvbmVudDtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGlzTWVhbmluZ2Z1bCh2YWx1ZXMpIHx8XHJcbiAgICAgIGlzTWVhbmluZ2Z1bCh2YWx1ZXNLZXkpIHx8XHJcbiAgICAgIGlzTWVhbmluZ2Z1bCh2YWx1ZXNFeHByZXNzaW9uKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlcyhjb21wb25lbnQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoY29tcG9uZW50LnZhbHVlcykge1xyXG4gICAgICAvLyBTdGF0aWNcclxuICAgICAgcmV0dXJuIG9mKGNvbXBvbmVudC52YWx1ZXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29tcG9uZW50LnZhbHVlc0tleSkge1xyXG4gICAgICAvLyBGaWVsZCB2YWx1ZVxyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC52YWx1ZXNLZXkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRBc09ic2VydmFibGUocmVzdWx0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNvbXBvbmVudC52YWx1ZXNFeHByZXNzaW9uKSB7XHJcbiAgICAgIC8vIEV4cHJlc3Npb25cclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ldmFsdWF0ZShjb21wb25lbnQudmFsdWVzRXhwcmVzc2lvbik7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEFzT2JzZXJ2YWJsZShyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIE5vdGhpbmdcclxuICAgICAgcmV0dXJuIHRoaXMubm9EYXRhO1xyXG4gICAgfSAgICBcclxuICB9XHJcblxyXG4gIHJlZnJlc2hWYWx1ZXMoY29tcG9uZW50OiBhbnkpOiAoKSA9PiB2b2lkIHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudmFsdWVzS2V5KSB7XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKGNvbXBvbmVudC52YWx1ZXNLZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC52YWx1ZXNFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKGNvbXBvbmVudC52YWx1ZXNFeHByZXNzaW9uKTtcclxuICAgICAgfSAgXHJcbiAgICB9OyAgXHJcbiAgfVxyXG5cclxuICB0b0xhYmVsKHZhbHVlOiBhbnksIGxpc3Q6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGFueSB9Pik6IGFueSB7XHJcbiAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkgfHwgbGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0TGFiZWwgPSAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gbGlzdC5maW5kKHggPT4geC52YWx1ZSA9PT0gdmFsdWUpO1xyXG4gICAgICByZXR1cm4gaXRlbSA/IGl0ZW0ubGFiZWwgOiB2YWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKHYgPT4gZ2V0TGFiZWwodikpLmpvaW4oJywgJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGdldExhYmVsKHZhbHVlKTsgICAgICBcclxuICAgIH0gICAgXHJcbiAgfVxyXG5cclxuICBzdXBwb3J0VmFsdWVzKGNvbXBvbmVudDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWNvbXBvbmVudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIGNvbXBvbmVudC5maWVsZHR5cGUgPT09ICdzZWxlY3QnIHx8IGNvbXBvbmVudC5maWVsZHR5cGUgPT09ICd0YWdsaXN0JztcclxuICB9XHJcblxyXG4gIGdldENoYXJ0T3B0aW9ucyhjb21wb25lbnQ6IGFueSk6IE9ic2VydmFibGU8QWdDaGFydE9wdGlvbnM+IHtcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbChjb21wb25lbnQsIGBnZXRDaGFydE9wdGlvbnNfJHt0aGlzLmxhbmd1YWdlfWBcclxuICAgICAgLCAoKSA9PiB0aGlzLmNoYXJ0LmdldE9wdGlvbnMoY29tcG9uZW50LCB0aGlzLmZvcm1Hcm91cCkpO1xyXG4gIH1cclxuXHJcbiAgaW52YWxpZGF0ZUNoYXJ0KGNvbXBvbmVudDogYW55KTogKCkgPT4gdm9pZCB7XHJcbiAgICByZXR1cm4gKCkgPT4gdGhpcy53ZWFrLmludmFsaWRhdGUoY29tcG9uZW50LCBgZ2V0Q2hhcnRPcHRpb25zXyR7dGhpcy5sYW5ndWFnZX1gKTtcclxuICB9XHJcblxyXG4gIGdldENoYXJ0RGF0YShjb21wb25lbnQ6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5jaGFydC5nZXREYXRhRXhwcmVzc2lvbihjb21wb25lbnQpO1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlKHRoaXMuZm9ybUdyb3VwLCBleHByZXNzaW9uKTtcclxuICB9XHJcblxyXG4gIGdldEdyaWRPcHRpb25zKGNvbXBvbmVudDogYW55KTogR3JpZE9wdGlvbnMgeyAgICBcclxuICAgIHJldHVybiB0aGlzLndlYWsuY2FsbChjb21wb25lbnQsIHRoaXMuZ3JpZC5nZXRDYWNoZUtleSgpXHJcbiAgICAgICwgKCkgPT4gdGhpcy5ncmlkLmdldE9wdGlvbnMoY29tcG9uZW50LCB0aGlzLmZvcm1Hcm91cCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZE1vZHVsZXMoY29tcG9uZW50OiBhbnkpOiBNb2R1bGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy53ZWFrLmNhbGwoY29tcG9uZW50LCAnZ2V0R3JpZE1vZHVsZXMnLCAoKSA9PiB0aGlzLmdyaWQuZ2V0TW9kdWxlcygpKTtcclxuICB9XHJcblxyXG4gIG9uR3JpZFNlbGVjdGlvbkNoYW5nZWQoY29tcG9uZW50OiBhbnksIGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JpZC5vblNlbGVjdGlvbkNoYW5nZWQoY29tcG9uZW50LCB0aGlzLmZvcm1Hcm91cCwgZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Um93U291cmNlKGNvbXBvbmVudDogYW55KTogYW55IHtcclxuICAgIGlmIChjb21wb25lbnQuZGF0YVNvdXJjZSkge1xyXG4gICAgICAvLyBFeHByZXNzaW9uXHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC5kYXRhU291cmNlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBOb3RoaW5nXHJcbiAgICAgIHJldHVybiB0aGlzLm5vRGF0YTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hSb3dTb3VyY2UoY29tcG9uZW50OiBhbnkpOiAoKSA9PiB2b2lkIHtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmIChjb21wb25lbnQuZGF0YVNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZShjb21wb25lbnQuZGF0YVNvdXJjZSk7XHJcbiAgICAgIH0gIFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFkZEl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXkpIHtcclxuICAgIGlmIChoYXNGYWN0b3J5KGZvcm1BcnJheSkpIHtcclxuICAgICAgY29uc3QgYWRkZWRJdGVtID0gZm9ybUFycmF5LmFkZEl0ZW0oKTtcclxuICAgICAgdGhpcy5hdXRvRm9jdXMubWFyayhhZGRlZEl0ZW0pO1xyXG4gICAgICB0aGlzLm5hdmlnYXRlSXRlbShmb3JtQXJyYXkpO1xyXG4gICAgfSAgICBcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXksIGluZGV4OiBudW1iZXIsIHdpdGhDb25maXJtOiBib29sZWFuKSB7XHJcbiAgICBpZiAod2l0aENvbmZpcm0pIHtcclxuICAgICAgdGhpcy5kaWFsb2cuY29uZmlybSh0aGlzLmxvY2FsZShUZXh0cywgJ0NvbmZpcm1EZWxldGUnKSwge1xyXG4gICAgICAgIFwidGl0bGVcIjogdGhpcy5sb2NhbGUoVGV4dHMsICdDb25maXJtJyksXHJcbiAgICAgICAgXCJidXR0b25zXCI6IFwiQ29uZmlybUNhbmNlbFwiLFxyXG4gICAgICAgIFwib25SZXN1bHRcIjogKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUl0ZW0oZm9ybUFycmF5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVJdGVtKGZvcm1BcnJheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0aW9uSW5kZXggPSAwO1xyXG5cclxuICBuYXZpZ2F0ZUl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXksIGRlbHRhOiBudW1iZXIgPSAwKTogdm9pZCB7XHJcbiAgICBpZiAoIWZvcm1BcnJheSB8fCBmb3JtQXJyYXkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbkluZGV4ID0gLTE7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYXN0SW5kZXggPSBmb3JtQXJyYXkubGVuZ3RoIC0gMTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRpb25JbmRleCA9IE1hdGgubWluKFxyXG4gICAgICBsYXN0SW5kZXgsXHJcbiAgICAgIE1hdGgubWF4KDAsIHRoaXMubmF2aWdhdGlvbkluZGV4ICsgZGVsdGEpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbW92ZVVwSXRlbShmb3JtQXJyYXk6IEZvcm1BcnJheSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY29udHJvbDogQWJzdHJhY3RDb250cm9sID0gZm9ybUFycmF5LmF0KGluZGV4KTtcclxuICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICBmb3JtQXJyYXkuaW5zZXJ0KGluZGV4IC0gMSwgY29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBtb3ZlRG93bkl0ZW0oZm9ybUFycmF5OiBGb3JtQXJyYXksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCA9IGZvcm1BcnJheS5hdChpbmRleCk7XHJcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgZm9ybUFycmF5Lmluc2VydChpbmRleCArIDEsIGNvbnRyb2wpOyAgICBcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVwbG9hZFRhYmxlcyhjb21wb25lbnQ6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy53ZWFrLmNhbGwoY29tcG9uZW50LCAnY3JlYXRlVXBsb2FkVGFibGVzJywgKCkgPT4ge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbXBvbmVudHM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInRhYmxlXCIsXHJcbiAgICAgICAgICAgICAgXCJsYXlvdXRcIjoge1xyXG4gICAgICAgICAgICAgICAgXCJjb2x1bW5zXCI6IG51bGxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIFwiY29sdW1uc1wiOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sb2NhbGUoVGV4dHMsICdOYW1lJyksXHJcbiAgICAgICAgICAgICAgICAgIFwia2V5XCI6IFwibmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgICBcImZsZXhcIjogMVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxvY2FsZShUZXh0cywgJ1NpemUnKSxcclxuICAgICAgICAgICAgICAgICAgXCJrZXlcIjogXCJzaXplXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwiZm9ybWF0XCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICAgICAgICBcImFsaWduXCI6IFwicmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxvY2FsZShUZXh0cywgJ1R5cGUnKSxcclxuICAgICAgICAgICAgICAgICAgXCJrZXlcIjogXCJ0eXBlXCIgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIFwia2V5XCI6IFwidXJsXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiA1MCxcclxuICAgICAgICAgICAgICAgICAgXCJhbGlnblwiOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgICBcImZvcm1hdFwiOiBcIm9iamVjdFVSTFwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIFwid2lkdGhcIjogNTAsXHJcbiAgICAgICAgICAgICAgICAgIFwiYWxpZ25cIjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgICAgICAgXCJmb3JtYXRcIjogXCJkZWxldGVSb3dcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgXCJkYXRhU291cmNlXCI6IFwiPVwiICsgY29tcG9uZW50LmtleSxcclxuICAgICAgICAgICAgICBcImhlaWdodFwiOiAyMDAsXHJcbiAgICAgICAgICAgICAgXCJjb25kaXRpb25hbFwiOiBjb21wb25lbnQuY29uZGl0aW9uYWwsXHJcbiAgICAgICAgICAgICAgXCJkaXNhYmxlZFwiOiBjb21wb25lbnQuZGlzYWJsZWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZmlsZVVwbG9hZGVkKCRldmVudDogTmd4U2lyaW9FdmVudDxTaXJpb0ZpbGVVcGxvYWRDb21wb25lbnQ+KSB7XHJcbiAgICBjb25zdCByZW1vdmVGaWxlID0gKGZpbGU6IEZpbGUpID0+IHtcclxuICAgICAgaWYgKCRldmVudC5jb21wb25lbnQuY29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IG5ld0ZpbGVzID0gJGV2ZW50LmNvbXBvbmVudC5maWxlTGlzdC5maWx0ZXIoZiA9PiBmICE9PSBmaWxlKTtcclxuICAgICAgICAkZXZlbnQuY29tcG9uZW50LmNvbnRyb2wuc2V0VmFsdWUobmV3RmlsZXMpO1xyXG4gICAgICAgIGFkZFJlbW92ZShuZXdGaWxlcyk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0ZpbGVzO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhZGRSZW1vdmUgPSAoZmlsZXM6IEZpbGVbXSkgPT4ge1xyXG4gICAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgIGlmICghKCdyZW1vdmUnIGluIGZpbGUpKSB7XHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmlsZSwgJ3JlbW92ZScsIHtcclxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICByZW1vdmVGaWxlKHRoaXMpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgfSk7IFxyXG4gICAgfTtcclxuXHJcbiAgICBhZGRSZW1vdmUoJGV2ZW50LmNvbXBvbmVudC5maWxlTGlzdCk7XHJcbiAgfVxyXG5cclxuICBnZXRGZWVsYWJsZVByb3BlcnRpZXMoY29tcG9uZW50OiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXM7XHJcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdvYmplY3QnICYmIHByb3BlcnRpZXMgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocHJvcGVydGllcykpIHtcclxuICAgICAgY29uc3QgZmVlbGFibGUgPSB0b0V4cHJlc3Npb24ocHJvcGVydGllcyk7XHJcbiAgICAgIHJldHVybiB0aGlzLnByb2dyYW1tYWJpbGl0eS5ldmFsdWF0ZSh0aGlzLmZvcm1Hcm91cCwgZmVlbGFibGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBPdXRsaW5lKGNvbXBvbmVudDogYW55KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnZ3JvdXAtb3V0bGluZSc6IGNvbXBvbmVudC5zaG93T3V0bGluZSA9PT0gdHJ1ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1DbGFzcygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIFtcImRmLWNvbXBvbmVudHNcIl06IHRydWUsXHJcbiAgICAgIFtcInZhbGlnbi1zdGFydFwiXTogdGhpcy5hbGlnbm1lbnQgPT09ICdzdGFydCcsXHJcbiAgICAgIFtcInZhbGlnbi1jZW50ZXJcIl06IHRoaXMuYWxpZ25tZW50ID09PSAnY2VudGVyJyxcclxuICAgICAgW1widmFsaWduLWVuZFwiXTogdGhpcy5hbGlnbm1lbnQgPT09ICdlbmQnXHJcbiAgICB9ICAgIFxyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcG9uZW50Q2xhc3MoY29tcG9uZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSB7XHJcbiAgICAgIFtcImNvbC1ob3N0XCJdOiB0cnVlLFxyXG4gICAgICBbXCJjb2wtbWQtXCIgKyBjb21wb25lbnQubGF5b3V0Py5jb2x1bW5zXTogKGNvbXBvbmVudC5sYXlvdXQ/LmNvbHVtbnMpLFxyXG4gICAgICBbXCJjb2xcIl06ICEoY29tcG9uZW50LmxheW91dD8uY29sdW1ucyksXHJcbiAgICAgIFtgZGYtZmllbGQtJHtjb21wb25lbnQudHlwZX1gXTogdHJ1ZSxcclxuICAgICAgW1wiY29tcG9uZW50LXN0YXJ0XCJdOiBjb21wb25lbnQuc2VsZkFsaWdubWVudCA9PT0gJ3N0YXJ0JyxcclxuICAgICAgW1wiY29tcG9uZW50LWNlbnRlclwiXTogY29tcG9uZW50LnNlbGZBbGlnbm1lbnQgPT09ICdjZW50ZXInLFxyXG4gICAgICBbXCJjb21wb25lbnQtZW5kXCJdOiBjb21wb25lbnQuc2VsZkFsaWdubWVudCA9PT0gJ2VuZCdcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHlDc3NDbGFzc2VzKGNsYXNzZXMsIGNvbXBvbmVudC5jc3NDbGFzcyk7XHJcbiAgICByZXR1cm4gY2xhc3NlcztcclxuICB9XHJcblxyXG4gIGdldENvbXBvbmVudFN0eWxlKGNvbXBvbmVudDogYW55KTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB8IG51bGwge1xyXG5cclxuICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5hcHBseUlubGluZVN0eWxlcyhzdHlsZXMsIGNvbXBvbmVudC5pbmxpbmVTdHlsZSkpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHJldHVybiBzdHlsZXM7XHJcblxyXG4gICAgLy9jb25zdCBsYXlvdXQgPSBjb21wb25lbnQubGF5b3V0O1xyXG4gICAgLy9pZiAoIXRoaXMuaGFzUG9zaXRpb24oY29tcG9uZW50LmxheW91dCkpIHtcclxuICAgIC8vICByZXR1cm4gbnVsbDtcclxuICAgIC8vfVxyXG4gICAgLy9yZXR1cm4ge1xyXG4gICAgLy8gIC4uLihsYXlvdXQueSAhPSBudWxsID8geyB0b3A6IGAke2xheW91dC55fXB4YCB9IDoge30pLFxyXG4gICAgLy8gIC4uLihsYXlvdXQueCAhPSBudWxsID8geyBsZWZ0OiBgJHtsYXlvdXQueH1weGAgfSA6IHt9KSxcclxuICAgIC8vICAuLi4obGF5b3V0LndpZHRoICE9IG51bGwgPyB7IHdpZHRoOiBgJHtsYXlvdXQud2lkdGh9cHhgIH0gOiB7fSksXHJcbiAgICAvLyAgLi4uKGxheW91dC5oZWlnaHQgIT0gbnVsbCA/IHsgaGVpZ2h0OiBgJHtsYXlvdXQuaGVpZ2h0fXB4YCB9IDoge30pLFxyXG4gICAgLy99O1xyXG4gIH1cclxuXHJcbiAgZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQ6IGFueSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50ZXh0QWxpZ24pIHtcclxuICAgICAgY2FzZSAnbGVmdCc6IHJldHVybiBcInRleHQtbGVmdFwiXHJcbiAgICAgIGNhc2UgJ2NlbnRlcic6IHJldHVybiBcInRleHQtY2VudGVyXCJcclxuICAgICAgY2FzZSAncmlnaHQnOiByZXR1cm4gXCJ0ZXh0LXJpZ2h0XCJcclxuICAgICAgZGVmYXVsdDogcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIb3Jpem9udGFsQWxpZ25tZW50KGNvbXBvbmVudDogYW55KSB7XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSBjb21wb25lbnQuaG9yaXpvbnRhbEFsaWdubWVudDtcclxuICAgIGNvbnN0IHJ1bGVOYW1lID0gXCJob3Jpem9udGFsXCI7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBbYCR7cnVsZU5hbWV9LWxlZnRgXTogYWxpZ25tZW50ID09PSAnbGVmdCcsXHJcbiAgICAgIFtgJHtydWxlTmFtZX0tY2VudGVyYF06IGFsaWdubWVudCA9PT0gJ2NlbnRlcicsXHJcbiAgICAgIFtgJHtydWxlTmFtZX0tcmlnaHRgXTogYWxpZ25tZW50ID09PSAncmlnaHQnLFxyXG4gICAgICBbYCR7cnVsZU5hbWV9LWZpbGxgXTogYWxpZ25tZW50ID09PSAnZmlsbCdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRMaWdodFZpZXcoY29tcG9uZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2xhc3NOYW1lID0gJ2xpZ2h0LXZpZXcnO1xyXG4gICAgY29uc3QgdmFsdWUgPSBjb21wb25lbnQucHJvcGVydGllcz8udXNlTGlnaHRSZWFkb25seVxyXG4gICAgICB8fCB0aGlzLmdsb2JhbC5nZXRQcm9wZXJ0eShcInVzZUxpZ2h0UmVhZG9ubHlcIiwgXCJ5ZXNcIik7XHJcbiAgICBpZiAodmFsdWUgIT09IFwieWVzXCIgJiYgdmFsdWUgIT09IFwibm9cIilcclxuICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcclxuICAgIHJldHVybiAodmFsdWUgPT09IFwieWVzXCIpID8gY2xhc3NOYW1lIDogXCJcIjtcclxuICB9XHJcblxyXG4gIGdldFBhbmVscyhjb21wb25lbnQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoY29tcG9uZW50LnBhbmVscykge1xyXG4gICAgICAvLyBTdGF0aWNcclxuICAgICAgcmV0dXJuIG9mKGNvbXBvbmVudC5wYW5lbHMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29tcG9uZW50LnBhbmVsc0V4cHJlc3Npb24pIHtcclxuICAgICAgLy8gRXhwcmVzc2lvblxyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmV2YWx1YXRlKGNvbXBvbmVudC5wYW5lbHNFeHByZXNzaW9uKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXNPYnNlcnZhYmxlKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gTm90aGluZ1xyXG4gICAgICByZXR1cm4gdGhpcy5ub0RhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vRGF0YTogT2JzZXJ2YWJsZTxhbnk+ID0gb2YoW10pO1xyXG5cclxuICBwcml2YXRlIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLmdldExhbmd1YWdlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGludmFsaWRhdGUodGV4dDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbW1hYmlsaXR5LmludmFsaWRhdGUodGV4dCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRyb2xGcm9tUGF0aChwYXRoOiBzdHJpbmcgfCBudWxsKTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gcGF0aFxyXG4gICAgICA/IHRoaXMuZm9ybUdyb3VwLmdldChwYXRoKVxyXG4gICAgICA6IHRoaXMuZm9ybUdyb3VwO1xyXG5cclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcm1Hcm91cCBkb2VzIG5vdCBjb250YWluIGEgY29udHJvbCB3aXRoIHBhdGggJyR7cGF0aH0nYCwgeyBjYXVzZTogdGhpcy5mb3JtR3JvdXAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QXNPYnNlcnZhYmxlKHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIHJldHVybiBvZih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q3NzQ2xhc3Nlcyh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCBjc3NDbGFzczogYW55KTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCFjc3NDbGFzcylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHZhciBjc3NWYWx1ZSA9IHRoaXMuZXZhbHVhdGUoY3NzQ2xhc3MpO1xyXG5cclxuICAgIGlmICghY3NzVmFsdWUpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBsZXQgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIGNzc1ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjbGFzc2VzID0gY3NzVmFsdWUuc3BsaXQoL1xccysvKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3NzQ2xhc3MpKSB7XHJcbiAgICAgIGNsYXNzZXMgPSBjc3NWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNsYXNzZXMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjbGFzc2VzXHJcbiAgICAgIC5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgJiYgYy50cmltKCkubGVuZ3RoID4gMClcclxuICAgICAgLmZvckVhY2goY2xzID0+IHRhcmdldFtjbHNdID0gdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5SW5saW5lU3R5bGVzKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55Piwgc3R5bGU6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghc3R5bGUpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBzdHlsZVZhbHVlID0gdGhpcy5ldmFsdWF0ZShzdHlsZSk7XHJcblxyXG4gICAgaWYgKCFzdHlsZVZhbHVlKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgbGV0IHN0eWxlczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgc3R5bGVzID0ge307XHJcblxyXG4gICAgICBzdHlsZVZhbHVlXHJcbiAgICAgICAgLnNwbGl0KCc7JylcclxuICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXHJcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxyXG4gICAgICAgIC5mb3JFYWNoKHJ1bGUgPT4ge1xyXG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcnVsZS5zcGxpdCgnOicpLm1hcChwID0+IHAudHJpbSgpKTtcclxuICAgICAgICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcclxuICAgICAgICAgICAgc3R5bGVzIVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygc3R5bGVWYWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc3R5bGVWYWx1ZSkpIHtcclxuICAgICAgc3R5bGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHN0eWxlVmFsdWUpXHJcbiAgICAgICAgICAuZmlsdGVyKChbXywgdl0pID0+IHYgIT0gbnVsbClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXN0eWxlcyB8fCBPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzdHlsZXMpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvL3ByaXZhdGUgaGFzUG9zaXRpb24obGF5b3V0Pzoge1xyXG4gIC8vICB4PzogbnVtYmVyIHwgbnVsbDtcclxuICAvLyAgeT86IG51bWJlciB8IG51bGw7XHJcbiAgLy99KTogYm9vbGVhbiB7XHJcbiAgLy8gIHJldHVybiBsYXlvdXQ/LnggIT0gbnVsbCB8fCBsYXlvdXQ/LnkgIT0gbnVsbDtcclxuICAvL31cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVEYXRlcGlja2VyKCkge1xyXG4gICAgKERhdGVwaWNrZXIubG9jYWxlcyBhcyBhbnkpWydpdCddID0ge1xyXG4gICAgICBkYXlzOiBbXHJcbiAgICAgICAgJ0RvbWVuaWNhJyxcclxuICAgICAgICAnTHVuZWTDrCcsXHJcbiAgICAgICAgJ01hcnRlZMOsJyxcclxuICAgICAgICAnTWVyY29sZWTDrCcsXHJcbiAgICAgICAgJ0dpb3ZlZMOsJyxcclxuICAgICAgICAnVmVuZXJkw6wnLFxyXG4gICAgICAgICdTYWJhdG8nLFxyXG4gICAgICBdLFxyXG4gICAgICBkYXlzTWluOiBbJ0RvbScsICdMdW4nLCAnTWFyJywgJ01lcicsICdHaW8nLCAnVmVuJywgJ1NhYiddLFxyXG4gICAgICBtb250aHM6IFtcclxuICAgICAgICAnR2VubmFpbycsXHJcbiAgICAgICAgJ0ZlYmJyYWlvJyxcclxuICAgICAgICAnTWFyem8nLFxyXG4gICAgICAgICdBcHJpbGUnLFxyXG4gICAgICAgICdNYWdnaW8nLFxyXG4gICAgICAgICdHaXVnbm8nLFxyXG4gICAgICAgICdMdWdsaW8nLFxyXG4gICAgICAgICdBZ29zdG8nLFxyXG4gICAgICAgICdTZXR0ZW1icmUnLFxyXG4gICAgICAgICdPdHRvYnJlJyxcclxuICAgICAgICAnTm92ZW1icmUnLFxyXG4gICAgICAgICdEaWNlbWJyZScsXHJcbiAgICAgIF0sXHJcbiAgICAgIG1vbnRoc1Nob3J0OiBbXHJcbiAgICAgICAgJ0dlbicsXHJcbiAgICAgICAgJ0ZlYicsXHJcbiAgICAgICAgJ01hcicsXHJcbiAgICAgICAgJ0FwcicsXHJcbiAgICAgICAgJ01hZycsXHJcbiAgICAgICAgJ0dpdScsXHJcbiAgICAgICAgJ0x1ZycsXHJcbiAgICAgICAgJ0FnbycsXHJcbiAgICAgICAgJ1NldCcsXHJcbiAgICAgICAgJ090dCcsXHJcbiAgICAgICAgJ05vdicsXHJcbiAgICAgICAgJ0RpYycsXHJcbiAgICAgIF0sXHJcbiAgICAgIHRvZGF5OiAnT2dnaScsXHJcbiAgICAgIGNsZWFyOiAnUHVsaXNjaScsXHJcbiAgICAgIGZvcm1hdDogJ2RkL21tL3l5eXknLFxyXG4gICAgICB3ZWVrU3RhcnQ6IDFcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBtYXJrRm9yQXV0b0ZvY3VzKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICAoZm9ybUdyb3VwIGFzIGFueSlbJ19hdXRvRm9jdXMnXSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVpcmVBdXRvRm9jdXMoZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoZm9ybUdyb3VwIGFzIGFueSlbJ19hdXRvRm9jdXMnXSA9PT0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbbmdDbGFzc109XCJnZXRGb3JtQ2xhc3MoKVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZmllbGQtc2V0XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbXBvbmVudCBvZiByb3cuY29tcG9uZW50c1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC50eXBlXCI+XHJcbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldENvbXBvbmVudENsYXNzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICBbc3R5bGVdPVwiZ2V0Q29tcG9uZW50U3R5bGUoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRlXT1cImV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQuY29uZGl0aW9uYWw/LmhpZGUpXCJcclxuICAgICAgICAgICAgICAgICBbc2hvd109XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LmNvbmRpdGlvbmFsPy5zaG93KVwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0ZXh0ZmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRmaWVsZCdcIiBbZm9ybUdyb3VwXT1cInJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5neC1zaXJpby1pbnB1dCB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmVlZGJhY2tdPVwiZ2V0VGV4dEZlZWRiYWNrKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZml4QWRvcm5lcl09XCJldmFsdWF0ZVN0cmluZyhjb21wb25lbnQuYXBwZWFyYW5jZT8ucHJlZml4QWRvcm5lcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VmZml4QWRvcm5lcl09XCJldmFsdWF0ZVN0cmluZyhjb21wb25lbnQuYXBwZWFyYW5jZT8uc3VmZml4QWRvcm5lcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Y2FzZV09XCJjb21wb25lbnQudGV4dENhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cImV2YWx1YXRlTnVtYmVyKGNvbXBvbmVudC5tYXhMZW5ndGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmx1clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRPbklucHV0XT1cImNvbXBvbmVudC52YWxpZGF0ZT8ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RleHRmaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0ZXh0ZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gc2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tc2VsZWN0IFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0SGVscF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZnJlc2hdPVwicmVmcmVzaFZhbHVlcyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNlbGVjdC1wYW5lbD5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWlucHV0ICpuZ0lmPVwiY29tcG9uZW50LnNlYXJjaGFibGVcIiBjbGFzcz1cInNlYXJjaGFibGVcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJsb2NhbGUoVGV4dHMsICdUeXBlVG9TZWFyY2gnKVwiPjwvbmd4LXNpcmlvLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tc2VsZWN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIChnZXRWYWx1ZXMoY29tcG9uZW50KSB8IGFzeW5jKSB8fCBbXVwiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBsb2NhbGUob3B0aW9uLCAnbGFiZWwnKSB9fTwvbmd4LXNpcmlvLXNlbGVjdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLXNlbGVjdC1wYW5lbD5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHRhZ2xpc3QgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RhZ2xpc3QnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tc2VsZWN0IFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0SGVscF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoVmFsdWVzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0YWdsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwidGFnbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNlbGVjdC1wYW5lbD5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNlbGVjdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiAoZ2V0VmFsdWVzKGNvbXBvbmVudCkgfCBhc3luYykgfHwgW11cIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgbG9jYWxlKG9wdGlvbiwgJ2xhYmVsJykgfX08L25neC1zaXJpby1zZWxlY3Qtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1zZWxlY3QtcGFuZWw+XHJcbiAgICAgICAgICAgICAgICA8L25neC1zaXJpby1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBudW1iZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIiBbZm9ybUdyb3VwXT1cInJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5neC1zaXJpby1pbnB1dCB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmVmaXhBZG9ybmVyXT1cImV2YWx1YXRlU3RyaW5nKGNvbXBvbmVudC5hcHBlYXJhbmNlPy5wcmVmaXhBZG9ybmVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhBZG9ybmVyXT1cImV2YWx1YXRlU3RyaW5nKGNvbXBvbmVudC5hcHBlYXJhbmNlPy5zdWZmaXhBZG9ybmVyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZXZhbHVhdGVOdW1iZXIoY29tcG9uZW50LmRlZmF1bHRWYWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluaW11bV09XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQubWluaW11bSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4aW11bV09XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQubWF4aW11bSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVjaW1hbERpZ2l0c109XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQuZGVjaW1hbERpZ2l0cylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCbHVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZE9uSW5wdXRdPVwiY29tcG9uZW50LnZhbGlkYXRlPy5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNXYXJuaW5nXT1cImlzV2FybmluZyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cIm51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8taW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkYXRldGltZSAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZXRpbWUnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWRhdGVwaWNrZXIgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYURhdGVMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdkYXRlTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2RhdGVMYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2RhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0aW1lIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRpbWVwaWNrZXIgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYVRpbWVMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICd0aW1lTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3RpbWVMYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0aW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRpbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZGF0ZXRpbWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlVGltZUNvb3JkaW5hdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlVGltZVZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZVBpY2tlcl09XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lUGlja2VyXT1cInRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAjZGF0ZXRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJkYXRldGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1kYXRlcGlja2VyIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFEYXRlTGFiZWwnKSB8fCBsb2NhbGUoY29tcG9uZW50LCAnZGF0ZUxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2RhdGVMYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsUG9wb3Zlcl09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAndG9vbHRpcCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRUZXh0QWxpZ25tZW50KGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb0RhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRpbWVwaWNrZXIgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYVRpbWVMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICd0aW1lTGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAndGltZUxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibG9jYWxlKGNvbXBvbmVudCwgJ3BsYWNlaG9sZGVyJykgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFRleHRBbGlnbm1lbnQoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RpbWU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KSBhcyB0ZXh0RmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2lyaW8tZm9ybS1mZWVkYmFja1wiPnt7dGV4dEZlZWRiYWNrfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKSBhcyB0ZXh0SGVscFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzaXJpby1oZWxwZXItdGV4dFwiPnt7dGV4dEhlbHB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gY2hlY2tib3ggLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEhvcml6b250YWxBbGlnbm1lbnQoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb21wb25lbnQuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0b2dnbGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RvZ2dsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tdG9nZ2xlIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmVlZGJhY2tdPVwiZ2V0VGV4dEZlZWRiYWNrKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNXYXJuaW5nXT1cImlzV2FybmluZyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwidG9nZ2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWNoZWNrYm94IFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0SGVscF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZlZWRiYWNrXT1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gcmFkaW8gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEhvcml6b250YWxBbGlnbm1lbnQoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb21wb25lbnQuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBjaGlwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGlwJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1jaGlwLXJhZGlvLWdyb3VwIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsUG9wb3Zlcl09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAndG9vbHRpcCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoVmFsdWVzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NoaXByYWRpb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiY2hpcHJhZGlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8taW5wdXQtY2hpcCAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIChnZXRWYWx1ZXMoY29tcG9uZW50KSB8IGFzeW5jKSB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZShvcHRpb24sICdsYWJlbCcpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWlucHV0LWNoaXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1jaGlwLXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXJhZGlvLWdyb3VwIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0RmVlZGJhY2tdPVwiZ2V0VGV4dEZlZWRiYWNrKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNXYXJuaW5nXT1cImlzV2FybmluZyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoVmFsdWVzKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcmFkaW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwicmFkaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1yYWRpby1idXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiAoZ2V0VmFsdWVzKGNvbXBvbmVudCkgfCBhc3luYykgfHwgW11cIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKG9wdGlvbiwgJ2xhYmVsJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gY2hlY2tsaXN0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2xpc3QnXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudChjb21wb25lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGNoaXAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoaXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWNoaXAtY2hlY2tib3gtZ3JvdXAgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZlZWRiYWNrXT1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dXaGVuVmFsaWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hWYWx1ZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY2hpcGNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJjaGlwY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1pbnB1dC1jaGlwICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgKGdldFZhbHVlcyhjb21wb25lbnQpIHwgYXN5bmMpIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKG9wdGlvbiwgJ2xhYmVsJykgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8taW5wdXQtY2hpcD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWNoaXAtY2hlY2tib3gtZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkZWZhdWx0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tY2hlY2tib3gtZ3JvdXAgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImNvbXBvbmVudC5wcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hWYWx1ZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVN5bmNdPVwiY29tcG9uZW50LnZhbHVlU3luY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWNoZWNrYm94ICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgKGdldFZhbHVlcyhjb21wb25lbnQpIHwgYXN5bmMpIHx8IFtdXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZShvcHRpb24sICdsYWJlbCcpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tY2hlY2tib3gtZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gdGV4dGFyZWEgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWlucHV0IHR5cGU9XCJ0ZXh0YXJlYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2FyaWFMYWJlbCcpIHx8IGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxvY2FsZShjb21wb25lbnQsICdwbGFjZWhvbGRlcicpIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiY29tcG9uZW50LnByb3BlcnRpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEhlbHBdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29tcG9uZW50LmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0Y2FzZV09XCJjb21wb25lbnQudGV4dENhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cImV2YWx1YXRlTnVtYmVyKGNvbXBvbmVudC5tYXhMZW5ndGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0VGV4dEFsaWdubWVudChjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmx1clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRPbklucHV0XT1cImNvbXBvbmVudC52YWxpZGF0ZT8ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RleHRhcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRleHRhcmVhXCI+XHJcbiAgICAgICAgICAgICAgICA8L25neC1zaXJpby1pbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGZpbGVwaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGVwaWNrZXInXCIgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChjb21wb25lbnQucGF0aClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudChjb21wb25lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tZmlsZS11cGxvYWQgW2FyaWFMYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxQb3BvdmVyXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImdldE1pbWVUeXBlcyhjb21wb25lbnQuYWNjZXB0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQubXVsdGlwbGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVVwbG9hZGVkRXZlbnQpPVwiZmlsZVVwbG9hZGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RmlsZWxpc3RdPVwiIWNvbXBvbmVudC5zaG93RGV0YWlsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRGZWVkYmFja109XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1dhcm5pbmddPVwiaXNXYXJuaW5nKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93V2hlblZhbGlkXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVTeW5jXT1cImNvbXBvbmVudC52YWx1ZVN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmaWxlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJmaWxlcGlja2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYXMgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKFRleHRzLCAnVXBsb2FkJykgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tZmlsZS11cGxvYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBvbmVudC5zaG93RGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjcmVhdGVVcGxvYWRUYWJsZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElkPVwiZmlsZUxpc3RcIj48L2FwcC1keW5hbWljLWZpZWxkcz5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gcmFuZ2UgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhbmdlJ1wiIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXNsaWRlciBbbGFiZWxdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFBvcG92ZXJdPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3Rvb2x0aXAnKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRIZWxwXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdkZXNjcmlwdGlvbicpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dEZlZWRiYWNrXT1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJjb21wb25lbnQucHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbXBvbmVudC5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZhbGlkYXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzV2FybmluZ109XCJpc1dhcm5pbmcoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1doZW5WYWxpZF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImV2YWx1YXRlTnVtYmVyKGNvbXBvbmVudC5yYW5nZT8ubWluKSA/PyAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiZXZhbHVhdGVOdW1iZXIoY29tcG9uZW50LnJhbmdlPy5tYXgpID8/IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlU3luY109XCJjb21wb25lbnQudmFsdWVTeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNyYW5nZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInJhbmdlXCI+XHJcbiAgICAgICAgICAgICAgICA8L25neC1zaXJpby1zbGlkZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkaXNwbGF5ZmllbGQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Rpc3BsYXlmaWVsZCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXJpby1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltnZXRUZXh0QWxpZ25tZW50KGNvbXBvbmVudCksIGdldExpZ2h0Vmlldyhjb21wb25lbnQpIF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgI2Rpc3BsYXlmaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImRpc3BsYXlmaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29tcG9uZW50LmxhYmVsXCIgY2xhc3M9XCJzaXJpby1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjb21wb25lbnQudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXJpb1Rvb2x0aXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50XT1cImNvbXBvbmVudC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNQb3BvdmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYXJpYUxhYmVsJykgfHwgbG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2lyaW8tbGFiZWwtcG9wb3ZlciBmYXMgZmEtaW5mby1jaXJjbGVcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXJpby1mb3JtLWNvbnRyb2wgZGF0YS1kaXNwbGF5XCIgW25nQ2xhc3NdPVwiY29tcG9uZW50LmZpZWxkdHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXBvbmVudC5maWVsZHR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJldmFsdWF0ZShjb21wb25lbnQuZXhwcmVzc2lvbilcIiBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb3JtYXR0ZWRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1cHBvcnRWYWx1ZXMoY29tcG9uZW50KSAmJiBoYXNWYWx1ZXMoY29tcG9uZW50KTsgZWxzZSBzaW1wbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0VmFsdWVzKGNvbXBvbmVudCkgfCBhc3luYyBhcyB2YWx1ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b0xhYmVsKGV2YWx1YXRlKGNvbXBvbmVudC5leHByZXNzaW9uKSwgdmFsdWVzKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW1wbGVUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlKGNvbXBvbmVudC5leHByZXNzaW9uKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtYXR0ZWRUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiIHN0eWxlPVwibWFyZ2luLXRvcDogLTZweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGNvbXBvbmVudC5leHByZXNzaW9uKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImNvbXBvbmVudC5kZXNjcmlwdGlvblwiIGNsYXNzPVwic2lyaW8taGVscGVyLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBkeW5hbWljbGlzdCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHluYW1pY2xpc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpIGFzIGZvcm1Hcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUFycmF5TmFtZV09XCJjb21wb25lbnQua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWN1cnNpb25dPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNyZWN1cnNpb249XCJyZWN1cnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcGVhdF09XCJldmFsdWF0ZU51bWJlcihjb21wb25lbnQucmVwZXRpdGlvbnMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0FkZFJlbW92ZV09XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjb21wb25lbnQuZGVzY3JpcHRpb25cIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnZGVzY3JpcHRpb24nKSkgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybUFycmF5KHJlc29sdmVQYXRoKGNvbXBvbmVudC5wYXRoKS5nZXQoY29tcG9uZW50LmtleSkpIGFzIGZvcm1BcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcG9uZW50LnN1YnR5cGUgPT0gJ25hdmlnYXRpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5hdmlnYXRpb247IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheS5jb250cm9scy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29tcG9uZW50LnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0YWIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFiJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZHluYW1pY2xpc3R0YWJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLXRhYiBbbGVmdEFycm93TGFiZWxdPVwibG9jYWxlKFRleHRzLCAnU2Nyb2xsTGVmdCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmlnaHRBcnJvd0xhYmVsXT1cImxvY2FsZShUZXh0cywgJ1Njcm9sbFJpZ2h0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJDb3VudF09XCJmb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZHluYW1pY2xpc3R0YWI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZvcm1BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tdGFiLWl0ZW0gW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSArICcgJyArIChpICsgMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA9PT0gZHluYW1pY2xpc3R0YWIuYWN0aXZlSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjb21wb25lbnQucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlQXV0b0ZvY3VzXT1cImNvbXBvbmVudC5kaXNhYmxlQXV0b0ZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiY29tcG9uZW50LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KSkgJiYgY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246cmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidG5SZW1vdmU7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10YWItaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLXRhYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBhY2NvcmRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWNjb3JkaW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiZHluYW1pY2xpc3RhY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFjY29yZGlvbiBbYWNjb3JkaW9uQ291bnRdPVwiZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2R5bmFtaWNsaXN0YWNjb3JkaW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmb3JtQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFjY29yZGlvbi1wYW5lbCAjcGFuZWwgYWNjb3JkaW9uUGFuZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1hY2NvcmRpb24taGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVyVGV4dF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgKyAnICcgKyAoaSArIDEpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFjY29yZGlvbi1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5wYW5lbElzT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImdldEZvcm1Hcm91cChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cImNvbXBvbmVudC5yb3dzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cImNvbXBvbmVudC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlQXV0b0ZvY3VzXT1cImNvbXBvbmVudC5kaXNhYmxlQXV0b0ZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsaWdubWVudF09XCJjb21wb25lbnQudmVydGljYWxBbGlnbm1lbnRcIj48L2FwcC1keW5hbWljLWZpZWxkcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KSkgJiYgY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuUmVtb3ZlOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5LCBpOiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFjY29yZGlvbi1ib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1hY2NvcmRpb24tcGFuZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1hY2NvcmRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICNyZWdpb24gdGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFibGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgI2R5bmFtaWNsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJkeW5hbWljbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImR5bmFtaWNsaXN0LXRhYmxlXCIgW25nQ2xhc3NdPVwieyAnbWFpbic6IHJlY3Vyc2lvbkxldmVsID09IDAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmb3JtQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9ybUdyb3VwKGl0ZW0pIGFzIGZvcm1JdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInsgaXRlbXNBcnJheTogcmVjdXJzaW9uLmdldEl0ZW1zQXJyYXkoZm9ybUl0ZW0pIH0gYXMgcmVjdXJzaW9uRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjb250ZW50LWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnZ3JvdXAtb3V0bGluZSc6IGNvbXBvbmVudC5zaG93T3V0bGluZSA9PT0gdHJ1ZSAmJiBjb21wb25lbnQuc3VidHlwZSAhPT0gJ3RhYmxlJywgJ2dyb3VwLW91dGxpbmUtcmVwZWF0JzogdHJ1ZSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJjb21wb25lbnQubGFiZWxcIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgKyAnICcgKyAoaSArIDEpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtSXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiY29tcG9uZW50LnJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cImNvbXBvbmVudC5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUF1dG9Gb2N1c109XCJjb21wb25lbnQuZGlzYWJsZUF1dG9Gb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImNvbXBvbmVudC52ZXJ0aWNhbEFsaWdubWVudFwiPjwvYXBwLWR5bmFtaWMtZmllbGRzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjb21tYW5kLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY3Vyc2lvbkRhdGEuaXRlbXNBcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc0FkZDsgY29udGV4dDogeyBmb3JtQXJyYXk6IHJlY3Vyc2lvbkRhdGEuaXRlbXNBcnJheSwgY29tcGFjdDogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zUmVvcmRlcjsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgaTogaSwgY29tcGFjdDogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1JlbW92ZTsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgaTogaSwgY29tcGFjdDogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicmVjdXJzaW9uRGF0YS5pdGVtc0FycmF5ICYmIHJlY3Vyc2lvbkRhdGEuaXRlbXNBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwicmVjdXJzaW9uLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjdXJzaW9uLXRvZ2dsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWJ1dHRvbiBbbmd4U2lyaW9Db2xsYXBzZVRyaWdnZXJdPVwiY29sbGFwc2VUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJudWxsXCIgW2ljb25dPVwiY29sbGFwc2UuaXNPcGVuID8gJ2ZhcyBmYS1jaGV2cm9uLWRvd24nIDogJ2ZhcyBmYS1jaGV2cm9uLXJpZ2h0JyBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbGxhcHNlLmlzT3BlblwiIGNsYXNzPVwicmVjdXJzaW9uLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWN1cnNpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sbGFwc2UuaXNPcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZWN1cnNpb25EYXRhLml0ZW1zQXJyYXkubGVuZ3RoIH19IGVsZW1lbnRpIHByZXNlbnRpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjdXJzaW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1jb2xsYXBzZSAjY29sbGFwc2VUZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2xsYXBzZT1cImNvbGxhcHNlRXh0ZW5zaW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUV4dGVuc2lvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sbGFwc2UuaXNPcGVuXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAtMTFweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtZHluYW1pYy1maWVsZHMgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicmVjdXJzaW9uLmdldEZvcm1Hcm91cChmb3JtSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVjdXJzaW9uTGV2ZWxdPVwicmVjdXJzaW9uTGV2ZWwrMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cInJlY3Vyc2lvbi5nZXRDb21wb25lbnRSb3dzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVBdXRvRm9jdXNdPVwiY29tcG9uZW50LmRpc2FibGVBdXRvRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImNvbXBvbmVudC52ZXJ0aWNhbEFsaWdubWVudFwiPjwvYXBwLWR5bmFtaWMtZmllbGRzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1jb2xsYXBzZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIG5hdmlnYXRpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbmF2aWdhdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5LmNvbnRyb2xzW25hdmlnYXRpb25JbmRleF0gYXMgaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2dyb3VwLW91dGxpbmUnOiBjb21wb25lbnQuc2hvd091dGxpbmUgPT09IHRydWUsICdncm91cC1vdXRsaW5lLXJlcGVhdCc6IHRydWUgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cImNvbXBvbmVudC5sYWJlbFwiPnt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSArICcgJyArIChuYXZpZ2F0aW9uSW5kZXggKyAxKSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtZHluYW1pYy1maWVsZHMgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiY29tcG9uZW50LnJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVBdXRvRm9jdXNdPVwiY29tcG9uZW50LmRpc2FibGVBdXRvRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImNvbXBvbmVudC52ZXJ0aWNhbEFsaWdubWVudFwiPjwvYXBwLWR5bmFtaWMtZmllbGRzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIGRlZmF1bHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgI2R5bmFtaWNsaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJkeW5hbWljbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydncm91cC1vdXRsaW5lJzogY29tcG9uZW50LnNob3dPdXRsaW5lID09PSB0cnVlLCAnZ3JvdXAtb3V0bGluZS1yZXBlYXQnOiB0cnVlIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJjb21wb25lbnQubGFiZWxcIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgKyAnICcgKyAoaSArIDEpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJnZXRGb3JtR3JvdXAoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjb21wb25lbnQucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eV09XCJjb21wb25lbnQuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUF1dG9Gb2N1c109XCJjb21wb25lbnQuZGlzYWJsZUF1dG9Gb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiY29tcG9uZW50LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBvbmVudC5hbGxvd0FkZFJlbW92ZSB8fCBjb21wb25lbnQuYWxsb3dSZW9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1Jlb3JkZXI7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1JlbW92ZTsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgaTogaSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pY2xpc3Qtbm8tZGF0YVwiPnt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdub0RhdGFUZXh0JykpIHx8IGxvY2FsZShUZXh0cywgJ05vRGF0YScpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmVlZGJhY2tcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY3Vyc2lvbkxldmVsID09IDAgJiYgY29tcG9uZW50LnN1YnR5cGUgIT09ICduYXZpZ2F0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zQWRkOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0ZW1wbGF0ZXMgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J0bk1vdmVVcCBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgbGV0LWk9XCJpXCIgbGV0LWNvbXBhY3Q9XCJjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2NhbGUoVGV4dHMsICdNb3ZlVXAnKSBhcyB1cExhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1idXR0b24gKGNsaWNrKT1cIm1vdmVVcEl0ZW0oZm9ybUFycmF5LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJ1cExhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwidXBMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIm51bGxcIiBpY29uPVwiZmFzIGZhLWFycm93LXVwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdXBMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J0bk1vdmVEb3duIGxldC1mb3JtQXJyYXk9XCJmb3JtQXJyYXlcIiBsZXQtaT1cImlcIiBsZXQtY29tcGFjdD1cImNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvY2FsZShUZXh0cywgJ01vdmVEb3duJykgYXMgZG93bkxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1idXR0b24gKGNsaWNrKT1cIm1vdmVEb3duSXRlbShmb3JtQXJyYXksIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cImRvd25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImRvd25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIm51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJmYXMgZmEtYXJyb3ctZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRvd25MYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J0blJlbW92ZSBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgbGV0LWk9XCJpXCIgbGV0LWNvbXBhY3Q9XCJjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAncmVtb3ZlTGFiZWwnKSB8fCBsb2NhbGUoVGV4dHMsICdSZW1vdmVJdGVtJykpIGFzIHJlbW92ZUxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1idXR0b24gKGNsaWNrKT1cInJlbW92ZUl0ZW0oZm9ybUFycmF5LCBpLCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJyZW1vdmVMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInJlbW92ZUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwibnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhcyBmYS10cmFzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlbW92ZUxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnRuQWRkIGxldC1mb3JtQXJyYXk9XCJmb3JtQXJyYXlcIiBsZXQtY29tcGFjdD1cImNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdhZGRMYWJlbCcpIHx8IGxvY2FsZShUZXh0cywgJ0FkZEl0ZW0nKSkgYXMgYWRkTGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWJ1dHRvbiAoY2xpY2spPVwiYWRkSXRlbShmb3JtQXJyYXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZC1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cImFkZExhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiYWRkTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmFzIGZhLXBsdXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhZGRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1dHRvbnNSZW9yZGVyIGxldC1mb3JtQXJyYXk9XCJmb3JtQXJyYXlcIiBsZXQtaT1cImlcIiBsZXQtY29tcGFjdD1cImNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEocmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5yZWFkb25seSkpICYmIGNvbXBvbmVudC5hbGxvd1Jlb3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuTW92ZVVwOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5LCBpOiBpLCBjb21wYWN0OiBjb21wYWN0IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuTW92ZURvd247IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IGksIGNvbXBhY3Q6IGNvbXBhY3QgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1dHRvbnNSZW1vdmUgbGV0LWZvcm1BcnJheT1cImZvcm1BcnJheVwiIGxldC1pPVwiaVwiIGxldC1jb21wYWN0PVwiY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KSkgJiYgY29tcG9uZW50LmFsbG93QWRkUmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ0blJlbW92ZTsgY29udGV4dDogeyBmb3JtQXJyYXk6IGZvcm1BcnJheSwgaTogaSwgY29tcGFjdDogY29tcGFjdCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnV0dG9uc0FkZCBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgbGV0LWNvbXBhY3Q9XCJjb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpKSAmJiBjb21wb25lbnQuYWxsb3dBZGRSZW1vdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuQWRkOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5LCBjb21wYWN0OiBjb21wYWN0IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmZWVkYmFjaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFRleHRGZWVkYmFjayhjb21wb25lbnQpIGFzIHRleHRGZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpcmlvLWZvcm0tZmVlZGJhY2sgc2lyaW8tZGlzcGxheS1mZWVkYmFja1wiPnt7dGV4dEZlZWRiYWNrfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpIGFzIHRleHRIZWxwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2lyaW8taGVscGVyLXRleHRcIj57e3RleHRIZWxwfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbmF2aWdhdGlvbiBsZXQtZm9ybUFycmF5PVwiZm9ybUFycmF5XCIgPiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8bmF2IGNsYXNzPVwic2lyaW8tcGFnaW5hdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpcmlvLXBhZ2luYXRpb24tcGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2lyaW8tZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5hdmlnYXRpb25JbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgXyBvZiBmb3JtQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbbmdWYWx1ZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpICsgMSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlKFRleHRzLCAnT2YnKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoIH19PC9zcGFuPiB7eyBsb2NhbGUoVGV4dHMsICdFbGVtZW50cycpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXJpby1wYWdpbmF0aW9uLWN1cnNvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJzaXJpby1wYWdpbmF0aW9uLWxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzLmRpc2FibGVkXT1cIm5hdmlnYXRpb25JbmRleCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZUl0ZW0oZm9ybUFycmF5LCAtMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImxvY2FsZShUZXh0cywgJ1ByZXZpb3VzRWxlbWVudCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJuYXZpZ2F0aW9uSW5kZXggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZhcyBmYS1hbmdsZS1sZWZ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5kaXNhYmxlZF09XCJuYXZpZ2F0aW9uSW5kZXggPT0gZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlSXRlbShmb3JtQXJyYXksIDEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJsb2NhbGUoVGV4dHMsICdOZXh0RWxlbWVudCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJuYXZpZ2F0aW9uSW5kZXggPT0gZm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJmYXMgZmEtYW5nbGUtcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zQWRkOyBjb250ZXh0OiB7IGZvcm1BcnJheTogZm9ybUFycmF5IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKHJlYWRPbmx5IHx8IGV2YWx1YXRlQm9vbGVhbihjb21wb25lbnQucmVhZG9ubHkpKSAmJiBjb21wb25lbnQuYWxsb3dBZGRSZW1vdmUgJiYgbmF2aWdhdGlvbkluZGV4ICE9IC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidG5SZW1vdmU7IGNvbnRleHQ6IHsgZm9ybUFycmF5OiBmb3JtQXJyYXksIGk6IG5hdmlnYXRpb25JbmRleCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uYXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gZ3JvdXAgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRHcm91cE91dGxpbmUoY29tcG9uZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIGFzIGxhYmVsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBsYWJlbFRleHQgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPGRpdiAjZ3JvdXBcclxuICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1keW5hbWljLWZpZWxkcyBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJyZWFkT25seSB8fCBldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJjb21wb25lbnQucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlQXV0b0ZvY3VzXT1cImNvbXBvbmVudC5kaXNhYmxlQXV0b0ZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiY29tcG9uZW50LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0YWIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RhYidcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZ2V0UGFuZWxzKGNvbXBvbmVudCkgfCBhc3luYykgYXMgcGFuZWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tdGFiICN0YWJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRhYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xlZnRBcnJvd0xhYmVsXT1cImxvY2FsZShUZXh0cywgJ1Njcm9sbExlZnQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JpZ2h0QXJyb3dMYWJlbF09XCJsb2NhbGUoVGV4dHMsICdTY3JvbGxSaWdodCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOYXZMaW5lXT1cImNvbXBvbmVudC5uYXZpZ2F0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWZXJ0aWNhbF09XCJjb21wb25lbnQudmVydGljYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lbCBvZiBwYW5lbHM7IGxldCBpID0gaW5kZXg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tdGFiLWl0ZW0gW2xhYmVsXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShwYW5lbCwgJ2xhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJldmFsdWF0ZVN0cmluZyhwYW5lbC5pY29uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImV2YWx1YXRlQm9vbGVhbihwYW5lbC5kaXNhYmxlZCkgPz8gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0YWJQYW5lbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRhYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJldmFsdWF0ZUNvbmRpdGlvbmFsKHBhbmVsLmNvbmRpdGlvbmFsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZW1wbGF0ZShwYW5lbC50ZW1wbGF0ZSkgYXMgdGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0YWJQYW5lbC5pc0FjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgocGFuZWwucGF0aClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cInRlbXBsYXRlPy5yb3dzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHlJbmRleF09XCJpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKHBhbmVsLnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVBdXRvRm9jdXNdPVwidGVtcGxhdGU/LmRpc2FibGVBdXRvRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwidGVtcGxhdGU/LnZlcnRpY2FsQWxpZ25tZW50XCI+PC9hcHAtZHluYW1pYy1maWVsZHM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tdGFiLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby10YWI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBhY2NvcmRpb24gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjY29yZGlvbidcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZ2V0UGFuZWxzKGNvbXBvbmVudCkgfCBhc3luYykgYXMgcGFuZWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYWNjb3JkaW9uICNhY2NvcmRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lbCBvZiBwYW5lbHM7IGxldCBpID0gaW5kZXg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYWNjb3JkaW9uLXBhbmVsICpuZ0lmPVwiZXZhbHVhdGVDb25kaXRpb25hbChwYW5lbC5jb25kaXRpb25hbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImV2YWx1YXRlQm9vbGVhbihwYW5lbC5kaXNhYmxlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFjY29yZGlvbi1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJUZXh0XT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShwYW5lbCwgJ2xhYmVsJykpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFjY29yZGlvbi1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZW1wbGF0ZShwYW5lbC50ZW1wbGF0ZSkgYXMgdGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJyZXNvbHZlUGF0aChwYW5lbC5wYXRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHkgfHwgZXZhbHVhdGVCb29sZWFuKHBhbmVsLnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCJ0ZW1wbGF0ZT8ucm93c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpdHldPVwiY29tcG9uZW50LmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZGVudGl0eUluZGV4XT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVBdXRvRm9jdXNdPVwidGVtcGxhdGU/LmRpc2FibGVBdXRvRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsaWdubWVudF09XCJ0ZW1wbGF0ZT8udmVydGljYWxBbGlnbm1lbnRcIj48L2FwcC1keW5hbWljLWZpZWxkcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1hY2NvcmRpb24tYm9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWNjb3JkaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWNjb3JkaW9uPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0ZXh0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbY29sbGFwc2VdPVwiY29tcG9uZW50LmNvbGxhcHNlVG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAjdGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS1SZXNldCBWaWV3IENvbnRleHQtLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiB0YWJpbmRleD1cIjBcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0ZXh0JykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wb25lbnQudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGFwcC10ZW1wbGF0ZS13cmFwcGVyICN0b29sdGlwV3JhcHBlciBbdGVtcGxhdGVdPVwidG9vbHRpcFRlbXBsYXRlXCIgW2NvbnRleHRdPVwieyBjb21wb25lbnQ6IGNvbXBvbmVudCB9XCI+PC9hcHAtdGVtcGxhdGUtd3JhcHBlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaXJpby1sYWJlbC1wb3BvdmVyIGZhcyBmYS1pbmZvLWNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpcmlvVG9vbHRpcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsZShUZXh0cywgJ0luZm9ybWF0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzUG9wb3Zlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbVRlbXBsYXRlXT1cInRvb2x0aXBXcmFwcGVyLmdldFRlbXBsYXRlUmVmKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbHRpcFRlbXBsYXRlIGxldC1jb21wb25lbnQ9XCJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpcmlvLXRvb2x0aXAtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0b29sdGlwJykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBodG1sIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidodG1sJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh0bWwtcGFyYWdyYXBoXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZShldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICdjb250ZW50JykpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICNodG1sXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImh0bWxcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gaW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImV2YWx1YXRlU3RyaW5nKGNvbXBvbmVudC5zb3VyY2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnYWx0JykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgI2ltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImltYWdlXCI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiB0YWJsZSAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFibGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxhZy1ncmlkLWFuZ3VsYXIgW21vZHVsZXNdPVwiZ2V0R3JpZE1vZHVsZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkT3B0aW9uc109XCJnZXRHcmlkT3B0aW9ucyhjb21wb25lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwiZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5zZWxlY3RhYmxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aVNlbGVjdF09XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50Lm11bHRpU2VsZWN0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2VkKT1cIm9uR3JpZFNlbGVjdGlvbkNoYW5nZWQoY29tcG9uZW50LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1cHByZXNzQWN0aW9uc109XCJldmFsdWF0ZUJvb2xlYW4oY29tcG9uZW50LnN1cHByZXNzQWN0aW9ucylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRGVmc109XCJjb21wb25lbnQuY29sdW1ucyB8fCBldmFsdWF0ZShjb21wb25lbnQuY29sdW1uc0V4cHJlc3Npb24pIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NvdXJjZV09XCJnZXRSb3dTb3VyY2UoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hSb3dTb3VyY2UoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiY29tcG9uZW50LmF1dG9IZWlnaHQgPyBudWxsIDogZXZhbHVhdGVIZWlnaHQoY29tcG9uZW50LmhlaWdodClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJ0YWJsZVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBidXR0b24gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0SG9yaXpvbnRhbEFsaWdubWVudChjb21wb25lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYnV0dG9uIChjbGlja0V2ZW50KT1cImNsaWNrQnV0dG9uKGNvbXBvbmVudCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJldmFsdWF0ZUNvbG9yKGNvbXBvbmVudC5jb2xvcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5kaXNhYmxlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJldmFsdWF0ZVN0cmluZyhjb21wb25lbnQuaWNvbikgYXMgaWNvbjsgZWxzZSBub0ljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29tcG9uZW50Lmljb25Qb3NpdGlvbiE9J3JpZ2h0J1wiIFtjbGFzc109XCJpY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbXBvbmVudC5pY29uUG9zaXRpb249PSdyaWdodCdcIiBbY2xhc3NdPVwiaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHNlcGFyYXRvciAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VwYXJhdG9yJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICNzZXBhcmF0b3JcclxuICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwic2VwYXJhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHNwYWNlciAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3BhY2VyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjb21wb25lbnQuaGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgI3NwYWNlclxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudFJlZl09XCJzcGFjZXJcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gaWZyYW1lIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpZnJhbWUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJjb21wb25lbnQuaWRcIj57eyBldmFsdWF0ZVN0cmluZyhsb2NhbGUoY29tcG9uZW50LCAnbGFiZWwnKSkgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlmcmFtZSBbc3JjXT1cImV2YWx1YXRlVXJsKGNvbXBvbmVudC51cmwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICdsYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5oZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJhbWVTZWN1cml0eV09XCJjb21wb25lbnQuc2VjdXJpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjaWZyYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImlmcmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9pZnJhbWU+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBhbGVydCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWxlcnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLWFsZXJ0IFt0eXBlXT1cImNvbXBvbmVudC5yb2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ2xvc2VdPVwibG9jYWxlKFRleHRzLCAnQ2xvc2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmV2ZW50Q2xvc2VdPVwiZXZhbHVhdGVCb29sZWFuKGNvbXBvbmVudC5wcmV2ZW50Q2xvc2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FsZXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImFsZXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tYWxlcnQtbWVzc2FnZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1wYXJhZ3JhcGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ0b0hUTUwoZXZhbHVhdGVUZW1wbGF0ZShsb2NhbGUoY29tcG9uZW50LCAndGV4dCcpKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZ3gtc2lyaW8tYWxlcnQtbWVzc2FnZT5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLWFsZXJ0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gbm90aWNlIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidub3RpY2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmd4LXNpcmlvLW5vdGlmeSAjbm90aWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVnaXN0ZXJdPVwiY29tcG9uZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwibm90aWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZ3gtc2lyaW8tbm90aWZ5LWJvZHkgW3RpdGxlXT1cImV2YWx1YXRlU3RyaW5nKGxvY2FsZShjb21wb25lbnQsICd0aXRsZScpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0ZXh0JykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25neC1zaXJpby1ub3RpZnktYm9keT5cclxuICAgICAgICAgICAgICAgIDwvbmd4LXNpcmlvLW5vdGlmeT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSAjcmVnaW9uIHRvb2x0aXAgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Rvb2x0aXAnXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXRlbXBsYXRlLXdyYXBwZXIgI3Rvb2x0aXBXcmFwcGVyIFt0ZW1wbGF0ZV09XCJ0b29sdGlwVGVtcGxhdGVcIiBbY29udGV4dF09XCJ7IGNvbXBvbmVudDogY29tcG9uZW50IH1cIj48L2FwcC10ZW1wbGF0ZS13cmFwcGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNpcmlvLWxhYmVsLXBvcG92ZXIgZmFzIGZhLWluZm8tY2lyY2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2lyaW9Ub29sdGlwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNQb3BvdmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY3VzdG9tVGVtcGxhdGVdPVwidG9vbHRpcFdyYXBwZXIuZ2V0VGVtcGxhdGVSZWYoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICN0b29sdGlwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cInRvb2x0aXBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbHRpcFRlbXBsYXRlIGxldC1jb21wb25lbnQ9XCJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpcmlvLXRvb2x0aXAtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY29tcG9uZW50LnRpdGxlXCIgY2xhc3M9XCJzaXJpby10b29sdGlwLWhlYWRpbmcgc2lyaW8tc3BhY2UtZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ3RpdGxlJykpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXBhcmFncmFwaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvSFRNTChldmFsdWF0ZVRlbXBsYXRlKGxvY2FsZShjb21wb25lbnQsICd0ZXh0JykpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gI3JlZ2lvbiBjaGFydCAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hhcnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxhZy1jaGFydHMgW29wdGlvbnNdPVwiKGdldENoYXJ0T3B0aW9ucyhjb21wb25lbnQpIHwgYXN5bmMpID8/IHt9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW29ic2VydmVdPVwiZ2V0Q2hhcnREYXRhKGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsbGJhY2tdPVwiaW52YWxpZGF0ZUNoYXJ0KGNvbXBvbmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5oZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAjY2hhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiY2hhcnRcIiAvPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgICAgICAgICAgICA8IS0tICNyZWdpb24gY29tcG9uZW50IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjb21wb25lbnQnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2xhYmVsJykpIGFzIGxhYmVsVGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgbGFiZWxUZXh0IH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBvbmVudC5pc0lucHV0OyBlbHNlIG5vSW5wdXRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtaG9zdCBbcHJvcGVydGllc109XCJnZXRGZWVsYWJsZVByb3BlcnRpZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwicmVzb2x2ZVBhdGgoY29tcG9uZW50LnBhdGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbXBvbmVudEhvc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZ2lzdGVyXT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRSZWZdPVwiY29tcG9uZW50SG9zdFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRUZXh0RmVlZGJhY2soY29tcG9uZW50KSBhcyB0ZXh0RmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpcmlvLWZvcm0tZmVlZGJhY2sgc2lyaW8tZGlzcGxheS1mZWVkYmFja1wiPnt7dGV4dEZlZWRiYWNrfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXZhbHVhdGVTdHJpbmcobG9jYWxlKGNvbXBvbmVudCwgJ2Rlc2NyaXB0aW9uJykpIGFzIHRleHRIZWxwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2lyaW8taGVscGVyLXRleHRcIj57e3RleHRIZWxwfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbnB1dFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtaG9zdCBbcHJvcGVydGllc109XCJnZXRGZWVsYWJsZVByb3BlcnRpZXMoY29tcG9uZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb21wb25lbnRIb3N0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWdpc3Rlcl09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50UmVmXT1cImNvbXBvbmVudEhvc3RcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuIl19
|