ngx-dynamic-entity 1.0.0 → 1.2.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.
Files changed (62) hide show
  1. package/README.md +129 -139
  2. package/esm2022/lib/field-types/array-field.component.mjs +112 -104
  3. package/esm2022/lib/field-types/boolean-field.component.mjs +62 -61
  4. package/esm2022/lib/field-types/checkbox-field.component.mjs +48 -47
  5. package/esm2022/lib/field-types/currency-field.component.mjs +54 -53
  6. package/esm2022/lib/field-types/date-field.component.mjs +46 -45
  7. package/esm2022/lib/field-types/dropdown-field.component.mjs +89 -87
  8. package/esm2022/lib/field-types/email-field.component.mjs +64 -63
  9. package/esm2022/lib/field-types/entity-ref-field.component.mjs +85 -71
  10. package/esm2022/lib/field-types/field-component.contract.mjs +2 -0
  11. package/esm2022/lib/field-types/file-field.component.mjs +88 -87
  12. package/esm2022/lib/field-types/group-field.component.mjs +50 -50
  13. package/esm2022/lib/field-types/image-field.component.mjs +92 -91
  14. package/esm2022/lib/field-types/month-year-field.component.mjs +80 -79
  15. package/esm2022/lib/field-types/multi-select-field.component.mjs +66 -65
  16. package/esm2022/lib/field-types/number-field.component.mjs +71 -75
  17. package/esm2022/lib/field-types/password-field.component.mjs +68 -67
  18. package/esm2022/lib/field-types/radio-field.component.mjs +66 -65
  19. package/esm2022/lib/field-types/text-field.component.mjs +81 -74
  20. package/esm2022/lib/field-types/textarea-field.component.mjs +48 -47
  21. package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +53 -6
  22. package/esm2022/lib/form/dynamic-form.component.mjs +309 -20
  23. package/esm2022/lib/form/dynamic-record-form.component.mjs +36 -11
  24. package/esm2022/lib/providers/provide-field-types.mjs +1 -1
  25. package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +8 -2
  26. package/esm2022/lib/services/cascade-data.service.mjs +2 -2
  27. package/esm2022/lib/services/entity-ref-cache.mjs +1 -1
  28. package/esm2022/lib/services/entity-ref-registry.service.mjs +2 -2
  29. package/esm2022/lib/services/entity-ref-selection.service.mjs +1 -1
  30. package/esm2022/lib/services/entity-reference.service.mjs +1 -1
  31. package/esm2022/lib/services/field-registry.service.mjs +1 -1
  32. package/esm2022/lib/services/file-upload.service.mjs +1 -1
  33. package/esm2022/lib/services/lookup-registry.service.mjs +2 -2
  34. package/esm2022/lib/services/rbac.service.mjs +1 -1
  35. package/esm2022/lib/services/validation-messages.service.mjs +56 -0
  36. package/esm2022/lib/services/validator-registry.service.mjs +35 -2
  37. package/esm2022/lib/tokens/injection-tokens.mjs +35 -6
  38. package/esm2022/public-api.mjs +23 -2
  39. package/fesm2022/ngx-dynamic-entity.mjs +1754 -1236
  40. package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
  41. package/lib/field-types/array-field.component.d.ts +7 -1
  42. package/lib/field-types/dropdown-field.component.d.ts +2 -1
  43. package/lib/field-types/entity-ref-field.component.d.ts +12 -2
  44. package/lib/field-types/field-component.contract.d.ts +49 -0
  45. package/lib/field-types/group-field.component.d.ts +1 -1
  46. package/lib/field-types/multi-select-field.component.d.ts +1 -1
  47. package/lib/field-types/number-field.component.d.ts +1 -0
  48. package/lib/field-types/radio-field.component.d.ts +1 -1
  49. package/lib/field-types/text-field.component.d.ts +10 -2
  50. package/lib/form/dynamic-field/dynamic-field.component.d.ts +39 -4
  51. package/lib/form/dynamic-form.component.d.ts +155 -8
  52. package/lib/form/dynamic-record-form.component.d.ts +13 -2
  53. package/lib/providers/provide-ngx-dynamic-entity.d.ts +25 -3
  54. package/lib/services/cascade-data.service.d.ts +1 -1
  55. package/lib/services/entity-ref-registry.service.d.ts +1 -1
  56. package/lib/services/lookup-registry.service.d.ts +1 -1
  57. package/lib/services/validation-messages.service.d.ts +43 -0
  58. package/lib/services/validator-registry.service.d.ts +13 -1
  59. package/lib/tokens/injection-tokens.d.ts +42 -7
  60. package/package.json +17 -18
  61. package/public-api.d.ts +12 -0
  62. package/styles.css +579 -0
@@ -1,9 +1,9 @@
1
- import { Component, Input, forwardRef } from '@angular/core';
1
+ import { Component, Input, forwardRef, ChangeDetectionStrategy } from '@angular/core';
2
2
  import { ReactiveFormsModule } from '@angular/forms';
3
3
  import { resolveLabel } from '@dynamic-entity/core';
4
4
  import { DynamicFieldComponent } from '../form/dynamic-field/dynamic-field.component';
5
5
  import * as i0 from "@angular/core";
6
- /** ADR-008: GroupFieldComponent — renders nested fieldset container for group.children */
6
+ /** Renders a nested fieldset container for a group field's children. */
7
7
  export class GroupFieldComponent {
8
8
  field;
9
9
  control;
@@ -20,56 +20,56 @@ export class GroupFieldComponent {
20
20
  return group?.get(childId);
21
21
  }
22
22
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GroupFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GroupFieldComponent, isStandalone: true, selector: "ngx-group-field", inputs: { field: "field", control: "control", config: "config", language: "language", readonly: "readonly", masked: "masked", userRoles: "userRoles" }, ngImport: i0, template: `
24
- <fieldset class="ngx-field ngx-field--group"
25
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
26
- <legend class="ngx-field__legend">{{ label }}</legend>
27
- @if (masked) {
28
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
29
- } @else {
30
- <div class="ngx-field__group-children">
31
- @for (child of field.children ?? []; track child.id) {
32
- @if (child.visibility !== false) {
33
- <ngx-dynamic-field
34
- [field]="child"
35
- [control]="getChildControl(child.id)"
36
- [config]="config"
37
- [language]="language"
38
- [readonly]="readonly || !!child.readonly"
39
- [userRoles]="userRoles"
40
- />
41
- }
42
- }
43
- </div>
44
- }
45
- </fieldset>
46
- `, isInline: true, styles: [".ngx-field--group{border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin-bottom:16px;background:#fafafa}.ngx-field__legend{font-weight:600;font-size:14px;padding:0 8px;color:#334155}.ngx-field__group-children{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "component", type: i0.forwardRef(() => DynamicFieldComponent), selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
23
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GroupFieldComponent, isStandalone: true, selector: "ngx-group-field", inputs: { field: "field", control: "control", config: "config", language: "language", readonly: "readonly", masked: "masked", userRoles: "userRoles" }, ngImport: i0, template: `
24
+ <fieldset class="ngx-field ngx-field--group"
25
+ [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
26
+ <legend class="ngx-field__legend">{{ label }}</legend>
27
+ @if (masked) {
28
+ <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
29
+ } @else {
30
+ <div class="ngx-field__group-children">
31
+ @for (child of field.children ?? []; track child.id) {
32
+ @if (child.visibility !== false) {
33
+ <ngx-dynamic-field
34
+ [field]="child"
35
+ [control]="getChildControl(child.id)"
36
+ [config]="config"
37
+ [language]="language"
38
+ [readonly]="readonly || !!child.readonly"
39
+ [userRoles]="userRoles"
40
+ />
41
+ }
42
+ }
43
+ </div>
44
+ }
45
+ </fieldset>
46
+ `, isInline: true, styles: [".ngx-field--group{border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin-bottom:16px;background:#fafafa}.ngx-field__legend{font-weight:600;font-size:14px;padding:0 8px;color:#334155}.ngx-field__group-children{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "component", type: i0.forwardRef(() => DynamicFieldComponent), selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
47
47
  }
48
48
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GroupFieldComponent, decorators: [{
49
49
  type: Component,
50
- args: [{ selector: 'ngx-group-field', standalone: true, imports: [ReactiveFormsModule, forwardRef(() => DynamicFieldComponent)], template: `
51
- <fieldset class="ngx-field ngx-field--group"
52
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
53
- <legend class="ngx-field__legend">{{ label }}</legend>
54
- @if (masked) {
55
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
56
- } @else {
57
- <div class="ngx-field__group-children">
58
- @for (child of field.children ?? []; track child.id) {
59
- @if (child.visibility !== false) {
60
- <ngx-dynamic-field
61
- [field]="child"
62
- [control]="getChildControl(child.id)"
63
- [config]="config"
64
- [language]="language"
65
- [readonly]="readonly || !!child.readonly"
66
- [userRoles]="userRoles"
67
- />
68
- }
69
- }
70
- </div>
71
- }
72
- </fieldset>
50
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngx-group-field', standalone: true, imports: [ReactiveFormsModule, forwardRef(() => DynamicFieldComponent)], template: `
51
+ <fieldset class="ngx-field ngx-field--group"
52
+ [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
53
+ <legend class="ngx-field__legend">{{ label }}</legend>
54
+ @if (masked) {
55
+ <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
56
+ } @else {
57
+ <div class="ngx-field__group-children">
58
+ @for (child of field.children ?? []; track child.id) {
59
+ @if (child.visibility !== false) {
60
+ <ngx-dynamic-field
61
+ [field]="child"
62
+ [control]="getChildControl(child.id)"
63
+ [config]="config"
64
+ [language]="language"
65
+ [readonly]="readonly || !!child.readonly"
66
+ [userRoles]="userRoles"
67
+ />
68
+ }
69
+ }
70
+ </div>
71
+ }
72
+ </fieldset>
73
73
  `, styles: [".ngx-field--group{border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin-bottom:16px;background:#fafafa}.ngx-field__legend{font-weight:600;font-size:14px;padding:0 8px;color:#334155}.ngx-field__group-children{display:flex;flex-direction:column;gap:12px}\n"] }]
74
74
  }], propDecorators: { field: [{
75
75
  type: Input
@@ -86,4 +86,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
86
86
  }], userRoles: [{
87
87
  type: Input
88
88
  }] } });
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9ncm91cC1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBOEIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7O0FBRXRGLDBGQUEwRjtBQW9EMUYsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixLQUFLLENBQXFCO0lBQzFCLE9BQU8sQ0FBbUI7SUFDMUIsTUFBTSxDQUFvQjtJQUMxQixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixTQUFTLEdBQWEsRUFBRSxDQUFDO0lBRWxDLElBQUksS0FBSztRQUNQLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQWU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQW9CLENBQUM7UUFDeEMsT0FBTyxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBb0IsQ0FBQztJQUNoRCxDQUFDO3dHQWhCVSxtQkFBbUI7NEZBQW5CLG1CQUFtQixtT0EvQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVCxvV0F4QlMsbUJBQW1CLG9EQUFtQixxQkFBcUI7OzRGQWdEMUQsbUJBQW1CO2tCQW5EL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxZQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlQ7OEJBeUJRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB0eXBlIHsgTmVzdGVkRmllbGRDb25maWcsIEVudGl0eUZvcm1Db25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcclxuaW1wb3J0IHsgRHluYW1pY0ZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9keW5hbWljLWZpZWxkL2R5bmFtaWMtZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8qKiBBRFItMDA4OiBHcm91cEZpZWxkQ29tcG9uZW50IOKAlCByZW5kZXJzIG5lc3RlZCBmaWVsZHNldCBjb250YWluZXIgZm9yIGdyb3VwLmNoaWxkcmVuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWdyb3VwLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBmb3J3YXJkUmVmKCgpID0+IER5bmFtaWNGaWVsZENvbXBvbmVudCldLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZmllbGRzZXQgY2xhc3M9XCJuZ3gtZmllbGQgbmd4LWZpZWxkLS1ncm91cFwiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIiBbYXR0ci5kYXRhLWZpZWxkLXR5cGVdPVwiZmllbGQudHlwZVwiIFtjbGFzcy5uZ3gtZmllbGQtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2NsYXNzLm5neC1maWVsZC0tbWFza2VkXT1cIm1hc2tlZFwiPlxyXG4gICAgICA8bGVnZW5kIGNsYXNzPVwibmd4LWZpZWxkX19sZWdlbmRcIj57eyBsYWJlbCB9fTwvbGVnZW5kPlxyXG4gICAgICBAaWYgKG1hc2tlZCkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19ncm91cC1jaGlsZHJlblwiPlxyXG4gICAgICAgICAgQGZvciAoY2hpbGQgb2YgZmllbGQuY2hpbGRyZW4gPz8gW107IHRyYWNrIGNoaWxkLmlkKSB7XHJcbiAgICAgICAgICAgIEBpZiAoY2hpbGQudmlzaWJpbGl0eSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICA8bmd4LWR5bmFtaWMtZmllbGRcclxuICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjaGlsZFwiXHJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDaGlsZENvbnRyb2woY2hpbGQuaWQpXCJcclxuICAgICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcclxuICAgICAgICAgICAgICAgIFtsYW5ndWFnZV09XCJsYW5ndWFnZVwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgISFjaGlsZC5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2ZpZWxkc2V0PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgXHJcbiAgICAgIC5uZ3gtZmllbGQtLWdyb3VwIHtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgICBwYWRkaW5nOiAxNnB4O1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XHJcbiAgICAgICAgYmFja2dyb3VuZDogI2ZhZmFmYTtcclxuICAgICAgfVxyXG4gICAgICAubmd4LWZpZWxkX19sZWdlbmQge1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgOHB4O1xyXG4gICAgICAgIGNvbG9yOiAjMzM0MTU1O1xyXG4gICAgICB9XHJcbiAgICAgIC5uZ3gtZmllbGRfX2dyb3VwLWNoaWxkcmVuIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcbiAgICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcm91cEZpZWxkQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBmaWVsZCE6IE5lc3RlZEZpZWxkQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGNvbnRyb2whOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgQElucHV0KCkgY29uZmlnITogRW50aXR5Rm9ybUNvbmZpZztcclxuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcclxuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHVzZXJSb2xlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcclxuICB9XHJcblxyXG4gIGdldENoaWxkQ29udHJvbChjaGlsZElkOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgcmV0dXJuIGdyb3VwPy5nZXQoY2hpbGRJZCkgYXMgQWJzdHJhY3RDb250cm9sO1xyXG4gIH1cclxufVxyXG4iXX0=
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9ncm91cC1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBOEIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7O0FBRXRGLHdFQUF3RTtBQXFEeEUsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixLQUFLLENBQXFCO0lBQzFCLE9BQU8sQ0FBbUI7SUFDMUIsTUFBTSxDQUFvQjtJQUMxQixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixTQUFTLEdBQWEsRUFBRSxDQUFDO0lBRWxDLElBQUksS0FBSztRQUNQLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQWU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQW9CLENBQUM7UUFDeEMsT0FBTyxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBb0IsQ0FBQztJQUNoRCxDQUFDO3dHQWhCVSxtQkFBbUI7NEZBQW5CLG1CQUFtQixtT0EvQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVCxvV0F4QlMsbUJBQW1CLG9EQUFtQixxQkFBcUI7OzRGQWdEMUQsbUJBQW1CO2tCQXBEL0IsU0FBUztzQ0FDUyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFlBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVDs4QkF5QlEsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgZm9yd2FyZFJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRGaWVsZENvbmZpZywgRW50aXR5Rm9ybUNvbmZpZyB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZHluYW1pYy1maWVsZC9keW5hbWljLWZpZWxkLmNvbXBvbmVudCc7XG5cbi8qKiBSZW5kZXJzIGEgbmVzdGVkIGZpZWxkc2V0IGNvbnRhaW5lciBmb3IgYSBncm91cCBmaWVsZCdzIGNoaWxkcmVuLiAqL1xuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ25neC1ncm91cC1maWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBmb3J3YXJkUmVmKCgpID0+IER5bmFtaWNGaWVsZENvbXBvbmVudCldLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxmaWVsZHNldCBjbGFzcz1cIm5neC1maWVsZCBuZ3gtZmllbGQtLWdyb3VwXCJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIiBbYXR0ci5kYXRhLWZpZWxkLXR5cGVdPVwiZmllbGQudHlwZVwiIFtjbGFzcy5uZ3gtZmllbGQtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2NsYXNzLm5neC1maWVsZC0tbWFza2VkXT1cIm1hc2tlZFwiPlxuICAgICAgPGxlZ2VuZCBjbGFzcz1cIm5neC1maWVsZF9fbGVnZW5kXCI+e3sgbGFiZWwgfX08L2xlZ2VuZD5cbiAgICAgIEBpZiAobWFza2VkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGRfX2dyb3VwLWNoaWxkcmVuXCI+XG4gICAgICAgICAgQGZvciAoY2hpbGQgb2YgZmllbGQuY2hpbGRyZW4gPz8gW107IHRyYWNrIGNoaWxkLmlkKSB7XG4gICAgICAgICAgICBAaWYgKGNoaWxkLnZpc2liaWxpdHkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIDxuZ3gtZHluYW1pYy1maWVsZFxuICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjaGlsZFwiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q2hpbGRDb250cm9sKGNoaWxkLmlkKVwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgICAgIFtsYW5ndWFnZV09XCJsYW5ndWFnZVwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8ICEhY2hpbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt1c2VyUm9sZXNdPVwidXNlclJvbGVzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZmllbGRzZXQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5uZ3gtZmllbGQtLWdyb3VwIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBwYWRkaW5nOiAxNnB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICAgICAgfVxuICAgICAgLm5neC1maWVsZF9fbGVnZW5kIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBwYWRkaW5nOiAwIDhweDtcbiAgICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICB9XG4gICAgICAubmd4LWZpZWxkX19ncm91cC1jaGlsZHJlbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBHcm91cEZpZWxkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcbiAgQElucHV0KCkgY29uZmlnITogRW50aXR5Rm9ybUNvbmZpZztcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB1c2VyUm9sZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbCh0aGlzLmZpZWxkPy5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICBnZXRDaGlsZENvbnRyb2woY2hpbGRJZDogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgcmV0dXJuIGdyb3VwPy5nZXQoY2hpbGRJZCkgYXMgQWJzdHJhY3RDb250cm9sO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { Component, inject, Input, signal } from '@angular/core';
1
+ import { Component, inject, Input, signal, ChangeDetectionStrategy } from '@angular/core';
2
2
  import { resolveLabel } from '@dynamic-entity/core';
3
3
  import { FileUploadService } from '../services/file-upload.service';
4
4
  import * as i0 from "@angular/core";
@@ -56,102 +56,103 @@ export class ImageFieldComponent {
56
56
  this.uploads.revokePreviewUrl(this.previewCache);
57
57
  }
58
58
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImageFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ImageFieldComponent, isStandalone: true, selector: "ngx-image-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
60
- <div class="ngx-field ngx-field--image"
61
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
62
- <label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
63
- @if (masked) {
64
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
65
- } @else {
66
- <div class="ngx-field__image-wrap">
67
- @if (previewUrl()) {
68
- <img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
69
- } @else {
70
- <div class="ngx-field__image-placeholder">
71
- <span>📷</span>
72
- <span>No image</span>
73
- </div>
74
- }
75
- @if (!readonly) {
76
- <div class="ngx-field__image-actions">
77
- <label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
78
- @if (uploading()) {
79
- <span>Uploading…</span>
80
- } @else {
81
- <span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
82
- <input
83
- type="file"
84
- class="ngx-field__file-input"
85
- [id]="'field-' + field.id"
86
- accept="image/*"
87
- [disabled]="field.disabled || uploading()"
88
- (change)="onFileSelect($any($event.target).files[0])"
89
- />
90
- }
91
- </label>
92
- @if (previewUrl()) {
93
- <button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
94
- }
95
- </div>
96
- }
97
- </div>
98
- @if (uploadError()) {
99
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
100
- }
101
- }
102
- </div>
103
- `, isInline: true });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ImageFieldComponent, isStandalone: true, selector: "ngx-image-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
60
+ <div class="ngx-field ngx-field--image"
61
+ [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
62
+ <label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
63
+ @if (masked) {
64
+ <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
65
+ } @else {
66
+ <div class="ngx-field__image-wrap">
67
+ @if (previewUrl()) {
68
+ <img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
69
+ } @else {
70
+ <div class="ngx-field__image-placeholder">
71
+ <span>📷</span>
72
+ <span>No image</span>
73
+ </div>
74
+ }
75
+ @if (!readonly) {
76
+ <div class="ngx-field__image-actions">
77
+ <label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
78
+ @if (uploading()) {
79
+ <span>Uploading…</span>
80
+ } @else {
81
+ <span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
82
+ <input
83
+ type="file"
84
+ class="ngx-field__file-input"
85
+ [id]="'field-' + field.id"
86
+ accept="image/*"
87
+ [disabled]="field.disabled || uploading()"
88
+ (change)="onFileSelect($any($event.target).files[0])"
89
+ />
90
+ }
91
+ </label>
92
+ @if (previewUrl()) {
93
+ <button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
94
+ }
95
+ </div>
96
+ }
97
+ </div>
98
+ @if (uploadError()) {
99
+ <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
100
+ }
101
+ }
102
+ </div>
103
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
104
104
  }
105
105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImageFieldComponent, decorators: [{
106
106
  type: Component,
107
107
  args: [{
108
+ changeDetection: ChangeDetectionStrategy.OnPush,
108
109
  selector: 'ngx-image-field',
109
110
  standalone: true,
110
111
  imports: [],
111
- template: `
112
- <div class="ngx-field ngx-field--image"
113
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
114
- <label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
115
- @if (masked) {
116
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
117
- } @else {
118
- <div class="ngx-field__image-wrap">
119
- @if (previewUrl()) {
120
- <img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
121
- } @else {
122
- <div class="ngx-field__image-placeholder">
123
- <span>📷</span>
124
- <span>No image</span>
125
- </div>
126
- }
127
- @if (!readonly) {
128
- <div class="ngx-field__image-actions">
129
- <label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
130
- @if (uploading()) {
131
- <span>Uploading…</span>
132
- } @else {
133
- <span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
134
- <input
135
- type="file"
136
- class="ngx-field__file-input"
137
- [id]="'field-' + field.id"
138
- accept="image/*"
139
- [disabled]="field.disabled || uploading()"
140
- (change)="onFileSelect($any($event.target).files[0])"
141
- />
142
- }
143
- </label>
144
- @if (previewUrl()) {
145
- <button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
146
- }
147
- </div>
148
- }
149
- </div>
150
- @if (uploadError()) {
151
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
152
- }
153
- }
154
- </div>
112
+ template: `
113
+ <div class="ngx-field ngx-field--image"
114
+ [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
115
+ <label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
116
+ @if (masked) {
117
+ <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
118
+ } @else {
119
+ <div class="ngx-field__image-wrap">
120
+ @if (previewUrl()) {
121
+ <img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
122
+ } @else {
123
+ <div class="ngx-field__image-placeholder">
124
+ <span>📷</span>
125
+ <span>No image</span>
126
+ </div>
127
+ }
128
+ @if (!readonly) {
129
+ <div class="ngx-field__image-actions">
130
+ <label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
131
+ @if (uploading()) {
132
+ <span>Uploading…</span>
133
+ } @else {
134
+ <span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
135
+ <input
136
+ type="file"
137
+ class="ngx-field__file-input"
138
+ [id]="'field-' + field.id"
139
+ accept="image/*"
140
+ [disabled]="field.disabled || uploading()"
141
+ (change)="onFileSelect($any($event.target).files[0])"
142
+ />
143
+ }
144
+ </label>
145
+ @if (previewUrl()) {
146
+ <button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
147
+ }
148
+ </div>
149
+ }
150
+ </div>
151
+ @if (uploadError()) {
152
+ <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
153
+ }
154
+ }
155
+ </div>
155
156
  `,
156
157
  }]
157
158
  }], propDecorators: { field: [{
@@ -165,4 +166,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
165
166
  }], masked: [{
166
167
  type: Input
167
168
  }] } });
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9pbWFnZS1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBRXBFOzs7OztHQUtHO0FBbURILE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRWhCLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUU1QyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLFdBQVcsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRW5ELDJGQUEyRjtJQUNuRixhQUFhLEdBQW1CLElBQUksQ0FBQztJQUNyQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUUzQyxJQUFJLEtBQUs7UUFDUCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLEtBQUssR0FBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQXdCLElBQUksSUFBSSxDQUFDO1FBQzlELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRTNELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLElBQXNCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMzRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0FuRFUsbUJBQW1COzRGQUFuQixtQkFBbUIseUxBOUNwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q1Q7OzRGQUVVLG1CQUFtQjtrQkFsRC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxFQUFFO29CQUNYLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q1Q7aUJBQ0Y7OEJBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIGluamVjdCwgSW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB0eXBlIHsgRmlsZVJlZiwgTmVzdGVkRmllbGRDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlLXVwbG9hZC5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBJbWFnZSBmaWVsZDogcHJldmlldyB0aHVtYm5haWwgKyB1cGxvYWQgYnV0dG9uLlxyXG4gKlxyXG4gKiBXaXRoIGBVUExPQURfSEFORExFUmAgcmVnaXN0ZXJlZCB0aGUgZmlsZSBpcyBwZXJzaXN0ZWQgYW5kIHN0b3JlZCBhcyBgeyB1cmwgfWA7IHdpdGhvdXQgb25lXHJcbiAqIGl0IGlzIHN0b3JlZCBhcyBgeyBmaWxlIH1gIGFuZCBwcmV2aWV3ZWQgZnJvbSBhbiBvYmplY3QgVVJMIChyZXZva2VkIHdoZW4gcmVwbGFjZWQvZGVzdHJveWVkKS5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LWltYWdlLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkIG5neC1maWVsZC0taW1hZ2VcIlxyXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIiBbY2xhc3Mubmd4LWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiIFtjbGFzcy5uZ3gtZmllbGQtLW1hc2tlZF09XCJtYXNrZWRcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LWZpZWxkX19sYWJlbFwiIFthdHRyLmZvcl09XCInZmllbGQtJyArIGZpZWxkLmlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxyXG4gICAgICBAaWYgKG1hc2tlZCkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19pbWFnZS13cmFwXCI+XHJcbiAgICAgICAgICBAaWYgKHByZXZpZXdVcmwoKSkge1xyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwibmd4LWZpZWxkX19pbWFnZS1wcmV2aWV3XCIgW3NyY109XCJwcmV2aWV3VXJsKClcIiBbYWx0XT1cImxhYmVsXCIgLz5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19pbWFnZS1wbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPvCfk7c8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4+Tm8gaW1hZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmICghcmVhZG9ubHkpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZF9faW1hZ2UtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm5neC1maWVsZF9fdXBsb2FkLWJ0blwiIFtjbGFzcy5uZ3gtZmllbGRfX3VwbG9hZC1idG4tLWxvYWRpbmddPVwidXBsb2FkaW5nKClcIj5cclxuICAgICAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nKCkpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW4+VXBsb2FkaW5n4oCmPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHByZXZpZXdVcmwoKSA/ICdDaGFuZ2UnIDogJ1VwbG9hZCcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5neC1maWVsZF9fZmlsZS1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCB8fCB1cGxvYWRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGFueSgkZXZlbnQudGFyZ2V0KS5maWxlc1swXSlcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgQGlmIChwcmV2aWV3VXJsKCkpIHtcclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LWZpZWxkX19yZW1vdmUtYnRuXCIgKGNsaWNrKT1cInJlbW92ZSgpXCI+UmVtb3ZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYgKHVwbG9hZEVycm9yKCkpIHtcclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX19lcnJvclwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLWVycm9yJ1wiPnt7IHVwbG9hZEVycm9yKCkgfX08L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1hZ2VGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcclxuICBASW5wdXQoKSBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgPSAnZW4nO1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWFza2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBsb2FkcyA9IGluamVjdChGaWxlVXBsb2FkU2VydmljZSk7XHJcblxyXG4gIHJlYWRvbmx5IHVwbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XHJcbiAgcmVhZG9ubHkgdXBsb2FkRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKiBDYWNoZWQgc28gYW4gb2JqZWN0IFVSTCBpcyBtaW50ZWQgb25jZSBwZXIgRmlsZSwgbm90IG9uY2UgcGVyIGNoYW5nZS1kZXRlY3Rpb24gcGFzcy4gKi9cclxuICBwcml2YXRlIHByZXZpZXdTb3VyY2U6IEZpbGVSZWYgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHByZXZpZXdDYWNoZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbCh0aGlzLmZpZWxkPy5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XHJcbiAgfVxyXG5cclxuICBwcmV2aWV3VXJsKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgdmFsdWUgPSAodGhpcy5jb250cm9sPy52YWx1ZSBhcyBGaWxlUmVmIHwgbnVsbCkgPz8gbnVsbDtcclxuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5wcmV2aWV3U291cmNlKSByZXR1cm4gdGhpcy5wcmV2aWV3Q2FjaGU7XHJcblxyXG4gICAgdGhpcy51cGxvYWRzLnJldm9rZVByZXZpZXdVcmwodGhpcy5wcmV2aWV3Q2FjaGUpO1xyXG4gICAgdGhpcy5wcmV2aWV3U291cmNlID0gdmFsdWU7XHJcbiAgICB0aGlzLnByZXZpZXdDYWNoZSA9IHRoaXMudXBsb2Fkcy5wcmV2aWV3VXJsRm9yKHZhbHVlKTtcclxuICAgIHJldHVybiB0aGlzLnByZXZpZXdDYWNoZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uRmlsZVNlbGVjdChmaWxlOiBGaWxlIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcclxuICAgIHRoaXMudXBsb2FkRXJyb3Iuc2V0KG51bGwpO1xyXG4gICAgdGhpcy51cGxvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGF3YWl0IHRoaXMudXBsb2Fkcy50b0ZpbGVSZWYoZmlsZSkpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHRoaXMudXBsb2FkRXJyb3Iuc2V0KCdVcGxvYWQgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy51cGxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBsb2Fkcy5yZXZva2VQcmV2aWV3VXJsKHRoaXMucHJldmlld0NhY2hlKTtcclxuICB9XHJcbn1cclxuIl19
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9pbWFnZS1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdyRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBRXBFOzs7OztHQUtHO0FBb0RILE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRWhCLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUU1QyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLFdBQVcsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRW5ELDJGQUEyRjtJQUNuRixhQUFhLEdBQW1CLElBQUksQ0FBQztJQUNyQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUUzQyxJQUFJLEtBQUs7UUFDUCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLEtBQUssR0FBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQXdCLElBQUksSUFBSSxDQUFDO1FBQzlELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRTNELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLElBQXNCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMzRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0FuRFUsbUJBQW1COzRGQUFuQixtQkFBbUIseUxBOUNwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q1Q7OzRGQUVVLG1CQUFtQjtrQkFuRC9CLFNBQVM7bUJBQUM7b0JBQ1QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsRUFBRTtvQkFDWCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENUO2lCQUNGOzhCQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBpbmplY3QsIElucHV0LCBzaWduYWwsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVSZWYsIE5lc3RlZEZpZWxkQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlLXVwbG9hZC5zZXJ2aWNlJztcblxuLyoqXG4gKiBJbWFnZSBmaWVsZDogcHJldmlldyB0aHVtYm5haWwgKyB1cGxvYWQgYnV0dG9uLlxuICpcbiAqIFdpdGggYFVQTE9BRF9IQU5ETEVSYCByZWdpc3RlcmVkIHRoZSBmaWxlIGlzIHBlcnNpc3RlZCBhbmQgc3RvcmVkIGFzIGB7IHVybCB9YDsgd2l0aG91dCBvbmVcbiAqIGl0IGlzIHN0b3JlZCBhcyBgeyBmaWxlIH1gIGFuZCBwcmV2aWV3ZWQgZnJvbSBhbiBvYmplY3QgVVJMIChyZXZva2VkIHdoZW4gcmVwbGFjZWQvZGVzdHJveWVkKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ25neC1pbWFnZS1maWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGQgbmd4LWZpZWxkLS1pbWFnZVwiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIiBbY2xhc3Mubmd4LWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiIFtjbGFzcy5uZ3gtZmllbGQtLW1hc2tlZF09XCJtYXNrZWRcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cIm5neC1maWVsZF9fbGFiZWxcIiBbYXR0ci5mb3JdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIEBpZiAobWFza2VkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGRfX2ltYWdlLXdyYXBcIj5cbiAgICAgICAgICBAaWYgKHByZXZpZXdVcmwoKSkge1xuICAgICAgICAgICAgPGltZyBjbGFzcz1cIm5neC1maWVsZF9faW1hZ2UtcHJldmlld1wiIFtzcmNdPVwicHJldmlld1VybCgpXCIgW2FsdF09XCJsYWJlbFwiIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19pbWFnZS1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICA8c3Bhbj7wn5O3PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj5ObyBpbWFnZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCFyZWFkb25seSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZF9faW1hZ2UtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX3VwbG9hZC1idG5cIiBbY2xhc3Mubmd4LWZpZWxkX191cGxvYWQtYnRuLS1sb2FkaW5nXT1cInVwbG9hZGluZygpXCI+XG4gICAgICAgICAgICAgICAgQGlmICh1cGxvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+VXBsb2FkaW5n4oCmPC9zcGFuPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJldmlld1VybCgpID8gJ0NoYW5nZScgOiAnVXBsb2FkJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmd4LWZpZWxkX19maWxlLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIlxuICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS8qXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IHVwbG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGFueSgkZXZlbnQudGFyZ2V0KS5maWxlc1swXSlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIEBpZiAocHJldmlld1VybCgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZmllbGRfX3JlbW92ZS1idG5cIiAoY2xpY2spPVwicmVtb3ZlKClcIj5SZW1vdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICh1cGxvYWRFcnJvcigpKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+e3sgdXBsb2FkRXJyb3IoKSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZUZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBsb2FkcyA9IGluamVjdChGaWxlVXBsb2FkU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgdXBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgdXBsb2FkRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIENhY2hlZCBzbyBhbiBvYmplY3QgVVJMIGlzIG1pbnRlZCBvbmNlIHBlciBGaWxlLCBub3Qgb25jZSBwZXIgY2hhbmdlLWRldGVjdGlvbiBwYXNzLiAqL1xuICBwcml2YXRlIHByZXZpZXdTb3VyY2U6IEZpbGVSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aWV3Q2FjaGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ubGFiZWwsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgcHJldmlld1VybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmNvbnRyb2w/LnZhbHVlIGFzIEZpbGVSZWYgfCBudWxsKSA/PyBudWxsO1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5wcmV2aWV3U291cmNlKSByZXR1cm4gdGhpcy5wcmV2aWV3Q2FjaGU7XG5cbiAgICB0aGlzLnVwbG9hZHMucmV2b2tlUHJldmlld1VybCh0aGlzLnByZXZpZXdDYWNoZSk7XG4gICAgdGhpcy5wcmV2aWV3U291cmNlID0gdmFsdWU7XG4gICAgdGhpcy5wcmV2aWV3Q2FjaGUgPSB0aGlzLnVwbG9hZHMucHJldmlld1VybEZvcih2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMucHJldmlld0NhY2hlO1xuICB9XG5cbiAgYXN5bmMgb25GaWxlU2VsZWN0KGZpbGU6IEZpbGUgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICB0aGlzLnVwbG9hZEVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLnVwbG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShhd2FpdCB0aGlzLnVwbG9hZHMudG9GaWxlUmVmKGZpbGUpKTtcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yLnNldCgnVXBsb2FkIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwbG9hZHMucmV2b2tlUHJldmlld1VybCh0aGlzLnByZXZpZXdDYWNoZSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
2
  import { ReactiveFormsModule } from '@angular/forms';
3
3
  import { resolveLabel } from '@dynamic-entity/core';
4
4
  import * as i0 from "@angular/core";
@@ -51,90 +51,91 @@ export class MonthYearFieldComponent {
51
51
  return monthName && year ? `${monthName} ${year}` : String(value);
52
52
  }
53
53
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MonthYearFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MonthYearFieldComponent, isStandalone: true, selector: "ngx-month-year-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
55
- <div class="ngx-field ngx-field--month-year"
56
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
57
- <label class="ngx-field__label">{{ label }}</label>
58
- @if (masked) {
59
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
60
- } @else if (readonly) {
61
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ formatValue(control.value) }}</span>
62
- } @else {
63
- <div class="ngx-field__month-year-wrap">
64
- <select
65
- class="ngx-field__input ngx-field__input--month" [attr.data-testid]="'field-' + field.id + '-month'"
66
- [value]="selectedMonth"
67
- (change)="onMonthChange($any($event.target).value)"
68
- [attr.disabled]="field.disabled ? true : null"
69
- >
70
- <option value="">Month</option>
71
- @for (m of months; track m.value) {
72
- <option [value]="m.value">{{ m.label }}</option>
73
- }
74
- </select>
75
- <select
76
- class="ngx-field__input ngx-field__input--year" [attr.data-testid]="'field-' + field.id + '-year'"
77
- [value]="selectedYear"
78
- (change)="onYearChange($any($event.target).value)"
79
- [attr.disabled]="field.disabled ? true : null"
80
- >
81
- <option value="">Year</option>
82
- @for (y of years; track y) {
83
- <option [value]="y">{{ y }}</option>
84
- }
85
- </select>
86
- </div>
87
- @if (control.invalid && control.touched) {
88
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
89
- }
90
- }
91
- </div>
92
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MonthYearFieldComponent, isStandalone: true, selector: "ngx-month-year-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
55
+ <div class="ngx-field ngx-field--month-year"
56
+ [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
57
+ <label class="ngx-field__label">{{ label }}</label>
58
+ @if (masked) {
59
+ <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
60
+ } @else if (readonly) {
61
+ <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ formatValue(control.value) }}</span>
62
+ } @else {
63
+ <div class="ngx-field__month-year-wrap">
64
+ <select
65
+ class="ngx-field__input ngx-field__input--month" [attr.data-testid]="'field-' + field.id + '-month'"
66
+ [value]="selectedMonth"
67
+ (change)="onMonthChange($any($event.target).value)"
68
+ [attr.disabled]="field.disabled ? true : null"
69
+ >
70
+ <option value="">Month</option>
71
+ @for (m of months; track m.value) {
72
+ <option [value]="m.value">{{ m.label }}</option>
73
+ }
74
+ </select>
75
+ <select
76
+ class="ngx-field__input ngx-field__input--year" [attr.data-testid]="'field-' + field.id + '-year'"
77
+ [value]="selectedYear"
78
+ (change)="onYearChange($any($event.target).value)"
79
+ [attr.disabled]="field.disabled ? true : null"
80
+ >
81
+ <option value="">Year</option>
82
+ @for (y of years; track y) {
83
+ <option [value]="y">{{ y }}</option>
84
+ }
85
+ </select>
86
+ </div>
87
+ @if (control.invalid && control.touched) {
88
+ <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
89
+ }
90
+ }
91
+ </div>
92
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
93
93
  }
94
94
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MonthYearFieldComponent, decorators: [{
95
95
  type: Component,
96
96
  args: [{
97
+ changeDetection: ChangeDetectionStrategy.OnPush,
97
98
  selector: 'ngx-month-year-field',
98
99
  standalone: true,
99
100
  imports: [ReactiveFormsModule],
100
- template: `
101
- <div class="ngx-field ngx-field--month-year"
102
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
103
- <label class="ngx-field__label">{{ label }}</label>
104
- @if (masked) {
105
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
106
- } @else if (readonly) {
107
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ formatValue(control.value) }}</span>
108
- } @else {
109
- <div class="ngx-field__month-year-wrap">
110
- <select
111
- class="ngx-field__input ngx-field__input--month" [attr.data-testid]="'field-' + field.id + '-month'"
112
- [value]="selectedMonth"
113
- (change)="onMonthChange($any($event.target).value)"
114
- [attr.disabled]="field.disabled ? true : null"
115
- >
116
- <option value="">Month</option>
117
- @for (m of months; track m.value) {
118
- <option [value]="m.value">{{ m.label }}</option>
119
- }
120
- </select>
121
- <select
122
- class="ngx-field__input ngx-field__input--year" [attr.data-testid]="'field-' + field.id + '-year'"
123
- [value]="selectedYear"
124
- (change)="onYearChange($any($event.target).value)"
125
- [attr.disabled]="field.disabled ? true : null"
126
- >
127
- <option value="">Year</option>
128
- @for (y of years; track y) {
129
- <option [value]="y">{{ y }}</option>
130
- }
131
- </select>
132
- </div>
133
- @if (control.invalid && control.touched) {
134
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
135
- }
136
- }
137
- </div>
101
+ template: `
102
+ <div class="ngx-field ngx-field--month-year"
103
+ [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
104
+ <label class="ngx-field__label">{{ label }}</label>
105
+ @if (masked) {
106
+ <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
107
+ } @else if (readonly) {
108
+ <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ formatValue(control.value) }}</span>
109
+ } @else {
110
+ <div class="ngx-field__month-year-wrap">
111
+ <select
112
+ class="ngx-field__input ngx-field__input--month" [attr.data-testid]="'field-' + field.id + '-month'"
113
+ [value]="selectedMonth"
114
+ (change)="onMonthChange($any($event.target).value)"
115
+ [attr.disabled]="field.disabled ? true : null"
116
+ >
117
+ <option value="">Month</option>
118
+ @for (m of months; track m.value) {
119
+ <option [value]="m.value">{{ m.label }}</option>
120
+ }
121
+ </select>
122
+ <select
123
+ class="ngx-field__input ngx-field__input--year" [attr.data-testid]="'field-' + field.id + '-year'"
124
+ [value]="selectedYear"
125
+ (change)="onYearChange($any($event.target).value)"
126
+ [attr.disabled]="field.disabled ? true : null"
127
+ >
128
+ <option value="">Year</option>
129
+ @for (y of years; track y) {
130
+ <option [value]="y">{{ y }}</option>
131
+ }
132
+ </select>
133
+ </div>
134
+ @if (control.invalid && control.touched) {
135
+ <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
136
+ }
137
+ }
138
+ </div>
138
139
  `,
139
140
  }]
140
141
  }], propDecorators: { field: [{
@@ -148,4 +149,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
148
149
  }], masked: [{
149
150
  type: Input
150
151
  }] } });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgteWVhci1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZpZWxkLXR5cGVzL21vbnRoLXllYXItZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUVwRCxNQUFNLFdBQVcsR0FBRztJQUNsQixTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU07SUFDdEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVO0NBQ2pFLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFckU7OztHQUdHO0FBNkNILE1BQU0sT0FBTyx1QkFBdUI7SUFDekIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRXhCLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FB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QkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB0eXBlIHsgTmVzdGVkRmllbGRDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcclxuXHJcbmNvbnN0IE1PTlRIX05BTUVTID0gW1xyXG4gICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJyxcclxuICAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInLFxyXG5dO1xyXG5cclxuY29uc3QgQ1VSUkVOVF9ZRUFSID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG5jb25zdCBZRUFSUyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDgwIH0sIChfLCBpKSA9PiBDVVJSRU5UX1lFQVIgLSBpKTtcclxuXHJcbi8qKlxyXG4gKiBNb250aC1ZZWFyIGZpZWxkOiB0d28gbGlua2VkIHNlbGVjdHMgKE1vbnRoICsgWWVhcikuXHJcbiAqIFZhbHVlIHN0b3JlZCBhcyBJU08gcGFydGlhbCBkYXRlIHN0cmluZyBcIllZWVktTU1cIiBmb3IgdW5hbWJpZ3VvdXMgc3RvcmFnZS5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW1vbnRoLXllYXItZmllbGQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkIG5neC1maWVsZC0tbW9udGgteWVhclwiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIiBbYXR0ci5kYXRhLWZpZWxkLXR5cGVdPVwiZmllbGQudHlwZVwiIFtjbGFzcy5uZ3gtZmllbGQtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2NsYXNzLm5neC1maWVsZC0tbWFza2VkXT1cIm1hc2tlZFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX2xhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxyXG4gICAgICBAaWYgKG1hc2tlZCkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxyXG4gICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZVwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLXZhbHVlJ1wiPnt7IGZvcm1hdFZhbHVlKGNvbnRyb2wudmFsdWUpIH19PC9zcGFuPlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19tb250aC15ZWFyLXdyYXBcIj5cclxuICAgICAgICAgIDxzZWxlY3RcclxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZmllbGRfX2lucHV0IG5neC1maWVsZF9faW5wdXQtLW1vbnRoXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctbW9udGgnXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkTW9udGhcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uTW9udGhDaGFuZ2UoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPk1vbnRoPC9vcHRpb24+XHJcbiAgICAgICAgICAgIEBmb3IgKG0gb2YgbW9udGhzOyB0cmFjayBtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwibS52YWx1ZVwiPnt7IG0ubGFiZWwgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgIGNsYXNzPVwibmd4LWZpZWxkX19pbnB1dCBuZ3gtZmllbGRfX2lucHV0LS15ZWFyXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICcteWVhcidcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRZZWFyXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblllYXJDaGFuZ2UoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgQGZvciAoeSBvZiB5ZWFyczsgdHJhY2sgeSkge1xyXG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInlcIj57eyB5IH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIEBpZiAoY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZCkge1xyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+VGhpcyBmaWVsZCBoYXMgYW4gZXJyb3I8L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTW9udGhZZWFyRmllbGRDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGZpZWxkITogTmVzdGVkRmllbGRDb25maWc7XHJcbiAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcclxuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcclxuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBtb250aHMgPSBNT05USF9OQU1FUy5tYXAoKGxhYmVsLCBpKSA9PiAoeyB2YWx1ZTogU3RyaW5nKGkgKyAxKS5wYWRTdGFydCgyLCAnMCcpLCBsYWJlbCB9KSk7XHJcbiAgcmVhZG9ubHkgeWVhcnMgPSBZRUFSUztcclxuXHJcbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcclxuICB9XHJcblxyXG4gIC8qKiBQYXJzZXMgXCJZWVlZLU1NXCIgb3IgXCJZWVlZLU1NLUREXCIgc3RvcmVkIHZhbHVlIOKGkiBtb250aCBwYXJ0LiAqL1xyXG4gIGdldCBzZWxlY3RlZE1vbnRoKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2ID0gU3RyaW5nKHRoaXMuY29udHJvbC52YWx1ZSA/PyAnJyk7XHJcbiAgICByZXR1cm4gdi5sZW5ndGggPj0gNyA/IHYuc3Vic3RyaW5nKDUsIDcpIDogJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRZZWFyKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2ID0gU3RyaW5nKHRoaXMuY29udHJvbC52YWx1ZSA/PyAnJyk7XHJcbiAgICByZXR1cm4gdi5sZW5ndGggPj0gNCA/IHYuc3Vic3RyaW5nKDAsIDQpIDogJyc7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoQ2hhbmdlKG1vbnRoOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciB8fCBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShtb250aCA/IGAke3llYXJ9LSR7bW9udGh9YCA6IG51bGwpO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIG9uWWVhckNoYW5nZSh5ZWFyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5zZWxlY3RlZE1vbnRoIHx8ICcwMSc7XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoeWVhciA/IGAke3llYXJ9LSR7bW9udGh9YCA6IG51bGwpO1xyXG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdFZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiAn4oCUJztcclxuICAgIGNvbnN0IFt5ZWFyLCBtb250aE51bV0gPSBTdHJpbmcodmFsdWUpLnNwbGl0KCctJyk7XHJcbiAgICBjb25zdCBtb250aE5hbWUgPSBNT05USF9OQU1FU1twYXJzZUludChtb250aE51bSwgMTApIC0gMV07XHJcbiAgICByZXR1cm4gbW9udGhOYW1lICYmIHllYXIgPyBgJHttb250aE5hbWV9ICR7eWVhcn1gIDogU3RyaW5nKHZhbHVlKTtcclxuICB9XHJcbn1cclxuIl19
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgteWVhci1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZpZWxkLXR5cGVzL21vbnRoLXllYXItZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUVwRCxNQUFNLFdBQVcsR0FBRztJQUNsQixTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU07SUFDdEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVO0NBQ2pFLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzlDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFckU7OztHQUdHO0FBOENILE1BQU0sT0FBTyx1QkFBdUI7SUFDekIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRXhCLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxN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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NUO2lCQUNGOzhCQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IE5lc3RlZEZpZWxkQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuXG5jb25zdCBNT05USF9OQU1FUyA9IFtcbiAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLFxuICAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInLFxuXTtcblxuY29uc3QgQ1VSUkVOVF9ZRUFSID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuY29uc3QgWUVBUlMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA4MCB9LCAoXywgaSkgPT4gQ1VSUkVOVF9ZRUFSIC0gaSk7XG5cbi8qKlxuICogTW9udGgtWWVhciBmaWVsZDogdHdvIGxpbmtlZCBzZWxlY3RzIChNb250aCArIFllYXIpLlxuICogVmFsdWUgc3RvcmVkIGFzIElTTyBwYXJ0aWFsIGRhdGUgc3RyaW5nIFwiWVlZWS1NTVwiIGZvciB1bmFtYmlndW91cyBzdG9yYWdlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHNlbGVjdG9yOiAnbmd4LW1vbnRoLXllYXItZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZCBuZ3gtZmllbGQtLW1vbnRoLXllYXJcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiIFthdHRyLmRhdGEtZmllbGQtdHlwZV09XCJmaWVsZC50eXBlXCIgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbY2xhc3Mubmd4LWZpZWxkLS1tYXNrZWRdPVwibWFza2VkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX2xhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgQGlmIChtYXNrZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlIG5neC1maWVsZF9fdmFsdWUtLW1hc2tlZFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLW1hc2tlZCdcIj5YWFhYWFhYWFg8L3NwYW4+XG4gICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWVcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy12YWx1ZSdcIj57eyBmb3JtYXRWYWx1ZShjb250cm9sLnZhbHVlKSB9fTwvc3Bhbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19tb250aC15ZWFyLXdyYXBcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cIm5neC1maWVsZF9faW5wdXQgbmd4LWZpZWxkX19pbnB1dC0tbW9udGhcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tb250aCdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkTW9udGhcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbk1vbnRoQ2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Nb250aDwvb3B0aW9uPlxuICAgICAgICAgICAgQGZvciAobSBvZiBtb250aHM7IHRyYWNrIG0udmFsdWUpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwibS52YWx1ZVwiPnt7IG0ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cIm5neC1maWVsZF9faW5wdXQgbmd4LWZpZWxkX19pbnB1dC0teWVhclwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLXllYXInXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFllYXJcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblllYXJDaGFuZ2UoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlllYXI8L29wdGlvbj5cbiAgICAgICAgICAgIEBmb3IgKHkgb2YgeWVhcnM7IHRyYWNrIHkpIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwieVwiPnt7IHkgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX19lcnJvclwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLWVycm9yJ1wiPlRoaXMgZmllbGQgaGFzIGFuIGVycm9yPC9zcGFuPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE1vbnRoWWVhckZpZWxkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IG1vbnRocyA9IE1PTlRIX05BTUVTLm1hcCgobGFiZWwsIGkpID0+ICh7IHZhbHVlOiBTdHJpbmcoaSArIDEpLnBhZFN0YXJ0KDIsICcwJyksIGxhYmVsIH0pKTtcbiAgcmVhZG9ubHkgeWVhcnMgPSBZRUFSUztcblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIC8qKiBQYXJzZXMgXCJZWVlZLU1NXCIgb3IgXCJZWVlZLU1NLUREXCIgc3RvcmVkIHZhbHVlIOKGkiBtb250aCBwYXJ0LiAqL1xuICBnZXQgc2VsZWN0ZWRNb250aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSBTdHJpbmcodGhpcy5jb250cm9sLnZhbHVlID8/ICcnKTtcbiAgICByZXR1cm4gdi5sZW5ndGggPj0gNyA/IHYuc3Vic3RyaW5nKDUsIDcpIDogJyc7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRZZWFyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdiA9IFN0cmluZyh0aGlzLmNvbnRyb2wudmFsdWUgPz8gJycpO1xuICAgIHJldHVybiB2Lmxlbmd0aCA+PSA0ID8gdi5zdWJzdHJpbmcoMCwgNCkgOiAnJztcbiAgfVxuXG4gIG9uTW9udGhDaGFuZ2UobW9udGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciB8fCBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobW9udGggPyBgJHt5ZWFyfS0ke21vbnRofWAgOiBudWxsKTtcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICB9XG5cbiAgb25ZZWFyQ2hhbmdlKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5zZWxlY3RlZE1vbnRoIHx8ICcwMSc7XG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHllYXIgPyBgJHt5ZWFyfS0ke21vbnRofWAgOiBudWxsKTtcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICB9XG5cbiAgZm9ybWF0VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAn4oCUJztcbiAgICBjb25zdCBbeWVhciwgbW9udGhOdW1dID0gU3RyaW5nKHZhbHVlKS5zcGxpdCgnLScpO1xuICAgIGNvbnN0IG1vbnRoTmFtZSA9IE1PTlRIX05BTUVTW3BhcnNlSW50KG1vbnRoTnVtLCAxMCkgLSAxXTtcbiAgICByZXR1cm4gbW9udGhOYW1lICYmIHllYXIgPyBgJHttb250aE5hbWV9ICR7eWVhcn1gIDogU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuIl19