@mtna/web-form-angular 0.0.1

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 (170) hide show
  1. package/_index.scss +25 -0
  2. package/bundles/mtna-web-form-angular.umd.js +4982 -0
  3. package/bundles/mtna-web-form-angular.umd.js.map +1 -0
  4. package/esm2015/lib/core/animations.js +8 -0
  5. package/esm2015/lib/core/api-config.js +3 -0
  6. package/esm2015/lib/core/index.js +7 -0
  7. package/esm2015/lib/core/pipes/coerce-date-item.pipe.js +23 -0
  8. package/esm2015/lib/core/pipes/coerce-form-group.pipe.js +35 -0
  9. package/esm2015/lib/core/pipes/date-quarter.pipe.js +43 -0
  10. package/esm2015/lib/core/pipes/get-auto-complete.pipe.js +42 -0
  11. package/esm2015/lib/core/pipes/get-available-quarters.pipe.js +29 -0
  12. package/esm2015/lib/core/pipes/get-form-control-error.pipe.js +20 -0
  13. package/esm2015/lib/core/pipes/get-list-icon.pipe.js +53 -0
  14. package/esm2015/lib/core/pipes/get-object-type.pipe.js +17 -0
  15. package/esm2015/lib/core/pipes/get-selected-option.pipe.js +20 -0
  16. package/esm2015/lib/core/pipes/index.js +71 -0
  17. package/esm2015/lib/core/pipes/items-with-value.pipe.js +30 -0
  18. package/esm2015/lib/core/pipes/sanitize-html.pipe.js +23 -0
  19. package/esm2015/lib/core/services/api.service.js +67 -0
  20. package/esm2015/lib/core/services/form-manager.service.js +465 -0
  21. package/esm2015/lib/core/services/index.js +5 -0
  22. package/esm2015/lib/core/services/ng-form.service.js +150 -0
  23. package/esm2015/lib/core/services/ui.service.js +333 -0
  24. package/esm2015/lib/core/utilities/find-form-control.js +29 -0
  25. package/esm2015/lib/core/utilities/find-form-item.js +25 -0
  26. package/esm2015/lib/core/utilities/flatten-steps.js +10 -0
  27. package/esm2015/lib/core/utilities/generate-form-steps.js +25 -0
  28. package/esm2015/lib/core/utilities/index.js +9 -0
  29. package/esm2015/lib/core/utilities/is-form-group.js +6 -0
  30. package/esm2015/lib/core/utilities/serializer-util.js +358 -0
  31. package/esm2015/lib/core/utilities/update-step-status.js +38 -0
  32. package/esm2015/lib/core/validators/index.js +3 -0
  33. package/esm2015/lib/core/validators/instant-validation-result-error-state-matcher.js +23 -0
  34. package/esm2015/lib/core/validators/validation-result-validator.js +19 -0
  35. package/esm2015/lib/file-upload/file-upload.component.js +66 -0
  36. package/esm2015/lib/file-upload/index.js +2 -0
  37. package/esm2015/lib/form/base-form-item.model.js +2 -0
  38. package/esm2015/lib/form/form-disabler.component.js +38 -0
  39. package/esm2015/lib/form/form-item.directive.js +22 -0
  40. package/esm2015/lib/form/form.component.js +250 -0
  41. package/esm2015/lib/form/form.module.js +214 -0
  42. package/esm2015/lib/form/index.js +5 -0
  43. package/esm2015/lib/form/white-list.model.js +11 -0
  44. package/esm2015/lib/form-item-controls/base-form-item-control.directive.js +58 -0
  45. package/esm2015/lib/form-item-controls/base-parent-item-control.directive.js +42 -0
  46. package/esm2015/lib/form-item-controls/base-single-selection-parent.directive.js +53 -0
  47. package/esm2015/lib/form-item-controls/date-range.component.js +84 -0
  48. package/esm2015/lib/form-item-controls/date.component.js +134 -0
  49. package/esm2015/lib/form-item-controls/dropdown.component.js +109 -0
  50. package/esm2015/lib/form-item-controls/index.js +8 -0
  51. package/esm2015/lib/form-item-controls/input.component.js +149 -0
  52. package/esm2015/lib/form-item-controls/year-quarter-range.component.js +75 -0
  53. package/esm2015/lib/form-item-controls/year-quarter.component.js +228 -0
  54. package/esm2015/lib/form-stepper/form-step-group.component.js +95 -0
  55. package/esm2015/lib/form-stepper/form-step-group.pipe.js +20 -0
  56. package/esm2015/lib/form-stepper/form-step.component.js +110 -0
  57. package/esm2015/lib/form-stepper/form-step.util.js +28 -0
  58. package/esm2015/lib/form-stepper/form-stepper.component.js +115 -0
  59. package/esm2015/lib/form-stepper/form-stepper.module.js +53 -0
  60. package/esm2015/lib/form-stepper/index.js +8 -0
  61. package/esm2015/lib/form-stepper/models/base-form-step.model.js +6 -0
  62. package/esm2015/lib/form-stepper/models/form-step-group.model.js +13 -0
  63. package/esm2015/lib/form-stepper/models/form-step.model.js +12 -0
  64. package/esm2015/lib/form-stepper/models/index.js +4 -0
  65. package/esm2015/lib/groups/form-item-dialog-data.model.js +14 -0
  66. package/esm2015/lib/groups/group-components.js +646 -0
  67. package/esm2015/lib/groups/index.js +3 -0
  68. package/esm2015/lib/groups/repeatable-item.component.js +23 -0
  69. package/esm2015/lib/item-header/index.js +2 -0
  70. package/esm2015/lib/item-header/item-header.component.js +108 -0
  71. package/esm2015/lib/static-form-items/index.js +3 -0
  72. package/esm2015/lib/static-form-items/ordered-list-item.js +50 -0
  73. package/esm2015/lib/static-form-items/unordered-list-item.js +52 -0
  74. package/esm2015/lib/step-card/index.js +2 -0
  75. package/esm2015/lib/step-card/step-card.component.js +53 -0
  76. package/esm2015/mtna-web-form-angular.js +5 -0
  77. package/esm2015/public-api.js +10 -0
  78. package/fesm2015/mtna-web-form-angular.js +4614 -0
  79. package/fesm2015/mtna-web-form-angular.js.map +1 -0
  80. package/lib/_index.scss +25 -0
  81. package/lib/core/_all-color.scss +25 -0
  82. package/lib/core/_all-theme.scss +28 -0
  83. package/lib/core/_all-typography.scss +25 -0
  84. package/lib/core/_core-theme.scss +43 -0
  85. package/lib/core/animations.d.ts +2 -0
  86. package/lib/core/api-config.d.ts +5 -0
  87. package/lib/core/index.d.ts +6 -0
  88. package/lib/core/pipes/coerce-date-item.pipe.d.ts +11 -0
  89. package/lib/core/pipes/coerce-form-group.pipe.d.ts +23 -0
  90. package/lib/core/pipes/date-quarter.pipe.d.ts +7 -0
  91. package/lib/core/pipes/get-auto-complete.pipe.d.ts +7 -0
  92. package/lib/core/pipes/get-available-quarters.pipe.d.ts +8 -0
  93. package/lib/core/pipes/get-form-control-error.pipe.d.ts +14 -0
  94. package/lib/core/pipes/get-list-icon.pipe.d.ts +7 -0
  95. package/lib/core/pipes/get-object-type.pipe.d.ts +7 -0
  96. package/lib/core/pipes/get-selected-option.pipe.d.ts +8 -0
  97. package/lib/core/pipes/index.d.ts +28 -0
  98. package/lib/core/pipes/items-with-value.pipe.d.ts +13 -0
  99. package/lib/core/pipes/sanitize-html.pipe.d.ts +10 -0
  100. package/lib/core/services/api.service.d.ts +41 -0
  101. package/lib/core/services/form-manager.service.d.ts +184 -0
  102. package/lib/core/services/index.d.ts +4 -0
  103. package/lib/core/services/ng-form.service.d.ts +76 -0
  104. package/lib/core/services/ui.service.d.ts +123 -0
  105. package/lib/core/utilities/find-form-control.d.ts +11 -0
  106. package/lib/core/utilities/find-form-item.d.ts +10 -0
  107. package/lib/core/utilities/flatten-steps.d.ts +7 -0
  108. package/lib/core/utilities/generate-form-steps.d.ts +3 -0
  109. package/lib/core/utilities/index.d.ts +8 -0
  110. package/lib/core/utilities/is-form-group.d.ts +3 -0
  111. package/lib/core/utilities/serializer-util.d.ts +81 -0
  112. package/lib/core/utilities/update-step-status.d.ts +14 -0
  113. package/lib/core/validators/index.d.ts +2 -0
  114. package/lib/core/validators/instant-validation-result-error-state-matcher.d.ts +13 -0
  115. package/lib/core/validators/validation-result-validator.d.ts +12 -0
  116. package/lib/file-upload/file-upload.component.d.ts +23 -0
  117. package/lib/file-upload/index.d.ts +1 -0
  118. package/lib/form/base-form-item.model.d.ts +15 -0
  119. package/lib/form/form-disabler.component.d.ts +6 -0
  120. package/lib/form/form-item.directive.d.ts +13 -0
  121. package/lib/form/form.component.d.ts +89 -0
  122. package/lib/form/form.module.d.ts +52 -0
  123. package/lib/form/index.d.ts +4 -0
  124. package/lib/form/white-list.model.d.ts +6 -0
  125. package/lib/form-item-controls/_date-item-theme.scss +29 -0
  126. package/lib/form-item-controls/_form-control-theme.scss +28 -0
  127. package/lib/form-item-controls/_year-quarter-item-theme.scss +28 -0
  128. package/lib/form-item-controls/base-form-item-control.directive.d.ts +26 -0
  129. package/lib/form-item-controls/base-parent-item-control.directive.d.ts +19 -0
  130. package/lib/form-item-controls/base-single-selection-parent.directive.d.ts +26 -0
  131. package/lib/form-item-controls/date-range.component.d.ts +12 -0
  132. package/lib/form-item-controls/date.component.d.ts +24 -0
  133. package/lib/form-item-controls/dropdown.component.d.ts +9 -0
  134. package/lib/form-item-controls/index.d.ts +7 -0
  135. package/lib/form-item-controls/input.component.d.ts +14 -0
  136. package/lib/form-item-controls/year-quarter-range.component.d.ts +9 -0
  137. package/lib/form-item-controls/year-quarter.component.d.ts +33 -0
  138. package/lib/form-stepper/_form-step-group-theme.scss +43 -0
  139. package/lib/form-stepper/_form-stepper-theme.scss +72 -0
  140. package/lib/form-stepper/form-step-group.component.d.ts +23 -0
  141. package/lib/form-stepper/form-step-group.pipe.d.ts +11 -0
  142. package/lib/form-stepper/form-step.component.d.ts +27 -0
  143. package/lib/form-stepper/form-step.util.d.ts +27 -0
  144. package/lib/form-stepper/form-stepper.component.d.ts +35 -0
  145. package/lib/form-stepper/form-stepper.module.d.ts +18 -0
  146. package/lib/form-stepper/index.d.ts +7 -0
  147. package/lib/form-stepper/models/base-form-step.model.d.ts +4 -0
  148. package/lib/form-stepper/models/form-step-group.model.d.ts +8 -0
  149. package/lib/form-stepper/models/form-step.model.d.ts +11 -0
  150. package/lib/form-stepper/models/index.d.ts +3 -0
  151. package/lib/groups/_checkbox-theme.scss +62 -0
  152. package/lib/groups/_form-group-theme.scss +32 -0
  153. package/lib/groups/_multiple-choice-theme.scss +65 -0
  154. package/lib/groups/_repeatable-item-theme.scss +28 -0
  155. package/lib/groups/form-item-dialog-data.model.d.ts +13 -0
  156. package/lib/groups/group-components.d.ts +221 -0
  157. package/lib/groups/index.d.ts +2 -0
  158. package/lib/groups/repeatable-item.component.d.ts +5 -0
  159. package/lib/item-header/_item-header-theme.scss +28 -0
  160. package/lib/item-header/index.d.ts +1 -0
  161. package/lib/item-header/item-header.component.d.ts +35 -0
  162. package/lib/static-form-items/index.d.ts +2 -0
  163. package/lib/static-form-items/ordered-list-item.d.ts +11 -0
  164. package/lib/static-form-items/unordered-list-item.d.ts +11 -0
  165. package/lib/step-card/_step-card-theme.scss +42 -0
  166. package/lib/step-card/index.d.ts +1 -0
  167. package/lib/step-card/step-card.component.d.ts +21 -0
  168. package/mtna-web-form-angular.d.ts +5 -0
  169. package/package.json +43 -0
  170. package/public-api.d.ts +9 -0
@@ -0,0 +1,66 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@mtna/file-manager-angular";
4
+ import * as i2 from "@angular/material/button";
5
+ import * as i3 from "@angular/material/icon";
6
+ import * as i4 from "@angular/material/progress-spinner";
7
+ import * as i5 from "@angular/common";
8
+ import * as i6 from "@mtna/core-angular";
9
+ export class MtnaWfFileUploadComponent {
10
+ constructor(fileService) {
11
+ this.fileService = fileService;
12
+ this.header = null;
13
+ this.indicatorStatus = 'INACTIVE';
14
+ this.readonly = false;
15
+ this.file = new EventEmitter();
16
+ this.loading = false;
17
+ }
18
+ fileToUpload(file) {
19
+ this.loading = true;
20
+ this.fileService.uploadFile(file).subscribe((fileInfo) => {
21
+ this.loading = false;
22
+ this.fileInfo = fileInfo;
23
+ this.file.emit(fileInfo);
24
+ });
25
+ }
26
+ handleDownload(template) {
27
+ this.fileService.downloadFileGET(template.key, template.fileName, template.contentType);
28
+ }
29
+ ngOnInit() {
30
+ var _a;
31
+ if ((_a = this.item) === null || _a === void 0 ? void 0 : _a.value) {
32
+ this.fileInfo = this.item.value;
33
+ }
34
+ }
35
+ removeFile() {
36
+ if (this.fileInfo) {
37
+ this.loading = true;
38
+ this.fileService.deleteFile(this.fileInfo).subscribe(() => {
39
+ this.loading = false;
40
+ this.fileInfo = undefined;
41
+ this.file.emit(undefined);
42
+ });
43
+ }
44
+ }
45
+ }
46
+ MtnaWfFileUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFileUploadComponent, deps: [{ token: i1.FileService }], target: i0.ɵɵFactoryTarget.Component });
47
+ MtnaWfFileUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFileUploadComponent, selector: "mtna-wf-file-upload-item", inputs: { header: "header", indicatorStatus: "indicatorStatus", item: "item", readonly: "readonly" }, outputs: { file: "file" }, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"header\"></ng-container>\n\n<div class=\"content\" [mtnaHighlight]=\"indicatorStatus === 'ACTIVE' && !item?.questionText && !item?.descriptiveText\">\n <ng-container *ngIf=\"!readonly; else readOnly\">\n <ng-container *ngIf=\"!loading; else loader\">\n <mtna-file-download\n *ngIf=\"!!fileInfo; else fileUpload\"\n [fileInfo]=\"fileInfo\"\n [canRemove]=\"true\"\n color=\"primary\"\n [canDownload]=\"true\"\n (download)=\"handleDownload($event)\"\n (remove)=\"removeFile()\"\n ></mtna-file-download>\n\n <ng-template #fileUpload>\n <mtna-file-upload\n [automaticUpload]=\"false\"\n color=\"primary\"\n [buttonText]=\"'CHOOSE A FILE'\"\n (fileToUpload)=\"fileToUpload($event)\"\n ></mtna-file-upload>\n </ng-template>\n </ng-container>\n </ng-container>\n\n <!-- READONLY -->\n <ng-template #readOnly>\n <!-- anchor being used, due to <fieldset disabled> blocking a <button>'s click event -->\n <a\n *ngIf=\"!!item && !!item.value\"\n class=\"single-icon-button\"\n color=\"primary\"\n mat-stroked-button\n role=\"button\"\n (click)=\"handleDownload(item.value)\"\n >\n <mat-icon color=\"primary\">file_download</mat-icon>\n {{ (item!.value!.fileName ? item!.value!.fileName : '') | uppercase }}\n </a>\n </ng-template>\n</div>\n\n<!-- PROGRESS SPINNER -->\n<ng-template #loader>\n <mat-spinner diameter=\"125\" strokeWidth=\"10\" mode=\"indeterminate\"></mat-spinner>\n</ng-template>\n", styles: [":host{display:block;margin:1rem 0}mtna-file-download{margin:37px 0}mat-spinner{margin:0 87.5px}\n"], components: [{ type: i1.MtnaFileDownloadComponent, selector: "mtna-file-download", inputs: ["color", "canDownload", "canRemove", "fileInfo", "loading"], outputs: ["download", "remove"] }, { type: i1.MtnaFileUploadComponent, selector: "mtna-file-upload", inputs: ["automaticUpload", "buttonText", "buttonColor", "disabled", "fileUploadUrl", "isProd", "maxUploadSize", "uploading"], outputs: ["uploaded", "fileToUpload", "uploadStatus"] }, { type: i2.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.MtnaHighlightDirective, selector: "[mtnaHighlight]", inputs: ["mtnaHighlight", "mtnaHighlightColor"], exportAs: ["mtnaHighlight"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "uppercase": i5.UpperCasePipe } });
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFileUploadComponent, decorators: [{
49
+ type: Component,
50
+ args: [{
51
+ selector: 'mtna-wf-file-upload-item',
52
+ templateUrl: './file-upload.component.html',
53
+ styleUrls: ['./file-upload.component.scss'],
54
+ }]
55
+ }], ctorParameters: function () { return [{ type: i1.FileService }]; }, propDecorators: { header: [{
56
+ type: Input
57
+ }], indicatorStatus: [{
58
+ type: Input
59
+ }], item: [{
60
+ type: Input
61
+ }], readonly: [{
62
+ type: Input
63
+ }], file: [{
64
+ type: Output
65
+ }] } });
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2ViLWZvcm0tYW5ndWxhci9zcmMvbGliL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVk1RixNQUFNLE9BQU8seUJBQXlCO0lBV3BDLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBVm5DLFdBQU0sR0FBZ0MsSUFBSSxDQUFDO1FBQzNDLG9CQUFlLEdBQThCLFVBQVUsQ0FBQztRQUV4RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWhCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUdqRSxZQUFPLEdBQUcsS0FBSyxDQUFDO0lBRStCLENBQUM7SUFFaEQsWUFBWSxDQUFDLElBQWM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBeUIsRUFBRSxFQUFFO1lBQ3hFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUF5QjtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCxRQUFROztRQUNOLElBQUksTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxLQUFLLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNqQztJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzt1SEF6Q1UseUJBQXlCOzJHQUF6Qix5QkFBeUIsaU1DWnRDLG9rREErQ0E7NEZEbkNhLHlCQUF5QjtrQkFMckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxXQUFXLEVBQUUsOEJBQThCO29CQUMzQyxTQUFTLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztpQkFDNUM7a0dBRVUsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksSUFBSTtzQkFBYixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRmlsZUluZm9ybWF0aW9uIH0gZnJvbSAnQG10bmEvZmlsZS1tYW5hZ2VyLXRzJztcbmltcG9ydCB7IEZpbGVTZXJ2aWNlIH0gZnJvbSAnQG10bmEvZmlsZS1tYW5hZ2VyLWFuZ3VsYXInO1xuaW1wb3J0IHsgQW5ub3RhdGlvbkluZGljYXRvclN0YXR1cywgSW5kaWNhdG9yU3RhdHVzUmVwZWF0ZXIgfSBmcm9tICdAbXRuYS9wb2pvLXNvY2lhbC1hbmd1bGFyJztcbmltcG9ydCB7IEZpbGVVcGxvYWRJdGVtIH0gZnJvbSAnQG10bmEvd2ViLWZvcm0tdHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdG5hLXdmLWZpbGUtdXBsb2FkLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZGaWxlVXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgSW5kaWNhdG9yU3RhdHVzUmVwZWF0ZXIsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGhlYWRlcjogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaW5kaWNhdG9yU3RhdHVzOiBBbm5vdGF0aW9uSW5kaWNhdG9yU3RhdHVzID0gJ0lOQUNUSVZFJztcbiAgQElucHV0KCkgaXRlbTogRmlsZVVwbG9hZEl0ZW0gfCB1bmRlZmluZWQgfCBudWxsO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBmaWxlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+KCk7XG5cbiAgZmlsZUluZm8/OiBGaWxlSW5mb3JtYXRpb247XG4gIGxvYWRpbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZSkge31cblxuICBmaWxlVG9VcGxvYWQoZmlsZTogRmlsZUxpc3QpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkRmlsZShmaWxlKS5zdWJzY3JpYmUoKGZpbGVJbmZvOiBGaWxlSW5mb3JtYXRpb24pID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5maWxlSW5mbyA9IGZpbGVJbmZvO1xuICAgICAgdGhpcy5maWxlLmVtaXQoZmlsZUluZm8pO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlRG93bmxvYWQodGVtcGxhdGU6IEZpbGVJbmZvcm1hdGlvbikge1xuICAgIHRoaXMuZmlsZVNlcnZpY2UuZG93bmxvYWRGaWxlR0VUKHRlbXBsYXRlLmtleSwgdGVtcGxhdGUuZmlsZU5hbWUsIHRlbXBsYXRlLmNvbnRlbnRUeXBlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLml0ZW0/LnZhbHVlKSB7XG4gICAgICB0aGlzLmZpbGVJbmZvID0gdGhpcy5pdGVtLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUZpbGUoKSB7XG4gICAgaWYgKHRoaXMuZmlsZUluZm8pIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmZpbGVTZXJ2aWNlLmRlbGV0ZUZpbGUodGhpcy5maWxlSW5mbykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZUluZm8gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZmlsZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cblxuPGRpdiBjbGFzcz1cImNvbnRlbnRcIiBbbXRuYUhpZ2hsaWdodF09XCJpbmRpY2F0b3JTdGF0dXMgPT09ICdBQ1RJVkUnICYmICFpdGVtPy5xdWVzdGlvblRleHQgJiYgIWl0ZW0/LmRlc2NyaXB0aXZlVGV4dFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJlYWRvbmx5OyBlbHNlIHJlYWRPbmx5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIGxvYWRlclwiPlxuICAgICAgPG10bmEtZmlsZS1kb3dubG9hZFxuICAgICAgICAqbmdJZj1cIiEhZmlsZUluZm87IGVsc2UgZmlsZVVwbG9hZFwiXG4gICAgICAgIFtmaWxlSW5mb109XCJmaWxlSW5mb1wiXG4gICAgICAgIFtjYW5SZW1vdmVdPVwidHJ1ZVwiXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIFtjYW5Eb3dubG9hZF09XCJ0cnVlXCJcbiAgICAgICAgKGRvd25sb2FkKT1cImhhbmRsZURvd25sb2FkKCRldmVudClcIlxuICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiXG4gICAgICA+PC9tdG5hLWZpbGUtZG93bmxvYWQ+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsZVVwbG9hZD5cbiAgICAgICAgPG10bmEtZmlsZS11cGxvYWRcbiAgICAgICAgICBbYXV0b21hdGljVXBsb2FkXT1cImZhbHNlXCJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgIFtidXR0b25UZXh0XT1cIidDSE9PU0UgQSBGSUxFJ1wiXG4gICAgICAgICAgKGZpbGVUb1VwbG9hZCk9XCJmaWxlVG9VcGxvYWQoJGV2ZW50KVwiXG4gICAgICAgID48L210bmEtZmlsZS11cGxvYWQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIFJFQURPTkxZIC0tPlxuICA8bmctdGVtcGxhdGUgI3JlYWRPbmx5PlxuICAgIDwhLS0gYW5jaG9yIGJlaW5nIHVzZWQsIGR1ZSB0byA8ZmllbGRzZXQgZGlzYWJsZWQ+IGJsb2NraW5nIGEgPGJ1dHRvbj4ncyBjbGljayBldmVudCAtLT5cbiAgICA8YVxuICAgICAgKm5nSWY9XCIhIWl0ZW0gJiYgISFpdGVtLnZhbHVlXCJcbiAgICAgIGNsYXNzPVwic2luZ2xlLWljb24tYnV0dG9uXCJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZURvd25sb2FkKGl0ZW0udmFsdWUpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+ZmlsZV9kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICB7eyAoaXRlbSEudmFsdWUhLmZpbGVOYW1lID8gaXRlbSEudmFsdWUhLmZpbGVOYW1lIDogJycpIHwgdXBwZXJjYXNlIH19XG4gICAgPC9hPlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjwhLS0gUFJPR1JFU1MgU1BJTk5FUiAtLT5cbjxuZy10ZW1wbGF0ZSAjbG9hZGVyPlxuICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIxMjVcIiBzdHJva2VXaWR0aD1cIjEwXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './file-upload.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvZmlsZS11cGxvYWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQuY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWl0ZW0ubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvZm9ybS9iYXNlLWZvcm0taXRlbS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBGb3JtSXRlbSB9IGZyb20gJ0BtdG5hL3dlYi1mb3JtLXRzJztcblxuLyoqXG4gKiBUaGUgQmFzaWMgc2V0dXAgZm9yIGEgRm9ybUl0ZW0uIEFueSBkeW5hbWljIGNvbXBvbmVudHMgdG8gYmUgcmVuZGVyZWQgc2hvdWxkXG4gKiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZW5zdXJlIHRoZXkgY29udGFpbiB0aGUgbmVjZXNzYXJ5IGlucHV0cy5cbiAqXG4gKiBAcHJvcCBjb250cm9sIC0gQWJzdHJhY3RDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAqIEBwcm9wIGl0ZW0gLSBGb3JtSXRlbVxuICogQHByb3AgcmVhZG9ubHkgLSBib29sZWFuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUZvcm1JdGVtIHtcbiAgY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgaXRlbTogRm9ybUl0ZW07XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,38 @@
1
+ /* eslint-disable @angular-eslint/component-selector */
2
+ import { Component, Input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class MtnaWfFormDisablerComponent {
5
+ constructor() {
6
+ this.formDisabled = false;
7
+ }
8
+ }
9
+ MtnaWfFormDisablerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormDisablerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
+ MtnaWfFormDisablerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormDisablerComponent, selector: "[formDisabled]", inputs: { formDisabled: "formDisabled" }, ngImport: i0, template: `
11
+ <fieldset [disabled]="formDisabled">
12
+ <ng-content></ng-content>
13
+ </fieldset>
14
+ `, isInline: true, styles: ["\n fieldset {\n display: block;\n margin: unset;\n padding: unset;\n border: unset;\n }\n "] });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormDisablerComponent, decorators: [{
16
+ type: Component,
17
+ args: [{
18
+ selector: '[formDisabled]',
19
+ template: `
20
+ <fieldset [disabled]="formDisabled">
21
+ <ng-content></ng-content>
22
+ </fieldset>
23
+ `,
24
+ styles: [
25
+ `
26
+ fieldset {
27
+ display: block;
28
+ margin: unset;
29
+ padding: unset;
30
+ border: unset;
31
+ }
32
+ `,
33
+ ],
34
+ }]
35
+ }], propDecorators: { formDisabled: [{
36
+ type: Input
37
+ }] } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1kaXNhYmxlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvZm9ybS9mb3JtLWRpc2FibGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBb0JqRCxNQUFNLE9BQU8sMkJBQTJCO0lBbEJ4QztRQW1CVyxpQkFBWSxHQUFHLEtBQUssQ0FBQztLQUMvQjs7eUhBRlksMkJBQTJCOzZHQUEzQiwyQkFBMkIsZ0dBaEI1Qjs7OztHQUlUOzRGQVlVLDJCQUEyQjtrQkFsQnZDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsUUFBUSxFQUFFOzs7O0dBSVQ7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOOzs7Ozs7O0tBT0M7cUJBQ0Y7aUJBQ0Y7OEJBRVUsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW2Zvcm1EaXNhYmxlZF0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxmaWVsZHNldCBbZGlzYWJsZWRdPVwiZm9ybURpc2FibGVkXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9maWVsZHNldD5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgZmllbGRzZXQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgbWFyZ2luOiB1bnNldDtcbiAgICAgICAgcGFkZGluZzogdW5zZXQ7XG4gICAgICAgIGJvcmRlcjogdW5zZXQ7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXRuYVdmRm9ybURpc2FibGVyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZm9ybURpc2FibGVkID0gZmFsc2U7XG59XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { Directive } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /* eslint-disable @angular-eslint/directive-selector */
4
+ /**
5
+ * Used to retrieve the host container for a dynamically rendered component.
6
+ *
7
+ * @export
8
+ */
9
+ export class MtnaWfFormItemDirective {
10
+ constructor(viewContainerRef) {
11
+ this.viewContainerRef = viewContainerRef;
12
+ }
13
+ }
14
+ MtnaWfFormItemDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormItemDirective, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
15
+ MtnaWfFormItemDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormItemDirective, selector: "[formItemHost]", ngImport: i0 });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormItemDirective, decorators: [{
17
+ type: Directive,
18
+ args: [{
19
+ selector: '[formItemHost]',
20
+ }]
21
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; } });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pdGVtLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9mb3JtL2Zvcm0taXRlbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7O0FBRTVELHVEQUF1RDtBQUN2RDs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLHVCQUF1QjtJQUNsQyxZQUFtQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFHLENBQUM7O3FIQUQ5Qyx1QkFBdUI7eUdBQXZCLHVCQUF1Qjs0RkFBdkIsdUJBQXVCO2tCQUhuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3IgKi9cbi8qKlxuICogVXNlZCB0byByZXRyaWV2ZSB0aGUgaG9zdCBjb250YWluZXIgZm9yIGEgZHluYW1pY2FsbHkgcmVuZGVyZWQgY29tcG9uZW50LlxuICpcbiAqIEBleHBvcnRcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Zvcm1JdGVtSG9zdF0nLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZGb3JtSXRlbURpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7fVxufVxuIl19
@@ -0,0 +1,250 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
3
+ import { mixinDestroyNotifier } from '@mtna/core-angular';
4
+ import { BehaviorSubject, Subscription } from 'rxjs';
5
+ import { distinctUntilChanged, skipWhile, takeUntil } from 'rxjs/operators';
6
+ import { findFormControl } from '../core/utilities/find-form-control';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../core/services";
9
+ import * as i2 from "./form-disabler.component";
10
+ import * as i3 from "../groups/group-components";
11
+ import * as i4 from "@angular/common";
12
+ import * as i5 from "@angular/forms";
13
+ export class MtnaWfFormComponent extends mixinDestroyNotifier(class {
14
+ }) {
15
+ constructor(mtnaFormManager, ngFormService, uiService) {
16
+ super();
17
+ this.mtnaFormManager = mtnaFormManager;
18
+ this.ngFormService = ngFormService;
19
+ this.uiService = uiService;
20
+ this._emitStatusOnMtnaFormChange = false;
21
+ this.readonly$ = new BehaviorSubject(true);
22
+ /**
23
+ * Emitted every time a form control's validation status changes.
24
+ * The `id` is the form control's name and the `status` is the new validation status for the control.
25
+ */
26
+ this.status = new EventEmitter();
27
+ this.focusedSection = new EventEmitter();
28
+ this.mtnaFormChange = new EventEmitter();
29
+ this.componentIds = [];
30
+ this._hasPreviousForm = false;
31
+ this._initialStatusEmitted = false;
32
+ this._constructionDate = new Date();
33
+ // Initialize the subscription to observe input changes
34
+ this._subscribeAndEmitMtnaFormChanges();
35
+ }
36
+ set annotations(map) {
37
+ this.uiService.registerAnnotations(map);
38
+ }
39
+ /** Whether to emit the status of each step each time the {@link mtnaForm} is set to a new value. Defaults to false.*/
40
+ get emitStatusOnMtnaFormChange() {
41
+ return this._emitStatusOnMtnaFormChange;
42
+ }
43
+ set emitStatusOnMtnaFormChange(emitStatusOnMtnaFormChange) {
44
+ this._emitStatusOnMtnaFormChange = coerceBooleanProperty(emitStatusOnMtnaFormChange);
45
+ }
46
+ get mtnaForm() {
47
+ return this._mtnaForm;
48
+ }
49
+ set mtnaForm(form) {
50
+ if (!!form && !this.ngForm) {
51
+ // serialize the form when input is set the first time
52
+ this._handleFormSerialization(form);
53
+ this._checkAndSubscribeToFormStatus();
54
+ }
55
+ this._mtnaForm = form;
56
+ if (form) {
57
+ this.mtnaFormManager.setMtnaForm(form);
58
+ // If indicated, re-emit the status of each step when there is a new form
59
+ if (this.emitStatusOnMtnaFormChange && this.ngForm) {
60
+ for (const key in this._steps) {
61
+ if (Object.prototype.hasOwnProperty.call(this._steps, key)) {
62
+ this._emitFormControlStatus(key);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * The form can contain sections not included in the steps.
70
+ * To avoid misalignment of steps-to-sections, we map each step to
71
+ * its instanceId
72
+ */
73
+ set steps(newSteps) {
74
+ if (!!newSteps && !!newSteps.length) {
75
+ if (!this._steps) {
76
+ this._steps = {};
77
+ }
78
+ for (const step of newSteps) {
79
+ this._steps[step.instanceId] = step;
80
+ }
81
+ this._checkAndSubscribeToFormStatus();
82
+ }
83
+ }
84
+ get readonly() {
85
+ return this.readonly$.value;
86
+ }
87
+ set readonly(r) {
88
+ const newValue = coerceBooleanProperty(r);
89
+ if (newValue !== this.readonly$.value) {
90
+ this.readonly$.next(r);
91
+ }
92
+ }
93
+ ngAfterViewInit() {
94
+ const afterViewInitDate = new Date();
95
+ const secondsToRender = (afterViewInitDate.getTime() - this._constructionDate.getTime()) / 1000;
96
+ console.warn('[MtnaFormComponent] afterViewInit - took ', secondsToRender, ' to render');
97
+ }
98
+ ngOnDestroy() {
99
+ super.ngOnDestroy();
100
+ this.uiService.resetComponentMap();
101
+ }
102
+ _trackByInstanceId(index, formItem) {
103
+ return formItem.instanceId;
104
+ }
105
+ /** Subscribe and emit form status changes for the steps. */
106
+ _checkAndSubscribeToFormStatus() {
107
+ // Only subscribe once both the steps and the angular have been initialized
108
+ if (this.ngForm && this._steps) {
109
+ // Update form status subscriptions anytime the readonly input changes
110
+ this.readonly$.pipe(takeUntil(this.destroyed$), distinctUntilChanged()).subscribe((readonly) => {
111
+ if (readonly) {
112
+ // Don't emit statuses while form is in readonly
113
+ this._unsubscribeFromNgFormChanges();
114
+ }
115
+ else if (!this._ngFormStatusChangeSub || this._ngFormStatusChangeSub.closed) {
116
+ // For performance, subscribe should only trigger again if the subscription didn't previously exist
117
+ this._emitInitialStepsStatusAndSubscribeToChanges(!this._initialStatusEmitted);
118
+ this._initialStatusEmitted = true;
119
+ }
120
+ });
121
+ }
122
+ }
123
+ /**
124
+ * Find a form control with the given name, then emit it's status.
125
+ *
126
+ * @param name — The unique name of the form cotrol to find and emit the status for.
127
+ */
128
+ _emitFormControlStatus(name) {
129
+ if (this.ngForm) {
130
+ const control = findFormControl(name, this.ngForm);
131
+ if (control) {
132
+ this.status.emit({
133
+ id: name,
134
+ status: control.status,
135
+ });
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * @param emitInitialValues Whether to emit initial step values or just listen for future changes
141
+ */
142
+ _emitInitialStepsStatusAndSubscribeToChanges(emitInitialValues) {
143
+ if (this._steps && this.ngForm) {
144
+ this._unsubscribeFromNgFormChanges();
145
+ this._ngFormStatusChangeSub = new Subscription();
146
+ // Find the form control for each step and only subscribe to those.
147
+ for (const key in this._steps) {
148
+ if (Object.prototype.hasOwnProperty.call(this._steps, key)) {
149
+ const control = findFormControl(key, this.ngForm);
150
+ if (control) {
151
+ if (emitInitialValues) {
152
+ this.status.emit({
153
+ id: key,
154
+ // Angular introduced this status in v13, once we update, this type cast can be removed.
155
+ status: control.status,
156
+ });
157
+ }
158
+ // Subscribe to status changes of each step & emit on change
159
+ this._ngFormStatusChangeSub.add(control.statusChanges
160
+ .pipe(takeUntil(this.destroyed$), distinctUntilChanged())
161
+ .subscribe((status) => this.status.emit({ id: key, status })));
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+ /**
168
+ * Observes input changes for readOnly, in order to handle internal change subscriptions.
169
+ * When the form is not readonly, we subscribe to form status & form item changes, so we can emit them.
170
+ * When the form is readonly, we do not want to emit any changes, so we unsubscribe.
171
+ */
172
+ _subscribeAndEmitMtnaFormChanges() {
173
+ this.readonly$
174
+ .pipe(takeUntil(this.destroyed$),
175
+ // we don't want to create subscriptions until we have a form to subscribe to
176
+ skipWhile(() => !this.mtnaForm), distinctUntilChanged())
177
+ .subscribe((readonly) => {
178
+ if (readonly) {
179
+ this._unsubscribeFromMtnaFormChanges();
180
+ }
181
+ else if (!this._mtnaFormItemChangeSub || this._mtnaFormItemChangeSub.closed) {
182
+ // For performance, subscribe should only trigger again if one of the subscriptions didn't previously exist
183
+ this._subscribeToMtnaFormItemChanges();
184
+ }
185
+ });
186
+ }
187
+ _handleFormSerialization(form) {
188
+ // Get the registered form from the service if it exists
189
+ this._hasPreviousForm = this.ngFormService.hasForm();
190
+ if (this._hasPreviousForm) {
191
+ this.ngForm = this.ngFormService.getForm();
192
+ // FIXME this is necessary because the initial visiblity is based on the mtnaForm item's disable property
193
+ // If the user changes a value, goes to another tab (destroying form) and comes back, the initial values are incorrect
194
+ this.mtnaForm = this.mtnaFormManager.insertNewValues(form, this.ngFormService.getFormValue());
195
+ }
196
+ else {
197
+ this.ngForm = this.mtnaFormManager.serializeMtnaFormItem(form);
198
+ this.ngFormService.setForm(this.ngForm);
199
+ }
200
+ }
201
+ /**
202
+ * Adds or removes a FormItem whenever a new MtnaWfFormItemChange occurs,
203
+ * and emits a new MtnaForm.
204
+ */
205
+ _subscribeToMtnaFormItemChanges() {
206
+ this._unsubscribeFromMtnaFormChanges();
207
+ this._mtnaFormItemChangeSub = this.mtnaFormManager.formChanges
208
+ .pipe(takeUntil(this.destroyed$), skipWhile((change) => !change))
209
+ .subscribe((newForm) => this.mtnaFormChange.emit(newForm));
210
+ }
211
+ _unsubscribeFromNgFormChanges() {
212
+ if (!!this._ngFormStatusChangeSub && !this._ngFormStatusChangeSub.closed) {
213
+ this._ngFormStatusChangeSub.unsubscribe();
214
+ }
215
+ }
216
+ _unsubscribeFromMtnaFormChanges() {
217
+ if (!!this._mtnaFormItemChangeSub && !this._mtnaFormItemChangeSub.closed) {
218
+ this._mtnaFormItemChangeSub.unsubscribe();
219
+ }
220
+ }
221
+ }
222
+ MtnaWfFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormComponent, deps: [{ token: i1.MtnaWfManagerService }, { token: i1.MtnaWfNgFormService }, { token: i1.MtnaWfUIService }], target: i0.ɵɵFactoryTarget.Component });
223
+ MtnaWfFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: MtnaWfFormComponent, selector: "mtna-form", inputs: { annotations: "annotations", emitStatusOnMtnaFormChange: "emitStatusOnMtnaFormChange", mtnaForm: "mtnaForm", steps: "steps", readonly: "readonly" }, outputs: { status: "status", focusedSection: "focusedSection", mtnaFormChange: "mtnaFormChange" }, usesInheritance: true, ngImport: i0, template: "<form *ngIf=\"ngForm\" [formGroup]=\"ngForm\" [formDisabled]=\"readonly\">\n <mtna-wf-item\n *ngFor=\"let item of mtnaForm?.items; let index = index; trackBy: _trackByInstanceId\"\n [item]=\"item\"\n [control]=\"ngForm.controls[item.instanceId]\"\n [readonly]=\"readonly\"\n [parentIds]=\"componentIds\"\n [step]=\"_steps?.[item.instanceId]\"\n (focusedSection)=\"focusedSection.emit($event)\"\n ></mtna-wf-item>\n</form>\n", styles: ["mtna-form form{display:block}mtna-form form .mtna-wf-section{display:block;margin:32px 0}mtna-form form fieldset[disabled] .mtna-wf-item .mtna-wf-date-item .mat-form-field.mat-form-field-appearance-outline .mat-form-field-flex:hover .mat-form-field-outline{opacity:0}mtna-form form fieldset[disabled] .mtna-wf-item .mtna-wf-date-item .mat-form-field.mat-form-field-appearance-outline .mat-form-field-flex:hover .mat-form-field-outline-thick{opacity:1}mtna-form form fieldset[disabled] .mtna-wf-item .mtna-wf-date-item .mat-form-field.mat-form-field-appearance-outline .mat-form-field-flex:hover .mat-form-field-outline-thick .mat-form-field-outline-end,mtna-form form fieldset[disabled] .mtna-wf-item .mtna-wf-date-item .mat-form-field.mat-form-field-appearance-outline .mat-form-field-flex:hover .mat-form-field-outline-thick .mat-form-field-outline-gap,mtna-form form fieldset[disabled] .mtna-wf-item .mtna-wf-date-item .mat-form-field.mat-form-field-appearance-outline .mat-form-field-flex:hover .mat-form-field-outline-thick .mat-form-field-outline-start{border-width:1px}mtna-form form fieldset[disabled] .mtna-wf-item .mtna-wf-date-item .mat-form-field.mat-form-field-appearance-outline .mat-form-field-suffix .mat-datepicker-toggle .mat-icon-button{cursor:default}mtna-form .mtna-wf-item,mtna-form .mtna-wf-title{margin-top:1rem}mtna-form .mtna-wf-text{margin:.5rem 0;font-size:.9rem}mtna-form .mtna-wf-title-item,mtna-form .mtna-wf-text-item{margin:0}mtna-form mtna-annotations-indicator+mtna-wf-value-item .mtna-wf-title-item,mtna-form mtna-annotations-indicator+mtna-wf-value-item .mtna-wf-text-item{padding-right:24px}\n"], components: [{ type: i2.MtnaWfFormDisablerComponent, selector: "[formDisabled]", inputs: ["formDisabled"] }, { type: i3.MtnaWfFormItemComponent, selector: "mtna-wf-item", inputs: ["item", "readonly", "control", "parentIds", "step"], outputs: ["focusedSection"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: MtnaWfFormComponent, decorators: [{
225
+ type: Component,
226
+ args: [{
227
+ selector: 'mtna-form',
228
+ templateUrl: './form.component.html',
229
+ styleUrls: ['./form.component.scss'],
230
+ changeDetection: ChangeDetectionStrategy.OnPush,
231
+ encapsulation: ViewEncapsulation.None,
232
+ }]
233
+ }], ctorParameters: function () { return [{ type: i1.MtnaWfManagerService }, { type: i1.MtnaWfNgFormService }, { type: i1.MtnaWfUIService }]; }, propDecorators: { annotations: [{
234
+ type: Input
235
+ }], emitStatusOnMtnaFormChange: [{
236
+ type: Input
237
+ }], mtnaForm: [{
238
+ type: Input
239
+ }], steps: [{
240
+ type: Input
241
+ }], readonly: [{
242
+ type: Input
243
+ }], status: [{
244
+ type: Output
245
+ }], focusedSection: [{
246
+ type: Output
247
+ }], mtnaFormChange: [{
248
+ type: Output
249
+ }] } });
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWItZm9ybS1hbmd1bGFyL3NyYy9saWIvZm9ybS9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dlYi1mb3JtLWFuZ3VsYXIvc3JjL2xpYi9mb3JtL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQW9CLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7QUFXdEUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG9CQUFvQixDQUFDO0NBQVEsQ0FBQztJQTZGckUsWUFDVSxlQUFxQyxFQUNyQyxhQUFrQyxFQUNsQyxTQUEwQjtRQUVsQyxLQUFLLEVBQUUsQ0FBQztRQUpBLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUNyQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDbEMsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUEvRTVCLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQXdEcEMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRXZEOzs7V0FHRztRQUNPLFdBQU0sR0FBRyxJ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L0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsV0FBVztvQkFDckIsV0FBVyxFQUFFLHVCQUF1QjtvQkFDcEMsU0FBUyxFQUFFLENBQUMsdUJBQXVCLENBQUM7b0JBQ3BDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7MktBTUssV0FBVztzQkFEZCxLQUFLO2dCQU9GLDBCQUEwQjtzQkFEN0IsS0FBSztnQkFVRixRQUFRO3NCQURYLEtBQUs7Z0JBZ0NGLEtBQUs7c0JBRFIsS0FBSztnQkFjRixRQUFRO3NCQURYLEtBQUs7Z0JBZ0JJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDYW5EZXN0cm95Tm90aWZ5LCBtaXhpbkRlc3Ryb3lOb3RpZmllciB9IGZyb20gJ0BtdG5hL2NvcmUtYW5ndWxhcic7XG5pbXBvcnQgeyBBbm5vdGF0YWJsZU51bWJlck1hcCB9IGZyb20gJ0BtdG5hL3Bvam8tc29jaWFsLWFuZ3VsYXInO1xuaW1wb3J0IHsgRm9ybSwgRm9ybUNvbnRyb2xTdGF0dXMsIEZvcm1JdGVtIH0gZnJvbSAnQG10bmEvd2ViLWZvcm0tdHMnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHNraXBXaGlsZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBmaW5kRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9jb3JlL3V0aWxpdGllcy9maW5kLWZvcm0tY29udHJvbCc7XG5pbXBvcnQgeyBNdG5hV2ZNYW5hZ2VyU2VydmljZSwgTXRuYVdmTmdGb3JtU2VydmljZSwgTXRuYVdmVUlTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBGb3JtU3RlcCB9IGZyb20gJy4uL2Zvcm0tc3RlcHBlci9tb2RlbHMvZm9ybS1zdGVwLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXRuYS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBNdG5hV2ZGb3JtQ29tcG9uZW50IGV4dGVuZHMgbWl4aW5EZXN0cm95Tm90aWZpZXIoY2xhc3Mge30pIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ2FuRGVzdHJveU5vdGlmeSwgT25EZXN0cm95IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2VtaXRTdGF0dXNPbk10bmFGb3JtQ2hhbmdlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZXNfcmVhZG9ubHk6IEJvb2xlYW5JbnB1dDtcblxuICBASW5wdXQoKVxuICBzZXQgYW5ub3RhdGlvbnMobWFwOiBBbm5vdGF0YWJsZU51bWJlck1hcCkge1xuICAgIHRoaXMudWlTZXJ2aWNlLnJlZ2lzdGVyQW5ub3RhdGlvbnMobWFwKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRvIGVtaXQgdGhlIHN0YXR1cyBvZiBlYWNoIHN0ZXAgZWFjaCB0aW1lIHRoZSB7QGxpbmsgbXRuYUZvcm19IGlzIHNldCB0byBhIG5ldyB2YWx1ZS4gRGVmYXVsdHMgdG8gZmFsc2UuKi9cbiAgQElucHV0KClcbiAgZ2V0IGVtaXRTdGF0dXNPbk10bmFGb3JtQ2hhbmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbWl0U3RhdHVzT25NdG5hRm9ybUNoYW5nZTtcbiAgfVxuICBzZXQgZW1pdFN0YXR1c09uTXRuYUZvcm1DaGFuZ2UoZW1pdFN0YXR1c09uTXRuYUZvcm1DaGFuZ2U6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lbWl0U3RhdHVzT25NdG5hRm9ybUNoYW5nZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShlbWl0U3RhdHVzT25NdG5hRm9ybUNoYW5nZSk7XG4gIH1cbiAgcHJpdmF0ZSBfZW1pdFN0YXR1c09uTXRuYUZvcm1DaGFuZ2UgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBnZXQgbXRuYUZvcm0oKTogRm9ybSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tdG5hRm9ybTtcbiAgfVxuICBzZXQgbXRuYUZvcm0oZm9ybTogRm9ybSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoISFmb3JtICYmICF0aGlzLm5nRm9ybSkge1xuICAgICAgLy8gc2VyaWFsaXplIHRoZSBmb3JtIHdoZW4gaW5wdXQgaXMgc2V0IHRoZSBmaXJzdCB0aW1lXG4gICAgICB0aGlzLl9oYW5kbGVGb3JtU2VyaWFsaXphdGlvbihmb3JtKTtcbiAgICAgIHRoaXMuX2NoZWNrQW5kU3Vic2NyaWJlVG9Gb3JtU3RhdHVzKCk7XG4gICAgfVxuICAgIHRoaXMuX210bmFGb3JtID0gZm9ybTtcbiAgICBpZiAoZm9ybSkge1xuICAgICAgdGhpcy5tdG5hRm9ybU1hbmFnZXIuc2V0TXRuYUZvcm0oZm9ybSk7XG5cbiAgICAgIC8vIElmIGluZGljYXRlZCwgcmUtZW1pdCB0aGUgc3RhdHVzIG9mIGVhY2ggc3RlcCB3aGVuIHRoZXJlIGlzIGEgbmV3IGZvcm1cbiAgICAgIGlmICh0aGlzLmVtaXRTdGF0dXNPbk10bmFGb3JtQ2hhbmdlICYmIHRoaXMubmdGb3JtKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX3N0ZXBzKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGVwcywga2V5KSkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEZvcm1Db250cm9sU3RhdHVzKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX210bmFGb3JtOiBGb3JtIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGZvcm0gY2FuIGNvbnRhaW4gc2VjdGlvbnMgbm90IGluY2x1ZGVkIGluIHRoZSBzdGVwcy5cbiAgICogVG8gYXZvaWQgbWlzYWxpZ25tZW50IG9mIHN0ZXBzLXRvLXNlY3Rpb25zLCB3ZSBtYXAgZWFjaCBzdGVwIHRvXG4gICAqIGl0cyBpbnN0YW5jZUlkXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc3RlcHMobmV3U3RlcHM6IEFycmF5PEZvcm1TdGVwPiB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoISFuZXdTdGVwcyAmJiAhIW5ld1N0ZXBzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLl9zdGVwcykge1xuICAgICAgICB0aGlzLl9zdGVwcyA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIG5ld1N0ZXBzKSB7XG4gICAgICAgIHRoaXMuX3N0ZXBzW3N0ZXAuaW5zdGFuY2VJZF0gPSBzdGVwO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tBbmRTdWJzY3JpYmVUb0Zvcm1TdGF0dXMoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkkLnZhbHVlO1xuICB9XG4gIHNldCByZWFkb25seShyOiBib29sZWFuKSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocik7XG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLnJlYWRvbmx5JC52YWx1ZSkge1xuICAgICAgdGhpcy5yZWFkb25seSQubmV4dChyKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgYSBmb3JtIGNvbnRyb2wncyB2YWxpZGF0aW9uIHN0YXR1cyBjaGFuZ2VzLlxuICAgKiBUaGUgYGlkYCBpcyB0aGUgZm9ybSBjb250cm9sJ3MgbmFtZSBhbmQgdGhlIGBzdGF0dXNgIGlzIHRoZSBuZXcgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIHRoZSBjb250cm9sLlxuICAgKi9cbiAgQE91dHB1dCgpIHN0YXR1cyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBzdGF0dXM6IEZvcm1Db250cm9sU3RhdHVzIH0+KCk7XG4gIEBPdXRwdXQoKSBmb2N1c2VkU2VjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybVN0ZXA+KCk7XG4gIEBPdXRwdXQoKSBtdG5hRm9ybUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybT4oKTtcblxuICBuZ0Zvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgY29tcG9uZW50SWRzID0gW107XG4gIF9zdGVwczogeyBbaWQ6IHN0cmluZ106IEZvcm1TdGVwIH0gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfY29uc3RydWN0aW9uRGF0ZTogRGF0ZTtcbiAgcHJpdmF0ZSBfaGFzUHJldmlvdXNGb3JtID0gZmFsc2U7XG4gIHByaXZhdGUgX25nRm9ybVN0YXR1c0NoYW5nZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfbXRuYUZvcm1JdGVtQ2hhbmdlU3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9pbml0aWFsU3RhdHVzRW1pdHRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbXRuYUZvcm1NYW5hZ2VyOiBNdG5hV2ZNYW5hZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIG5nRm9ybVNlcnZpY2U6IE10bmFXZk5nRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1aVNlcnZpY2U6IE10bmFXZlVJU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbnN0cnVjdGlvbkRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIC8vIEluaXRpYWxpemUgdGhlIHN1YnNjcmlwdGlvbiB0byBvYnNlcnZlIGlucHV0IGNoYW5nZXNcbiAgICB0aGlzLl9zdWJzY3JpYmVBbmRFbWl0TXRuYUZvcm1DaGFuZ2VzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgYWZ0ZXJWaWV3SW5pdERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHNlY29uZHNUb1JlbmRlciA9IChhZnRlclZpZXdJbml0RGF0ZS5nZXRUaW1lKCkgLSB0aGlzLl9jb25zdHJ1Y3Rpb25EYXRlLmdldFRpbWUoKSkgLyAxMDAwO1xuICAgIGNvbnNvbGUud2FybignW010bmFGb3JtQ29tcG9uZW50XSBhZnRlclZpZXdJbml0IC0gdG9vayAnLCBzZWNvbmRzVG9SZW5kZXIsICcgdG8gcmVuZGVyJyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMudWlTZXJ2aWNlLnJlc2V0Q29tcG9uZW50TWFwKCk7XG4gIH1cblxuICBfdHJhY2tCeUluc3RhbmNlSWQoaW5kZXg6IG51bWJlciwgZm9ybUl0ZW06IEZvcm1JdGVtKSB7XG4gICAgcmV0dXJuIGZvcm1JdGVtLmluc3RhbmNlSWQ7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIGFuZCBlbWl0IGZvcm0gc3RhdHVzIGNoYW5nZXMgZm9yIHRoZSBzdGVwcy4gKi9cbiAgcHJpdmF0ZSBfY2hlY2tBbmRTdWJzY3JpYmVUb0Zvcm1TdGF0dXMoKSB7XG4gICAgLy8gT25seSBzdWJzY3JpYmUgb25jZSBib3RoIHRoZSBzdGVwcyBhbmQgdGhlIGFuZ3VsYXIgaGF2ZSBiZWVuIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMubmdGb3JtICYmIHRoaXMuX3N0ZXBzKSB7XG4gICAgICAvLyBVcGRhdGUgZm9ybSBzdGF0dXMgc3Vic2NyaXB0aW9ucyBhbnl0aW1lIHRoZSByZWFkb25seSBpbnB1dCBjaGFuZ2VzXG4gICAgICB0aGlzLnJlYWRvbmx5JC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHJlYWRvbmx5KSA9PiB7XG4gICAgICAgIGlmIChyZWFkb25seSkge1xuICAgICAgICAgIC8vIERvbid0IGVtaXQgc3RhdHVzZXMgd2hpbGUgZm9ybSBpcyBpbiByZWFkb25seVxuICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRnJvbU5nRm9ybUNoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fbmdGb3JtU3RhdHVzQ2hhbmdlU3ViIHx8IHRoaXMuX25nRm9ybVN0YXR1c0NoYW5nZVN1Yi5jbG9zZWQpIHtcbiAgICAgICAgICAvLyBGb3IgcGVyZm9ybWFuY2UsIHN1YnNjcmliZSBzaG91bGQgb25seSB0cmlnZ2VyIGFnYWluIGlmIHRoZSBzdWJzY3JpcHRpb24gZGlkbid0IHByZXZpb3VzbHkgZXhpc3RcbiAgICAgICAgICB0aGlzLl9lbWl0SW5pdGlhbFN0ZXBzU3RhdHVzQW5kU3Vic2NyaWJlVG9DaGFuZ2VzKCF0aGlzLl9pbml0aWFsU3RhdHVzRW1pdHRlZCk7XG4gICAgICAgICAgdGhpcy5faW5pdGlhbFN0YXR1c0VtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIGZvcm0gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lLCB0aGVuIGVtaXQgaXQncyBzdGF0dXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIOKAlCBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGZvcm0gY290cm9sIHRvIGZpbmQgYW5kIGVtaXQgdGhlIHN0YXR1cyBmb3IuXG4gICAqL1xuICBwcml2YXRlIF9lbWl0Rm9ybUNvbnRyb2xTdGF0dXMobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubmdGb3JtKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZmluZEZvcm1Db250cm9sKG5hbWUsIHRoaXMubmdGb3JtKTtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzLmVtaXQoe1xuICAgICAgICAgIGlkOiBuYW1lLFxuICAgICAgICAgIHN0YXR1czogY29udHJvbC5zdGF0dXMgYXMgRm9ybUNvbnRyb2xTdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZW1pdEluaXRpYWxWYWx1ZXMgV2hldGhlciB0byBlbWl0IGluaXRpYWwgc3RlcCB2YWx1ZXMgb3IganVzdCBsaXN0ZW4gZm9yIGZ1dHVyZSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIF9lbWl0SW5pdGlhbFN0ZXBzU3RhdHVzQW5kU3Vic2NyaWJlVG9DaGFuZ2VzKGVtaXRJbml0aWFsVmFsdWVzOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3N0ZXBzICYmIHRoaXMubmdGb3JtKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZUZyb21OZ0Zvcm1DaGFuZ2VzKCk7XG4gICAgICB0aGlzLl9uZ0Zvcm1TdGF0dXNDaGFuZ2VTdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGZvcm0gY29udHJvbCBmb3IgZWFjaCBzdGVwIGFuZCBvbmx5IHN1YnNjcmliZSB0byB0aG9zZS5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX3N0ZXBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc3RlcHMsIGtleSkpIHtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gZmluZEZvcm1Db250cm9sKGtleSwgdGhpcy5uZ0Zvcm0pO1xuICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBpZiAoZW1pdEluaXRpYWxWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXMuZW1pdCh7XG4gICAgICAgICAgICAgICAgaWQ6IGtleSxcbiAgICAgICAgICAgICAgICAvLyBBbmd1bGFyIGludHJvZHVjZWQgdGhpcyBzdGF0dXMgaW4gdjEzLCBvbmNlIHdlIHVwZGF0ZSwgdGhpcyB0eXBlIGNhc3QgY2FuIGJlIHJlbW92ZWQuXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBjb250cm9sLnN0YXR1cyBhcyBGb3JtQ29udHJvbFN0YXR1cyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gc3RhdHVzIGNoYW5nZXMgb2YgZWFjaCBzdGVwICYgZW1pdCBvbiBjaGFuZ2VcbiAgICAgICAgICAgIHRoaXMuX25nRm9ybVN0YXR1c0NoYW5nZVN1Yi5hZGQoXG4gICAgICAgICAgICAgIGNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN0YXR1cykgPT4gdGhpcy5zdGF0dXMuZW1pdCh7IGlkOiBrZXksIHN0YXR1cyB9KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmVzIGlucHV0IGNoYW5nZXMgZm9yIHJlYWRPbmx5LCBpbiBvcmRlciB0byBoYW5kbGUgaW50ZXJuYWwgY2hhbmdlIHN1YnNjcmlwdGlvbnMuXG4gICAqIFdoZW4gdGhlIGZvcm0gaXMgbm90IHJlYWRvbmx5LCB3ZSBzdWJzY3JpYmUgdG8gZm9ybSBzdGF0dXMgJiBmb3JtIGl0ZW0gY2hhbmdlcywgc28gd2UgY2FuIGVtaXQgdGhlbS5cbiAgICogV2hlbiB0aGUgZm9ybSBpcyByZWFkb25seSwgd2UgZG8gbm90IHdhbnQgdG8gZW1pdCBhbnkgY2hhbmdlcywgc28gd2UgdW5zdWJzY3JpYmUuXG4gICAqL1xuICBwcml2YXRlIF9zdWJzY3JpYmVBbmRFbWl0TXRuYUZvcm1DaGFuZ2VzKCkge1xuICAgIHRoaXMucmVhZG9ubHkkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCksXG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHN1YnNjcmlwdGlvbnMgdW50aWwgd2UgaGF2ZSBhIGZvcm0gdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgIHNraXBXaGlsZSgoKSA9PiAhdGhpcy5tdG5hRm9ybSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlYWRvbmx5KSA9PiB7XG4gICAgICAgIGlmIChyZWFkb25seSkge1xuICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRnJvbU10bmFGb3JtQ2hhbmdlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9tdG5hRm9ybUl0ZW1DaGFuZ2VTdWIgfHwgdGhpcy5fbXRuYUZvcm1JdGVtQ2hhbmdlU3ViLmNsb3NlZCkge1xuICAgICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSwgc3Vic2NyaWJlIHNob3VsZCBvbmx5IHRyaWdnZXIgYWdhaW4gaWYgb25lIG9mIHRoZSBzdWJzY3JpcHRpb25zIGRpZG4ndCBwcmV2aW91c2x5IGV4aXN0XG4gICAgICAgICAgdGhpcy5fc3Vic2NyaWJlVG9NdG5hRm9ybUl0ZW1DaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlRm9ybVNlcmlhbGl6YXRpb24oZm9ybTogRm9ybSkge1xuICAgIC8vIEdldCB0aGUgcmVnaXN0ZXJlZCBmb3JtIGZyb20gdGhlIHNlcnZpY2UgaWYgaXQgZXhpc3RzXG4gICAgdGhpcy5faGFzUHJldmlvdXNGb3JtID0gdGhpcy5uZ0Zvcm1TZXJ2aWNlLmhhc0Zvcm0oKTtcbiAgICBpZiAodGhpcy5faGFzUHJldmlvdXNGb3JtKSB7XG4gICAgICB0aGlzLm5nRm9ybSA9IHRoaXMubmdGb3JtU2VydmljZS5nZXRGb3JtKCk7XG4gICAgICAvLyBGSVhNRSB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBpbml0aWFsIHZpc2libGl0eSBpcyBiYXNlZCBvbiB0aGUgbXRuYUZvcm0gaXRlbSdzIGRpc2FibGUgcHJvcGVydHlcbiAgICAgIC8vIElmIHRoZSB1c2VyIGNoYW5nZXMgYSB2YWx1ZSwgZ29lcyB0byBhbm90aGVyIHRhYiAoZGVzdHJveWluZyBmb3JtKSBhbmQgY29tZXMgYmFjaywgdGhlIGluaXRpYWwgdmFsdWVzIGFyZSBpbmNvcnJlY3RcbiAgICAgIHRoaXMubXRuYUZvcm0gPSB0aGlzLm10bmFGb3JtTWFuYWdlci5pbnNlcnROZXdWYWx1ZXMoZm9ybSwgdGhpcy5uZ0Zvcm1TZXJ2aWNlLmdldEZvcm1WYWx1ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZ0Zvcm0gPSB0aGlzLm10bmFGb3JtTWFuYWdlci5zZXJpYWxpemVNdG5hRm9ybUl0ZW0oZm9ybSkgYXMgRm9ybUdyb3VwO1xuICAgICAgdGhpcy5uZ0Zvcm1TZXJ2aWNlLnNldEZvcm0odGhpcy5uZ0Zvcm0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9yIHJlbW92ZXMgYSBGb3JtSXRlbSB3aGVuZXZlciBhIG5ldyBNdG5hV2ZGb3JtSXRlbUNoYW5nZSBvY2N1cnMsXG4gICAqIGFuZCBlbWl0cyBhIG5ldyBNdG5hRm9ybS5cbiAgICovXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvTXRuYUZvcm1JdGVtQ2hhbmdlcygpIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZUZyb21NdG5hRm9ybUNoYW5nZXMoKTtcbiAgICB0aGlzLl9tdG5hRm9ybUl0ZW1DaGFuZ2VTdWIgPSB0aGlzLm10bmFGb3JtTWFuYWdlci5mb3JtQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpLFxuICAgICAgICBza2lwV2hpbGUoKGNoYW5nZSkgPT4gIWNoYW5nZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG5ld0Zvcm06IEZvcm0pID0+IHRoaXMubXRuYUZvcm1DaGFuZ2UuZW1pdChuZXdGb3JtKSk7XG4gIH1cblxuICBwcml2YXRlIF91bnN1YnNjcmliZUZyb21OZ0Zvcm1DaGFuZ2VzKCkge1xuICAgIGlmICghIXRoaXMuX25nRm9ybVN0YXR1c0NoYW5nZVN1YiAmJiAhdGhpcy5fbmdGb3JtU3RhdHVzQ2hhbmdlU3ViLmNsb3NlZCkge1xuICAgICAgdGhpcy5fbmdGb3JtU3RhdHVzQ2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmVGcm9tTXRuYUZvcm1DaGFuZ2VzKCkge1xuICAgIGlmICghIXRoaXMuX210bmFGb3JtSXRlbUNoYW5nZVN1YiAmJiAhdGhpcy5fbXRuYUZvcm1JdGVtQ2hhbmdlU3ViLmNsb3NlZCkge1xuICAgICAgdGhpcy5fbXRuYUZvcm1JdGVtQ2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iLCI8Zm9ybSAqbmdJZj1cIm5nRm9ybVwiIFtmb3JtR3JvdXBdPVwibmdGb3JtXCIgW2Zvcm1EaXNhYmxlZF09XCJyZWFkb25seVwiPlxuICA8bXRuYS13Zi1pdGVtXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbXRuYUZvcm0/Lml0ZW1zOyBsZXQgaW5kZXggPSBpbmRleDsgdHJhY2tCeTogX3RyYWNrQnlJbnN0YW5jZUlkXCJcbiAgICBbaXRlbV09XCJpdGVtXCJcbiAgICBbY29udHJvbF09XCJuZ0Zvcm0uY29udHJvbHNbaXRlbS5pbnN0YW5jZUlkXVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbcGFyZW50SWRzXT1cImNvbXBvbmVudElkc1wiXG4gICAgW3N0ZXBdPVwiX3N0ZXBzPy5baXRlbS5pbnN0YW5jZUlkXVwiXG4gICAgKGZvY3VzZWRTZWN0aW9uKT1cImZvY3VzZWRTZWN0aW9uLmVtaXQoJGV2ZW50KVwiXG4gID48L210bmEtd2YtaXRlbT5cbjwvZm9ybT5cbiJdfQ==