@solidev/data 0.0.1-dev.3 → 0.0.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/auth/auth-interceptor.service.mjs +13 -4
- package/esm2020/lib/auth/auth.service.mjs +20 -9
- package/esm2020/lib/data/data-backend.mjs +3 -3
- package/esm2020/lib/data/data-model.mjs +5 -1
- package/esm2020/lib/data/data-query.mjs +32 -25
- package/esm2020/lib/data/fields/base.mjs +9 -8
- package/esm2020/lib/data/fields/computed.mjs +10 -0
- package/esm2020/lib/data/fields/index.mjs +2 -1
- package/esm2020/lib/dispedit/choice.pipe.mjs +44 -4
- package/esm2020/lib/dispedit/dispedit/dispedit.component.mjs +17 -6
- package/esm2020/lib/dispedit/factor.pipe.mjs +37 -4
- package/esm2020/lib/dispedit/factorc.pipe.mjs +59 -8
- package/esm2020/lib/dispedit/fkselect/fkselect.component.mjs +3 -3
- package/esm2020/lib/dispedit/flags/flags.component.mjs +140 -0
- package/esm2020/lib/dispedit/m2mselect/m2mselect.component.mjs +4 -4
- package/esm2020/lib/dispedit/richedit/richedit.component.mjs +94 -0
- package/esm2020/lib/dispedit/sdelete/sdelete.component.mjs +62 -15
- package/esm2020/lib/messages/message-zone/message-zone.component.mjs +3 -3
- package/esm2020/lib/messages/message.service.mjs +3 -3
- package/esm2020/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +5 -5
- package/esm2020/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +4 -4
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +4 -4
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +4 -4
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +5 -6
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.mjs +6 -1
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.mjs +7 -1
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +7 -7
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.mjs +10 -7
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/model-list-filter.mjs +11 -10
- package/esm2020/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +3 -3
- package/esm2020/lib/modellist/model-list.service.mjs +21 -16
- package/esm2020/lib/routing/breadcrumb/breadcrumb.component.mjs +3 -3
- package/esm2020/lib/updates/update/update.component.mjs +17 -0
- package/esm2020/lib/updates/update.service.mjs +58 -0
- package/esm2020/lib/uploader/ng-file-drop.directive.mjs +3 -3
- package/esm2020/lib/uploader/ng-file-select.directive.mjs +3 -3
- package/esm2020/lib/uploader/ngx-uploader.module.mjs +4 -4
- package/esm2020/lib/utils/tab-memory.service.mjs +20 -11
- package/esm2020/public-api.mjs +5 -1
- package/fesm2015/solidev-data.mjs +752 -201
- package/fesm2015/solidev-data.mjs.map +1 -1
- package/fesm2020/solidev-data.mjs +733 -199
- package/fesm2020/solidev-data.mjs.map +1 -1
- package/lib/auth/auth.service.d.ts +6 -1
- package/lib/data/data-model.d.ts +1 -0
- package/lib/data/data-query.d.ts +14 -11
- package/lib/data/fields/base.d.ts +6 -5
- package/lib/data/fields/computed.d.ts +14 -0
- package/lib/data/fields/index.d.ts +1 -0
- package/lib/dispedit/choice.pipe.d.ts +5 -0
- package/lib/dispedit/dispedit/dispedit.component.d.ts +6 -1
- package/lib/dispedit/factor.pipe.d.ts +7 -0
- package/lib/dispedit/factorc.pipe.d.ts +8 -0
- package/lib/dispedit/fkselect/fkselect.component.d.ts +1 -1
- package/lib/dispedit/flags/flags.component.d.ts +40 -0
- package/lib/dispedit/m2mselect/m2mselect.component.d.ts +1 -1
- package/lib/dispedit/richedit/richedit.component.d.ts +31 -0
- package/lib/dispedit/sdelete/sdelete.component.d.ts +13 -4
- package/lib/messages/message-zone/message-zone.component.d.ts +1 -1
- package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +1 -1
- package/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.d.ts +2 -2
- package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.d.ts +1 -0
- package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.d.ts +6 -1
- package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.d.ts +3 -3
- package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/model-list-filter.d.ts +4 -2
- package/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +1 -1
- package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +1 -1
- package/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.d.ts +1 -1
- package/lib/modellist/model-list.service.d.ts +6 -6
- package/lib/routing/breadcrumb/breadcrumb.component.d.ts +1 -1
- package/lib/updates/update/update.component.d.ts +8 -0
- package/lib/updates/update.service.d.ts +16 -0
- package/lib/uploader/ng-file-drop.directive.d.ts +1 -1
- package/lib/uploader/ng-file-select.directive.d.ts +1 -1
- package/lib/utils/tab-memory.service.d.ts +4 -3
- package/package.json +7 -4
- package/public-api.d.ts +4 -0
|
@@ -25,6 +25,11 @@ export class DispeditComponent {
|
|
|
25
25
|
* If mode is inline, edit is always true.
|
|
26
26
|
*/
|
|
27
27
|
this.edit = false;
|
|
28
|
+
/**
|
|
29
|
+
* Can be switched to edit mode?
|
|
30
|
+
* default : true
|
|
31
|
+
*/
|
|
32
|
+
this.editable = true;
|
|
28
33
|
/**
|
|
29
34
|
* Display mode
|
|
30
35
|
* - dd provides display / edit within a dt/dd block
|
|
@@ -88,7 +93,8 @@ export class DispeditComponent {
|
|
|
88
93
|
this.realPlaceholder = this.placeholder || this.manager?.description || '';
|
|
89
94
|
this.realDefault = this.default;
|
|
90
95
|
this.save = this.save === undefined ? this.mode === 'dd' : this.save;
|
|
91
|
-
if (!this.edit && this.mode === 'dd')
|
|
96
|
+
if ((!this.edit && this.mode === 'dd') ||
|
|
97
|
+
(!this.editable && this.mode === 'inline')) {
|
|
92
98
|
this.enableDisplayMode();
|
|
93
99
|
}
|
|
94
100
|
else {
|
|
@@ -118,6 +124,9 @@ export class DispeditComponent {
|
|
|
118
124
|
* - update form control classes
|
|
119
125
|
*/
|
|
120
126
|
enableEditMode() {
|
|
127
|
+
if (!this.editable) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
121
130
|
this._getChoices();
|
|
122
131
|
this._getRealEditor();
|
|
123
132
|
this._setFormControl();
|
|
@@ -409,9 +418,9 @@ export class DispeditComponent {
|
|
|
409
418
|
}
|
|
410
419
|
_setDisplayClasses() { }
|
|
411
420
|
}
|
|
412
|
-
DispeditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
413
|
-
DispeditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.5", type: DispeditComponent, isStandalone: true, selector: "data-dispedit", inputs: { model: "model", field: "field", form: "form", edit: "edit", mode: "mode", choices: "choices", inputClasses: "inputClasses", editor: "editor", viewer: "viewer", default: "default", placeholder: "placeholder", help: "help", hideLabel: "hideLabel", queryset: "queryset", collection: "collection", display: "display", filter: "filter" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span>\n <!--span.editable.disp-quill(*ngSwitchCase=\"'quill'\", (click)=\"enableEditMode()\")-->\n <!-- quill-view-html([content]=\"txtValue||''\")-->\n </ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <!--ng-container(*ngSwitchCase=\"'quill'\")-->\n <!-- quill-editor([formControl]=\"form.get(field)\")-->\n <!-- .form-text(*ngIf=\"realHelp\") {{realHelp}}-->\n <!-- span.ms-1(*ngIf=\"required\") (requis)-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\") Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\") Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\") Format invalide...-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\") Ce champ est requis...-->\n <!-- button([ngClass]=\"inputClasses\") Enregistrer-->\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FkselectComponent, selector: "data-fkselect", inputs: ["model", "field", "edit", "value", "queryset", "collection", "update", "filter", "mode", "display", "search", "label", "placeholder", "inputClasses"], outputs: ["selected", "cancelled", "cleared"] }, { kind: "component", type: M2mselectComponent, selector: "data-m2mselect", inputs: ["model", "field", "edit", "values", "queryset", "collection", "filter", "mode", "display", "search", "label", "placeholder", "emptyLabel", "inputClasses"], outputs: ["added", "removed", "cancelled", "cleared", "detailsChanged", "changed"] }] });
|
|
414
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
421
|
+
DispeditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DispeditComponent, deps: [{ token: DATA_DISPLAY_CONFIG, optional: true }, { token: i1.DataMessageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
422
|
+
DispeditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DispeditComponent, isStandalone: true, selector: "data-dispedit", inputs: { model: "model", field: "field", form: "form", edit: "edit", editable: "editable", mode: "mode", choices: "choices", inputClasses: "inputClasses", editor: "editor", viewer: "viewer", default: "default", placeholder: "placeholder", help: "help", hideLabel: "hideLabel", queryset: "queryset", collection: "collection", display: "display", filter: "filter" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span></ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FkselectComponent, selector: "data-fkselect", inputs: ["model", "field", "edit", "value", "queryset", "collection", "update", "filter", "mode", "display", "search", "label", "placeholder", "inputClasses"], outputs: ["selected", "cancelled", "cleared"] }, { kind: "component", type: M2mselectComponent, selector: "data-m2mselect", inputs: ["model", "field", "edit", "values", "queryset", "collection", "filter", "mode", "display", "search", "label", "placeholder", "emptyLabel", "inputClasses"], outputs: ["added", "removed", "cancelled", "cleared", "detailsChanged", "changed"] }] });
|
|
423
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DispeditComponent, decorators: [{
|
|
415
424
|
type: Component,
|
|
416
425
|
args: [{ selector: 'data-dispedit', standalone: true, imports: [
|
|
417
426
|
CommonModule,
|
|
@@ -419,7 +428,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
|
|
|
419
428
|
FkselectComponent,
|
|
420
429
|
M2mselectComponent,
|
|
421
430
|
ChoicePipe,
|
|
422
|
-
], template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span>\n <!--span.editable.disp-quill(*ngSwitchCase=\"'quill'\", (click)=\"enableEditMode()\")-->\n <!-- quill-view-html([content]=\"txtValue||''\")-->\n </ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <!--ng-container(*ngSwitchCase=\"'quill'\")-->\n <!-- quill-editor([formControl]=\"form.get(field)\")-->\n <!-- .form-text(*ngIf=\"realHelp\") {{realHelp}}-->\n <!-- span.ms-1(*ngIf=\"required\") (requis)-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\") Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\") Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\") Format invalide...-->\n <!-- .invalid-feedback.mt-0([class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\") Ce champ est requis...-->\n <!-- button([ngClass]=\"inputClasses\") Enregistrer-->\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"] }]
|
|
431
|
+
], template: "\n<ng-template #titleTpl>\n <ng-content></ng-content>\n</ng-template>\n<ng-template #dispTpl>\n <ng-container [ngSwitch]=\"realDisplay\"><span class=\"editable disp-text\" *ngSwitchCase=\"'text'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-choice\" *ngSwitchCase=\"'choice'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-decimal\" *ngSwitchCase=\"'decimal'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-boolean\" *ngSwitchCase=\"'boolean'\" (click)=\"enableEditMode()\">{{txtValue}}</span><span class=\"editable disp-fkdetails\" *ngSwitchCase=\"'fkdetails'\" (click)=\"enableEditMode()\">\n <div class=\"fkitem\">{{txtValue}}</div></span><span class=\"editable disp-m2mdetails\" *ngSwitchCase=\"'m2mdetails'\" (click)=\"enableEditMode()\">\n <div class=\"m2mitem\" *ngFor=\"let v of txtValues\">{{v}}</div></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'datetime'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'short'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span><span class=\"editable disp-datetime\" *ngSwitchCase=\"'date'\" (click)=\"enableEditMode()\">\n <ng-container *ngIf=\"dispValue\">{{txtValue|date:'shortDate'}}</ng-container>\n <ng-container *ngIf=\"!dispValue\">{{txtValue}}</ng-container></span></ng-container>\n</ng-template>\n<ng-template #editTpl let-form=\"form\">\n <ng-container [ngSwitch]=\"realEditor\">\n <ng-container *ngSwitchCase=\"'input.text'\">\n <input type=\"text\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.email'\">\n <input type=\"email\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['email']\">Format d'email invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.password'\">\n <input type=\"password\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.datetime'\">\n <input type=\"datetime-local\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.date'\">\n <input type=\"date\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" (keyup.enter)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minDate']\">Doit \u00EAtre post\u00E9rieur \u00E0 {{$any(manager).min|date:'short'}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxDate']\">Doit \u00EAtre ant\u00E9rieur \u00E0 {{$any(manager).max|date:'short'}}...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.number'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.decimal'\">\n <input type=\"number\" [formControl]=\"form.get(field)\" [ngClass]=\"inputClasses\" (keyup.escape)=\"unsetEdit()\" [placeholder]=\"realPlaceholder\">\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['min']\">Trop petit : minimum {{$any(manager).min}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['max']\">Trop grand : maximum {{$any(manager).max}}...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'input.checkbox'\">\n <input class=\"form-check-input\" type=\"checkbox\" [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\">\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" [ngClass]=\"inputClasses\" (keyup.control.enter)=\"update()\" [placeholder]=\"realPlaceholder\"></textarea>\n <div class=\"form-text\" *ngIf=\"realHelp\">{{realHelp}}<span class=\"ms-1\" *ngIf=\"required\">(requis)</span></div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['minlength']\">Trop court : {{$any(manager).minLength}} caract\u00E8res minimum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['maxlength']\">Trop long : {{$any(manager).maxLength}} caract\u00E8res maximum...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['pattern']\">Format invalide...</div>\n <div class=\"invalid-feedback mt-0\" [class.d-block]=\"form && !form.controls[field].pristine && form.controls[field].errors?.['required']\">Ce champ est requis...</div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fkselect'\">\n <data-fkselect [collection]=\"collection\" [filter]=\"filter\" (selected)=\"selectedRefItem($event)\" [placeholder]=\"placeholder\" (cancelled)=\"unsetEdit()\" (cleared)=\"selectedRefItem(null)\"></data-fkselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'m2mselect'\">\n <data-m2mselect [collection]=\"collection\" [filter]=\"filter\" (changed)=\"update()\" [formControl]=\"form.get(field)\" (detailsChanged)=\"onM2MValuesChanges($event)\" [model]=\"model\" [field]=\"field\" [placeholder]=\"placeholder\"></data-m2mselect>\n </ng-container>\n <ng-container *ngSwitchCase=\"'select'\">\n <select [formControl]=\"form.get(field)\" (keyup.escape)=\"unsetEdit()\" (change)=\"update()\" [ngClass]=\"inputClasses\">\n <option *ngFor=\"let c of realChoices\" [ngValue]=\"c.value ? c.value : c\">{{c.desc ? c.desc : c}}</option>\n </select>\n <div class=\"form-text\">{{realHelp}}</div>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Disp/edit toggler-->\n<ng-template #dispeditTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"fg\">\n <form [formGroup]=\"fg\" (submit)=\"update()\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: fg}\"></ng-container>\n </form>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- DispEdit noform-->\n<ng-template #dispeditFormTpl>\n <ng-container *ngIf=\"!edit\">\n <ng-container *ngTemplateOutlet=\"dispTpl\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"edit\">\n <ng-container *ngIf=\"form\">\n <ng-container *ngTemplateOutlet=\"editTpl; context: {form: form}\"></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<!-- Dd display-->\n<ng-container *ngIf=\"mode==='dd'\">\n <dt [class.required]=\"required\" *ngIf=\"!hideLabel\"><span class=\"editable\" (click)=\"toggleEdit()\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container></span><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span></dt>\n <dd [class.mb-0]=\"hideLabel\">\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n </dd>\n</ng-container>\n<!-- Inline display-->\n<ng-container *ngIf=\"mode==='inline'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditTpl\"></ng-container>\n</ng-container>\n<!-- Form display-->\n<ng-container *ngIf=\"mode==='form'\">\n <ng-container *ngIf=\"!hideLabel\"><span class=\"pointer float-end\" (click)=\"setDefault()\" *ngIf=\"realDefault!== undefined && edit\"><i class=\"bi bi-trash ms-2\"></i></span>\n <label [class.required]=\"required\">\n <ng-container *ngTemplateOutlet=\"titleTpl\"></ng-container>\n </label>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"dispeditFormTpl\"></ng-container>\n</ng-container>", styles: [".editable{cursor:pointer}form.inline{display:inline-block}.required{font-weight:700}.required:after{content:\" (*)\"}\n"] }]
|
|
423
432
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
424
433
|
type: Optional
|
|
425
434
|
}, {
|
|
@@ -433,6 +442,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
|
|
|
433
442
|
type: Input
|
|
434
443
|
}], edit: [{
|
|
435
444
|
type: Input
|
|
445
|
+
}], editable: [{
|
|
446
|
+
type: Input
|
|
436
447
|
}], mode: [{
|
|
437
448
|
type: Input
|
|
438
449
|
}], choices: [{
|
|
@@ -462,4 +473,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.5", ngImpor
|
|
|
462
473
|
}], changed: [{
|
|
463
474
|
type: Output
|
|
464
475
|
}] } });
|
|
465
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2Rpc3BlZGl0L2Rpc3BlZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9kaXNwZWRpdC9kaXNwZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixnQkFBZ0IsR0FDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBUXRDLE9BQU8sRUFBRSxpQkFBaUIsRUFBVSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNFLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsbUJBQW1CLEdBRXBCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBTS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFlNUMsTUFBTSxPQUFPLGlCQUFpQjtJQXNHNUI7Ozs7O09BS0c7SUFDSCxZQUNrRCxLQUF3QixFQUNoRSxLQUF5QjtRQURlLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ2hFLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBckduQzs7O1dBR0c7UUFDYSxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBUTdCOzs7O2FBSUs7UUFDVyxTQUFJLEdBQTZCLFFBQVEsQ0FBQztRQUMxRDs7O1dB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QUExQixLQUFLO2dCQUtVLElBQUk7c0JBQW5CLEtBQUs7Z0JBSVUsU0FBUztzQkFBeEIsS0FBSztnQkFLVSxRQUFRO3NCQUF2QixLQUFLO2dCQUVVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBRVUsT0FBTztzQkFBdEIsS0FBSztnQkFFVSxNQUFNO3NCQUFyQixLQUFLO2dCQUdXLE9BQU87c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLW1vZGVsJztcbmltcG9ydCB7IEJhc2VGaWVsZE1hbmFnZXIgfSBmcm9tICcuLi8uLi9kYXRhL2ZpZWxkcy9iYXNlJztcbmltcG9ydCB7XG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcbiAgVW50eXBlZEZvcm1Hcm91cCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERJU1BFRElUX0RJU1BMQVlfVFlQRVMsXG4gIERJU1BFRElUX0VESVRPUl9UWVBFUyxcbiAgSURpc3BFZGl0Q2hvaWNlLFxufSBmcm9tICcuL2Rpc3BlZGl0LmNvbnN0YW50cyc7XG5pbXBvcnQgeyBGaWx0ZXJEYXRhLCBRdWVyeXNldCB9IGZyb20gJy4uLy4uL2RhdGEvZGF0YS1xdWVyeSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLWNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgRmtzZWxlY3RDb21wb25lbnQsIFRwbEZ1biB9IGZyb20gJy4uL2Zrc2VsZWN0L2Zrc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWNpbWFsRmllbGRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZGF0YS9maWVsZHMvbnVtYmVycyc7XG5pbXBvcnQge1xuICBCb290c3RyYXBEYXRhRGlzcGxheUNvbmZpZyxcbiAgREFUQV9ESVNQTEFZX0NPTkZJRyxcbiAgRGF0YURpc3BsYXlDb25maWcsXG59IGZyb20gJy4uLy4uL2RhdGEvZGF0YS1wYXJhbWV0ZXJzJztcbmltcG9ydCB7IERhdGFNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL21lc3NhZ2VzL21lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgTmdiT2ZmY2FudmFzTW9kdWxlLFxuICBOZ2JUeXBlYWhlYWRNb2R1bGUsXG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBNMm1zZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9tMm1zZWxlY3QvbTJtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaG9pY2VQaXBlIH0gZnJvbSAnLi4vY2hvaWNlLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhLWRpc3BlZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc3BlZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlzcGVkaXQuY29tcG9uZW50LnNhc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZrc2VsZWN0Q29tcG9uZW50LFxuICAgIE0ybXNlbGVjdENvbXBvbmVudCxcbiAgICBDaG9pY2VQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEaXNwZWRpdENvbXBvbmVudDxGVCwgVCBleHRlbmRzIERhdGFNb2RlbCwgUiBleHRlbmRzIERhdGFNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAvKiogTW9kZWwgKG1hbmRhdG9yeSkgKi9cbiAgQElucHV0KCkgcHVibGljIG1vZGVsITogVDtcbiAgLyoqIEZpZWxkIChtYW5kYXRvcnkpICovXG4gIEBJbnB1dCgpIHB1YmxpYyBmaWVsZCE6IHN0cmluZztcbiAgLyoqIEV4dGVybmFsIGZvcm0gKi9cbiAgQElucHV0KCkgcHVibGljIGZvcm0/OiBVbnR5cGVkRm9ybUdyb3VwO1xuICAvKipcbiAgICogU3RhcnRpbmcgZWRpdCBtb2RlXG4gICAqIElmIG1vZGUgaXMgaW5saW5lLCBlZGl0IGlzIGFsd2F5cyB0cnVlLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGVkaXQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNhdmUgdXBkYXRlZCB2YWx1ZXMgP1xuICAgKiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHQgdmFsdWUgZGVwZW5kcyBvbiBtb2RlIDpcbiAgICogLSBzYXZlIGlmIG1vZGUgaXMgZGRcbiAgICogLSBkb24ndCBzYXZlIGlmIG1vZGUgaXMgaW5saW5lXG4gICAqL1xuICBwdWJsaWMgc2F2ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEaXNwbGF5IG1vZGVcbiAgICogLSBkZCBwcm92aWRlcyBkaXNwbGF5IC8gZWRpdCB3aXRoaW4gYSBkdC9kZCBibG9ja1xuICAgKiAtIGlubGluZSAodG8gYmUgcmVuYW1lZCB0byBmb3JtKSBwcm92aWRlcyBhIChsYWJlbD8gYW5kKSBmb3JtIGNvbnRyb2xcbiAgICogKi9cbiAgQElucHV0KCkgcHVibGljIG1vZGU6ICdkZCcgfCAnaW5saW5lJyB8ICdmb3JtJyA9ICdpbmxpbmUnO1xuICAvKipcbiAgICogQ3VzdG9tIGNob2ljZXNcbiAgICogSWYgcHJvdmlkZWQsIGEgc2VsZWN0IGZvcm0gY29udHJvbCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBiYXNlIGVkaXRvclxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNob2ljZXM6IElEaXNwRWRpdENob2ljZVtdID0gW107XG4gIC8qKiBDdXN0b20gaW5wdXQgY2xhc3NlcyAqL1xuICBASW5wdXQoKSBwdWJsaWMgaW5wdXRDbGFzc2VzITogc3RyaW5nW10gfCBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSBlZGl0b3IsIGlmIHByb3ZpZGVkICovXG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0b3I/OiBESVNQRURJVF9FRElUT1JfVFlQRVM7XG4gIC8qKiBPdmVycmlkZSB2aWV3ZXIsIGlmIHByb3ZpZGVkICovXG4gIEBJbnB1dCgpIHB1YmxpYyB2aWV3ZXI/OiBESVNQRURJVF9ESVNQTEFZX1RZUEVTO1xuICAvKiogT3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZSAqL1xuICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdD86IGFueTtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHBsYWNlaG9sZGVyLCBpZiBwcm92aWRlZC5cbiAgICogQnkgZGVmYXVsdCwgbWFuYWdlci5kZXNjcmlwdGlvbiBpcyB1c2VkXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICAvKipcbiAgICogT3ZlcnJpZGUgaGVscCwgaWYgcHJvdmlkZWQuXG4gICAqIEJ5IGRlZmF1bHQsIG1hbmFnZXIuaGVscCBpcyB1c2VkLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGhlbHA6IHN0cmluZyA9ICcnO1xuICAvKipcbiAgICogIEhpZGUgbGFiZWwgKGZvciBpbmxpbmUgZm9ybXMpXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRksgZmllbGRzXG4gIC8vIFRPRE86IHJlbmFtZSBhcyBma18gb3IgcmVsYXRlZF9cbiAgLyoqIEZrIHF1ZXJ5c2V0ICovXG4gIEBJbnB1dCgpIHB1YmxpYyBxdWVyeXNldD86IFF1ZXJ5c2V0PFI+O1xuICAvKiogRmsgY29sbGVjdGlvbiAqL1xuICBASW5wdXQoKSBwdWJsaWMgY29sbGVjdGlvbj86IENvbGxlY3Rpb248Uj47XG4gIC8qKiBGayBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5Pzogc3RyaW5nIHwgVHBsRnVuPFI+O1xuICAvKiogRmsgZmlsdGVyICovXG4gIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXI6IEZpbHRlckRhdGEgPSB7fTtcblxuICAvKiogT3V0cHV0IGVtaXR0ZXIsIG91dHB1dCBtb2RlbCBvbiBldmVyeSBjaGFuZ2UgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKiBGaWVsZCBtYW5hZ2VyICovXG4gIHB1YmxpYyBtYW5hZ2VyPzogQmFzZUZpZWxkTWFuYWdlcjxGVD47XG5cbiAgLyoqIFRleHQgdmFsdWUgdXNlZCBmb3IgZGlzcGxheSAqL1xuICBwdWJsaWMgdHh0VmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBUZXh0IHZhbHVlcyB1c2VkIGZvciBtYW55IGRpc3BsYXlzICovXG4gIHB1YmxpYyB0eHRWYWx1ZXM/OiBzdHJpbmdbXTtcblxuICAvKiogQ29tcHV0ZWQgZWRpdG9yIHR5cGUgKi9cbiAgcHVibGljIHJlYWxFZGl0b3I6IERJU1BFRElUX0VESVRPUl9UWVBFUyA9ICdpbnB1dC50ZXh0JztcbiAgLyoqIENvbXB1dGVkIGRpc3BsYXkgdHlwZSAqL1xuICBwdWJsaWMgcmVhbERpc3BsYXk6IERJU1BFRElUX0RJU1BMQVlfVFlQRVMgPSAndGV4dCc7XG4gIC8qKiBDdXJyZW50IGRpc3AgcmF3IHZhbHVlICovXG4gIHB1YmxpYyBkaXNwVmFsdWU/OiBhbnk7XG4gIC8qKiBDb21wdXRlZCBjaG9jaWVzIHR5cGUgKi9cbiAgcHVibGljIHJlYWxDaG9pY2VzPzogSURpc3BFZGl0Q2hvaWNlW10gPSBbXTtcbiAgLyoqIENvbXB1dGVkIGhlbHAgKi9cbiAgcHVibGljIHJlYWxIZWxwITogc3RyaW5nO1xuICAvKiogQ29tcHV0ZWQgcGxhY2Vob2xkZXIgKi9cbiAgcHVibGljIHJlYWxQbGFjZWhvbGRlciE6IHN0cmluZztcbiAgLyoqIENvbXB1dGVkIHJlcXVpcmVkICovXG4gIHB1YmxpYyByZXF1aXJlZCE6IGJvb2xlYW47XG4gIC8qKiBDb21wdXRlZCBkZWZhdWx0IHZhbHVlICovXG4gIHB1YmxpYyByZWFsRGVmYXVsdCE6IGFueTtcblxuICBwdWJsaWMgbTJtVmFsdWVzPzogYW55W107XG5cbiAgLy8gTG9jYWwgZm9ybSBncm91cFxuICBwdWJsaWMgZmc/OiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIC8vIERpc3BsYXkgdGVtcGxhdGUgZnVuY3Rpb25cbiAgcHJpdmF0ZSBfdHBsITogVHBsRnVuPFI+O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciwgY2FuIGJlIGdpdmVuIERBVEFfRElTUExBWV9DT05GSUcgaW5qZWN0aW9uIHRva2VuIHRvIG92ZXJyaWRlIGRpc3BsYXkgY2xhc3Nlcy5cbiAgICogQnkgZGVmYXVsdCwgYnM1IGNvbmZpZyBpcyB1c2VkXG4gICAqIEBwYXJhbSBkY29uZiBEYXRhRGlzcGxheUNvbmZpZyBpdGVtXG4gICAqIEBwYXJhbSBfbXNncyBtZXNzYWdlcyBzZXJ2aWNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERBVEFfRElTUExBWV9DT05GSUcpIHB1YmxpYyBkY29uZjogRGF0YURpc3BsYXlDb25maWcsXG4gICAgcHJpdmF0ZSBfbXNnczogRGF0YU1lc3NhZ2VTZXJ2aWNlXG4gICkge1xuICAgIGlmICh0aGlzLmRjb25mID09PSBudWxsKSB7XG4gICAgICB0aGlzLmRjb25mID0gQm9vdHN0cmFwRGF0YURpc3BsYXlDb25maWc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgc2VxdWVuY2UuXG4gICAqIC0gU2V0cyBtb2RlXG4gICAqIC0gU2V0cyBkaXNwbGF5IGZ1bmN0aW9uXG4gICAqIC0gTG9hZHMgbWFuYWdlclxuICAgKiAtIFJ1biBtaXNjIGNoZWNrcyBvbiBzcGVjaWFsIHZhbHVlc1xuICAgKiAtIEdldCBoZWxwLCBwbGFjZWhvbGRlciBzdHJpbmdzXG4gICAqL1xuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fc2V0TW9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgYWxsIHZhbHVlcyBvbiBhbnkgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2hhbmdlc1xuICAgKi9cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXREaXNwbGF5Rm4oKTtcbiAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLm1vZGVsPy5GTSh0aGlzLmZpZWxkKTtcbiAgICB0aGlzLnJlcXVpcmVkID0gdGhpcy5tYW5hZ2VyPy5yZXF1aXJlZCB8fCBmYWxzZTtcbiAgICB0aGlzLl9jaGVja3MoKTtcbiAgICB0aGlzLnJlYWxIZWxwID0gdGhpcy5oZWxwIHx8IHRoaXMubWFuYWdlcj8uaGVscCB8fCAnJztcbiAgICB0aGlzLnJlYWxQbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy5tYW5hZ2VyPy5kZXNjcmlwdGlvbiB8fCAnJztcbiAgICB0aGlzLnJlYWxEZWZhdWx0ID0gdGhpcy5kZWZhdWx0O1xuICAgIHRoaXMuc2F2ZSA9IHRoaXMuc2F2ZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5tb2RlID09PSAnZGQnIDogdGhpcy5zYXZlO1xuICAgIGlmICghdGhpcy5lZGl0ICYmIHRoaXMubW9kZSA9PT0gJ2RkJykge1xuICAgICAgdGhpcy5lbmFibGVEaXNwbGF5TW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBkaXNwbGF5IG1vZGUuXG4gICAqIC0gZ2V0IGNob2ljZXMgaWYgYXZhaWxhYmxlXG4gICAqIC0gZ2V0IGRpc3BsYXkgdHlwZVxuICAgKiAtIHByb2Nlc3MgY3VycmVudCB2YWx1ZSBmb3IgZGlzcGxheVxuICAgKiAtIHNldCBkaXNwbGF5IGNsYXNzZXNcbiAgICovXG4gIHB1YmxpYyBlbmFibGVEaXNwbGF5TW9kZSgpIHtcbiAgICB0aGlzLl9nZXRDaG9pY2VzKCk7XG4gICAgdGhpcy5fZ2V0UmVhbERpc3BsYXkoKTtcbiAgICB0aGlzLl9nZXREaXNwbGF5VmFsdWUoKTtcbiAgICB0aGlzLl9zZXREaXNwbGF5Q2xhc3NlcygpO1xuICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBlZGl0IG1vZGUgOlxuICAgKiAtIGdldCBjaG9pY2VzIGlmIGF2YWlsYWJsZVxuICAgKiAtIGdldCBlZGl0b3IgdHlwZVxuICAgKiAtIHByZXBhcmUgZm9ybSBjb250cm9sZVxuICAgKiAtIHNldCBmb3JtIGNvbnRyb2wgdmFsdWVcbiAgICogLSB1cGRhdGUgZm9ybSBjb250cm9sIGNsYXNzZXNcbiAgICovXG4gIHB1YmxpYyBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICB0aGlzLl9nZXRDaG9pY2VzKCk7XG4gICAgdGhpcy5fZ2V0UmVhbEVkaXRvcigpO1xuICAgIHRoaXMuX3NldEZvcm1Db250cm9sKCk7XG4gICAgdGhpcy5fc2V0Rm9ybUNvbnRyb2xWYWx1ZSgpO1xuICAgIHRoaXMuX3NldEVkaXRvckNsYXNzZXMoKTtcbiAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtb2RlbCBmaWVsZCBmcm9tIGZvcm0gY29udHJvbCB2YWx1ZSAoaWYgdmFsdWUgaXMgdmFsaWQpLlxuICAgKiBJZiBzYXZlIGJvb2xlYW4gaXMgdHJ1ZSwgc2F2ZSB2YWx1ZXMgdG8gQVBJLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mZyAmJiB0aGlzLm1vZGVsICYmIHRoaXMuZmcudmFsaWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5yZWFsRWRpdG9yKSB7XG4gICAgICAgIGNhc2UgJ2lucHV0LmRlY2ltYWwnOlxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgdGhpcy5mZy52YWx1ZVt0aGlzLmZpZWxkXSAqICh0aGlzLm1hbmFnZXIgYXMgYW55KS5mYWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSB0aGlzLmZnLnZhbHVlW3RoaXMuZmllbGRdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2F2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVuc2V0RWRpdCgpIHtcbiAgICBpZiAodGhpcy5tb2RlID09ICdkZCcgJiYgdGhpcy5lZGl0KSB7XG4gICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICAgIGRlbGV0ZSB0aGlzLmZnO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUVkaXQoKSB7XG4gICAgaWYgKCF0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnNldEVkaXQoKTtcbiAgICAgIHRoaXMuZW5hYmxlRGlzcGxheU1vZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZVxuICAgKiBUT0RPOiBjaGVjayBpZiBlZGl0IG1vZGUgbmVlZHMgdG8gYmUgY2hhbmdlZCAvIHNhdmVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0RGVmYXVsdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXSA9IHRoaXMucmVhbERlZmF1bHQ7XG4gICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZSh0aGlzLnJlYWxEZWZhdWx0LCB7XG4gICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RlZFJlZkl0ZW0oJGV2ZW50OiBUIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICBpZiAoJGV2ZW50ICE9PSBudWxsKSB7XG4gICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSAkZXZlbnQuaWQ7XG4gICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbYCR7dGhpcy5maWVsZH1fZGV0YWlsc2BdID0gJGV2ZW50O1xuICAgICAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICAgICAgY29uc3QgZnY6IHsgW2luZGV4OiBzdHJpbmddOiBudW1iZXIgfCBudWxsIH0gPSB7fTtcbiAgICAgICAgICBmdlt0aGlzLmZpZWxkXSA9ICRldmVudC5pZDtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShmdiwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSBudWxsO1xuICAgICAgICBkZWxldGUgKHRoaXMubW9kZWwgYXMgYW55KVtgJHt0aGlzLmZpZWxkfV9kZXRhaWxzYF07XG4gICAgICAgIGlmICh0aGlzLmZvcm0pIHtcbiAgICAgICAgICBjb25zdCBmdjogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB8IG51bGwgfSA9IHt9O1xuICAgICAgICAgIGZ2W3RoaXMuZmllbGRdID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShmdiwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9zYXZlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uTTJNVmFsdWVzQ2hhbmdlcyh2OiBhbnlbXSkge1xuICAgIHRoaXMubTJtVmFsdWVzID0gdjtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrcygpIHtcbiAgICBpZiAodGhpcy5lZGl0b3IgPT09ICdxdWlsbCcgJiYgIXRoaXMudmlld2VyKSB7XG4gICAgICB0aGlzLnZpZXdlciA9ICdxdWlsbCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgdG8gZGF0YWJhc2UsIG9ubHkgaWYgbW9kZWwgaGF2ZSBhbiBpZC5cbiAgICogSWYgbW9kZSBpcyBkZCwgdG9nZ2xlIGVkaXQgLyBkaXNwbGF5IG1vZGUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5pZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGUoW3RoaXMuZmllbGRdLCB7IHVwZGF0ZU1vZGVsOiB0cnVlIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgbGV0IG1zZzogc3RyaW5nID0gJyc7XG4gICAgICAgICAgaWYgKGUgJiYgKGUgYXMgYW55KS5lcnJvciAmJiAoZSBhcyBhbnkpLmVycm9yW3RoaXMuZmllbGRdKSB7XG4gICAgICAgICAgICBtc2cgPSBgJHsoZSBhcyBhbnkpLmVycm9yW3RoaXMuZmllbGRdfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX21zZ3MuZXJyb3IoXG4gICAgICAgICAgICBcIkVycmV1ciBsb3JzIGRlIGwnZW5yZWdpc3RyZW1lbnRcIixcbiAgICAgICAgICAgIG1zZyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdkZCcpIHtcbiAgICAgICAgdGhpcy51bnNldEVkaXQoKTtcbiAgICAgICAgdGhpcy5lbmFibGVEaXNwbGF5TW9kZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VkLm5leHQodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcGxheSh4OiBhbnkpOiBhbnkge1xuICAgIGlmICh4KSB7XG4gICAgICBpZiAoeC5fZGlzcGxheSkge1xuICAgICAgICBpZiAoeC5fZGlzcGxheSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHguX2Rpc3BsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geC5fZGlzcGxheTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3RwbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHBsKHgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRpc3BsYXkgbW9kZSBiYXNlZCBvbiBjdXJyZW50IGRpc3BsYXkgY29uZmlnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9zZXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5tb2RlKSB7XG4gICAgICB0aGlzLm1vZGUgPSB0aGlzLmRjb25mLmRpc3BFZGl0LmRlZmF1bHRNb2RlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldERpc3BsYXlGbigpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5KSB7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5ICYmIHR5cGVvZiB0aGlzLmRpc3BsYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX3RwbCA9IChtb2RlbDogUikgPT4gYCR7KG1vZGVsIGFzIGFueSlbdGhpcy5kaXNwbGF5IGFzIHN0cmluZ119YDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ICYmIHR5cGVvZiB0aGlzLmRpc3BsYXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fdHBsID0gdGhpcy5kaXNwbGF5LmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RwbCA9IChtb2RlbDogUikgPT5cbiAgICAgICAgYCR7XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlbJ25hbWUnXSB8fFxuICAgICAgICAgIChtb2RlbCBhcyBhbnkpWyd0aXRsZSddIHx8XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlbJ2lkJ11cbiAgICAgICAgfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2hvaWNlcygpIHtcbiAgICAvLyBTZXQgZGlzcGxheSBjaG9pY2VzXG4gICAgbGV0IGNob2ljZXM6IElEaXNwRWRpdENob2ljZVtdIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmNob2ljZXMgJiYgdGhpcy5jaG9pY2VzLmxlbmd0aCkge1xuICAgICAgY2hvaWNlcyA9IHRoaXMuY2hvaWNlcztcbiAgICB9IGVsc2UgaWYgKCh0aGlzLm1hbmFnZXIgYXMgYW55KT8uY2hvaWNlcykge1xuICAgICAgY2hvaWNlcyA9ICh0aGlzLm1hbmFnZXIgYXMgYW55KT8uY2hvaWNlcztcbiAgICB9XG4gICAgLy8gU2V0IGRpc3BsYXkgdmFsdWVcbiAgICBpZiAoY2hvaWNlcyAmJiBjaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVhbENob2ljZXMgPSBjaG9pY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5yZWFsQ2hvaWNlcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZWFsRGlzcGxheSgpIHtcbiAgICB0aGlzLnJlYWxEaXNwbGF5ID0gdGhpcy52aWV3ZXJcbiAgICAgID8gdGhpcy52aWV3ZXJcbiAgICAgIDogdGhpcy5tYW5hZ2VyPy5kaXNwbGF5VHlwZVxuICAgICAgPyB0aGlzLm1hbmFnZXIuZGlzcGxheVR5cGVcbiAgICAgIDogJ3RleHQnO1xuICAgIGlmICh0aGlzLnJlYWxDaG9pY2VzICYmIHRoaXMucmVhbENob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlYWxEaXNwbGF5ID0gJ2Nob2ljZSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVhbEVkaXRvcigpIHtcbiAgICB0aGlzLnJlYWxFZGl0b3IgPSB0aGlzLmVkaXRvclxuICAgICAgPyB0aGlzLmVkaXRvclxuICAgICAgOiB0aGlzLm1hbmFnZXI/LmVkaXRvclR5cGUgfHwgJ2lucHV0LnRleHQnO1xuICAgIGlmICh0aGlzLnJlYWxDaG9pY2VzICYmIHRoaXMucmVhbENob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlYWxFZGl0b3IgPSAnc2VsZWN0JztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRGb3JtQ29udHJvbCgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybSkge1xuICAgICAgY29uc3QgZmdjOiB7IFtpbmRleDogc3RyaW5nXTogVW50eXBlZEZvcm1Db250cm9sIH0gPSB7fTtcbiAgICAgIGZnY1t0aGlzLmZpZWxkXSA9IHRoaXMubW9kZWwuRkModGhpcy5maWVsZCk7XG4gICAgICB0aGlzLmZnID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoZmdjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mZyA9IHRoaXMuZm9ybTtcbiAgICAgIHRoaXMuZmcuc2V0Q29udHJvbCh0aGlzLmZpZWxkLCB0aGlzLm1vZGVsLkZDKHRoaXMuZmllbGQpLCB7XG4gICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMuZmcudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRGb3JtQ29udHJvbFZhbHVlKCkge1xuICAgIHN3aXRjaCAodGhpcy5yZWFsRWRpdG9yKSB7XG4gICAgICBjYXNlICdpbnB1dC5kYXRldGltZSc6XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXTtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbG9jYWxub3cgPSBuZXcgRGF0ZShcbiAgICAgICAgICBub3cuZ2V0VGltZSgpIC0gbm93LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMFxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZSkgOiBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRpbWUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICBjb25zdCBsb2NhbHRpbWUgPSBuZXcgRGF0ZSh0aW1lLmdldFRpbWUoKSAtIG9mZnNldCAqIDYwMDAwKTtcbiAgICAgICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShcbiAgICAgICAgICAgIGxvY2FsdGltZS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxNiksXG4gICAgICAgICAgICB7IGVtaXRFdmVudDogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWxEZWZhdWx0ID1cbiAgICAgICAgICB0aGlzLmRlZmF1bHQgfHwgdGhpcy5tYW5hZ2VyPy5yZXF1aXJlZFxuICAgICAgICAgICAgPyBsb2NhbG5vdy50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxNilcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbnB1dC5kYXRlJzpcbiAgICAgICAgY29uc3QgZHQgPSB0aGlzLm1vZGVsLnRvSnNvbihbdGhpcy5maWVsZF0pW3RoaXMuZmllbGRdO1xuICAgICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShkdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5wdXQuZGVjaW1hbCc6XG4gICAgICAgIHRoaXMuZmchLmNvbnRyb2xzW3RoaXMuZmllbGRdLnNldFZhbHVlKFxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gL1xuICAgICAgICAgICAgKCh0aGlzLm1hbmFnZXIgYXMgdW5rbm93biBhcyBEZWNpbWFsRmllbGRNYW5hZ2VyKS5mYWN0b3IgfHwgMSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRFZGl0b3JDbGFzc2VzKCkge1xuICAgIC8vIEZJWE1FOiB1c2UgcmVhbEVkaXRvckNsYXNzZXNcbiAgICBpZiAoIXRoaXMuaW5wdXRDbGFzc2VzKSB7XG4gICAgICB0aGlzLmlucHV0Q2xhc3NlcyA9XG4gICAgICAgIHRoaXMuZGNvbmYuZGlzcEVkaXQuaW5wdXRDbGFzc2VzW3RoaXMucmVhbEVkaXRvcl0gfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGlzcGxheVZhbHVlKCkge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXTtcbiAgICB0aGlzLmRpc3BWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnJlYWxDaG9pY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5yZWFsQ2hvaWNlcykge1xuICAgICAgICBpZiAoYyA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnR4dFZhbHVlID0gYyBhcyBhbnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGMudmFsdWUgJiYgYy52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnR4dFZhbHVlID0gYy5kZXNjO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBTZXQgZGlzcGxheSB0ZXh0IGRlcGVuZGluZyBvbiB2YWx1ZSBhbmQgcmVhbERpc3BsYXkgdmFsdWVcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudHh0VmFsdWUgPSAnT1VJJztcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy50eHRWYWx1ZSA9ICdOT04nO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy50eHRWYWx1ZSA9ICdub24gZMOpZmluaSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5yZWFsRGlzcGxheSkge1xuICAgICAgICBjYXNlICdma2RldGFpbHMnOlxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSAodGhpcy5tb2RlbCBhcyBhbnkpW2Ake3RoaXMuZmllbGR9X2RldGFpbHNgXSBhcyBhbnk7XG4gICAgICAgICAgdGhpcy50eHRWYWx1ZSA9IHRoaXMuX2Rpc3BsYXkoZGV0YWlscyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ20ybWRldGFpbHMnOlxuICAgICAgICAgIGNvbnN0IG0ybURldGFpbHMgPVxuICAgICAgICAgICAgdGhpcy5tMm1WYWx1ZXMgfHxcbiAgICAgICAgICAgICgodGhpcy5tb2RlbCBhcyBhbnkpW2Ake3RoaXMuZmllbGR9X2RldGFpbHNgXSBhcyBhbnlbXSk7XG4gICAgICAgICAgdGhpcy50eHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbTJtRGV0YWlscykge1xuICAgICAgICAgICAgdGhpcy50eHRWYWx1ZXMucHVzaCh0aGlzLl9kaXNwbGF5KHYpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlY2ltYWwnOlxuICAgICAgICAgIHRoaXMudHh0VmFsdWUgPSBgJHtcbiAgICAgICAgICAgIHZhbHVlIC9cbiAgICAgICAgICAgICgodGhpcy5tYW5hZ2VyIGFzIHVua25vd24gYXMgRGVjaW1hbEZpZWxkTWFuYWdlcikuZmFjdG9yIHx8IDEpXG4gICAgICAgICAgfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50eHRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RGlzcGxheUNsYXNzZXMoKSB7fVxufVxuIiwiXG48bmctdGVtcGxhdGUgI3RpdGxlVHBsPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNkaXNwVHBsPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyZWFsRGlzcGxheVwiPjxzcGFuIGNsYXNzPVwiZWRpdGFibGUgZGlzcC10ZXh0XCIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiIChjbGljayk9XCJlbmFibGVFZGl0TW9kZSgpXCI+e3t0eHRWYWx1ZX19PC9zcGFuPjxzcGFuIGNsYXNzPVwiZWRpdGFibGUgZGlzcC1jaG9pY2VcIiAqbmdTd2l0Y2hDYXNlPVwiJ2Nob2ljZSdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPnt7dHh0VmFsdWV9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImVkaXRhYmxlIGRpc3AtZGVjaW1hbFwiICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPnt7dHh0VmFsdWV9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImVkaXRhYmxlIGRpc3AtYm9vbGVhblwiICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPnt7dHh0VmFsdWV9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImVkaXRhYmxlIGRpc3AtZmtkZXRhaWxzXCIgKm5nU3dpdGNoQ2FzZT1cIidma2RldGFpbHMnXCIgKGNsaWNrKT1cImVuYWJsZUVkaXRNb2RlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJma2l0ZW1cIj57e3R4dFZhbHVlfX08L2Rpdj48L3NwYW4+PHNwYW4gY2xhc3M9XCJlZGl0YWJsZSBkaXNwLW0ybWRldGFpbHNcIiAqbmdTd2l0Y2hDYXNlPVwiJ20ybWRldGFpbHMnXCIgKGNsaWNrKT1cImVuYWJsZUVkaXRNb2RlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtMm1pdGVtXCIgKm5nRm9yPVwibGV0IHYgb2YgdHh0VmFsdWVzXCI+e3t2fX08L2Rpdj48L3NwYW4+PHNwYW4gY2xhc3M9XCJlZGl0YWJsZSBkaXNwLWRhdGV0aW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BWYWx1ZVwiPnt7dHh0VmFsdWV8ZGF0ZTonc2hvcnQnfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGlzcFZhbHVlXCI+e3t0eHRWYWx1ZX19PC9uZy1jb250YWluZXI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZWRpdGFibGUgZGlzcC1kYXRldGltZVwiICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BWYWx1ZVwiPnt7dHh0VmFsdWV8ZGF0ZTonc2hvcnREYXRlJ319PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc3BWYWx1ZVwiPnt7dHh0VmFsdWV9fTwvbmctY29udGFpbmVyPjwvc3Bhbj5cbiAgICA8IS0tc3Bhbi5lZGl0YWJsZS5kaXNwLXF1aWxsKCpuZ1N3aXRjaENhc2U9XCIncXVpbGwnXCIsIChjbGljayk9XCJlbmFibGVFZGl0TW9kZSgpXCIpLS0+XG4gICAgPCEtLSAgcXVpbGwtdmlldy1odG1sKFtjb250ZW50XT1cInR4dFZhbHVlfHwnJ1wiKS0tPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2VkaXRUcGwgbGV0LWZvcm09XCJmb3JtXCI+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInJlYWxFZGl0b3JcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQudGV4dCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiBbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIiAoa2V5dXAuZXNjYXBlKT1cInVuc2V0RWRpdCgpXCIgW3BsYWNlaG9sZGVyXT1cInJlYWxQbGFjZWhvbGRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dFwiICpuZ0lmPVwicmVhbEhlbHBcIj57e3JlYWxIZWxwfX08c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cInJlcXVpcmVkXCI+KHJlcXVpcyk8L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtaW5sZW5ndGgnXVwiPlRyb3AgY291cnQgOiB7eyRhbnkobWFuYWdlcikubWluTGVuZ3RofX0gY2FyYWN0w6hyZXMgbWluaW11bS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWF4bGVuZ3RoJ11cIj5Ucm9wIGxvbmcgOiB7eyRhbnkobWFuYWdlcikubWF4TGVuZ3RofX0gY2FyYWN0w6hyZXMgbWF4aW11bS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncGF0dGVybiddXCI+Rm9ybWF0IGludmFsaWRlLi4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q2UgY2hhbXAgZXN0IHJlcXVpcy4uLjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dC5lbWFpbCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc2VzXCIgKGtleXVwLmVzY2FwZSk9XCJ1bnNldEVkaXQoKVwiIFtwbGFjZWhvbGRlcl09XCJyZWFsUGxhY2Vob2xkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIiAqbmdJZj1cInJlYWxIZWxwXCI+e3tyZWFsSGVscH19PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJyZXF1aXJlZFwiPihyZXF1aXMpPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Ucm9wIGNvdXJ0IDoge3skYW55KG1hbmFnZXIpLm1pbkxlbmd0aH19IGNhcmFjdMOocmVzIG1pbmltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+VHJvcCBsb25nIDoge3skYW55KG1hbmFnZXIpLm1heExlbmd0aH19IGNhcmFjdMOocmVzIG1heGltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkZvcm1hdCBpbnZhbGlkZS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnZW1haWwnXVwiPkZvcm1hdCBkJ2VtYWlsIGludmFsaWRlLi4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q2UgY2hhbXAgZXN0IHJlcXVpcy4uLjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dC5wYXNzd29yZCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc2VzXCIgKGtleXVwLmVzY2FwZSk9XCJ1bnNldEVkaXQoKVwiIFtwbGFjZWhvbGRlcl09XCJyZWFsUGxhY2Vob2xkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIiAqbmdJZj1cInJlYWxIZWxwXCI+e3tyZWFsSGVscH19PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJyZXF1aXJlZFwiPihyZXF1aXMpPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Ucm9wIGNvdXJ0IDoge3skYW55KG1hbmFnZXIpLm1pbkxlbmd0aH19IGNhcmFjdMOocmVzIG1pbmltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+VHJvcCBsb25nIDoge3skYW55KG1hbmFnZXIpLm1heExlbmd0aH19IGNhcmFjdMOocmVzIG1heGltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkZvcm1hdCBpbnZhbGlkZS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuZGF0ZXRpbWUnXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiAoa2V5dXAuZW50ZXIpPVwidXBkYXRlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj57e3JlYWxIZWxwfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5DZSBjaGFtcCBlc3QgcmVxdWlzLi4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtaW5EYXRlJ11cIj5Eb2l0IMOqdHJlIHBvc3TDqXJpZXVyIMOgICB7eyRhbnkobWFuYWdlcikubWlufGRhdGU6J3Nob3J0J319Li4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtYXhEYXRlJ11cIj5Eb2l0IMOqdHJlIGFudMOpcmlldXIgw6AgIHt7JGFueShtYW5hZ2VyKS5tYXh8ZGF0ZTonc2hvcnQnfX0uLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuZGF0ZSdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiBbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIiAoa2V5dXAuZXNjYXBlKT1cInVuc2V0RWRpdCgpXCIgKGtleXVwLmVudGVyKT1cInVwZGF0ZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tyZWFsSGVscH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q2UgY2hhbXAgZXN0IHJlcXVpcy4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWluRGF0ZSddXCI+RG9pdCDDqnRyZSBwb3N0w6lyaWV1ciDDoCAge3skYW55KG1hbmFnZXIpLm1pbnxkYXRlOidzaG9ydCd9fS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWF4RGF0ZSddXCI+RG9pdCDDqnRyZSBhbnTDqXJpZXVyIMOgICB7eyRhbnkobWFuYWdlcikubWF4fGRhdGU6J3Nob3J0J319Li4uPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0Lm51bWJlcidcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiBbcGxhY2Vob2xkZXJdPVwicmVhbFBsYWNlaG9sZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCIgKm5nSWY9XCJyZWFsSGVscFwiPnt7cmVhbEhlbHB9fTxzcGFuIGNsYXNzPVwibXMtMVwiICpuZ0lmPVwicmVxdWlyZWRcIj4ocmVxdWlzKTwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21pbiddXCI+VHJvcCBwZXRpdCA6IG1pbmltdW0ge3skYW55KG1hbmFnZXIpLm1pbn19Li4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtYXgnXVwiPlRyb3AgZ3JhbmQgOiBtYXhpbXVtIHt7JGFueShtYW5hZ2VyKS5tYXh9fS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuZGVjaW1hbCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiBbcGxhY2Vob2xkZXJdPVwicmVhbFBsYWNlaG9sZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCIgKm5nSWY9XCJyZWFsSGVscFwiPnt7cmVhbEhlbHB9fTxzcGFuIGNsYXNzPVwibXMtMVwiICpuZ0lmPVwicmVxdWlyZWRcIj4ocmVxdWlzKTwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21pbiddXCI+VHJvcCBwZXRpdCA6IG1pbmltdW0ge3skYW55KG1hbmFnZXIpLm1pbn19Li4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtYXgnXVwiPlRyb3AgZ3JhbmQgOiBtYXhpbXVtIHt7JGFueShtYW5hZ2VyKS5tYXh9fS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuY2hlY2tib3gnXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiAoY2hhbmdlKT1cInVwZGF0ZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tyZWFsSGVscH19PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxuICAgICAgPHRleHRhcmVhIFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiAoa2V5dXAuZXNjYXBlKT1cInVuc2V0RWRpdCgpXCIgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc2VzXCIgKGtleXVwLmNvbnRyb2wuZW50ZXIpPVwidXBkYXRlKClcIiBbcGxhY2Vob2xkZXJdPVwicmVhbFBsYWNlaG9sZGVyXCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIiAqbmdJZj1cInJlYWxIZWxwXCI+e3tyZWFsSGVscH19PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJyZXF1aXJlZFwiPihyZXF1aXMpPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Ucm9wIGNvdXJ0IDoge3skYW55KG1hbmFnZXIpLm1pbkxlbmd0aH19IGNhcmFjdMOocmVzIG1pbmltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+VHJvcCBsb25nIDoge3skYW55KG1hbmFnZXIpLm1heExlbmd0aH19IGNhcmFjdMOocmVzIG1heGltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkZvcm1hdCBpbnZhbGlkZS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tbmctY29udGFpbmVyKCpuZ1N3aXRjaENhc2U9XCIncXVpbGwnXCIpLS0+XG4gICAgPCEtLSAgcXVpbGwtZWRpdG9yKFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiktLT5cbiAgICA8IS0tICAuZm9ybS10ZXh0KCpuZ0lmPVwicmVhbEhlbHBcIikge3tyZWFsSGVscH19LS0+XG4gICAgPCEtLSAgICBzcGFuLm1zLTEoKm5nSWY9XCJyZXF1aXJlZFwiKSAocmVxdWlzKS0tPlxuICAgIDwhLS0gIC5pbnZhbGlkLWZlZWRiYWNrLm10LTAoW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmJiAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJiYgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21pbmxlbmd0aCddXCIpIFRyb3AgY291cnQgOiB7eyRhbnkobWFuYWdlcikubWluTGVuZ3RofX0gY2FyYWN0w6hyZXMgbWluaW11bS4uLi0tPlxuICAgIDwhLS0gIC5pbnZhbGlkLWZlZWRiYWNrLm10LTAoW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmJiAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJiYgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCIpIFRyb3AgbG9uZyA6IHt7JGFueShtYW5hZ2VyKS5tYXhMZW5ndGh9fSBjYXJhY3TDqHJlcyBtYXhpbXVtLi4uLS0+XG4gICAgPCEtLSAgLmludmFsaWQtZmVlZGJhY2subXQtMChbY2xhc3MuZC1ibG9ja109XCJmb3JtICYmICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmJiBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncGF0dGVybiddXCIpIEZvcm1hdCBpbnZhbGlkZS4uLi0tPlxuICAgIDwhLS0gIC5pbnZhbGlkLWZlZWRiYWNrLm10LTAoW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmJiAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJiYgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIikgQ2UgY2hhbXAgZXN0IHJlcXVpcy4uLi0tPlxuICAgIDwhLS0gIGJ1dHRvbihbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIikgRW5yZWdpc3RyZXItLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmtzZWxlY3QnXCI+XG4gICAgICA8ZGF0YS1ma3NlbGVjdCBbY29sbGVjdGlvbl09XCJjb2xsZWN0aW9uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiAoc2VsZWN0ZWQpPVwic2VsZWN0ZWRSZWZJdGVtKCRldmVudClcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiAoY2FuY2VsbGVkKT1cInVuc2V0RWRpdCgpXCIgKGNsZWFyZWQpPVwic2VsZWN0ZWRSZWZJdGVtKG51bGwpXCI+PC9kYXRhLWZrc2VsZWN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtMm1zZWxlY3QnXCI+XG4gICAgICA8ZGF0YS1tMm1zZWxlY3QgW2NvbGxlY3Rpb25dPVwiY29sbGVjdGlvblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgKGNoYW5nZWQpPVwidXBkYXRlKClcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgKGRldGFpbHNDaGFuZ2VkKT1cIm9uTTJNVmFsdWVzQ2hhbmdlcygkZXZlbnQpXCIgW21vZGVsXT1cIm1vZGVsXCIgW2ZpZWxkXT1cImZpZWxkXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCI+PC9kYXRhLW0ybXNlbGVjdD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgPHNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgKGtleXVwLmVzY2FwZSk9XCJ1bnNldEVkaXQoKVwiIChjaGFuZ2UpPVwidXBkYXRlKClcIiBbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiByZWFsQ2hvaWNlc1wiIFtuZ1ZhbHVlXT1cImMudmFsdWUgPyBjLnZhbHVlIDogY1wiPnt7Yy5kZXNjID8gYy5kZXNjIDogY319PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj57e3JlYWxIZWxwfX08L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuPCEtLSBEaXNwL2VkaXQgdG9nZ2xlci0tPlxuPG5nLXRlbXBsYXRlICNkaXNwZWRpdFRwbD5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRpc3BUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZnXCI+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZnXCIgKHN1Ym1pdCk9XCJ1cGRhdGUoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZWRpdFRwbDsgY29udGV4dDoge2Zvcm06IGZnfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9mb3JtPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG48IS0tIERpc3BFZGl0IG5vZm9ybS0tPlxuPG5nLXRlbXBsYXRlICNkaXNwZWRpdEZvcm1UcGw+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaXNwVHBsXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZWRpdFRwbDsgY29udGV4dDoge2Zvcm06IGZvcm19XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjwhLS0gRGQgZGlzcGxheS0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGU9PT0nZGQnXCI+XG4gIDxkdCBbY2xhc3MucmVxdWlyZWRdPVwicmVxdWlyZWRcIiAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cImVkaXRhYmxlXCIgKGNsaWNrKT1cInRvZ2dsZUVkaXQoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlVHBsXCI+PC9uZy1jb250YWluZXI+PC9zcGFuPjxzcGFuIGNsYXNzPVwicG9pbnRlciBmbG9hdC1lbmRcIiAoY2xpY2spPVwic2V0RGVmYXVsdCgpXCIgKm5nSWY9XCJyZWFsRGVmYXVsdCE9PSB1bmRlZmluZWQgJmFtcDsmYW1wOyBlZGl0XCI+PGkgY2xhc3M9XCJiaSBiaS10cmFzaCBtcy0yXCI+PC9pPjwvc3Bhbj48L2R0PlxuICA8ZGQgW2NsYXNzLm1iLTBdPVwiaGlkZUxhYmVsXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRpc3BlZGl0VHBsXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGQ+XG48L25nLWNvbnRhaW5lcj5cbjwhLS0gSW5saW5lIGRpc3BsYXktLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlPT09J2lubGluZSdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cInBvaW50ZXIgZmxvYXQtZW5kXCIgKGNsaWNrKT1cInNldERlZmF1bHQoKVwiICpuZ0lmPVwicmVhbERlZmF1bHQhPT0gdW5kZWZpbmVkICZhbXA7JmFtcDsgZWRpdFwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggbXMtMlwiPjwvaT48L3NwYW4+XG4gICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJyZXF1aXJlZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9sYWJlbD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaXNwZWRpdFRwbFwiPjwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG48IS0tIEZvcm0gZGlzcGxheS0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGU9PT0nZm9ybSdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cInBvaW50ZXIgZmxvYXQtZW5kXCIgKGNsaWNrKT1cInNldERlZmF1bHQoKVwiICpuZ0lmPVwicmVhbERlZmF1bHQhPT0gdW5kZWZpbmVkICZhbXA7JmFtcDsgZWRpdFwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggbXMtMlwiPjwvaT48L3NwYW4+XG4gICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJyZXF1aXJlZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9sYWJlbD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaXNwZWRpdEZvcm1UcGxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPiJdfQ==
|
|
476
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2Rpc3BlZGl0L2Rpc3BlZGl0L2Rpc3BlZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi9kaXNwZWRpdC9kaXNwZWRpdC9kaXNwZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixnQkFBZ0IsR0FDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBUXRDLE9BQU8sRUFBRSxpQkFBaUIsRUFBVSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNFLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsbUJBQW1CLEdBRXBCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFlNUMsTUFBTSxPQUFPLGlCQUFpQjtJQTJHNUI7Ozs7O09BS0c7SUFDSCxZQUNrRCxLQUF3QixFQUNoRSxLQUF5QjtRQURlLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ2hFLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBMUduQzs7O1dBR0c7UUFDYSxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzdCOzs7V0FHRztRQUNhLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFRaEM7Ozs7YUFJ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STtzQkFBbkIsS0FBSztnQkFLVSxRQUFRO3NCQUF2QixLQUFLO2dCQWFVLElBQUk7c0JBQW5CLEtBQUs7Z0JBS1UsT0FBTztzQkFBdEIsS0FBSztnQkFFVSxZQUFZO3NCQUEzQixLQUFLO2dCQUVVLE1BQU07c0JBQXJCLEtBQUs7Z0JBRVUsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxPQUFPO3NCQUF0QixLQUFLO2dCQUtVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBS1UsSUFBSTtzQkFBbkIsS0FBSztnQkFJVSxTQUFTO3NCQUF4QixLQUFLO2dCQUtVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBRVUsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxPQUFPO3NCQUF0QixLQUFLO2dCQUVVLE1BQU07c0JBQXJCLEtBQUs7Z0JBR1csT0FBTztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgQmFzZUZpZWxkTWFuYWdlciB9IGZyb20gJy4uLy4uL2RhdGEvZmllbGRzL2Jhc2UnO1xuaW1wb3J0IHtcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRElTUEVESVRfRElTUExBWV9UWVBFUyxcbiAgRElTUEVESVRfRURJVE9SX1RZUEVTLFxuICBJRGlzcEVkaXRDaG9pY2UsXG59IGZyb20gJy4vZGlzcGVkaXQuY29uc3RhbnRzJztcbmltcG9ydCB7IEZpbHRlckRhdGEsIFF1ZXJ5c2V0IH0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLXF1ZXJ5JztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9kYXRhL2RhdGEtY29sbGVjdGlvbic7XG5pbXBvcnQgeyBGa3NlbGVjdENvbXBvbmVudCwgVHBsRnVuIH0gZnJvbSAnLi4vZmtzZWxlY3QvZmtzZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IERlY2ltYWxGaWVsZE1hbmFnZXIgfSBmcm9tICcuLi8uLi9kYXRhL2ZpZWxkcy9udW1iZXJzJztcbmltcG9ydCB7XG4gIEJvb3RzdHJhcERhdGFEaXNwbGF5Q29uZmlnLFxuICBEQVRBX0RJU1BMQVlfQ09ORklHLFxuICBEYXRhRGlzcGxheUNvbmZpZyxcbn0gZnJvbSAnLi4vLi4vZGF0YS9kYXRhLXBhcmFtZXRlcnMnO1xuaW1wb3J0IHsgRGF0YU1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbWVzc2FnZXMvbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNMm1zZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9tMm1zZWxlY3QvbTJtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaG9pY2VQaXBlIH0gZnJvbSAnLi4vY2hvaWNlLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhLWRpc3BlZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rpc3BlZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlzcGVkaXQuY29tcG9uZW50LnNhc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZrc2VsZWN0Q29tcG9uZW50LFxuICAgIE0ybXNlbGVjdENvbXBvbmVudCxcbiAgICBDaG9pY2VQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEaXNwZWRpdENvbXBvbmVudDxGVCwgVCBleHRlbmRzIERhdGFNb2RlbCwgUiBleHRlbmRzIERhdGFNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAvKiogTW9kZWwgKG1hbmRhdG9yeSkgKi9cbiAgQElucHV0KCkgcHVibGljIG1vZGVsITogVDtcbiAgLyoqIEZpZWxkIChtYW5kYXRvcnkpICovXG4gIEBJbnB1dCgpIHB1YmxpYyBmaWVsZCE6IHN0cmluZztcbiAgLyoqIEV4dGVybmFsIGZvcm0gKi9cbiAgQElucHV0KCkgcHVibGljIGZvcm0/OiBVbnR5cGVkRm9ybUdyb3VwO1xuICAvKipcbiAgICogU3RhcnRpbmcgZWRpdCBtb2RlXG4gICAqIElmIG1vZGUgaXMgaW5saW5lLCBlZGl0IGlzIGFsd2F5cyB0cnVlLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGVkaXQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIENhbiBiZSBzd2l0Y2hlZCB0byBlZGl0IG1vZGU/XG4gICAqIGRlZmF1bHQgOiB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgZWRpdGFibGUgPSB0cnVlO1xuICAvKipcbiAgICogU2F2ZSB1cGRhdGVkIHZhbHVlcyA/XG4gICAqIElmIG5vdCBnaXZlbiwgZGVmYXVsdCB2YWx1ZSBkZXBlbmRzIG9uIG1vZGUgOlxuICAgKiAtIHNhdmUgaWYgbW9kZSBpcyBkZFxuICAgKiAtIGRvbid0IHNhdmUgaWYgbW9kZSBpcyBpbmxpbmVcbiAgICovXG4gIHB1YmxpYyBzYXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERpc3BsYXkgbW9kZVxuICAgKiAtIGRkIHByb3ZpZGVzIGRpc3BsYXkgLyBlZGl0IHdpdGhpbiBhIGR0L2RkIGJsb2NrXG4gICAqIC0gaW5saW5lICh0byBiZSByZW5hbWVkIHRvIGZvcm0pIHByb3ZpZGVzIGEgKGxhYmVsPyBhbmQpIGZvcm0gY29udHJvbFxuICAgKiAqL1xuICBASW5wdXQoKSBwdWJsaWMgbW9kZTogJ2RkJyB8ICdpbmxpbmUnIHwgJ2Zvcm0nID0gJ2lubGluZSc7XG4gIC8qKlxuICAgKiBDdXN0b20gY2hvaWNlc1xuICAgKiBJZiBwcm92aWRlZCwgYSBzZWxlY3QgZm9ybSBjb250cm9sIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIGJhc2UgZWRpdG9yXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgY2hvaWNlczogSURpc3BFZGl0Q2hvaWNlW10gPSBbXTtcbiAgLyoqIEN1c3RvbSBpbnB1dCBjbGFzc2VzICovXG4gIEBJbnB1dCgpIHB1YmxpYyBpbnB1dENsYXNzZXMhOiBzdHJpbmdbXSB8IHN0cmluZztcbiAgLyoqIE92ZXJyaWRlIGVkaXRvciwgaWYgcHJvdmlkZWQgKi9cbiAgQElucHV0KCkgcHVibGljIGVkaXRvcj86IERJU1BFRElUX0VESVRPUl9UWVBFUztcbiAgLyoqIE92ZXJyaWRlIHZpZXdlciwgaWYgcHJvdmlkZWQgKi9cbiAgQElucHV0KCkgcHVibGljIHZpZXdlcj86IERJU1BFRElUX0RJU1BMQVlfVFlQRVM7XG4gIC8qKiBPdmVycmlkZSBkZWZhdWx0IHZhbHVlICovXG4gIEBJbnB1dCgpIHB1YmxpYyBkZWZhdWx0PzogYW55O1xuICAvKipcbiAgICogT3ZlcnJpZGUgcGxhY2Vob2xkZXIsIGlmIHByb3ZpZGVkLlxuICAgKiBCeSBkZWZhdWx0LCBtYW5hZ2VyLmRlc2NyaXB0aW9uIGlzIHVzZWRcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBoZWxwLCBpZiBwcm92aWRlZC5cbiAgICogQnkgZGVmYXVsdCwgbWFuYWdlci5oZWxwIGlzIHVzZWQuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGVscDogc3RyaW5nID0gJyc7XG4gIC8qKlxuICAgKiAgSGlkZSBsYWJlbCAoZm9yIGlubGluZSBmb3JtcylcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBoaWRlTGFiZWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBGSyBmaWVsZHNcbiAgLy8gVE9ETzogcmVuYW1lIGFzIGZrXyBvciByZWxhdGVkX1xuICAvKiogRmsgcXVlcnlzZXQgKi9cbiAgQElucHV0KCkgcHVibGljIHF1ZXJ5c2V0PzogUXVlcnlzZXQ8Uj47XG4gIC8qKiBGayBjb2xsZWN0aW9uICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xsZWN0aW9uPzogQ29sbGVjdGlvbjxSPjtcbiAgLyoqIEZrIGRpc3BsYXkgKi9cbiAgQElucHV0KCkgcHVibGljIGRpc3BsYXk/OiBzdHJpbmcgfCBUcGxGdW48Uj47XG4gIC8qKiBGayBmaWx0ZXIgKi9cbiAgQElucHV0KCkgcHVibGljIGZpbHRlcjogRmlsdGVyRGF0YSA9IHt9O1xuXG4gIC8qKiBPdXRwdXQgZW1pdHRlciwgb3V0cHV0IG1vZGVsIG9uIGV2ZXJ5IGNoYW5nZSAqL1xuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqIEZpZWxkIG1hbmFnZXIgKi9cbiAgcHVibGljIG1hbmFnZXI/OiBCYXNlRmllbGRNYW5hZ2VyPEZUPjtcblxuICAvKiogVGV4dCB2YWx1ZSB1c2VkIGZvciBkaXNwbGF5ICovXG4gIHB1YmxpYyB0eHRWYWx1ZT86IHN0cmluZztcbiAgLyoqIFRleHQgdmFsdWVzIHVzZWQgZm9yIG1hbnkgZGlzcGxheXMgKi9cbiAgcHVibGljIHR4dFZhbHVlcz86IHN0cmluZ1tdO1xuXG4gIC8qKiBDb21wdXRlZCBlZGl0b3IgdHlwZSAqL1xuICBwdWJsaWMgcmVhbEVkaXRvcjogRElTUEVESVRfRURJVE9SX1RZUEVTID0gJ2lucHV0LnRleHQnO1xuICAvKiogQ29tcHV0ZWQgZGlzcGxheSB0eXBlICovXG4gIHB1YmxpYyByZWFsRGlzcGxheTogRElTUEVESVRfRElTUExBWV9UWVBFUyA9ICd0ZXh0JztcbiAgLyoqIEN1cnJlbnQgZGlzcCByYXcgdmFsdWUgKi9cbiAgcHVibGljIGRpc3BWYWx1ZT86IGFueTtcbiAgLyoqIENvbXB1dGVkIGNob2NpZXMgdHlwZSAqL1xuICBwdWJsaWMgcmVhbENob2ljZXM/OiBJRGlzcEVkaXRDaG9pY2VbXSA9IFtdO1xuICAvKiogQ29tcHV0ZWQgaGVscCAqL1xuICBwdWJsaWMgcmVhbEhlbHAhOiBzdHJpbmc7XG4gIC8qKiBDb21wdXRlZCBwbGFjZWhvbGRlciAqL1xuICBwdWJsaWMgcmVhbFBsYWNlaG9sZGVyITogc3RyaW5nO1xuICAvKiogQ29tcHV0ZWQgcmVxdWlyZWQgKi9cbiAgcHVibGljIHJlcXVpcmVkITogYm9vbGVhbjtcbiAgLyoqIENvbXB1dGVkIGRlZmF1bHQgdmFsdWUgKi9cbiAgcHVibGljIHJlYWxEZWZhdWx0ITogYW55O1xuXG4gIHB1YmxpYyBtMm1WYWx1ZXM/OiBhbnlbXTtcblxuICAvLyBMb2NhbCBmb3JtIGdyb3VwXG4gIHB1YmxpYyBmZz86IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgLy8gRGlzcGxheSB0ZW1wbGF0ZSBmdW5jdGlvblxuICBwcml2YXRlIF90cGwhOiBUcGxGdW48Uj47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLCBjYW4gYmUgZ2l2ZW4gREFUQV9ESVNQTEFZX0NPTkZJRyBpbmplY3Rpb24gdG9rZW4gdG8gb3ZlcnJpZGUgZGlzcGxheSBjbGFzc2VzLlxuICAgKiBCeSBkZWZhdWx0LCBiczUgY29uZmlnIGlzIHVzZWRcbiAgICogQHBhcmFtIGRjb25mIERhdGFEaXNwbGF5Q29uZmlnIGl0ZW1cbiAgICogQHBhcmFtIF9tc2dzIG1lc3NhZ2VzIHNlcnZpY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9ESVNQTEFZX0NPTkZJRykgcHVibGljIGRjb25mOiBEYXRhRGlzcGxheUNvbmZpZyxcbiAgICBwcml2YXRlIF9tc2dzOiBEYXRhTWVzc2FnZVNlcnZpY2VcbiAgKSB7XG4gICAgaWYgKHRoaXMuZGNvbmYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZGNvbmYgPSBCb290c3RyYXBEYXRhRGlzcGxheUNvbmZpZztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdCBzZXF1ZW5jZS5cbiAgICogLSBTZXRzIG1vZGVcbiAgICogLSBTZXRzIGRpc3BsYXkgZnVuY3Rpb25cbiAgICogLSBMb2FkcyBtYW5hZ2VyXG4gICAqIC0gUnVuIG1pc2MgY2hlY2tzIG9uIHNwZWNpYWwgdmFsdWVzXG4gICAqIC0gR2V0IGhlbHAsIHBsYWNlaG9sZGVyIHN0cmluZ3NcbiAgICovXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9zZXRNb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBncmFkZSBhbGwgdmFsdWVzIG9uIGFueSBjaGFuZ2UuXG4gICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuX3NldERpc3BsYXlGbigpO1xuICAgIHRoaXMubWFuYWdlciA9IHRoaXMubW9kZWw/LkZNKHRoaXMuZmllbGQpO1xuICAgIHRoaXMucmVxdWlyZWQgPSB0aGlzLm1hbmFnZXI/LnJlcXVpcmVkIHx8IGZhbHNlO1xuICAgIHRoaXMuX2NoZWNrcygpO1xuICAgIHRoaXMucmVhbEhlbHAgPSB0aGlzLmhlbHAgfHwgdGhpcy5tYW5hZ2VyPy5oZWxwIHx8ICcnO1xuICAgIHRoaXMucmVhbFBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLm1hbmFnZXI/LmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMucmVhbERlZmF1bHQgPSB0aGlzLmRlZmF1bHQ7XG4gICAgdGhpcy5zYXZlID0gdGhpcy5zYXZlID09PSB1bmRlZmluZWQgPyB0aGlzLm1vZGUgPT09ICdkZCcgOiB0aGlzLnNhdmU7XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLmVkaXQgJiYgdGhpcy5tb2RlID09PSAnZGQnKSB8fFxuICAgICAgKCF0aGlzLmVkaXRhYmxlICYmIHRoaXMubW9kZSA9PT0gJ2lubGluZScpXG4gICAgKSB7XG4gICAgICB0aGlzLmVuYWJsZURpc3BsYXlNb2RlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGRpc3BsYXkgbW9kZS5cbiAgICogLSBnZXQgY2hvaWNlcyBpZiBhdmFpbGFibGVcbiAgICogLSBnZXQgZGlzcGxheSB0eXBlXG4gICAqIC0gcHJvY2VzcyBjdXJyZW50IHZhbHVlIGZvciBkaXNwbGF5XG4gICAqIC0gc2V0IGRpc3BsYXkgY2xhc3Nlc1xuICAgKi9cbiAgcHVibGljIGVuYWJsZURpc3BsYXlNb2RlKCkge1xuICAgIHRoaXMuX2dldENob2ljZXMoKTtcbiAgICB0aGlzLl9nZXRSZWFsRGlzcGxheSgpO1xuICAgIHRoaXMuX2dldERpc3BsYXlWYWx1ZSgpO1xuICAgIHRoaXMuX3NldERpc3BsYXlDbGFzc2VzKCk7XG4gICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGVkaXQgbW9kZSA6XG4gICAqIC0gZ2V0IGNob2ljZXMgaWYgYXZhaWxhYmxlXG4gICAqIC0gZ2V0IGVkaXRvciB0eXBlXG4gICAqIC0gcHJlcGFyZSBmb3JtIGNvbnRyb2xlXG4gICAqIC0gc2V0IGZvcm0gY29udHJvbCB2YWx1ZVxuICAgKiAtIHVwZGF0ZSBmb3JtIGNvbnRyb2wgY2xhc3Nlc1xuICAgKi9cbiAgcHVibGljIGVuYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9nZXRDaG9pY2VzKCk7XG4gICAgdGhpcy5fZ2V0UmVhbEVkaXRvcigpO1xuICAgIHRoaXMuX3NldEZvcm1Db250cm9sKCk7XG4gICAgdGhpcy5fc2V0Rm9ybUNvbnRyb2xWYWx1ZSgpO1xuICAgIHRoaXMuX3NldEVkaXRvckNsYXNzZXMoKTtcbiAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtb2RlbCBmaWVsZCBmcm9tIGZvcm0gY29udHJvbCB2YWx1ZSAoaWYgdmFsdWUgaXMgdmFsaWQpLlxuICAgKiBJZiBzYXZlIGJvb2xlYW4gaXMgdHJ1ZSwgc2F2ZSB2YWx1ZXMgdG8gQVBJLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mZyAmJiB0aGlzLm1vZGVsICYmIHRoaXMuZmcudmFsaWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5yZWFsRWRpdG9yKSB7XG4gICAgICAgIGNhc2UgJ2lucHV0LmRlY2ltYWwnOlxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgdGhpcy5mZy52YWx1ZVt0aGlzLmZpZWxkXSAqICh0aGlzLm1hbmFnZXIgYXMgYW55KS5mYWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSB0aGlzLmZnLnZhbHVlW3RoaXMuZmllbGRdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2F2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVuc2V0RWRpdCgpIHtcbiAgICBpZiAodGhpcy5tb2RlID09ICdkZCcgJiYgdGhpcy5lZGl0KSB7XG4gICAgICB0aGlzLmVkaXQgPSBmYWxzZTtcbiAgICAgIGRlbGV0ZSB0aGlzLmZnO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUVkaXQoKSB7XG4gICAgaWYgKCF0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnNldEVkaXQoKTtcbiAgICAgIHRoaXMuZW5hYmxlRGlzcGxheU1vZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZVxuICAgKiBUT0RPOiBjaGVjayBpZiBlZGl0IG1vZGUgbmVlZHMgdG8gYmUgY2hhbmdlZCAvIHNhdmVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0RGVmYXVsdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXSA9IHRoaXMucmVhbERlZmF1bHQ7XG4gICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZSh0aGlzLnJlYWxEZWZhdWx0LCB7XG4gICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RlZFJlZkl0ZW0oJGV2ZW50OiBUIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICBpZiAoJGV2ZW50ICE9PSBudWxsKSB7XG4gICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSAkZXZlbnQuaWQ7XG4gICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbYCR7dGhpcy5maWVsZH1fZGV0YWlsc2BdID0gJGV2ZW50O1xuICAgICAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICAgICAgY29uc3QgZnY6IHsgW2luZGV4OiBzdHJpbmddOiBudW1iZXIgfCBudWxsIH0gPSB7fTtcbiAgICAgICAgICBmdlt0aGlzLmZpZWxkXSA9ICRldmVudC5pZDtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShmdiwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gPSBudWxsO1xuICAgICAgICBkZWxldGUgKHRoaXMubW9kZWwgYXMgYW55KVtgJHt0aGlzLmZpZWxkfV9kZXRhaWxzYF07XG4gICAgICAgIGlmICh0aGlzLmZvcm0pIHtcbiAgICAgICAgICBjb25zdCBmdjogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB8IG51bGwgfSA9IHt9O1xuICAgICAgICAgIGZ2W3RoaXMuZmllbGRdID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShmdiwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9zYXZlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uTTJNVmFsdWVzQ2hhbmdlcyh2OiBhbnlbXSkge1xuICAgIHRoaXMubTJtVmFsdWVzID0gdjtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrcygpIHtcbiAgICBpZiAodGhpcy5lZGl0b3IgPT09ICdxdWlsbCcgJiYgIXRoaXMudmlld2VyKSB7XG4gICAgICB0aGlzLnZpZXdlciA9ICdxdWlsbCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgdG8gZGF0YWJhc2UsIG9ubHkgaWYgbW9kZWwgaGF2ZSBhbiBpZC5cbiAgICogSWYgbW9kZSBpcyBkZCwgdG9nZ2xlIGVkaXQgLyBkaXNwbGF5IG1vZGUuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5pZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGUoW3RoaXMuZmllbGRdLCB7IHVwZGF0ZU1vZGVsOiB0cnVlIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgbGV0IG1zZzogc3RyaW5nID0gJyc7XG4gICAgICAgICAgaWYgKGUgJiYgKGUgYXMgYW55KS5lcnJvciAmJiAoZSBhcyBhbnkpLmVycm9yW3RoaXMuZmllbGRdKSB7XG4gICAgICAgICAgICBtc2cgPSBgJHsoZSBhcyBhbnkpLmVycm9yW3RoaXMuZmllbGRdfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX21zZ3MuZXJyb3IoXG4gICAgICAgICAgICBcIkVycmV1ciBsb3JzIGRlIGwnZW5yZWdpc3RyZW1lbnRcIixcbiAgICAgICAgICAgIG1zZyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdkZCcpIHtcbiAgICAgICAgdGhpcy51bnNldEVkaXQoKTtcbiAgICAgICAgdGhpcy5lbmFibGVEaXNwbGF5TW9kZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFuZ2VkLm5leHQodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcGxheSh4OiBhbnkpOiBhbnkge1xuICAgIGlmICh4KSB7XG4gICAgICBpZiAoeC5fZGlzcGxheSkge1xuICAgICAgICBpZiAoeC5fZGlzcGxheSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHguX2Rpc3BsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geC5fZGlzcGxheTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3RwbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHBsKHgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRpc3BsYXkgbW9kZSBiYXNlZCBvbiBjdXJyZW50IGRpc3BsYXkgY29uZmlnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9zZXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5tb2RlKSB7XG4gICAgICB0aGlzLm1vZGUgPSB0aGlzLmRjb25mLmRpc3BFZGl0LmRlZmF1bHRNb2RlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldERpc3BsYXlGbigpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5KSB7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5ICYmIHR5cGVvZiB0aGlzLmRpc3BsYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX3RwbCA9IChtb2RlbDogUikgPT4gYCR7KG1vZGVsIGFzIGFueSlbdGhpcy5kaXNwbGF5IGFzIHN0cmluZ119YDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5ICYmIHR5cGVvZiB0aGlzLmRpc3BsYXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fdHBsID0gdGhpcy5kaXNwbGF5LmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RwbCA9IChtb2RlbDogUikgPT5cbiAgICAgICAgYCR7XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlbJ25hbWUnXSB8fFxuICAgICAgICAgIChtb2RlbCBhcyBhbnkpWyd0aXRsZSddIHx8XG4gICAgICAgICAgKG1vZGVsIGFzIGFueSlbJ2lkJ11cbiAgICAgICAgfWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2hvaWNlcygpIHtcbiAgICAvLyBTZXQgZGlzcGxheSBjaG9pY2VzXG4gICAgbGV0IGNob2ljZXM6IElEaXNwRWRpdENob2ljZVtdIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmNob2ljZXMgJiYgdGhpcy5jaG9pY2VzLmxlbmd0aCkge1xuICAgICAgY2hvaWNlcyA9IHRoaXMuY2hvaWNlcztcbiAgICB9IGVsc2UgaWYgKCh0aGlzLm1hbmFnZXIgYXMgYW55KT8uY2hvaWNlcykge1xuICAgICAgY2hvaWNlcyA9ICh0aGlzLm1hbmFnZXIgYXMgYW55KT8uY2hvaWNlcztcbiAgICB9XG4gICAgLy8gU2V0IGRpc3BsYXkgdmFsdWVcbiAgICBpZiAoY2hvaWNlcyAmJiBjaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVhbENob2ljZXMgPSBjaG9pY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5yZWFsQ2hvaWNlcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZWFsRGlzcGxheSgpIHtcbiAgICB0aGlzLnJlYWxEaXNwbGF5ID0gdGhpcy52aWV3ZXJcbiAgICAgID8gdGhpcy52aWV3ZXJcbiAgICAgIDogdGhpcy5tYW5hZ2VyPy5kaXNwbGF5VHlwZVxuICAgICAgPyB0aGlzLm1hbmFnZXIuZGlzcGxheVR5cGVcbiAgICAgIDogJ3RleHQnO1xuICAgIGlmICh0aGlzLnJlYWxDaG9pY2VzICYmIHRoaXMucmVhbENob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlYWxEaXNwbGF5ID0gJ2Nob2ljZSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UmVhbEVkaXRvcigpIHtcbiAgICB0aGlzLnJlYWxFZGl0b3IgPSB0aGlzLmVkaXRvclxuICAgICAgPyB0aGlzLmVkaXRvclxuICAgICAgOiB0aGlzLm1hbmFnZXI/LmVkaXRvclR5cGUgfHwgJ2lucHV0LnRleHQnO1xuICAgIGlmICh0aGlzLnJlYWxDaG9pY2VzICYmIHRoaXMucmVhbENob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlYWxFZGl0b3IgPSAnc2VsZWN0JztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRGb3JtQ29udHJvbCgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybSkge1xuICAgICAgY29uc3QgZmdjOiB7IFtpbmRleDogc3RyaW5nXTogVW50eXBlZEZvcm1Db250cm9sIH0gPSB7fTtcbiAgICAgIGZnY1t0aGlzLmZpZWxkXSA9IHRoaXMubW9kZWwuRkModGhpcy5maWVsZCk7XG4gICAgICB0aGlzLmZnID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoZmdjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mZyA9IHRoaXMuZm9ybTtcbiAgICAgIHRoaXMuZmcuc2V0Q29udHJvbCh0aGlzLmZpZWxkLCB0aGlzLm1vZGVsLkZDKHRoaXMuZmllbGQpLCB7XG4gICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMuZmcudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRGb3JtQ29udHJvbFZhbHVlKCkge1xuICAgIHN3aXRjaCAodGhpcy5yZWFsRWRpdG9yKSB7XG4gICAgICBjYXNlICdpbnB1dC5kYXRldGltZSc6XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXTtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbG9jYWxub3cgPSBuZXcgRGF0ZShcbiAgICAgICAgICBub3cuZ2V0VGltZSgpIC0gbm93LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMFxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZSkgOiBuZXcgRGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRpbWUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICBjb25zdCBsb2NhbHRpbWUgPSBuZXcgRGF0ZSh0aW1lLmdldFRpbWUoKSAtIG9mZnNldCAqIDYwMDAwKTtcbiAgICAgICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShcbiAgICAgICAgICAgIGxvY2FsdGltZS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxNiksXG4gICAgICAgICAgICB7IGVtaXRFdmVudDogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWxEZWZhdWx0ID1cbiAgICAgICAgICB0aGlzLmRlZmF1bHQgfHwgdGhpcy5tYW5hZ2VyPy5yZXF1aXJlZFxuICAgICAgICAgICAgPyBsb2NhbG5vdy50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxNilcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbnB1dC5kYXRlJzpcbiAgICAgICAgY29uc3QgZHQgPSB0aGlzLm1vZGVsLnRvSnNvbihbdGhpcy5maWVsZF0pW3RoaXMuZmllbGRdO1xuICAgICAgICB0aGlzLmZnIS5jb250cm9sc1t0aGlzLmZpZWxkXS5zZXRWYWx1ZShkdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5wdXQuZGVjaW1hbCc6XG4gICAgICAgIHRoaXMuZmchLmNvbnRyb2xzW3RoaXMuZmllbGRdLnNldFZhbHVlKFxuICAgICAgICAgICh0aGlzLm1vZGVsIGFzIGFueSlbdGhpcy5maWVsZF0gL1xuICAgICAgICAgICAgKCh0aGlzLm1hbmFnZXIgYXMgdW5rbm93biBhcyBEZWNpbWFsRmllbGRNYW5hZ2VyKS5mYWN0b3IgfHwgMSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRFZGl0b3JDbGFzc2VzKCkge1xuICAgIC8vIEZJWE1FOiB1c2UgcmVhbEVkaXRvckNsYXNzZXNcbiAgICBpZiAoIXRoaXMuaW5wdXRDbGFzc2VzKSB7XG4gICAgICB0aGlzLmlucHV0Q2xhc3NlcyA9XG4gICAgICAgIHRoaXMuZGNvbmYuZGlzcEVkaXQuaW5wdXRDbGFzc2VzW3RoaXMucmVhbEVkaXRvcl0gfHwgJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGlzcGxheVZhbHVlKCkge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMubW9kZWwgYXMgYW55KVt0aGlzLmZpZWxkXTtcbiAgICB0aGlzLmRpc3BWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnJlYWxDaG9pY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5yZWFsQ2hvaWNlcykge1xuICAgICAgICBpZiAoYyA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnR4dFZhbHVlID0gYyBhcyBhbnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGMudmFsdWUgJiYgYy52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnR4dFZhbHVlID0gYy5kZXNjO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBTZXQgZGlzcGxheSB0ZXh0IGRlcGVuZGluZyBvbiB2YWx1ZSBhbmQgcmVhbERpc3BsYXkgdmFsdWVcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudHh0VmFsdWUgPSAnT1VJJztcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy50eHRWYWx1ZSA9ICdOT04nO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy50eHRWYWx1ZSA9ICdub24gZMOpZmluaSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5yZWFsRGlzcGxheSkge1xuICAgICAgICBjYXNlICdma2RldGFpbHMnOlxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSAodGhpcy5tb2RlbCBhcyBhbnkpW2Ake3RoaXMuZmllbGR9X2RldGFpbHNgXSBhcyBhbnk7XG4gICAgICAgICAgdGhpcy50eHRWYWx1ZSA9IHRoaXMuX2Rpc3BsYXkoZGV0YWlscyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ20ybWRldGFpbHMnOlxuICAgICAgICAgIGNvbnN0IG0ybURldGFpbHMgPVxuICAgICAgICAgICAgdGhpcy5tMm1WYWx1ZXMgfHxcbiAgICAgICAgICAgICgodGhpcy5tb2RlbCBhcyBhbnkpW2Ake3RoaXMuZmllbGR9X2RldGFpbHNgXSBhcyBhbnlbXSk7XG4gICAgICAgICAgdGhpcy50eHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgbTJtRGV0YWlscykge1xuICAgICAgICAgICAgdGhpcy50eHRWYWx1ZXMucHVzaCh0aGlzLl9kaXNwbGF5KHYpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlY2ltYWwnOlxuICAgICAgICAgIHRoaXMudHh0VmFsdWUgPSBgJHtcbiAgICAgICAgICAgIHZhbHVlIC9cbiAgICAgICAgICAgICgodGhpcy5tYW5hZ2VyIGFzIHVua25vd24gYXMgRGVjaW1hbEZpZWxkTWFuYWdlcikuZmFjdG9yIHx8IDEpXG4gICAgICAgICAgfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50eHRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RGlzcGxheUNsYXNzZXMoKSB7fVxufVxuIiwiXG48bmctdGVtcGxhdGUgI3RpdGxlVHBsPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNkaXNwVHBsPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyZWFsRGlzcGxheVwiPjxzcGFuIGNsYXNzPVwiZWRpdGFibGUgZGlzcC10ZXh0XCIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiIChjbGljayk9XCJlbmFibGVFZGl0TW9kZSgpXCI+e3t0eHRWYWx1ZX19PC9zcGFuPjxzcGFuIGNsYXNzPVwiZWRpdGFibGUgZGlzcC1jaG9pY2VcIiAqbmdTd2l0Y2hDYXNlPVwiJ2Nob2ljZSdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPnt7dHh0VmFsdWV9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImVkaXRhYmxlIGRpc3AtZGVjaW1hbFwiICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPnt7dHh0VmFsdWV9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImVkaXRhYmxlIGRpc3AtYm9vbGVhblwiICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPnt7dHh0VmFsdWV9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImVkaXRhYmxlIGRpc3AtZmtkZXRhaWxzXCIgKm5nU3dpdGNoQ2FzZT1cIidma2RldGFpbHMnXCIgKGNsaWNrKT1cImVuYWJsZUVkaXRNb2RlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJma2l0ZW1cIj57e3R4dFZhbHVlfX08L2Rpdj48L3NwYW4+PHNwYW4gY2xhc3M9XCJlZGl0YWJsZSBkaXNwLW0ybWRldGFpbHNcIiAqbmdTd2l0Y2hDYXNlPVwiJ20ybWRldGFpbHMnXCIgKGNsaWNrKT1cImVuYWJsZUVkaXRNb2RlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtMm1pdGVtXCIgKm5nRm9yPVwibGV0IHYgb2YgdHh0VmFsdWVzXCI+e3t2fX08L2Rpdj48L3NwYW4+PHNwYW4gY2xhc3M9XCJlZGl0YWJsZSBkaXNwLWRhdGV0aW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BWYWx1ZVwiPnt7dHh0VmFsdWV8ZGF0ZTonc2hvcnQnfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGlzcFZhbHVlXCI+e3t0eHRWYWx1ZX19PC9uZy1jb250YWluZXI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZWRpdGFibGUgZGlzcC1kYXRldGltZVwiICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIiAoY2xpY2spPVwiZW5hYmxlRWRpdE1vZGUoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BWYWx1ZVwiPnt7dHh0VmFsdWV8ZGF0ZTonc2hvcnREYXRlJ319PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc3BWYWx1ZVwiPnt7dHh0VmFsdWV9fTwvbmctY29udGFpbmVyPjwvc3Bhbj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2VkaXRUcGwgbGV0LWZvcm09XCJmb3JtXCI+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInJlYWxFZGl0b3JcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQudGV4dCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiBbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIiAoa2V5dXAuZXNjYXBlKT1cInVuc2V0RWRpdCgpXCIgW3BsYWNlaG9sZGVyXT1cInJlYWxQbGFjZWhvbGRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dFwiICpuZ0lmPVwicmVhbEhlbHBcIj57e3JlYWxIZWxwfX08c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cInJlcXVpcmVkXCI+KHJlcXVpcyk8L3NwYW4+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtaW5sZW5ndGgnXVwiPlRyb3AgY291cnQgOiB7eyRhbnkobWFuYWdlcikubWluTGVuZ3RofX0gY2FyYWN0w6hyZXMgbWluaW11bS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWF4bGVuZ3RoJ11cIj5Ucm9wIGxvbmcgOiB7eyRhbnkobWFuYWdlcikubWF4TGVuZ3RofX0gY2FyYWN0w6hyZXMgbWF4aW11bS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncGF0dGVybiddXCI+Rm9ybWF0IGludmFsaWRlLi4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q2UgY2hhbXAgZXN0IHJlcXVpcy4uLjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dC5lbWFpbCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc2VzXCIgKGtleXVwLmVzY2FwZSk9XCJ1bnNldEVkaXQoKVwiIFtwbGFjZWhvbGRlcl09XCJyZWFsUGxhY2Vob2xkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIiAqbmdJZj1cInJlYWxIZWxwXCI+e3tyZWFsSGVscH19PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJyZXF1aXJlZFwiPihyZXF1aXMpPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Ucm9wIGNvdXJ0IDoge3skYW55KG1hbmFnZXIpLm1pbkxlbmd0aH19IGNhcmFjdMOocmVzIG1pbmltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+VHJvcCBsb25nIDoge3skYW55KG1hbmFnZXIpLm1heExlbmd0aH19IGNhcmFjdMOocmVzIG1heGltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkZvcm1hdCBpbnZhbGlkZS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnZW1haWwnXVwiPkZvcm1hdCBkJ2VtYWlsIGludmFsaWRlLi4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q2UgY2hhbXAgZXN0IHJlcXVpcy4uLjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dC5wYXNzd29yZCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc2VzXCIgKGtleXVwLmVzY2FwZSk9XCJ1bnNldEVkaXQoKVwiIFtwbGFjZWhvbGRlcl09XCJyZWFsUGxhY2Vob2xkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIiAqbmdJZj1cInJlYWxIZWxwXCI+e3tyZWFsSGVscH19PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJyZXF1aXJlZFwiPihyZXF1aXMpPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Ucm9wIGNvdXJ0IDoge3skYW55KG1hbmFnZXIpLm1pbkxlbmd0aH19IGNhcmFjdMOocmVzIG1pbmltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+VHJvcCBsb25nIDoge3skYW55KG1hbmFnZXIpLm1heExlbmd0aH19IGNhcmFjdMOocmVzIG1heGltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkZvcm1hdCBpbnZhbGlkZS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuZGF0ZXRpbWUnXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiAoa2V5dXAuZW50ZXIpPVwidXBkYXRlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj57e3JlYWxIZWxwfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5DZSBjaGFtcCBlc3QgcmVxdWlzLi4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtaW5EYXRlJ11cIj5Eb2l0IMOqdHJlIHBvc3TDqXJpZXVyIMOgICB7eyRhbnkobWFuYWdlcikubWlufGRhdGU6J3Nob3J0J319Li4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtYXhEYXRlJ11cIj5Eb2l0IMOqdHJlIGFudMOpcmlldXIgw6AgIHt7JGFueShtYW5hZ2VyKS5tYXh8ZGF0ZTonc2hvcnQnfX0uLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuZGF0ZSdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiBbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIiAoa2V5dXAuZXNjYXBlKT1cInVuc2V0RWRpdCgpXCIgKGtleXVwLmVudGVyKT1cInVwZGF0ZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tyZWFsSGVscH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydyZXF1aXJlZCddXCI+Q2UgY2hhbXAgZXN0IHJlcXVpcy4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWluRGF0ZSddXCI+RG9pdCDDqnRyZSBwb3N0w6lyaWV1ciDDoCAge3skYW55KG1hbmFnZXIpLm1pbnxkYXRlOidzaG9ydCd9fS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWF4RGF0ZSddXCI+RG9pdCDDqnRyZSBhbnTDqXJpZXVyIMOgICB7eyRhbnkobWFuYWdlcikubWF4fGRhdGU6J3Nob3J0J319Li4uPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0Lm51bWJlcidcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiBbcGxhY2Vob2xkZXJdPVwicmVhbFBsYWNlaG9sZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCIgKm5nSWY9XCJyZWFsSGVscFwiPnt7cmVhbEhlbHB9fTxzcGFuIGNsYXNzPVwibXMtMVwiICpuZ0lmPVwicmVxdWlyZWRcIj4ocmVxdWlzKTwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21pbiddXCI+VHJvcCBwZXRpdCA6IG1pbmltdW0ge3skYW55KG1hbmFnZXIpLm1pbn19Li4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtYXgnXVwiPlRyb3AgZ3JhbmQgOiBtYXhpbXVtIHt7JGFueShtYW5hZ2VyKS5tYXh9fS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuZGVjaW1hbCdcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3Nlc1wiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiBbcGxhY2Vob2xkZXJdPVwicmVhbFBsYWNlaG9sZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCIgKm5nSWY9XCJyZWFsSGVscFwiPnt7cmVhbEhlbHB9fTxzcGFuIGNsYXNzPVwibXMtMVwiICpuZ0lmPVwicmVxdWlyZWRcIj4ocmVxdWlzKTwvc3Bhbj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21pbiddXCI+VHJvcCBwZXRpdCA6IG1pbmltdW0ge3skYW55KG1hbmFnZXIpLm1pbn19Li4uPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBtdC0wXCIgW2NsYXNzLmQtYmxvY2tdPVwiZm9ybSAmYW1wOyZhbXA7ICFmb3JtLmNvbnRyb2xzW2ZpZWxkXS5wcmlzdGluZSAmYW1wOyZhbXA7IGZvcm0uY29udHJvbHNbZmllbGRdLmVycm9ycz8uWydtYXgnXVwiPlRyb3AgZ3JhbmQgOiBtYXhpbXVtIHt7JGFueShtYW5hZ2VyKS5tYXh9fS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQuY2hlY2tib3gnXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgW2Zvcm1Db250cm9sXT1cImZvcm0uZ2V0KGZpZWxkKVwiIChrZXl1cC5lc2NhcGUpPVwidW5zZXRFZGl0KClcIiAoY2hhbmdlKT1cInVwZGF0ZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0XCI+e3tyZWFsSGVscH19PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxuICAgICAgPHRleHRhcmVhIFtmb3JtQ29udHJvbF09XCJmb3JtLmdldChmaWVsZClcIiAoa2V5dXAuZXNjYXBlKT1cInVuc2V0RWRpdCgpXCIgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc2VzXCIgKGtleXVwLmNvbnRyb2wuZW50ZXIpPVwidXBkYXRlKClcIiBbcGxhY2Vob2xkZXJdPVwicmVhbFBsYWNlaG9sZGVyXCI+PC90ZXh0YXJlYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIiAqbmdJZj1cInJlYWxIZWxwXCI+e3tyZWFsSGVscH19PHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJyZXF1aXJlZFwiPihyZXF1aXMpPC9zcGFuPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Ucm9wIGNvdXJ0IDoge3skYW55KG1hbmFnZXIpLm1pbkxlbmd0aH19IGNhcmFjdMOocmVzIG1pbmltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ21heGxlbmd0aCddXCI+VHJvcCBsb25nIDoge3skYW55KG1hbmFnZXIpLm1heExlbmd0aH19IGNhcmFjdMOocmVzIG1heGltdW0uLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIG10LTBcIiBbY2xhc3MuZC1ibG9ja109XCJmb3JtICZhbXA7JmFtcDsgIWZvcm0uY29udHJvbHNbZmllbGRdLnByaXN0aW5lICZhbXA7JmFtcDsgZm9ybS5jb250cm9sc1tmaWVsZF0uZXJyb3JzPy5bJ3BhdHRlcm4nXVwiPkZvcm1hdCBpbnZhbGlkZS4uLjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2sgbXQtMFwiIFtjbGFzcy5kLWJsb2NrXT1cImZvcm0gJmFtcDsmYW1wOyAhZm9ybS5jb250cm9sc1tmaWVsZF0ucHJpc3RpbmUgJmFtcDsmYW1wOyBmb3JtLmNvbnRyb2xzW2ZpZWxkXS5lcnJvcnM/LlsncmVxdWlyZWQnXVwiPkNlIGNoYW1wIGVzdCByZXF1aXMuLi48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmtzZWxlY3QnXCI+XG4gICAgICA8ZGF0YS1ma3NlbGVjdCBbY29sbGVjdGlvbl09XCJjb2xsZWN0aW9uXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiAoc2VsZWN0ZWQpPVwic2VsZWN0ZWRSZWZJdGVtKCRldmVudClcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiAoY2FuY2VsbGVkKT1cInVuc2V0RWRpdCgpXCIgKGNsZWFyZWQpPVwic2VsZWN0ZWRSZWZJdGVtKG51bGwpXCI+PC9kYXRhLWZrc2VsZWN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtMm1zZWxlY3QnXCI+XG4gICAgICA8ZGF0YS1tMm1zZWxlY3QgW2NvbGxlY3Rpb25dPVwiY29sbGVjdGlvblwiIFtmaWx0ZXJdPVwiZmlsdGVyXCIgKGNoYW5nZWQpPVwidXBkYXRlKClcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgKGRldGFpbHNDaGFuZ2VkKT1cIm9uTTJNVmFsdWVzQ2hhbmdlcygkZXZlbnQpXCIgW21vZGVsXT1cIm1vZGVsXCIgW2ZpZWxkXT1cImZpZWxkXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCI+PC9kYXRhLW0ybXNlbGVjdD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgPHNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZm9ybS5nZXQoZmllbGQpXCIgKGtleXVwLmVzY2FwZSk9XCJ1bnNldEVkaXQoKVwiIChjaGFuZ2UpPVwidXBkYXRlKClcIiBbbmdDbGFzc109XCJpbnB1dENsYXNzZXNcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiByZWFsQ2hvaWNlc1wiIFtuZ1ZhbHVlXT1cImMudmFsdWUgPyBjLnZhbHVlIDogY1wiPnt7Yy5kZXNjID8gYy5kZXNjIDogY319PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj57e3JlYWxIZWxwfX08L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuPCEtLSBEaXNwL2VkaXQgdG9nZ2xlci0tPlxuPG5nLXRlbXBsYXRlICNkaXNwZWRpdFRwbD5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRpc3BUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZnXCI+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZnXCIgKHN1Ym1pdCk9XCJ1cGRhdGUoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZWRpdFRwbDsgY29udGV4dDoge2Zvcm06IGZnfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9mb3JtPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG48IS0tIERpc3BFZGl0IG5vZm9ybS0tPlxuPG5nLXRlbXBsYXRlICNkaXNwZWRpdEZvcm1UcGw+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaXNwVHBsXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZWRpdFRwbDsgY29udGV4dDoge2Zvcm06IGZvcm19XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjwhLS0gRGQgZGlzcGxheS0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGU9PT0nZGQnXCI+XG4gIDxkdCBbY2xhc3MucmVxdWlyZWRdPVwicmVxdWlyZWRcIiAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cImVkaXRhYmxlXCIgKGNsaWNrKT1cInRvZ2dsZUVkaXQoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlVHBsXCI+PC9uZy1jb250YWluZXI+PC9zcGFuPjxzcGFuIGNsYXNzPVwicG9pbnRlciBmbG9hdC1lbmRcIiAoY2xpY2spPVwic2V0RGVmYXVsdCgpXCIgKm5nSWY9XCJyZWFsRGVmYXVsdCE9PSB1bmRlZmluZWQgJmFtcDsmYW1wOyBlZGl0XCI+PGkgY2xhc3M9XCJiaSBiaS10cmFzaCBtcy0yXCI+PC9pPjwvc3Bhbj48L2R0PlxuICA8ZGQgW2NsYXNzLm1iLTBdPVwiaGlkZUxhYmVsXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRpc3BlZGl0VHBsXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGQ+XG48L25nLWNvbnRhaW5lcj5cbjwhLS0gSW5saW5lIGRpc3BsYXktLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlPT09J2lubGluZSdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cInBvaW50ZXIgZmxvYXQtZW5kXCIgKGNsaWNrKT1cInNldERlZmF1bHQoKVwiICpuZ0lmPVwicmVhbERlZmF1bHQhPT0gdW5kZWZpbmVkICZhbXA7JmFtcDsgZWRpdFwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggbXMtMlwiPjwvaT48L3NwYW4+XG4gICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJyZXF1aXJlZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9sYWJlbD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaXNwZWRpdFRwbFwiPjwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG48IS0tIEZvcm0gZGlzcGxheS0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGU9PT0nZm9ybSdcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRlTGFiZWxcIj48c3BhbiBjbGFzcz1cInBvaW50ZXIgZmxvYXQtZW5kXCIgKGNsaWNrKT1cInNldERlZmF1bHQoKVwiICpuZ0lmPVwicmVhbERlZmF1bHQhPT0gdW5kZWZpbmVkICZhbXA7JmFtcDsgZWRpdFwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2ggbXMtMlwiPjwvaT48L3NwYW4+XG4gICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJyZXF1aXJlZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9sYWJlbD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaXNwZWRpdEZvcm1UcGxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPiJdfQ==
|