@messaia/cdk-cms 0.0.1-rc01
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/README.md +24 -0
- package/esm2020/lib/cms-routing.module.mjs +52 -0
- package/esm2020/lib/cms.module.mjs +134 -0
- package/esm2020/lib/comnponents/content-form/content-form.component.mjs +237 -0
- package/esm2020/lib/comnponents/document-dialog/document-dialog.component.mjs +91 -0
- package/esm2020/lib/comnponents/template-form/template-form.component.mjs +177 -0
- package/esm2020/lib/comnponents/template-preview-dialog/template-preview-dialog.component.mjs +126 -0
- package/esm2020/lib/enums/content-type.mjs +6 -0
- package/esm2020/lib/enums/document-type.mjs +8 -0
- package/esm2020/lib/enums/faq-scope.mjs +6 -0
- package/esm2020/lib/enums/template-type.mjs +6 -0
- package/esm2020/lib/enums/wrap-tag.mjs +9 -0
- package/esm2020/lib/models/cms-settings.mjs +12 -0
- package/esm2020/lib/models/content-variable.mjs +48 -0
- package/esm2020/lib/models/content.mjs +89 -0
- package/esm2020/lib/models/document.mjs +102 -0
- package/esm2020/lib/models/faq.mjs +71 -0
- package/esm2020/lib/models/template-preview.mjs +10 -0
- package/esm2020/lib/models/template.mjs +80 -0
- package/esm2020/lib/public-api.mjs +25 -0
- package/esm2020/lib/resolvers/excluded-columns.resolve.mjs +22 -0
- package/esm2020/lib/resolvers/excluded-fields.resolve.mjs +22 -0
- package/esm2020/lib/resolvers/includes.resolve.mjs +22 -0
- package/esm2020/lib/resolvers/settings.resolve.mjs +26 -0
- package/esm2020/lib/services/content-variable.service.mjs +27 -0
- package/esm2020/lib/services/content.service.mjs +34 -0
- package/esm2020/lib/services/document.generic-service.mjs +11 -0
- package/esm2020/lib/services/document.service`.mjs +25 -0
- package/esm2020/lib/services/faq.service.mjs +18 -0
- package/esm2020/lib/services/template-preview.service.mjs +18 -0
- package/esm2020/lib/services/template.service.mjs +18 -0
- package/esm2020/messaia-cdk-cms.mjs +5 -0
- package/esm2020/public_api.mjs +5 -0
- package/fesm2015/messaia-cdk-cms.mjs +1380 -0
- package/fesm2015/messaia-cdk-cms.mjs.map +1 -0
- package/fesm2020/messaia-cdk-cms.mjs +1367 -0
- package/fesm2020/messaia-cdk-cms.mjs.map +1 -0
- package/lib/cms-routing.module.d.ts +7 -0
- package/lib/cms.module.d.ts +40 -0
- package/lib/comnponents/content-form/content-form.component.d.ts +109 -0
- package/lib/comnponents/document-dialog/document-dialog.component.d.ts +47 -0
- package/lib/comnponents/template-form/template-form.component.d.ts +74 -0
- package/lib/comnponents/template-preview-dialog/template-preview-dialog.component.d.ts +68 -0
- package/lib/enums/content-type.d.ts +4 -0
- package/lib/enums/document-type.d.ts +6 -0
- package/lib/enums/faq-scope.d.ts +4 -0
- package/lib/enums/template-type.d.ts +4 -0
- package/lib/enums/wrap-tag.d.ts +7 -0
- package/lib/models/cms-settings.d.ts +10 -0
- package/lib/models/content-variable.d.ts +9 -0
- package/lib/models/content.d.ts +19 -0
- package/lib/models/document.d.ts +26 -0
- package/lib/models/faq.d.ts +14 -0
- package/lib/models/template-preview.d.ts +17 -0
- package/lib/models/template.d.ts +16 -0
- package/lib/public-api.d.ts +21 -0
- package/lib/resolvers/excluded-columns.resolve.d.ts +14 -0
- package/lib/resolvers/excluded-fields.resolve.d.ts +14 -0
- package/lib/resolvers/includes.resolve.d.ts +14 -0
- package/lib/resolvers/settings.resolve.d.ts +15 -0
- package/lib/services/content-variable.service.d.ts +17 -0
- package/lib/services/content.service.d.ts +23 -0
- package/lib/services/document.generic-service.d.ts +9 -0
- package/lib/services/document.service`.d.ts +17 -0
- package/lib/services/faq.service.d.ts +11 -0
- package/lib/services/template-preview.service.d.ts +11 -0
- package/lib/services/template.service.d.ts +11 -0
- package/messaia-cdk-cms.d.ts +5 -0
- package/package.json +33 -0
- package/public_api.d.ts +1 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { HttpEventType, HttpResponse } from '@angular/common/http';
|
|
2
|
+
import { ChangeDetectorRef, Component, Inject } from '@angular/core';
|
|
3
|
+
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
|
+
import { ActivatedRoute } from '@angular/router';
|
|
5
|
+
import { AuthHelper, FileService, GenericReactiveFormComponent, SaveAction } from '@messaia/cdk';
|
|
6
|
+
import { Document } from '../../models/document';
|
|
7
|
+
import { DocumentService } from '../../services/document.service`';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../../services/document.service`";
|
|
10
|
+
import * as i2 from "@messaia/cdk";
|
|
11
|
+
import * as i3 from "@angular/router";
|
|
12
|
+
import * as i4 from "@angular/material/dialog";
|
|
13
|
+
import * as i5 from "@angular/material/form-field";
|
|
14
|
+
import * as i6 from "@angular/material/core";
|
|
15
|
+
import * as i7 from "@angular/material/checkbox";
|
|
16
|
+
import * as i8 from "@angular/material/button";
|
|
17
|
+
import * as i9 from "@angular/common";
|
|
18
|
+
import * as i10 from "@angular/forms";
|
|
19
|
+
import * as i11 from "../../models/document";
|
|
20
|
+
export class DocumentDialogComponent extends GenericReactiveFormComponent {
|
|
21
|
+
/**
|
|
22
|
+
* Constructor
|
|
23
|
+
*/
|
|
24
|
+
constructor(documentService, fileService, route, changeDetectorRef, dialogRef, item = new Document()) {
|
|
25
|
+
super(Document, documentService, route, changeDetectorRef);
|
|
26
|
+
this.documentService = documentService;
|
|
27
|
+
this.fileService = fileService;
|
|
28
|
+
this.route = route;
|
|
29
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
30
|
+
this.dialogRef = dialogRef;
|
|
31
|
+
this.item = item;
|
|
32
|
+
/**
|
|
33
|
+
* Upload progress
|
|
34
|
+
*/
|
|
35
|
+
this.uploadProgress = 0;
|
|
36
|
+
/**
|
|
37
|
+
* Used to disable some properties for client manager
|
|
38
|
+
*/
|
|
39
|
+
this.isClientManager = AuthHelper.hasRole('ClientManager');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Uploads a new document
|
|
43
|
+
*/
|
|
44
|
+
upload(file) {
|
|
45
|
+
if (file != null && this.item && this.item.clientId) {
|
|
46
|
+
this.isUploading = true;
|
|
47
|
+
this.fileService.upload(file, `upload`, {
|
|
48
|
+
clientId: this.form?.value?.clientId,
|
|
49
|
+
path: this.form?.value?.path,
|
|
50
|
+
isPublic: true,
|
|
51
|
+
preserveOriginalName: this.form?.value?.preserveOriginalName
|
|
52
|
+
}).subscribe(event => {
|
|
53
|
+
if (event.type === HttpEventType.UploadProgress) {
|
|
54
|
+
/* Calculate the progress percentage */
|
|
55
|
+
const percentDone = Math.round(100 * event.loaded / event.total);
|
|
56
|
+
/* Pass the percentage into the progress-stream */
|
|
57
|
+
this.uploadProgress = percentDone;
|
|
58
|
+
}
|
|
59
|
+
else if (event instanceof HttpResponse) {
|
|
60
|
+
this.form.patchValue(event.body);
|
|
61
|
+
this.isUploading = false;
|
|
62
|
+
}
|
|
63
|
+
}, _ => this.isUploading = true);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Event emitted after data submition
|
|
68
|
+
* @param action
|
|
69
|
+
* @param response
|
|
70
|
+
*/
|
|
71
|
+
onAfterSubmit(action = SaveAction.SaveAndClose, response = null) {
|
|
72
|
+
this.isSaving = false;
|
|
73
|
+
this.cancel();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Closes the dialog
|
|
77
|
+
*/
|
|
78
|
+
cancel() {
|
|
79
|
+
this.dialogRef.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
DocumentDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: DocumentDialogComponent, deps: [{ token: i1.DocumentService }, { token: i2.FileService }, { token: i3.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
83
|
+
DocumentDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: DocumentDialogComponent, selector: "document-dialog", usesInheritance: true, ngImport: i0, template: "<div mat-dialog-title class=\"mat-title\" i18n>New document</div>\r\n<form *ngIf=\"form\" [formGroup]=\"form\" (ngSubmit)=\"save()\">\r\n\t<div>\r\n\t\t<!-- #region Client-->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\" *ngIf=\"!isClientAdmin\">\r\n\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-label i18n>Client</mat-label>\r\n\t\t\t\t<vd-select formControlName=\"clientId\" endpoint=\"client?enabled=true\" projection=\"id,displayName\" text=\"displayName\" layout=\"column\" flex></vd-select>\r\n\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.clientId['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Path -->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-label i18n>Type</mat-label>\r\n\t\t\t\t<mat-select formControlName=\"path\">\r\n\t\t\t\t\t<mat-option value=\"docs\"><span i18n>Document</span></mat-option>\r\n\t\t\t\t\t<mat-option value=\"images\"><span i18n>Image</span></mat-option>\r\n\t\t\t\t\t<mat-option value=\"videos\"><span>Video</span></mat-option>\r\n\t\t\t\t</mat-select>\r\n\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.path['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- #endregion-->\r\n\r\n\t\t<!-- #region PreserveOriginalName -->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\" *ngIf=\"!isClientAdmin\">\r\n\t\t\t<div layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-checkbox name=\"preserveOriginalName\" formControlName=\"preserveOriginalName\" (change)=\"item.name = ''\" i18n>Preserve original name</mat-checkbox>\r\n\t\t\t\t<br />\r\n\t\t\t\t<mat-hint *ngIf=\"form?.value?.preserveOriginalName\" class=\"tc-red-500\" i18n>Warning: old files will be overridden</mat-hint>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region File -->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-label i18n>File</mat-label>\r\n\t\t\t\t<div vd-file-input formControlName=\"name\" (select)=\"upload($event)\" required></div>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- #endregion -->\r\n\t</div>\r\n\t<div mat-dialog-actions class=\"pad-top\">\r\n\t\t<button type=\"submit\" mat-flat-button [disabled]=\"form. isSaving\" color=\"primary\" i18n>Save</button>\r\n\t\t<button type=\"button\" mat-button (click)=\"cancel()\" i18n>Cancel</button>\r\n\t</div>\r\n</form>", components: [{ type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.VdSelectComponent, selector: "vd-select", inputs: ["multiple", "disabled", "sorted", "textPrefix", "endpoint", "params", "projection", "enum", "key", "text", "prefix", "options", "filteredOptions", "filterable", "cache", "sortBy", "searchField"], outputs: ["change", "itemChange", "selected", "itemSelected", "launch"] }, { type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i2.VdFileInputComponent, selector: "[vd-file-input]", inputs: ["accept", "placeholder", "required", "multiple", "disabled", "errorState"], outputs: ["select", "clear"] }, { type: i8.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.RxwebFormDirective, selector: "[formGroup],[rxwebForm]", inputs: ["formGroup", "rxwebForm"] }, { type: i2.MatFormFieldReadonlyDirective, selector: "mat-form-field" }, { type: i5.MatLabel, selector: "mat-label" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.AsyncValidationDirective, selector: "[ngModel],[formControlName],[formControl]", inputs: ["async"] }, { type: i2.RxFormControlDirective, selector: "[ngModel],[formControlName],[formControl]", inputs: ["rxalpha", "rxalphaNumeric", "rxascii", "rxcompare", "rxcompose", "rxcontains", "rxcreditCard", "rxdataUri", "rxdifferent", "rxdigit", "rxemail", "rxendsWith", "rxeven", "rxextension", "rxfactor", "rxfileSize", "rxgreaterThanEqualTo", "rxgreaterThan", "rxhexColor", "rxjson", "rxlatitude", "rxlatLong", "rxleapYear", "rxlessThan", "rxlessThanEqualTo", "rxlongitude", "rxlowerCase", "rxmac", "rxmaxDate", "rxmaxLength", "rxmaxNumber", "rxminDate", "rxminLength", "rxminNumber", "rxnumeric", "rxodd", "rxpassword", "rxport", "rxprimeNumber", "rxrequired", "rxrange", "rxrule", "rxstartsWith", "rxtime", "rxupperCase", "rxurl", "rxunique", "rxnotEmpty", "rxcusip", "rxgrid", "rxdate"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }] });
|
|
84
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: DocumentDialogComponent, decorators: [{
|
|
85
|
+
type: Component,
|
|
86
|
+
args: [{ selector: 'document-dialog', template: "<div mat-dialog-title class=\"mat-title\" i18n>New document</div>\r\n<form *ngIf=\"form\" [formGroup]=\"form\" (ngSubmit)=\"save()\">\r\n\t<div>\r\n\t\t<!-- #region Client-->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\" *ngIf=\"!isClientAdmin\">\r\n\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-label i18n>Client</mat-label>\r\n\t\t\t\t<vd-select formControlName=\"clientId\" endpoint=\"client?enabled=true\" projection=\"id,displayName\" text=\"displayName\" layout=\"column\" flex></vd-select>\r\n\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.clientId['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Path -->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-label i18n>Type</mat-label>\r\n\t\t\t\t<mat-select formControlName=\"path\">\r\n\t\t\t\t\t<mat-option value=\"docs\"><span i18n>Document</span></mat-option>\r\n\t\t\t\t\t<mat-option value=\"images\"><span i18n>Image</span></mat-option>\r\n\t\t\t\t\t<mat-option value=\"videos\"><span>Video</span></mat-option>\r\n\t\t\t\t</mat-select>\r\n\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.path['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- #endregion-->\r\n\r\n\t\t<!-- #region PreserveOriginalName -->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\" *ngIf=\"!isClientAdmin\">\r\n\t\t\t<div layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-checkbox name=\"preserveOriginalName\" formControlName=\"preserveOriginalName\" (change)=\"item.name = ''\" i18n>Preserve original name</mat-checkbox>\r\n\t\t\t\t<br />\r\n\t\t\t\t<mat-hint *ngIf=\"form?.value?.preserveOriginalName\" class=\"tc-red-500\" i18n>Warning: old files will be overridden</mat-hint>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region File -->\r\n\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t<mat-label i18n>File</mat-label>\r\n\t\t\t\t<div vd-file-input formControlName=\"name\" (select)=\"upload($event)\" required></div>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<!-- #endregion -->\r\n\t</div>\r\n\t<div mat-dialog-actions class=\"pad-top\">\r\n\t\t<button type=\"submit\" mat-flat-button [disabled]=\"form. isSaving\" color=\"primary\" i18n>Save</button>\r\n\t\t<button type=\"button\" mat-button (click)=\"cancel()\" i18n>Cancel</button>\r\n\t</div>\r\n</form>" }]
|
|
87
|
+
}], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.FileService }, { type: i3.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i4.MatDialogRef }, { type: i11.Document, decorators: [{
|
|
88
|
+
type: Inject,
|
|
89
|
+
args: [MAT_DIALOG_DATA]
|
|
90
|
+
}] }]; } });
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay1jbXMvc3JjL2xpYi9jb21ucG9uZW50cy9kb2N1bWVudC1kaWFsb2cvZG9jdW1lbnQtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay1jbXMvc3JjL2xpYi9jb21ucG9uZW50cy9kb2N1bWVudC1kaWFsb2cvZG9jdW1lbnQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsNEJBQTRCLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFNbkUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLDRCQUF1RDtJQWdCbkc7O09BRUc7SUFDSCxZQUNXLGVBQWdDLEVBQ2hDLFdBQXdCLEVBQ3hCLEtBQXFCLEVBQ3JCLGlCQUFvQyxFQUN2QyxTQUFnRCxFQUN2QixPQUFpQixJQUFJLFFBQVEsRUFBRTtRQUUvRCxLQUFLLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtRQVBoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUN2QyxjQUFTLEdBQVQsU0FBUyxDQUF1QztRQUN2QixTQUFJLEdBQUosSUFBSSxDQUEyQjtRQW5CaEU7O1dBRUc7UUFDSSxtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUVsQzs7V0FFRztRQUNJLG9CQUFlLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQWM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBVTtRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNwRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUN2QyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUTtnQkFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUk7Z0JBQzVCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLG9CQUFvQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLG9CQUFvQjthQUM1RCxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGNBQWMsRUFBRTtvQkFFaEQsdUNBQXVDO29CQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFakUsa0RBQWtEO29CQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQztpQkFDbEM7cUJBQU0sSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFO29CQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBVyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2lCQUN6QjtZQUNGLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFDRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGFBQWEsQ0FBQyxTQUFxQixVQUFVLENBQUMsWUFBWSxFQUFFLFdBQWdCLElBQUk7UUFDekYsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTTtRQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7b0hBeEVXLHVCQUF1Qix1S0F5QjFCLGVBQWU7d0dBekJaLHVCQUF1Qiw4RUNacEMsOGpGQWtETzsyRkR0Q00sdUJBQXVCO2tCQUpuQyxTQUFTOytCQUNDLGlCQUFpQjs7MEJBNEJ6QixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXZlbnRUeXBlLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQXV0aEhlbHBlciwgRmlsZVNlcnZpY2UsIEdlbmVyaWNSZWFjdGl2ZUZvcm1Db21wb25lbnQsIFNhdmVBY3Rpb24gfSBmcm9tICdAbWVzc2FpYS9jZGsnO1xyXG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4uLy4uL21vZGVscy9kb2N1bWVudCc7XHJcbmltcG9ydCB7IERvY3VtZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RvY3VtZW50LnNlcnZpY2VgJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnZG9jdW1lbnQtZGlhbG9nJyxcclxuXHR0ZW1wbGF0ZVVybDogJ2RvY3VtZW50LWRpYWxvZy5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERvY3VtZW50RGlhbG9nQ29tcG9uZW50IGV4dGVuZHMgR2VuZXJpY1JlYWN0aXZlRm9ybUNvbXBvbmVudDxEb2N1bWVudCwgRG9jdW1lbnRTZXJ2aWNlPiB7XHJcblx0LyoqXHJcblx0ICogVXBsb2FkIHN0YXR1c1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc1VwbG9hZGluZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkIHByb2dyZXNzXHJcblx0ICovXHJcblx0cHVibGljIHVwbG9hZFByb2dyZXNzOiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBVc2VkIHRvIGRpc2FibGUgc29tZSBwcm9wZXJ0aWVzIGZvciBjbGllbnQgbWFuYWdlclxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0NsaWVudE1hbmFnZXIgPSBBdXRoSGVscGVyLmhhc1JvbGUoJ0NsaWVudE1hbmFnZXInKTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByb3RlY3RlZCBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcclxuXHRcdHByb3RlY3RlZCBmaWxlU2VydmljZTogRmlsZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRcdHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEb2N1bWVudERpYWxvZ0NvbXBvbmVudD4sXHJcblx0XHRASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGl0ZW06IERvY3VtZW50ID0gbmV3IERvY3VtZW50KClcclxuXHQpIHtcclxuXHRcdHN1cGVyKERvY3VtZW50LCBkb2N1bWVudFNlcnZpY2UsIHJvdXRlLCBjaGFuZ2VEZXRlY3RvclJlZilcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwbG9hZHMgYSBuZXcgZG9jdW1lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBsb2FkKGZpbGU6IEZpbGUpOiB2b2lkIHtcclxuXHRcdGlmIChmaWxlICE9IG51bGwgJiYgdGhpcy5pdGVtICYmIHRoaXMuaXRlbS5jbGllbnRJZCkge1xyXG5cdFx0XHR0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5maWxlU2VydmljZS51cGxvYWQoZmlsZSwgYHVwbG9hZGAsIHtcclxuXHRcdFx0XHRjbGllbnRJZDogdGhpcy5mb3JtPy52YWx1ZT8uY2xpZW50SWQsXHJcblx0XHRcdFx0cGF0aDogdGhpcy5mb3JtPy52YWx1ZT8ucGF0aCxcclxuXHRcdFx0XHRpc1B1YmxpYzogdHJ1ZSxcclxuXHRcdFx0XHRwcmVzZXJ2ZU9yaWdpbmFsTmFtZTogdGhpcy5mb3JtPy52YWx1ZT8ucHJlc2VydmVPcmlnaW5hbE5hbWVcclxuXHRcdFx0fSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuXHRcdFx0XHRpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcykge1xyXG5cclxuXHRcdFx0XHRcdC8qIENhbGN1bGF0ZSB0aGUgcHJvZ3Jlc3MgcGVyY2VudGFnZSAqL1xyXG5cdFx0XHRcdFx0Y29uc3QgcGVyY2VudERvbmUgPSBNYXRoLnJvdW5kKDEwMCAqIGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKTtcclxuXHJcblx0XHRcdFx0XHQvKiBQYXNzIHRoZSBwZXJjZW50YWdlIGludG8gdGhlIHByb2dyZXNzLXN0cmVhbSAqL1xyXG5cdFx0XHRcdFx0dGhpcy51cGxvYWRQcm9ncmVzcyA9IHBlcmNlbnREb25lO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcclxuXHRcdFx0XHRcdHRoaXMuZm9ybS5wYXRjaFZhbHVlKDxEb2N1bWVudD5ldmVudC5ib2R5KTtcclxuXHRcdFx0XHRcdHRoaXMuaXNVcGxvYWRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIF8gPT4gdGhpcy5pc1VwbG9hZGluZyA9IHRydWUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciBkYXRhIHN1Ym1pdGlvblxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gXHJcblx0ICogQHBhcmFtIHJlc3BvbnNlIFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyU3VibWl0KGFjdGlvbjogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlLCByZXNwb25zZTogYW55ID0gbnVsbCk6IHZvaWQge1xyXG5cdFx0dGhpcy5pc1NhdmluZyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5jYW5jZWwoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsb3NlcyB0aGUgZGlhbG9nXHJcblx0ICovXHJcblx0cHVibGljIGNhbmNlbCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcblx0fVxyXG59IiwiPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwibWF0LXRpdGxlXCIgaTE4bj5OZXcgZG9jdW1lbnQ8L2Rpdj5cclxuPGZvcm0gKm5nSWY9XCJmb3JtXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cInNhdmUoKVwiPlxyXG5cdDxkaXY+XHJcblx0XHQ8IS0tICNyZWdpb24gQ2xpZW50LS0+XHJcblx0XHQ8ZGl2IGxheW91dC1ndC1zbT1cInJvd1wiIGxheW91dD1cImNvbHVtblwiICpuZ0lmPVwiIWlzQ2xpZW50QWRtaW5cIj5cclxuXHRcdFx0PG1hdC1mb3JtLWZpZWxkIGZsZXggbGF5b3V0LW1hcmdpbiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG5cdFx0XHRcdDxtYXQtbGFiZWwgaTE4bj5DbGllbnQ8L21hdC1sYWJlbD5cclxuXHRcdFx0XHQ8dmQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNsaWVudElkXCIgZW5kcG9pbnQ9XCJjbGllbnQ/ZW5hYmxlZD10cnVlXCIgcHJvamVjdGlvbj1cImlkLGRpc3BsYXlOYW1lXCIgdGV4dD1cImRpc3BsYXlOYW1lXCIgbGF5b3V0PVwiY29sdW1uXCIgZmxleD48L3ZkLXNlbGVjdD5cclxuXHRcdFx0XHQ8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybS5jb250cm9scy5jbGllbnRJZFsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG5cdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0PC9kaXY+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIFBhdGggLS0+XHJcblx0XHQ8ZGl2IGxheW91dC1ndC1zbT1cInJvd1wiIGxheW91dD1cImNvbHVtblwiPlxyXG5cdFx0XHQ8bWF0LWZvcm0tZmllbGQgZmxleCBsYXlvdXQtbWFyZ2luIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcblx0XHRcdFx0PG1hdC1sYWJlbCBpMThuPlR5cGU8L21hdC1sYWJlbD5cclxuXHRcdFx0XHQ8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXRoXCI+XHJcblx0XHRcdFx0XHQ8bWF0LW9wdGlvbiB2YWx1ZT1cImRvY3NcIj48c3BhbiBpMThuPkRvY3VtZW50PC9zcGFuPjwvbWF0LW9wdGlvbj5cclxuXHRcdFx0XHRcdDxtYXQtb3B0aW9uIHZhbHVlPVwiaW1hZ2VzXCI+PHNwYW4gaTE4bj5JbWFnZTwvc3Bhbj48L21hdC1vcHRpb24+XHJcblx0XHRcdFx0XHQ8bWF0LW9wdGlvbiB2YWx1ZT1cInZpZGVvc1wiPjxzcGFuPlZpZGVvPC9zcGFuPjwvbWF0LW9wdGlvbj5cclxuXHRcdFx0XHQ8L21hdC1zZWxlY3Q+XHJcblx0XHRcdFx0PG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3JNZXNzYWdlIG9mIGZvcm0uY29udHJvbHMucGF0aFsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG5cdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0PC9kaXY+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24tLT5cclxuXHJcblx0XHQ8IS0tICNyZWdpb24gUHJlc2VydmVPcmlnaW5hbE5hbWUgLS0+XHJcblx0XHQ8ZGl2IGxheW91dC1ndC1zbT1cInJvd1wiIGxheW91dD1cImNvbHVtblwiICpuZ0lmPVwiIWlzQ2xpZW50QWRtaW5cIj5cclxuXHRcdFx0PGRpdiBsYXlvdXQtbWFyZ2luIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcblx0XHRcdFx0PG1hdC1jaGVja2JveCBuYW1lPVwicHJlc2VydmVPcmlnaW5hbE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJwcmVzZXJ2ZU9yaWdpbmFsTmFtZVwiIChjaGFuZ2UpPVwiaXRlbS5uYW1lID0gJydcIiBpMThuPlByZXNlcnZlIG9yaWdpbmFsIG5hbWU8L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHQ8YnIgLz5cclxuXHRcdFx0XHQ8bWF0LWhpbnQgKm5nSWY9XCJmb3JtPy52YWx1ZT8ucHJlc2VydmVPcmlnaW5hbE5hbWVcIiBjbGFzcz1cInRjLXJlZC01MDBcIiBpMThuPldhcm5pbmc6IG9sZCBmaWxlcyB3aWxsIGJlIG92ZXJyaWRkZW48L21hdC1oaW50PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdDwhLS0gI3JlZ2lvbiBGaWxlIC0tPlxyXG5cdFx0PGRpdiBsYXlvdXQtZ3Qtc209XCJyb3dcIiBsYXlvdXQ9XCJjb2x1bW5cIj5cclxuXHRcdFx0PG1hdC1mb3JtLWZpZWxkIGZsZXggbGF5b3V0LW1hcmdpbiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG5cdFx0XHRcdDxtYXQtbGFiZWwgaTE4bj5GaWxlPC9tYXQtbGFiZWw+XHJcblx0XHRcdFx0PGRpdiB2ZC1maWxlLWlucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiAoc2VsZWN0KT1cInVwbG9hZCgkZXZlbnQpXCIgcmVxdWlyZWQ+PC9kaXY+XHJcblx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IG1hdC1kaWFsb2ctYWN0aW9ucyBjbGFzcz1cInBhZC10b3BcIj5cclxuXHRcdDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIG1hdC1mbGF0LWJ1dHRvbiBbZGlzYWJsZWRdPVwiZm9ybS4gaXNTYXZpbmdcIiBjb2xvcj1cInByaW1hcnlcIiBpMThuPlNhdmU8L2J1dHRvbj5cclxuXHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gKGNsaWNrKT1cImNhbmNlbCgpXCIgaTE4bj5DYW5jZWw8L2J1dHRvbj5cclxuXHQ8L2Rpdj5cclxuPC9mb3JtPiJdfQ==
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { HttpEventType, HttpResponse } from '@angular/common/http';
|
|
2
|
+
import { ChangeDetectorRef, Component, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
4
|
+
import { ActivatedRoute } from '@angular/router';
|
|
5
|
+
import { AuthHelper, FileService, GenericReactiveFormComponent } from '@messaia/cdk';
|
|
6
|
+
import 'codemirror/addon/edit/closetag';
|
|
7
|
+
import 'codemirror/addon/edit/matchbrackets';
|
|
8
|
+
import 'codemirror/addon/selection/active-line';
|
|
9
|
+
import 'codemirror/mode/htmlmixed/htmlmixed';
|
|
10
|
+
import 'codemirror/mode/javascript/javascript';
|
|
11
|
+
import { saveAs } from 'file-saver';
|
|
12
|
+
import { TemplateType } from '../../enums/template-type';
|
|
13
|
+
import { Template } from '../../models/template';
|
|
14
|
+
import { TemplatePreview } from '../../models/template-preview';
|
|
15
|
+
import { TemplateService } from '../../services/template.service';
|
|
16
|
+
import { TemplatePreviewDialogComponent } from '../template-preview-dialog/template-preview-dialog.component';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "../../services/template.service";
|
|
19
|
+
import * as i2 from "@messaia/cdk";
|
|
20
|
+
import * as i3 from "@angular/material/dialog";
|
|
21
|
+
import * as i4 from "@angular/router";
|
|
22
|
+
import * as i5 from "@angular/material/expansion";
|
|
23
|
+
import * as i6 from "@angular/material/form-field";
|
|
24
|
+
import * as i7 from "@angular/material/chips";
|
|
25
|
+
import * as i8 from "@angular/material/icon";
|
|
26
|
+
import * as i9 from "@angular/material/checkbox";
|
|
27
|
+
import * as i10 from "@angular/material/button";
|
|
28
|
+
import * as i11 from "@ctrl/ngx-codemirror";
|
|
29
|
+
import * as i12 from "@messaia/cdk-base";
|
|
30
|
+
import * as i13 from "@angular/common";
|
|
31
|
+
import * as i14 from "@angular/forms";
|
|
32
|
+
import * as i15 from "@angular/material/input";
|
|
33
|
+
export class TemplateFormComponent extends GenericReactiveFormComponent {
|
|
34
|
+
/**
|
|
35
|
+
* Constructor
|
|
36
|
+
*/
|
|
37
|
+
constructor(service, fileService, dialog, route, changeDetectorRef) {
|
|
38
|
+
super(Template, service, route, changeDetectorRef);
|
|
39
|
+
this.service = service;
|
|
40
|
+
this.fileService = fileService;
|
|
41
|
+
this.dialog = dialog;
|
|
42
|
+
this.route = route;
|
|
43
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
44
|
+
/**
|
|
45
|
+
* Template type
|
|
46
|
+
*/
|
|
47
|
+
this.TemplateType = TemplateType;
|
|
48
|
+
/**
|
|
49
|
+
* Used to disable some properties for client manager
|
|
50
|
+
*/
|
|
51
|
+
this.isClientAdmin = AuthHelper.hasRole('ClientAdministrator') || AuthHelper.hasRole('ClientManager');
|
|
52
|
+
/**
|
|
53
|
+
* Used to disable some properties for client manager
|
|
54
|
+
*/
|
|
55
|
+
this.isClientManager = AuthHelper.hasRole('ClientManager');
|
|
56
|
+
/**
|
|
57
|
+
* Editor options
|
|
58
|
+
*/
|
|
59
|
+
this.editorOptions = {
|
|
60
|
+
lineNumbers: true,
|
|
61
|
+
theme: 'material',
|
|
62
|
+
autoCloseTags: true,
|
|
63
|
+
styleActiveLine: true,
|
|
64
|
+
mode: 'text/html',
|
|
65
|
+
profile: 'xhtml'
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Editor options
|
|
69
|
+
*/
|
|
70
|
+
this.jsonEditorOptions = {
|
|
71
|
+
lineNumbers: true,
|
|
72
|
+
theme: 'material',
|
|
73
|
+
autoCloseTags: true,
|
|
74
|
+
styleActiveLine: true,
|
|
75
|
+
mode: {
|
|
76
|
+
name: "javascript",
|
|
77
|
+
json: true,
|
|
78
|
+
statementIndent: 2
|
|
79
|
+
},
|
|
80
|
+
profile: 'xhtml',
|
|
81
|
+
lineWrapping: true,
|
|
82
|
+
indentWithTabs: false,
|
|
83
|
+
tabSize: 2
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Gets the attachments control
|
|
88
|
+
*/
|
|
89
|
+
get attachmentsControl() { return this.form.controls.attachments; }
|
|
90
|
+
/**
|
|
91
|
+
* Removes a attachment
|
|
92
|
+
* @param attachment
|
|
93
|
+
*/
|
|
94
|
+
removeAttachment(attachment) {
|
|
95
|
+
if (Array.isArray(this.item.attachments)) {
|
|
96
|
+
var index = this.attachmentsControl.value.indexOf(attachment, 0);
|
|
97
|
+
if (index > -1) {
|
|
98
|
+
this.dialogService.openConfirm({
|
|
99
|
+
message: 'Möchten Sie diesen Anhang wirklich löschen?',
|
|
100
|
+
title: 'Löschen bestätigen',
|
|
101
|
+
cancelButton: $localize `:@@cancel:Cancel`,
|
|
102
|
+
acceptButton: $localize `:@@yes:Yes`,
|
|
103
|
+
}).afterClosed().subscribe((accept) => {
|
|
104
|
+
if (accept) {
|
|
105
|
+
this.attachmentsControl.value.splice(index, 1);
|
|
106
|
+
this.attachmentsControl.updateValueAndValidity();
|
|
107
|
+
this.attachmentsControl.markAsDirty();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Uploads a attachment file
|
|
115
|
+
* @param file
|
|
116
|
+
*/
|
|
117
|
+
uploadAttachment(file) {
|
|
118
|
+
if (file != null) {
|
|
119
|
+
this.fileService.upload(file, `upload`, { clientId: this.item.clientId, path: `${this.item.clientId ? '' : 'common/'}docs` }).subscribe(event => {
|
|
120
|
+
if (event.type === HttpEventType.UploadProgress) {
|
|
121
|
+
/* Calculate the progress percentage */
|
|
122
|
+
const percentDone = Math.round(100 * event.loaded / event.total);
|
|
123
|
+
/* Pass the percentage into the progress-stream */
|
|
124
|
+
console.info(percentDone);
|
|
125
|
+
}
|
|
126
|
+
else if (event instanceof HttpResponse) {
|
|
127
|
+
/* Add our attachments */
|
|
128
|
+
this.attachmentsControl.setValue([...this.attachmentsControl.value, event.body]);
|
|
129
|
+
this.attachmentsControl.updateValueAndValidity();
|
|
130
|
+
this.attachmentsControl.markAsDirty();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Downloads a attachment
|
|
137
|
+
* @param attachment
|
|
138
|
+
*/
|
|
139
|
+
downloadAttachment(attachment) {
|
|
140
|
+
if (attachment.id) {
|
|
141
|
+
this.service.download(`downloadAttachment/${attachment.id}`).subscribe(x => {
|
|
142
|
+
saveAs(new Blob([x.data], { type: '' }), x.filename);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Shows template preview
|
|
148
|
+
*/
|
|
149
|
+
showPreview() {
|
|
150
|
+
this.dialog.open(TemplatePreviewDialogComponent, {
|
|
151
|
+
width: this.item.type == TemplateType.Pdf ? '1020px' : '920px',
|
|
152
|
+
data: new TemplatePreview({
|
|
153
|
+
templateId: this.item.id,
|
|
154
|
+
type: this.item.type
|
|
155
|
+
}),
|
|
156
|
+
panelClass: ['dialog-full-screen']
|
|
157
|
+
}).afterClosed().subscribe();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Creates a new instance of the Template
|
|
161
|
+
*/
|
|
162
|
+
newInstance() {
|
|
163
|
+
let item = new Template();
|
|
164
|
+
/* Get clientId */
|
|
165
|
+
if (!this.isEditMode && this.isClientManager) {
|
|
166
|
+
// this.clientManagerService.getClientId().subscribe(x => item.clientId = x);
|
|
167
|
+
}
|
|
168
|
+
return item;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
TemplateFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: TemplateFormComponent, deps: [{ token: i1.TemplateService }, { token: i2.FileService }, { token: i3.MatDialog }, { token: i4.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
172
|
+
TemplateFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: TemplateFormComponent, selector: "app-template-form", usesInheritance: true, ngImport: i0, template: "<vd-layout-nav color=\"primary\" [backNavigationRoute]=\"listRoute\" toolbarTitle=\"Template\" i18n-toolbarTitle [editMode]=\"isEditMode\" [menuItems]=\"toolbarMenuItems\" (reload)=\"reloadPage()\">\r\n\t<form *ngIf=\"form\" [formGroup]=\"form\" novalidate (ngSubmit)=\"save()\">\r\n\t\t<vd-layout-card-over class=\"accordion\" cardWidth=\"70\" color=\"primary\" flex>\r\n\t\t\t<mat-accordion [multi]=\"!isEditMode\">\r\n\t\t\t\t<!-- #region Details -->\r\n\t\t\t\t<mat-expansion-panel expanded=\"true\" id=\"details\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title i18n>Details</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\r\n\t\t\t\t\t<!-- #region Client-->\r\n\t\t\t\t\t<div layout-gt-sm=\"row\" layout=\"column\" *ngIf=\"settings?.multitenantable && !isClientAdmin\">\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Client</mat-label>\r\n\t\t\t\t\t\t\t<vd-select formControlName=\"clientId\" endpoint=\"client?enabled=true\" layout=\"column\" flex></vd-select>\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.clientId['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t\t<mat-hint i18n>If empty this template will be used for all projects</mat-hint>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Type-->\r\n\t\t\t\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Type</mat-label>\r\n\t\t\t\t\t\t\t<vd-select formControlName=\"type\" [enum]=\"TemplateType\" layout=\"column\" flex></vd-select>\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.type['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Name & Subject -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<!-- #region Name -->\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Name</mat-label>\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"name\">\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.name['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Key -->\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Key</mat-label>\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"key\">\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.key['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Subject -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Subject</mat-label>\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"subject\">\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.subject['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Attachments -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin>\r\n\t\t\t\t\t\t\t<mat-label i18n>Attachments</mat-label>\r\n\t\t\t\t\t\t\t<mat-chip-list #chipList formControlName=\"attachments\">\r\n\t\t\t\t\t\t\t\t<mat-chip *ngFor=\"let attachment of form.controls.attachments.value\" [selectable]=\"true\" color=\"primary\" removable=\"true\" (removed)=\"removeAttachment(attachment)\" (click)=\"downloadAttachment(attachment)\" selected>\r\n\t\t\t\t\t\t\t\t\t{{attachment.originalName}}\r\n\t\t\t\t\t\t\t\t\t<mat-icon matChipRemove>cancel</mat-icon>\r\n\t\t\t\t\t\t\t\t</mat-chip>\r\n\t\t\t\t\t\t\t\t<input placeholder=\"Attachments\" i18n-placeholder [matChipInputFor]=\"chipList\" [matChipInputAddOnBlur]=\"false\" (click)=\"fileInput.click()\" readonly>\r\n\t\t\t\t\t\t\t\t<mat-icon matSuffix (click)=\"fileInput.click()\">publish</mat-icon>\r\n\t\t\t\t\t\t\t\t<input hidden type=\"file\" accept=\"{{allowedExtensions}}\" #fileInput (change)=\"uploadAttachment($event.target.files[0])\" />\r\n\t\t\t\t\t\t\t</mat-chip-list>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Notice -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Notice</mat-label>\r\n\t\t\t\t\t\t\t<textarea matInput autocomplete=\"off\" formControlName=\"notice\"></textarea>\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.notice['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Enabled-->\r\n\t\t\t\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t\t\t\t<div layout-margin appearance=\"outline\" class=\"push-top push-bottom\">\r\n\t\t\t\t\t\t\t<mat-checkbox formControlName=\"enabled\" i18n>Activ</mat-checkbox>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"submit\" mat-flat-button color=\"primary\" [disabled]=\"isSaving\" i18n>Save</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"apply()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving\" i18n>Apply</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"back()\" i18n>Cancel</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t<!-- #region Content -->\r\n\t\t\t\t<mat-expansion-panel id=\"content\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t\t\t<span i18n>Content</span>\r\n\t\t\t\t\t\t</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\t\t\t\t\t<div layout-margin>\r\n\t\t\t\t\t\t<ngx-codemirror formControlName=\"content\" rows=\"160\" [options]=\"editorOptions\"></ngx-codemirror>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"submit\" mat-flat-button color=\"primary\" [disabled]=\"isSaving\" i18n>Save</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"apply()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving\" i18n>Apply</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"showPreview()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving || !form.pristine\" i18n=\"@@preview\">Preview</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"back()\" i18n>Cancel</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t<!-- #region Content -->\r\n\t\t\t\t<mat-expansion-panel id=\"testData\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t\t\t<span i18n=\"@@testData\">Test Data</span>\r\n\t\t\t\t\t\t</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\t\t\t\t\t<div layout-margin>\r\n\t\t\t\t\t\t<ngx-codemirror formControlName=\"dummyData\" rows=\"120\" [options]=\"jsonEditorOptions\"></ngx-codemirror>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"submit\" mat-flat-button color=\"primary\" [disabled]=\"isSaving\" i18n>Save</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"apply()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving\" i18n>Apply</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"showPreview()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving || !form.pristine\" i18n=\"@@preview\">Preview</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"back()\" i18n>Cancel</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t<!-- #region Audit -->\r\n\t\t\t\t<mat-expansion-panel id=\"audit\" *ngIf=\"isEditMode\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t\t\t<span i18n>Audit</span>\r\n\t\t\t\t\t\t</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\t\t\t\t\t<vd-audit [item]=\"item\"> </vd-audit>\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"button\" mat-flat-button color=\"accent\" (click)=\"back()\" i18n>Close</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\t\t\t</mat-accordion>\r\n\t\t</vd-layout-card-over>\r\n\t</form>\r\n</vd-layout-nav>", styles: ["@import\"~codemirror/lib/codemirror.css\";@import\"~codemirror/theme/material.css\";codemirror{width:100%}.CodeMirror{height:500px}\n"], components: [{ type: i2.VdLayoutNavComponent, selector: "vd-layout-nav", inputs: ["toolbarTitle", "editMode", "menuItems", "icon", "logo", "color", "hideToggle", "backNavigationRoute", "navigationRoute"], outputs: ["reload"] }, { type: i2.VdLayoutCardOverComponent, selector: "vd-layout-card-over", inputs: ["cardTitle", "cardSubtitle", "cardWidth", "color"] }, { type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.VdSelectComponent, selector: "vd-select", inputs: ["multiple", "disabled", "sorted", "textPrefix", "endpoint", "params", "projection", "enum", "key", "text", "prefix", "options", "filteredOptions", "filterable", "cache", "sortBy", "searchField"], outputs: ["change", "itemChange", "selected", "itemSelected", "launch"] }, { type: i7.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i11.CodemirrorComponent, selector: "ngx-codemirror", inputs: ["className", "name", "autoFocus", "options", "preserveScrollPosition"], outputs: ["cursorActivity", "focusChange", "scroll", "drop"] }, { type: i12.VdAuditComponent, selector: "vd-audit", inputs: ["item"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.RxwebFormDirective, selector: "[formGroup],[rxwebForm]", inputs: ["formGroup", "rxwebForm"] }, { type: i5.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i2.MatFormFieldReadonlyDirective, selector: "mat-form-field" }, { type: i6.MatLabel, selector: "mat-label" }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.AsyncValidationDirective, selector: "[ngModel],[formControlName],[formControl]", inputs: ["async"] }, { type: i2.RxFormControlDirective, selector: "[ngModel],[formControlName],[formControl]", inputs: ["rxalpha", "rxalphaNumeric", "rxascii", "rxcompare", "rxcompose", "rxcontains", "rxcreditCard", "rxdataUri", "rxdifferent", "rxdigit", "rxemail", "rxendsWith", "rxeven", "rxextension", "rxfactor", "rxfileSize", "rxgreaterThanEqualTo", "rxgreaterThan", "rxhexColor", "rxjson", "rxlatitude", "rxlatLong", "rxleapYear", "rxlessThan", "rxlessThanEqualTo", "rxlongitude", "rxlowerCase", "rxmac", "rxmaxDate", "rxmaxLength", "rxmaxNumber", "rxminDate", "rxminLength", "rxminNumber", "rxnumeric", "rxodd", "rxpassword", "rxport", "rxprimeNumber", "rxrequired", "rxrange", "rxrule", "rxstartsWith", "rxtime", "rxupperCase", "rxurl", "rxunique", "rxnotEmpty", "rxcusip", "rxgrid", "rxdate"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i7.MatChipRemove, selector: "[matChipRemove]" }, { type: i7.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i2.FileControlDirective, selector: "input[type=file]", inputs: ["writeFile", "extension", "fileSize", "file"] }, { type: i2.ImageFileControlDirective, selector: "input[type=file]", inputs: ["image"] }, { type: i5.MatExpansionPanelActionRow, selector: "mat-action-row" }], encapsulation: i0.ViewEncapsulation.None });
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: TemplateFormComponent, decorators: [{
|
|
174
|
+
type: Component,
|
|
175
|
+
args: [{ selector: 'app-template-form', encapsulation: ViewEncapsulation.None, template: "<vd-layout-nav color=\"primary\" [backNavigationRoute]=\"listRoute\" toolbarTitle=\"Template\" i18n-toolbarTitle [editMode]=\"isEditMode\" [menuItems]=\"toolbarMenuItems\" (reload)=\"reloadPage()\">\r\n\t<form *ngIf=\"form\" [formGroup]=\"form\" novalidate (ngSubmit)=\"save()\">\r\n\t\t<vd-layout-card-over class=\"accordion\" cardWidth=\"70\" color=\"primary\" flex>\r\n\t\t\t<mat-accordion [multi]=\"!isEditMode\">\r\n\t\t\t\t<!-- #region Details -->\r\n\t\t\t\t<mat-expansion-panel expanded=\"true\" id=\"details\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title i18n>Details</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\r\n\t\t\t\t\t<!-- #region Client-->\r\n\t\t\t\t\t<div layout-gt-sm=\"row\" layout=\"column\" *ngIf=\"settings?.multitenantable && !isClientAdmin\">\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Client</mat-label>\r\n\t\t\t\t\t\t\t<vd-select formControlName=\"clientId\" endpoint=\"client?enabled=true\" layout=\"column\" flex></vd-select>\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.clientId['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t\t<mat-hint i18n>If empty this template will be used for all projects</mat-hint>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Type-->\r\n\t\t\t\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Type</mat-label>\r\n\t\t\t\t\t\t\t<vd-select formControlName=\"type\" [enum]=\"TemplateType\" layout=\"column\" flex></vd-select>\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.type['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Name & Subject -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<!-- #region Name -->\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Name</mat-label>\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"name\">\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.name['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Key -->\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Key</mat-label>\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"key\">\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.key['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Subject -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Subject</mat-label>\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"subject\">\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.subject['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Attachments -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin>\r\n\t\t\t\t\t\t\t<mat-label i18n>Attachments</mat-label>\r\n\t\t\t\t\t\t\t<mat-chip-list #chipList formControlName=\"attachments\">\r\n\t\t\t\t\t\t\t\t<mat-chip *ngFor=\"let attachment of form.controls.attachments.value\" [selectable]=\"true\" color=\"primary\" removable=\"true\" (removed)=\"removeAttachment(attachment)\" (click)=\"downloadAttachment(attachment)\" selected>\r\n\t\t\t\t\t\t\t\t\t{{attachment.originalName}}\r\n\t\t\t\t\t\t\t\t\t<mat-icon matChipRemove>cancel</mat-icon>\r\n\t\t\t\t\t\t\t\t</mat-chip>\r\n\t\t\t\t\t\t\t\t<input placeholder=\"Attachments\" i18n-placeholder [matChipInputFor]=\"chipList\" [matChipInputAddOnBlur]=\"false\" (click)=\"fileInput.click()\" readonly>\r\n\t\t\t\t\t\t\t\t<mat-icon matSuffix (click)=\"fileInput.click()\">publish</mat-icon>\r\n\t\t\t\t\t\t\t\t<input hidden type=\"file\" accept=\"{{allowedExtensions}}\" #fileInput (change)=\"uploadAttachment($event.target.files[0])\" />\r\n\t\t\t\t\t\t\t</mat-chip-list>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Notice -->\r\n\t\t\t\t\t<div layout=\"row\" flex>\r\n\t\t\t\t\t\t<mat-form-field flex layout-margin appearance=\"outline\">\r\n\t\t\t\t\t\t\t<mat-label i18n>Notice</mat-label>\r\n\t\t\t\t\t\t\t<textarea matInput autocomplete=\"off\" formControlName=\"notice\"></textarea>\r\n\t\t\t\t\t\t\t<mat-error *ngFor=\"let errorMessage of form.controls.notice['errorMessages']\">{{errorMessage}}</mat-error>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Enabled-->\r\n\t\t\t\t\t<div layout-gt-sm=\"row\" layout=\"column\">\r\n\t\t\t\t\t\t<div layout-margin appearance=\"outline\" class=\"push-top push-bottom\">\r\n\t\t\t\t\t\t\t<mat-checkbox formControlName=\"enabled\" i18n>Activ</mat-checkbox>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"submit\" mat-flat-button color=\"primary\" [disabled]=\"isSaving\" i18n>Save</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"apply()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving\" i18n>Apply</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"back()\" i18n>Cancel</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t<!-- #region Content -->\r\n\t\t\t\t<mat-expansion-panel id=\"content\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t\t\t<span i18n>Content</span>\r\n\t\t\t\t\t\t</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\t\t\t\t\t<div layout-margin>\r\n\t\t\t\t\t\t<ngx-codemirror formControlName=\"content\" rows=\"160\" [options]=\"editorOptions\"></ngx-codemirror>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"submit\" mat-flat-button color=\"primary\" [disabled]=\"isSaving\" i18n>Save</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"apply()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving\" i18n>Apply</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"showPreview()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving || !form.pristine\" i18n=\"@@preview\">Preview</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"back()\" i18n>Cancel</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t<!-- #region Content -->\r\n\t\t\t\t<mat-expansion-panel id=\"testData\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t\t\t<span i18n=\"@@testData\">Test Data</span>\r\n\t\t\t\t\t\t</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\t\t\t\t\t<div layout-margin>\r\n\t\t\t\t\t\t<ngx-codemirror formControlName=\"dummyData\" rows=\"120\" [options]=\"jsonEditorOptions\"></ngx-codemirror>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"submit\" mat-flat-button color=\"primary\" [disabled]=\"isSaving\" i18n>Save</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"apply()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving\" i18n>Apply</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"showPreview()\" *ngIf=\"isEditMode\" [disabled]=\"isSaving || !form.pristine\" i18n=\"@@preview\">Preview</button>\r\n\t\t\t\t\t\t<button type=\"button\" mat-button (click)=\"back()\" i18n>Cancel</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t<!-- #region Audit -->\r\n\t\t\t\t<mat-expansion-panel id=\"audit\" *ngIf=\"isEditMode\">\r\n\t\t\t\t\t<mat-expansion-panel-header>\r\n\t\t\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t\t\t<span i18n>Audit</span>\r\n\t\t\t\t\t\t</mat-panel-title>\r\n\t\t\t\t\t</mat-expansion-panel-header>\r\n\t\t\t\t\t<vd-audit [item]=\"item\"> </vd-audit>\r\n\t\t\t\t\t<mat-action-row>\r\n\t\t\t\t\t\t<button type=\"button\" mat-flat-button color=\"accent\" (click)=\"back()\" i18n>Close</button>\r\n\t\t\t\t\t\t<span flex></span>\r\n\t\t\t\t\t</mat-action-row>\r\n\t\t\t\t</mat-expansion-panel>\r\n\t\t\t\t<!-- #endregion -->\r\n\t\t\t</mat-accordion>\r\n\t\t</vd-layout-card-over>\r\n\t</form>\r\n</vd-layout-nav>", styles: ["@import\"~codemirror/lib/codemirror.css\";@import\"~codemirror/theme/material.css\";codemirror{width:100%}.CodeMirror{height:500px}\n"] }]
|
|
176
|
+
}], ctorParameters: function () { return [{ type: i1.TemplateService }, { type: i2.FileService }, { type: i3.MatDialog }, { type: i4.ActivatedRoute }, { type: i0.ChangeDetectorRef }]; } });
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGstY21zL3NyYy9saWIvY29tbnBvbmVudHMvdGVtcGxhdGUtZm9ybS90ZW1wbGF0ZS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay1jbXMvc3JjL2xpYi9jb21ucG9uZW50cy90ZW1wbGF0ZS1mb3JtL3RlbXBsYXRlLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFckYsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sd0NBQXdDLENBQUM7QUFDaEQsT0FBTyxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9B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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50VHlwZSwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEF1dGhIZWxwZXIsIEZpbGVTZXJ2aWNlLCBHZW5lcmljUmVhY3RpdmVGb3JtQ29tcG9uZW50IH0gZnJvbSAnQG1lc3NhaWEvY2RrJztcclxuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJ0BtZXNzYWlhL2Nkay1iYXNlJztcclxuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL2VkaXQvY2xvc2V0YWcnO1xyXG5pbXBvcnQgJ2NvZGVtaXJyb3IvYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzJztcclxuaW1wb3J0ICdjb2RlbWlycm9yL2FkZG9uL3NlbGVjdGlvbi9hY3RpdmUtbGluZSc7XHJcbmltcG9ydCAnY29kZW1pcnJvci9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQnO1xyXG5pbXBvcnQgJ2NvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQnO1xyXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgVGVtcGxhdGVUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdGVtcGxhdGUtdHlwZSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RlbXBsYXRlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQcmV2aWV3IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RlbXBsYXRlLXByZXZpZXcnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQcmV2aWV3RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vdGVtcGxhdGUtcHJldmlldy1kaWFsb2cvdGVtcGxhdGUtcHJldmlldy1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnYXBwLXRlbXBsYXRlLWZvcm0nLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi90ZW1wbGF0ZS1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0ZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVGb3JtQ29tcG9uZW50IGV4dGVuZHMgR2VuZXJpY1JlYWN0aXZlRm9ybUNvbXBvbmVudDxUZW1wbGF0ZSwgVGVtcGxhdGVTZXJ2aWNlPiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRlbXBsYXRlIHR5cGVcclxuXHQgKi9cclxuXHRwdWJsaWMgVGVtcGxhdGVUeXBlOiB0eXBlb2YgVGVtcGxhdGVUeXBlID0gVGVtcGxhdGVUeXBlO1xyXG5cclxuXHQvKipcclxuXHQgKiBVc2VkIHRvIGRpc2FibGUgc29tZSBwcm9wZXJ0aWVzIGZvciBjbGllbnQgbWFuYWdlclxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0NsaWVudEFkbWluID0gQXV0aEhlbHBlci5oYXNSb2xlKCdDbGllbnRBZG1pbmlzdHJhdG9yJykgfHwgQXV0aEhlbHBlci5oYXNSb2xlKCdDbGllbnRNYW5hZ2VyJyk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgdG8gZGlzYWJsZSBzb21lIHByb3BlcnRpZXMgZm9yIGNsaWVudCBtYW5hZ2VyXHJcblx0ICovXHJcblx0cHVibGljIGlzQ2xpZW50TWFuYWdlciA9IEF1dGhIZWxwZXIuaGFzUm9sZSgnQ2xpZW50TWFuYWdlcicpO1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBhdHRhY2htZW50cyBjb250cm9sXHJcblx0ICovXHJcblx0Z2V0IGF0dGFjaG1lbnRzQ29udHJvbCgpIHsgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9scy5hdHRhY2htZW50czsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBFZGl0b3Igb3B0aW9uc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0b3JPcHRpb25zOiBhbnkgPSB7XHJcblx0XHRsaW5lTnVtYmVyczogdHJ1ZSxcclxuXHRcdHRoZW1lOiAnbWF0ZXJpYWwnLFxyXG5cdFx0YXV0b0Nsb3NlVGFnczogdHJ1ZSxcclxuXHRcdHN0eWxlQWN0aXZlTGluZTogdHJ1ZSxcclxuXHRcdG1vZGU6ICd0ZXh0L2h0bWwnLFxyXG5cdFx0cHJvZmlsZTogJ3hodG1sJ1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVkaXRvciBvcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIGpzb25FZGl0b3JPcHRpb25zOiBhbnkgPSB7XHJcblx0XHRsaW5lTnVtYmVyczogdHJ1ZSxcclxuXHRcdHRoZW1lOiAnbWF0ZXJpYWwnLFxyXG5cdFx0YXV0b0Nsb3NlVGFnczogdHJ1ZSxcclxuXHRcdHN0eWxlQWN0aXZlTGluZTogdHJ1ZSxcclxuXHRcdG1vZGU6IHtcclxuXHRcdFx0bmFtZTogXCJqYXZhc2NyaXB0XCIsXHJcblx0XHRcdGpzb246IHRydWUsXHJcblx0XHRcdHN0YXRlbWVudEluZGVudDogMlxyXG5cdFx0fSxcclxuXHRcdHByb2ZpbGU6ICd4aHRtbCcsXHJcblx0XHRsaW5lV3JhcHBpbmc6IHRydWUsXHJcblx0XHRpbmRlbnRXaXRoVGFiczogZmFsc2UsXHJcblx0XHR0YWJTaXplOiAyXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvclxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdGVjdGVkIHNlcnZpY2U6IFRlbXBsYXRlU2VydmljZSxcclxuXHRcdHByb3RlY3RlZCBmaWxlU2VydmljZTogRmlsZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgZGlhbG9nOiBNYXREaWFsb2csXHJcblx0XHRwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRcdC8vIEBPcHRpb25hbCgpIHByb3RlY3RlZCBzZXR0aW5nczogQ21zU2V0dGluZ3NcclxuXHQpIHtcclxuXHRcdHN1cGVyKFRlbXBsYXRlLCBzZXJ2aWNlLCByb3V0ZSwgY2hhbmdlRGV0ZWN0b3JSZWYpXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgYXR0YWNobWVudFxyXG5cdCAqIEBwYXJhbSBhdHRhY2htZW50IFxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZW1vdmVBdHRhY2htZW50KGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpOiB2b2lkIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHRoaXMuaXRlbS5hdHRhY2htZW50cykpIHtcclxuXHRcdFx0dmFyIGluZGV4ID0gdGhpcy5hdHRhY2htZW50c0NvbnRyb2wudmFsdWUuaW5kZXhPZihhdHRhY2htZW50LCAwKTtcclxuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcclxuXHRcdFx0XHR0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkNvbmZpcm0oe1xyXG5cdFx0XHRcdFx0bWVzc2FnZTogJ03DtmNodGVuIFNpZSBkaWVzZW4gQW5oYW5nIHdpcmtsaWNoIGzDtnNjaGVuPycsXHJcblx0XHRcdFx0XHR0aXRsZTogJ0zDtnNjaGVuIGJlc3TDpHRpZ2VuJyxcclxuXHRcdFx0XHRcdGNhbmNlbEJ1dHRvbjogJGxvY2FsaXplYDpAQGNhbmNlbDpDYW5jZWxgLFxyXG5cdFx0XHRcdFx0YWNjZXB0QnV0dG9uOiAkbG9jYWxpemVgOkBAeWVzOlllc2AsXHJcblx0XHRcdFx0fSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGFjY2VwdDogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGFjY2VwdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmF0dGFjaG1lbnRzQ29udHJvbC52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmF0dGFjaG1lbnRzQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdFx0XHRcdHRoaXMuYXR0YWNobWVudHNDb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwbG9hZHMgYSBhdHRhY2htZW50IGZpbGVcclxuXHQgKiBAcGFyYW0gZmlsZSBcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBsb2FkQXR0YWNobWVudChmaWxlOiBGaWxlKTogdm9pZCB7XHJcblx0XHRpZiAoZmlsZSAhPSBudWxsKSB7XHJcblx0XHRcdHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkKGZpbGUsIGB1cGxvYWRgLCB7IGNsaWVudElkOiB0aGlzLml0ZW0uY2xpZW50SWQsIHBhdGg6IGAke3RoaXMuaXRlbS5jbGllbnRJZCA/ICcnIDogJ2NvbW1vbi8nfWRvY3NgIH0pLnN1YnNjcmliZShldmVudCA9PiB7XHJcblx0XHRcdFx0aWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpIHtcclxuXHJcblx0XHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIHByb2dyZXNzIHBlcmNlbnRhZ2UgKi9cclxuXHRcdFx0XHRcdGNvbnN0IHBlcmNlbnREb25lID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCk7XHJcblxyXG5cdFx0XHRcdFx0LyogUGFzcyB0aGUgcGVyY2VudGFnZSBpbnRvIHRoZSBwcm9ncmVzcy1zdHJlYW0gKi9cclxuXHRcdFx0XHRcdGNvbnNvbGUuaW5mbyhwZXJjZW50RG9uZSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0LyogQWRkIG91ciBhdHRhY2htZW50cyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5hdHRhY2htZW50c0NvbnRyb2wuc2V0VmFsdWUoWy4uLnRoaXMuYXR0YWNobWVudHNDb250cm9sLnZhbHVlLCA8QXR0YWNobWVudD5ldmVudC5ib2R5XSk7XHJcblx0XHRcdFx0XHR0aGlzLmF0dGFjaG1lbnRzQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHRcdFx0XHR0aGlzLmF0dGFjaG1lbnRzQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEb3dubG9hZHMgYSBhdHRhY2htZW50XHJcblx0ICogQHBhcmFtIGF0dGFjaG1lbnQgXHJcblx0ICovXHJcblx0cHVibGljIGRvd25sb2FkQXR0YWNobWVudChhdHRhY2htZW50OiBBdHRhY2htZW50KTogdm9pZCB7XHJcblx0XHRpZiAoYXR0YWNobWVudC5pZCkge1xyXG5cdFx0XHR0aGlzLnNlcnZpY2UuZG93bmxvYWQoYGRvd25sb2FkQXR0YWNobWVudC8ke2F0dGFjaG1lbnQuaWR9YCkuc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHRcdHNhdmVBcyhuZXcgQmxvYihbeC5kYXRhXSwgeyB0eXBlOiAnJyB9KSwgeC5maWxlbmFtZSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvd3MgdGVtcGxhdGUgcHJldmlld1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBzaG93UHJldmlldygpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlhbG9nLm9wZW4oVGVtcGxhdGVQcmV2aWV3RGlhbG9nQ29tcG9uZW50LCB7XHJcblx0XHRcdHdpZHRoOiB0aGlzLml0ZW0udHlwZSA9PSBUZW1wbGF0ZVR5cGUuUGRmID8gJzEwMjBweCcgOiAnOTIwcHgnLFxyXG5cdFx0XHRkYXRhOiBuZXcgVGVtcGxhdGVQcmV2aWV3KHtcclxuXHRcdFx0XHR0ZW1wbGF0ZUlkOiB0aGlzLml0ZW0uaWQsXHJcblx0XHRcdFx0dHlwZTogdGhpcy5pdGVtLnR5cGVcclxuXHRcdFx0fSksXHJcblx0XHRcdHBhbmVsQ2xhc3M6IFsnZGlhbG9nLWZ1bGwtc2NyZWVuJ11cclxuXHRcdH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBUZW1wbGF0ZVxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBuZXdJbnN0YW5jZSgpOiBUZW1wbGF0ZSB7XHJcblx0XHRsZXQgaXRlbSA9IG5ldyBUZW1wbGF0ZSgpO1xyXG5cclxuXHRcdC8qIEdldCBjbGllbnRJZCAqL1xyXG5cdFx0aWYgKCF0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5pc0NsaWVudE1hbmFnZXIpIHtcclxuXHRcdFx0Ly8gdGhpcy5jbGllbnRNYW5hZ2VyU2VydmljZS5nZXRDbGllbnRJZCgpLnN1YnNjcmliZSh4ID0+IGl0ZW0uY2xpZW50SWQgPSB4KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaXRlbTtcclxuXHR9XHJcbn0iLCI8dmQtbGF5b3V0LW5hdiBjb2xvcj1cInByaW1hcnlcIiBbYmFja05hdmlnYXRpb25Sb3V0ZV09XCJsaXN0Um91dGVcIiB0b29sYmFyVGl0bGU9XCJUZW1wbGF0ZVwiIGkxOG4tdG9vbGJhclRpdGxlIFtlZGl0TW9kZV09XCJpc0VkaXRNb2RlXCIgW21lbnVJdGVtc109XCJ0b29sYmFyTWVudUl0ZW1zXCIgKHJlbG9hZCk9XCJyZWxvYWRQYWdlKClcIj5cclxuXHQ8Zm9ybSAqbmdJZj1cImZvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1cIiBub3ZhbGlkYXRlIChuZ1N1Ym1pdCk9XCJzYXZlKClcIj5cclxuXHRcdDx2ZC1sYXlvdXQtY2FyZC1vdmVyIGNsYXNzPVwiYWNjb3JkaW9uXCIgY2FyZFdpZHRoPVwiNzBcIiBjb2xvcj1cInByaW1hcnlcIiBmbGV4PlxyXG5cdFx0XHQ8bWF0LWFjY29yZGlvbiBbbXVsdGldPVwiIWlzRWRpdE1vZGVcIj5cclxuXHRcdFx0XHQ8IS0tICNyZWdpb24gRGV0YWlscyAtLT5cclxuXHRcdFx0XHQ8bWF0LWV4cGFuc2lvbi1wYW5lbCBleHBhbmRlZD1cInRydWVcIiBpZD1cImRldGFpbHNcIj5cclxuXHRcdFx0XHRcdDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHRcdFx0XHRcdFx0PG1hdC1wYW5lbC10aXRsZSBpMThuPkRldGFpbHM8L21hdC1wYW5lbC10aXRsZT5cclxuXHRcdFx0XHRcdDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIENsaWVudC0tPlxyXG5cdFx0XHRcdFx0PGRpdiBsYXlvdXQtZ3Qtc209XCJyb3dcIiBsYXlvdXQ9XCJjb2x1bW5cIiAqbmdJZj1cInNldHRpbmdzPy5tdWx0aXRlbmFudGFibGUgJiYgIWlzQ2xpZW50QWRtaW5cIj5cclxuXHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkIGZsZXggbGF5b3V0LW1hcmdpbiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtbGFiZWwgaTE4bj5DbGllbnQ8L21hdC1sYWJlbD5cclxuXHRcdFx0XHRcdFx0XHQ8dmQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNsaWVudElkXCIgZW5kcG9pbnQ9XCJjbGllbnQ/ZW5hYmxlZD10cnVlXCIgbGF5b3V0PVwiY29sdW1uXCIgZmxleD48L3ZkLXNlbGVjdD5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybS5jb250cm9scy5jbGllbnRJZFsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaGludCBpMThuPklmIGVtcHR5IHRoaXMgdGVtcGxhdGUgd2lsbCBiZSB1c2VkIGZvciBhbGwgcHJvamVjdHM8L21hdC1oaW50PlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFR5cGUtLT5cclxuXHRcdFx0XHRcdDxkaXYgbGF5b3V0LWd0LXNtPVwicm93XCIgbGF5b3V0PVwiY29sdW1uXCI+XHJcblx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCBmbGV4IGxheW91dC1tYXJnaW4gYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWxhYmVsIGkxOG4+VHlwZTwvbWF0LWxhYmVsPlxyXG5cdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiIFtlbnVtXT1cIlRlbXBsYXRlVHlwZVwiIGxheW91dD1cImNvbHVtblwiIGZsZXg+PC92ZC1zZWxlY3Q+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1lcnJvciAqbmdGb3I9XCJsZXQgZXJyb3JNZXNzYWdlIG9mIGZvcm0uY29udHJvbHMudHlwZVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIE5hbWUgJiBTdWJqZWN0IC0tPlxyXG5cdFx0XHRcdFx0PGRpdiBsYXlvdXQ9XCJyb3dcIiBmbGV4PlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTmFtZSAtLT5cclxuXHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkIGZsZXggbGF5b3V0LW1hcmdpbiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtbGFiZWwgaTE4bj5OYW1lPC9tYXQtbGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybS5jb250cm9scy5uYW1lWydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcblx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBLZXkgLS0+XHJcblx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCBmbGV4IGxheW91dC1tYXJnaW4gYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWxhYmVsIGkxOG4+S2V5PC9tYXQtbGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImtleVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtLmNvbnRyb2xzLmtleVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gU3ViamVjdCAtLT5cclxuXHRcdFx0XHRcdDxkaXYgbGF5b3V0PVwicm93XCIgZmxleD5cclxuXHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkIGZsZXggbGF5b3V0LW1hcmdpbiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtbGFiZWwgaTE4bj5TdWJqZWN0PC9tYXQtbGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInN1YmplY3RcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvck1lc3NhZ2Ugb2YgZm9ybS5jb250cm9scy5zdWJqZWN0WydlcnJvck1lc3NhZ2VzJ11cIj57e2Vycm9yTWVzc2FnZX19PC9tYXQtZXJyb3I+XHJcblx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gQXR0YWNobWVudHMgLS0+XHJcblx0XHRcdFx0XHQ8ZGl2IGxheW91dD1cInJvd1wiIGZsZXg+XHJcblx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCBmbGV4IGxheW91dC1tYXJnaW4+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1sYWJlbCBpMThuPkF0dGFjaG1lbnRzPC9tYXQtbGFiZWw+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1jaGlwLWxpc3QgI2NoaXBMaXN0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaG1lbnRzXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bWF0LWNoaXAgKm5nRm9yPVwibGV0IGF0dGFjaG1lbnQgb2YgZm9ybS5jb250cm9scy5hdHRhY2htZW50cy52YWx1ZVwiIFtzZWxlY3RhYmxlXT1cInRydWVcIiBjb2xvcj1cInByaW1hcnlcIiByZW1vdmFibGU9XCJ0cnVlXCIgKHJlbW92ZWQpPVwicmVtb3ZlQXR0YWNobWVudChhdHRhY2htZW50KVwiIChjbGljayk9XCJkb3dubG9hZEF0dGFjaG1lbnQoYXR0YWNobWVudClcIiBzZWxlY3RlZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0e3thdHRhY2htZW50Lm9yaWdpbmFsTmFtZX19XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1jaGlwPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHBsYWNlaG9sZGVyPVwiQXR0YWNobWVudHNcIiBpMThuLXBsYWNlaG9sZGVyIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIiBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImZhbHNlXCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCIgcmVhZG9ubHk+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bWF0LWljb24gbWF0U3VmZml4IChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPnB1Ymxpc2g8L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IGhpZGRlbiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cInt7YWxsb3dlZEV4dGVuc2lvbnN9fVwiICNmaWxlSW5wdXQgKGNoYW5nZSk9XCJ1cGxvYWRBdHRhY2htZW50KCRldmVudC50YXJnZXQuZmlsZXNbMF0pXCIgLz5cclxuXHRcdFx0XHRcdFx0XHQ8L21hdC1jaGlwLWxpc3Q+XHJcblx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTm90aWNlIC0tPlxyXG5cdFx0XHRcdFx0PGRpdiBsYXlvdXQ9XCJyb3dcIiBmbGV4PlxyXG5cdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgZmxleCBsYXlvdXQtbWFyZ2luIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1sYWJlbCBpMThuPk5vdGljZTwvbWF0LWxhYmVsPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBmb3JtQ29udHJvbE5hbWU9XCJub3RpY2VcIj48L3RleHRhcmVhPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yTWVzc2FnZSBvZiBmb3JtLmNvbnRyb2xzLm5vdGljZVsnZXJyb3JNZXNzYWdlcyddXCI+e3tlcnJvck1lc3NhZ2V9fTwvbWF0LWVycm9yPlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIEVuYWJsZWQtLT5cclxuXHRcdFx0XHRcdDxkaXYgbGF5b3V0LWd0LXNtPVwicm93XCIgbGF5b3V0PVwiY29sdW1uXCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgbGF5b3V0LW1hcmdpbiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwicHVzaC10b3AgcHVzaC1ib3R0b21cIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cImVuYWJsZWRcIiBpMThuPkFjdGl2PC9tYXQtY2hlY2tib3g+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PG1hdC1hY3Rpb24tcm93PlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImlzU2F2aW5nXCIgaTE4bj5TYXZlPC9idXR0b24+XHJcblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gKGNsaWNrKT1cImFwcGx5KClcIiAqbmdJZj1cImlzRWRpdE1vZGVcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIiBpMThuPkFwcGx5PC9idXR0b24+XHJcblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gKGNsaWNrKT1cImJhY2soKVwiIGkxOG4+Q2FuY2VsPC9idXR0b24+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGZsZXg+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9tYXQtYWN0aW9uLXJvdz5cclxuXHRcdFx0XHQ8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcblx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHQ8IS0tICNyZWdpb24gQ29udGVudCAtLT5cclxuXHRcdFx0XHQ8bWF0LWV4cGFuc2lvbi1wYW5lbCBpZD1cImNvbnRlbnRcIj5cclxuXHRcdFx0XHRcdDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHRcdFx0XHRcdFx0PG1hdC1wYW5lbC10aXRsZT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpMThuPkNvbnRlbnQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbWF0LXBhbmVsLXRpdGxlPlxyXG5cdFx0XHRcdFx0PC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHRcdFx0XHRcdDxkaXYgbGF5b3V0LW1hcmdpbj5cclxuXHRcdFx0XHRcdFx0PG5neC1jb2RlbWlycm9yIGZvcm1Db250cm9sTmFtZT1cImNvbnRlbnRcIiByb3dzPVwiMTYwXCIgW29wdGlvbnNdPVwiZWRpdG9yT3B0aW9uc1wiPjwvbmd4LWNvZGVtaXJyb3I+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxtYXQtYWN0aW9uLXJvdz5cclxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiIGkxOG4+U2F2ZTwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtYnV0dG9uIChjbGljayk9XCJhcHBseSgpXCIgKm5nSWY9XCJpc0VkaXRNb2RlXCIgW2Rpc2FibGVkXT1cImlzU2F2aW5nXCIgaTE4bj5BcHBseTwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtYnV0dG9uIChjbGljayk9XCJzaG93UHJldmlldygpXCIgKm5nSWY9XCJpc0VkaXRNb2RlXCIgW2Rpc2FibGVkXT1cImlzU2F2aW5nIHx8ICFmb3JtLnByaXN0aW5lXCIgaTE4bj1cIkBAcHJldmlld1wiPlByZXZpZXc8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwiYmFjaygpXCIgaTE4bj5DYW5jZWw8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gZmxleD48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L21hdC1hY3Rpb24tcm93PlxyXG5cdFx0XHRcdDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdDwhLS0gI3JlZ2lvbiBDb250ZW50IC0tPlxyXG5cdFx0XHRcdDxtYXQtZXhwYW5zaW9uLXBhbmVsIGlkPVwidGVzdERhdGFcIj5cclxuXHRcdFx0XHRcdDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHRcdFx0XHRcdFx0PG1hdC1wYW5lbC10aXRsZT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpMThuPVwiQEB0ZXN0RGF0YVwiPlRlc3QgRGF0YTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PC9tYXQtcGFuZWwtdGl0bGU+XHJcblx0XHRcdFx0XHQ8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG5cdFx0XHRcdFx0PGRpdiBsYXlvdXQtbWFyZ2luPlxyXG5cdFx0XHRcdFx0XHQ8bmd4LWNvZGVtaXJyb3IgZm9ybUNvbnRyb2xOYW1lPVwiZHVtbXlEYXRhXCIgcm93cz1cIjEyMFwiIFtvcHRpb25zXT1cImpzb25FZGl0b3JPcHRpb25zXCI+PC9uZ3gtY29kZW1pcnJvcj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PG1hdC1hY3Rpb24tcm93PlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImlzU2F2aW5nXCIgaTE4bj5TYXZlPC9idXR0b24+XHJcblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gKGNsaWNrKT1cImFwcGx5KClcIiAqbmdJZj1cImlzRWRpdE1vZGVcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIiBpMThuPkFwcGx5PC9idXR0b24+XHJcblx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gKGNsaWNrKT1cInNob3dQcmV2aWV3KClcIiAqbmdJZj1cImlzRWRpdE1vZGVcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmcgfHwgIWZvcm0ucHJpc3RpbmVcIiBpMThuPVwiQEBwcmV2aWV3XCI+UHJldmlldzwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtYnV0dG9uIChjbGljayk9XCJiYWNrKClcIiBpMThuPkNhbmNlbDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBmbGV4Pjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvbWF0LWFjdGlvbi1yb3c+XHJcblx0XHRcdFx0PC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0PCEtLSAjcmVnaW9uIEF1ZGl0IC0tPlxyXG5cdFx0XHRcdDxtYXQtZXhwYW5zaW9uLXBhbmVsIGlkPVwiYXVkaXRcIiAqbmdJZj1cImlzRWRpdE1vZGVcIj5cclxuXHRcdFx0XHRcdDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHRcdFx0XHRcdFx0PG1hdC1wYW5lbC10aXRsZT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBpMThuPkF1ZGl0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8L21hdC1wYW5lbC10aXRsZT5cclxuXHRcdFx0XHRcdDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblx0XHRcdFx0XHQ8dmQtYXVkaXQgW2l0ZW1dPVwiaXRlbVwiPiA8L3ZkLWF1ZGl0PlxyXG5cdFx0XHRcdFx0PG1hdC1hY3Rpb24tcm93PlxyXG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwiYmFjaygpXCIgaTE4bj5DbG9zZTwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBmbGV4Pjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvbWF0LWFjdGlvbi1yb3c+XHJcblx0XHRcdFx0PC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHRcdFx0PC9tYXQtYWNjb3JkaW9uPlxyXG5cdFx0PC92ZC1sYXlvdXQtY2FyZC1vdmVyPlxyXG5cdDwvZm9ybT5cclxuPC92ZC1sYXlvdXQtbmF2PiJdfQ==
|