ng-tailwind 5.2.0 → 5.2.2

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 (212) hide show
  1. package/README.md +24 -24
  2. package/animations/ngt-angular-animations.d.ts +5 -5
  3. package/base/ngt-base-ng-model.d.ts +32 -32
  4. package/components/ngt-action/ngt-action.component.d.ts +30 -30
  5. package/components/ngt-action/ngt-action.module.d.ts +10 -10
  6. package/components/ngt-button/ngt-button.component.d.ts +35 -35
  7. package/components/ngt-button/ngt-button.module.d.ts +10 -10
  8. package/components/ngt-checkbox/ngt-checkbox.component.d.ts +53 -53
  9. package/components/ngt-checkbox/ngt-checkbox.module.d.ts +10 -10
  10. package/components/ngt-content/ngt-content.component.d.ts +12 -12
  11. package/components/ngt-content/ngt-content.module.d.ts +8 -8
  12. package/components/ngt-context-menu/ngt-context-menu.component.d.ts +19 -19
  13. package/components/ngt-context-menu/ngt-context-menu.directive.d.ts +25 -25
  14. package/components/ngt-context-menu/ngt-context-menu.module.d.ts +10 -10
  15. package/components/ngt-datatable/ngt-datatable.component.d.ts +125 -125
  16. package/components/ngt-datatable/ngt-datatable.module.d.ts +25 -25
  17. package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +14 -14
  18. package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +14 -14
  19. package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +29 -29
  20. package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +55 -55
  21. package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +32 -32
  22. package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +13 -13
  23. package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +20 -20
  24. package/components/ngt-date/ngt-date.component.d.ts +85 -85
  25. package/components/ngt-date/ngt-date.module.d.ts +13 -13
  26. package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +8 -8
  27. package/components/ngt-dropdown/ngt-dropdown.component.d.ts +53 -53
  28. package/components/ngt-dropdown/ngt-dropdown.module.d.ts +9 -9
  29. package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +14 -14
  30. package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +25 -25
  31. package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +35 -35
  32. package/components/ngt-dropzone/ngt-dropzone.component.d.ts +95 -95
  33. package/components/ngt-dropzone/ngt-dropzone.meta.d.ts +27 -27
  34. package/components/ngt-dropzone/ngt-dropzone.module.d.ts +17 -17
  35. package/components/ngt-floating-button/ngt-floating-button.component.d.ts +35 -35
  36. package/components/ngt-floating-button/ngt-floating-button.module.d.ts +10 -10
  37. package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +10 -10
  38. package/components/ngt-form/ngt-form.component.d.ts +60 -60
  39. package/components/ngt-form/ngt-form.module.d.ts +9 -9
  40. package/components/ngt-header-nav/ngt-header-nav.component.d.ts +14 -14
  41. package/components/ngt-header-nav/ngt-header-nav.module.d.ts +8 -8
  42. package/components/ngt-helper/ngt-helper.component.d.ts +25 -25
  43. package/components/ngt-helper/ngt-helper.module.d.ts +10 -10
  44. package/components/ngt-input/ngt-input.component.d.ts +129 -129
  45. package/components/ngt-input/ngt-input.module.d.ts +14 -14
  46. package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +17 -17
  47. package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +12 -5
  48. package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +15 -15
  49. package/components/ngt-modal/ngt-modal.component.d.ts +31 -31
  50. package/components/ngt-modal/ngt-modal.module.d.ts +11 -11
  51. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +116 -116
  52. package/components/ngt-multi-select/ngt-multi-select.module.d.ts +15 -15
  53. package/components/ngt-pagination/ngt-pagination.component.d.ts +43 -43
  54. package/components/ngt-pagination/ngt-pagination.module.d.ts +12 -12
  55. package/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.d.ts +21 -21
  56. package/components/ngt-popover/ngt-popover.component.d.ts +31 -31
  57. package/components/ngt-popover/ngt-popover.directive.d.ts +31 -31
  58. package/components/ngt-popover/ngt-popover.module.d.ts +11 -11
  59. package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +12 -12
  60. package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +12 -12
  61. package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +18 -18
  62. package/components/ngt-portlet/ngt-portlet.component.d.ts +20 -20
  63. package/components/ngt-portlet/ngt-portlet.module.d.ts +13 -13
  64. package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +9 -9
  65. package/components/ngt-radio-button/ngt-radio-button.component.d.ts +45 -45
  66. package/components/ngt-radio-button/ngt-radio-button.module.d.ts +11 -11
  67. package/components/ngt-section/ngt-section.component.d.ts +38 -38
  68. package/components/ngt-section/ngt-section.module.d.ts +11 -11
  69. package/components/ngt-select/ngt-select.component.d.ts +154 -154
  70. package/components/ngt-select/ngt-select.directive.d.ts +20 -20
  71. package/components/ngt-select/ngt-select.module.d.ts +16 -16
  72. package/components/ngt-shining/ngt-shining.component.d.ts +19 -19
  73. package/components/ngt-shining/ngt-shining.module.d.ts +8 -8
  74. package/components/ngt-sidenav/ngt-sidenav.component.d.ts +32 -32
  75. package/components/ngt-sidenav/ngt-sidenav.module.d.ts +8 -8
  76. package/components/ngt-slider/ngt-slider.component.d.ts +36 -36
  77. package/components/ngt-slider/ngt-slider.module.d.ts +9 -9
  78. package/components/ngt-svg/ngt-svg.component.d.ts +13 -13
  79. package/components/ngt-svg/ngt-svg.module.d.ts +10 -10
  80. package/components/ngt-tag/ngt-tag.component.d.ts +13 -13
  81. package/components/ngt-tag/ngt-tag.module.d.ts +9 -9
  82. package/components/ngt-textarea/ngt-textarea.component.d.ts +49 -49
  83. package/components/ngt-textarea/ngt-textarea.module.d.ts +13 -13
  84. package/components/ngt-validation/ngt-validation.component.d.ts +13 -13
  85. package/components/ngt-validation/ngt-validation.module.d.ts +8 -8
  86. package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +68 -68
  87. package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +8 -8
  88. package/enums/size.enum.d.ts +8 -8
  89. package/esm2020/animations/ngt-angular-animations.mjs +34 -34
  90. package/esm2020/base/ngt-base-ng-model.mjs +90 -90
  91. package/esm2020/components/ngt-action/ngt-action.component.mjs +96 -96
  92. package/esm2020/components/ngt-action/ngt-action.module.mjs +28 -28
  93. package/esm2020/components/ngt-button/ngt-button.component.mjs +142 -142
  94. package/esm2020/components/ngt-button/ngt-button.module.mjs +28 -28
  95. package/esm2020/components/ngt-checkbox/ngt-checkbox.component.mjs +192 -192
  96. package/esm2020/components/ngt-checkbox/ngt-checkbox.module.mjs +28 -28
  97. package/esm2020/components/ngt-content/ngt-content.component.mjs +32 -32
  98. package/esm2020/components/ngt-content/ngt-content.module.mjs +20 -20
  99. package/esm2020/components/ngt-context-menu/ngt-context-menu.component.mjs +25 -25
  100. package/esm2020/components/ngt-context-menu/ngt-context-menu.directive.mjs +89 -89
  101. package/esm2020/components/ngt-context-menu/ngt-context-menu.module.mjs +33 -33
  102. package/esm2020/components/ngt-datatable/ngt-datatable.component.mjs +470 -470
  103. package/esm2020/components/ngt-datatable/ngt-datatable.module.mjs +99 -99
  104. package/esm2020/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +57 -57
  105. package/esm2020/components/ngt-datatable/ngt-td/ngt-td.component.mjs +62 -62
  106. package/esm2020/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +113 -113
  107. package/esm2020/components/ngt-datatable/ngt-th/ngt-th.component.mjs +228 -228
  108. package/esm2020/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +127 -127
  109. package/esm2020/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +55 -55
  110. package/esm2020/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +86 -86
  111. package/esm2020/components/ngt-date/ngt-date.component.mjs +435 -435
  112. package/esm2020/components/ngt-date/ngt-date.module.mjs +40 -40
  113. package/esm2020/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +19 -19
  114. package/esm2020/components/ngt-dropdown/ngt-dropdown.component.mjs +204 -204
  115. package/esm2020/components/ngt-dropdown/ngt-dropdown.module.mjs +21 -21
  116. package/esm2020/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +54 -54
  117. package/esm2020/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +69 -66
  118. package/esm2020/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +94 -94
  119. package/esm2020/components/ngt-dropzone/ngt-dropzone.component.mjs +496 -496
  120. package/esm2020/components/ngt-dropzone/ngt-dropzone.meta.mjs +24 -24
  121. package/esm2020/components/ngt-dropzone/ngt-dropzone.module.mjs +55 -55
  122. package/esm2020/components/ngt-floating-button/ngt-floating-button.component.mjs +119 -119
  123. package/esm2020/components/ngt-floating-button/ngt-floating-button.module.mjs +28 -28
  124. package/esm2020/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +22 -22
  125. package/esm2020/components/ngt-form/ngt-form.component.mjs +207 -207
  126. package/esm2020/components/ngt-form/ngt-form.module.mjs +29 -29
  127. package/esm2020/components/ngt-header-nav/ngt-header-nav.component.mjs +39 -39
  128. package/esm2020/components/ngt-header-nav/ngt-header-nav.module.mjs +20 -20
  129. package/esm2020/components/ngt-helper/ngt-helper.component.mjs +68 -68
  130. package/esm2020/components/ngt-helper/ngt-helper.module.mjs +28 -28
  131. package/esm2020/components/ngt-input/ngt-input.component.mjs +844 -844
  132. package/esm2020/components/ngt-input/ngt-input.module.mjs +47 -47
  133. package/esm2020/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +46 -46
  134. package/esm2020/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +33 -11
  135. package/esm2020/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +40 -40
  136. package/esm2020/components/ngt-modal/ngt-modal.component.mjs +122 -122
  137. package/esm2020/components/ngt-modal/ngt-modal.module.mjs +39 -39
  138. package/esm2020/components/ngt-multi-select/ngt-multi-select.component.mjs +503 -503
  139. package/esm2020/components/ngt-multi-select/ngt-multi-select.module.mjs +52 -52
  140. package/esm2020/components/ngt-pagination/ngt-pagination.component.mjs +162 -162
  141. package/esm2020/components/ngt-pagination/ngt-pagination.module.mjs +36 -36
  142. package/esm2020/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +58 -58
  143. package/esm2020/components/ngt-popover/ngt-popover.component.mjs +85 -85
  144. package/esm2020/components/ngt-popover/ngt-popover.directive.mjs +126 -126
  145. package/esm2020/components/ngt-popover/ngt-popover.module.mjs +36 -36
  146. package/esm2020/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +34 -34
  147. package/esm2020/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +35 -35
  148. package/esm2020/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +57 -57
  149. package/esm2020/components/ngt-portlet/ngt-portlet.component.mjs +74 -74
  150. package/esm2020/components/ngt-portlet/ngt-portlet.module.mjs +47 -47
  151. package/esm2020/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +19 -19
  152. package/esm2020/components/ngt-radio-button/ngt-radio-button.component.mjs +153 -153
  153. package/esm2020/components/ngt-radio-button/ngt-radio-button.module.mjs +29 -29
  154. package/esm2020/components/ngt-section/ngt-section.component.mjs +151 -151
  155. package/esm2020/components/ngt-section/ngt-section.module.mjs +32 -32
  156. package/esm2020/components/ngt-select/ngt-select.component.mjs +670 -670
  157. package/esm2020/components/ngt-select/ngt-select.directive.mjs +36 -36
  158. package/esm2020/components/ngt-select/ngt-select.module.mjs +65 -65
  159. package/esm2020/components/ngt-shining/ngt-shining.component.mjs +40 -40
  160. package/esm2020/components/ngt-shining/ngt-shining.module.mjs +20 -20
  161. package/esm2020/components/ngt-sidenav/ngt-sidenav.component.mjs +132 -132
  162. package/esm2020/components/ngt-sidenav/ngt-sidenav.module.mjs +20 -20
  163. package/esm2020/components/ngt-slider/ngt-slider.component.mjs +100 -100
  164. package/esm2020/components/ngt-slider/ngt-slider.module.mjs +24 -24
  165. package/esm2020/components/ngt-svg/ngt-svg.component.mjs +53 -53
  166. package/esm2020/components/ngt-svg/ngt-svg.module.mjs +28 -28
  167. package/esm2020/components/ngt-tag/ngt-tag.component.mjs +37 -37
  168. package/esm2020/components/ngt-tag/ngt-tag.module.mjs +24 -24
  169. package/esm2020/components/ngt-textarea/ngt-textarea.component.mjs +238 -238
  170. package/esm2020/components/ngt-textarea/ngt-textarea.module.mjs +43 -43
  171. package/esm2020/components/ngt-validation/ngt-validation.component.mjs +26 -26
  172. package/esm2020/components/ngt-validation/ngt-validation.module.mjs +20 -20
  173. package/esm2020/directives/ngt-stylizable/ngt-stylizable.directive.mjs +290 -290
  174. package/esm2020/directives/ngt-stylizable/ngt-stylizable.module.mjs +20 -20
  175. package/esm2020/enums/size.enum.mjs +11 -11
  176. package/esm2020/helpers/enum/enum.mjs +7 -7
  177. package/esm2020/helpers/form/form.mjs +14 -14
  178. package/esm2020/helpers/input-mask/input-mask.helper.mjs +26 -26
  179. package/esm2020/helpers/promise/promise-helper.mjs +4 -4
  180. package/esm2020/helpers/routing/route.mjs +11 -11
  181. package/esm2020/helpers/uuid.mjs +10 -10
  182. package/esm2020/ng-tailwind.mjs +4 -4
  183. package/esm2020/public-api.mjs +127 -127
  184. package/esm2020/services/http/ngt-attachment-http.service.mjs +3 -3
  185. package/esm2020/services/http/ngt-http-form.service.mjs +3 -3
  186. package/esm2020/services/http/ngt-http-resource.service.mjs +3 -3
  187. package/esm2020/services/http/ngt-http-validation.service.mjs +3 -3
  188. package/esm2020/services/http/ngt-http.service.mjs +3 -3
  189. package/esm2020/services/http/ngt-translate.service.mjs +3 -3
  190. package/esm2020/services/ngt-stylizable/ngt-stylizable.service.mjs +273 -273
  191. package/esm2020/services/validation/ngt-ability-validation.service.mjs +3 -3
  192. package/fesm2015/ng-tailwind.mjs +8657 -8632
  193. package/fesm2015/ng-tailwind.mjs.map +1 -1
  194. package/fesm2020/ng-tailwind.mjs +8482 -8459
  195. package/fesm2020/ng-tailwind.mjs.map +1 -1
  196. package/helpers/enum/enum.d.ts +1 -1
  197. package/helpers/form/form.d.ts +4 -4
  198. package/helpers/input-mask/input-mask.helper.d.ts +20 -20
  199. package/helpers/promise/promise-helper.d.ts +1 -1
  200. package/helpers/routing/route.d.ts +2 -2
  201. package/helpers/uuid.d.ts +1 -1
  202. package/index.d.ts +5 -5
  203. package/package.json +1 -1
  204. package/public-api.d.ts +87 -87
  205. package/services/http/ngt-attachment-http.service.d.ts +9 -9
  206. package/services/http/ngt-http-form.service.d.ts +5 -5
  207. package/services/http/ngt-http-resource.service.d.ts +12 -12
  208. package/services/http/ngt-http-validation.service.d.ts +12 -12
  209. package/services/http/ngt-http.service.d.ts +27 -27
  210. package/services/http/ngt-translate.service.d.ts +33 -33
  211. package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -96
  212. package/services/validation/ngt-ability-validation.service.d.ts +5 -5
@@ -1,496 +1,496 @@
1
- import { Component, EventEmitter, Host, Input, Optional, Output, SkipSelf, ViewChild, ViewEncapsulation, } from '@angular/core';
2
- import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
- import { NgxDropzoneComponent } from 'ngx-dropzone';
4
- import { forkJoin } from 'rxjs';
5
- import { map } from 'rxjs/operators';
6
- import Viewer from 'viewerjs';
7
- import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
8
- import { getEnumFromString } from '../../helpers/enum/enum';
9
- import { uuid } from '../../helpers/uuid';
10
- import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
11
- import { NgtDropzoneFileViewerComponent } from './ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component';
12
- import { NgtDropzoneErrorType, NgtDropzonePreviewType } from './ngt-dropzone.meta';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/forms";
15
- import * as i2 from "../../services/http/ngt-attachment-http.service";
16
- import * as i3 from "../ngt-form/ngt-form.component";
17
- import * as i4 from "../ngt-section/ngt-section.component";
18
- import * as i5 from "../ngt-modal/ngt-modal.component";
19
- import * as i6 from "@angular/common";
20
- import * as i7 from "../ngt-validation/ngt-validation.component";
21
- import * as i8 from "ngx-dropzone";
22
- import * as i9 from "../ngt-helper/ngt-helper.component";
23
- import * as i10 from "./ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component";
24
- import * as i11 from "./ngt-dropzone-view/ngt-dropzone-view.component";
25
- import * as i12 from "./custom-dropzone-preview/custom-dropzone-preview.component";
26
- export class NgtDropzoneComponent extends NgtBaseNgModel {
27
- ;
28
- ;
29
- constructor(formContainer, injector, changeDetector, ngtAttachmentHttpService, ngtForm, ngtSection, ngtModal) {
30
- super();
31
- this.formContainer = formContainer;
32
- this.injector = injector;
33
- this.changeDetector = changeDetector;
34
- this.ngtAttachmentHttpService = ngtAttachmentHttpService;
35
- this.ngtForm = ngtForm;
36
- this.ngtSection = ngtSection;
37
- this.ngtModal = ngtModal;
38
- this.helpTextColor = 'text-green-500';
39
- // Behavior
40
- this.resources = [];
41
- this.multipleSelection = false;
42
- this.showFileName = false;
43
- this.disableClick = false;
44
- this.disabled = false;
45
- this.viewMode = false;
46
- this.removable = false;
47
- this.canDownloadFile = true;
48
- this.verticalExpandable = false;
49
- this.acceptedFiles = '*' /** Mime type */;
50
- this.previewType = NgtDropzonePreviewType.DEFAULT;
51
- this.onFileSelected = new EventEmitter();
52
- this.onFileSelectError = new EventEmitter();
53
- this.onFileUploadFail = new EventEmitter();
54
- this.onFileRemoved = new EventEmitter();
55
- this.onFileUploadInit = new EventEmitter();
56
- this.onFileUploaded = new EventEmitter();
57
- this.onFilePreviewLoaded = new EventEmitter();
58
- this.dropzoneHeight = '180px';
59
- this.uploadedResources = [];
60
- this.forceDisableClick = false;
61
- this.nativeValue = [];
62
- this.showNgtDropzoneFileViewer = false;
63
- this.componentReady = false;
64
- this.loading = false;
65
- this.ngxElementId = uuid();
66
- this.imageViewerOptions = {
67
- navbar: true,
68
- toolbar: {
69
- zoomIn: true,
70
- zoomOut: true,
71
- reset: true,
72
- rotateLeft: true,
73
- rotateRight: true,
74
- prev: true,
75
- next: true,
76
- }
77
- };
78
- this.subscriptions = [];
79
- this.ngtDropzoneLoaderStyle = new NgtStylizableService();
80
- this.ngtDropzoneLoaderStyle.load(this.injector, 'NgtDropzoneLoader', {
81
- h: 'h-8',
82
- color: {
83
- text: 'text-gray-600'
84
- }
85
- });
86
- }
87
- ngOnChanges(changes) {
88
- if (changes.previewType) {
89
- this.previewType = getEnumFromString(changes.previewType.currentValue, NgtDropzonePreviewType);
90
- }
91
- }
92
- ngAfterContentChecked() {
93
- if (this.container && this.container.nativeElement) {
94
- this.dropzoneHeight = `${this.container.nativeElement.parentElement.offsetHeight}px`;
95
- this.changeDetector.detectChanges();
96
- }
97
- }
98
- ngOnInit() {
99
- setTimeout(() => {
100
- this.componentReady = true;
101
- setTimeout(() => {
102
- this.initComponent();
103
- });
104
- }, 500);
105
- }
106
- ngOnDestroy() {
107
- this.destroySubscriptions();
108
- }
109
- imagePreview(index) {
110
- const images = this.uploadedResources.filter((resource) => this.isImage(resource));
111
- const imagesDiv = document.createElement("div");
112
- images.forEach((image) => {
113
- let imageElement = document.createElement("img");
114
- imageElement.src = image.file.url;
115
- imagesDiv.appendChild(imageElement);
116
- });
117
- this.onImageClick(imagesDiv, index);
118
- }
119
- onImageClick(element, index) {
120
- if (!this.viewMode) {
121
- this.forceDisableClick = true;
122
- }
123
- const ngtDropzoneComponent = this;
124
- if (index !== null && index !== undefined) {
125
- this.imageViewerOptions = { ...this.imageViewerOptions, ...{ initialViewIndex: index } };
126
- }
127
- const viewer = new Viewer(element, {
128
- ...this.imageViewerOptions, ...{
129
- hidden() {
130
- ngtDropzoneComponent.forceDisableClick = false;
131
- viewer.destroy();
132
- }
133
- }
134
- });
135
- viewer.show();
136
- }
137
- onFileClick(url, name, size) {
138
- this.forceDisableClick = true;
139
- this.showNgtDropzoneFileViewer = true;
140
- this.ngtDropzoneFileViewer.url = url;
141
- this.ngtDropzoneFileViewer.fileName = name;
142
- this.ngtDropzoneFileViewer.fileSize = size;
143
- this.ngtDropzoneFileViewer.init();
144
- this.subscriptions.push(this.ngtDropzoneFileViewer.onClose.subscribe(() => {
145
- this.showNgtDropzoneFileViewer = false;
146
- this.forceDisableClick = false;
147
- }));
148
- }
149
- async onSelect(event) {
150
- if (event.rejectedFiles.length) {
151
- for (const rejectedFile of event.rejectedFiles) {
152
- if (rejectedFile.reason == 'size') {
153
- this.onFileSelectError.emit(NgtDropzoneErrorType.SIZE);
154
- break;
155
- }
156
- else if (rejectedFile.reason == 'no_multiple') {
157
- this.onFileSelectError.emit(NgtDropzoneErrorType.NO_MULTIPLE);
158
- break;
159
- }
160
- else if (rejectedFile.reason == 'type') {
161
- this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
162
- break;
163
- }
164
- else {
165
- this.onFileSelectError.emit(NgtDropzoneErrorType.DEFAULT);
166
- break;
167
- }
168
- }
169
- }
170
- if (this.itemsLimit) {
171
- if (this.itemsLimit == 1 && event.addedFiles
172
- && event.addedFiles.length == this.itemsLimit && this.uploadedResources.length == this.itemsLimit) {
173
- this.uploadedResources = [];
174
- }
175
- if (event.addedFiles
176
- && event.addedFiles.length + this.uploadedResources.length <= this.itemsLimit) {
177
- this.onFileSelected.emit(event);
178
- this.uploadFiles(event.addedFiles);
179
- }
180
- else {
181
- this.onFileSelectError.emit(NgtDropzoneErrorType.ITEMS_LIMIT);
182
- }
183
- }
184
- else {
185
- this.onFileSelected.emit(event);
186
- this.uploadFiles(event.addedFiles);
187
- }
188
- }
189
- async uploadFiles(files) {
190
- if (files && files.length) {
191
- const temporaryFiles = [];
192
- const temporaryAttachments = [];
193
- const observables = [];
194
- const unacceptedFiles = [];
195
- this.loading = true;
196
- this.onFileUploadInit.emit();
197
- files.forEach(file => {
198
- if (file.type.includes(this.unacceptedFiles)) {
199
- return unacceptedFiles.push(file);
200
- }
201
- observables.push(this.ngtAttachmentHttpService.upload(this.remoteResource, file).pipe(map((response) => {
202
- if (response && response.data) {
203
- if (response.data.attributes && response.data.attributes.data) {
204
- file['url'] = response.data.attributes.data.url;
205
- }
206
- temporaryFiles.push({
207
- id: response.data.id,
208
- size: file.size,
209
- file: file
210
- });
211
- response.data['loaded'] = true;
212
- temporaryAttachments.push(response.data);
213
- }
214
- })));
215
- });
216
- if (!observables.length && unacceptedFiles.length) {
217
- this.loading = false;
218
- return this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
219
- }
220
- this.subscriptions.push(forkJoin(observables).subscribe((response) => {
221
- this.uploadedResources.push(...temporaryFiles);
222
- if (this.itemsLimit == 1) {
223
- this.onNativeChange([...temporaryAttachments]);
224
- }
225
- else {
226
- this.onNativeChange([...temporaryAttachments, ...this.nativeValue]);
227
- }
228
- this.onFileUploaded.emit();
229
- this.loading = false;
230
- if (unacceptedFiles.length) {
231
- this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
232
- }
233
- setTimeout(() => this.changeDetector.detectChanges(), 500);
234
- }, (error) => {
235
- this.onFileUploadFail.emit(error);
236
- this.loading = false;
237
- setTimeout(() => this.changeDetector.detectChanges(), 500);
238
- }));
239
- }
240
- }
241
- async loadFilePreview(attachments) {
242
- if (attachments && attachments.length && attachments[0]) {
243
- let temporaryResource = [];
244
- let observables = [];
245
- attachments.forEach((attachment) => {
246
- if (!(attachment instanceof File) && !attachment.loaded) {
247
- this.loading = true;
248
- attachment['loaded'] = true;
249
- observables.push(this.ngtAttachmentHttpService.preview(attachment)
250
- .pipe(map((response) => {
251
- temporaryResource.push({
252
- id: response.data.getApiId(),
253
- file: response.data.getAttribute('file')
254
- });
255
- })));
256
- }
257
- });
258
- this.subscriptions.push(forkJoin(observables).subscribe((response) => {
259
- this.uploadedResources.push(...temporaryResource);
260
- this.onNativeChange(attachments);
261
- this.onFilePreviewLoaded.emit();
262
- this.loading = false;
263
- setTimeout(() => this.changeDetector.detectChanges(), 500);
264
- }, (error) => {
265
- this.loading = false;
266
- }));
267
- }
268
- }
269
- onRemove(resource) {
270
- this.uploadedResources.splice(this.uploadedResources.indexOf(resource), 1);
271
- this.nativeValue = this.nativeValue.filter(element => element.id != resource.id);
272
- this.onNativeChange(this.nativeValue);
273
- this.onFileRemoved.emit(resource);
274
- }
275
- isImage(resource) {
276
- return this.previewType == 'IMAGE'
277
- || (resource.file?.type
278
- && resource.file.type.includes('image')
279
- && !resource.file.type.includes('dwg'));
280
- }
281
- isVideo(resource) {
282
- return this.previewType == 'VIDEO' || (resource.file && resource.file.type && resource.file.type.includes('video'));
283
- }
284
- isAudio(resource) {
285
- return (resource.file && resource.file.type && resource.file.type.includes('audio'));
286
- }
287
- isFile(resource) {
288
- return !this.isImage(resource) && !this.isAudio(resource) && !this.isVideo(resource);
289
- }
290
- getFormattedFileSize(resource) {
291
- if (resource) {
292
- let size = resource.size || resource.fileSize;
293
- if (!size) {
294
- if (resource.file && resource.file.size) {
295
- size = resource.file.size;
296
- }
297
- else {
298
- size = 0;
299
- }
300
- }
301
- if (parseFloat(size) > 1000000) {
302
- return (parseFloat(size) / 1000000).toFixed(2) + ' Mb';
303
- }
304
- return Math.round(parseFloat(size) / 1000) + ' Kb';
305
- }
306
- }
307
- onNativeChange(value) {
308
- if (value === undefined) {
309
- this.value = [];
310
- this.nativeValue = [];
311
- }
312
- else {
313
- this.nativeValue = value;
314
- if (JSON.stringify(this.value) != JSON.stringify(this.nativeValue)) {
315
- this.value = this.nativeValue;
316
- }
317
- }
318
- }
319
- change(value) {
320
- if (value && !this.viewMode) {
321
- this.onNativeChange(Array.isArray(value) ? value : [value]);
322
- if (this.componentReady) {
323
- this.loadFilePreview(Array.isArray(value) ? value : [value]);
324
- }
325
- }
326
- }
327
- downloadFile(attachment) {
328
- this.ngtAttachmentHttpService.download(attachment).subscribe(() => { });
329
- }
330
- reset() {
331
- this.uploadedResources = [];
332
- this.value = [];
333
- this.nativeValue = [];
334
- this.initComponent();
335
- }
336
- openFileSelector() {
337
- document.getElementById(this.ngxElementId).click();
338
- }
339
- isDisabled() {
340
- return this.disabled || this.isDisabledByParent();
341
- }
342
- initComponent() {
343
- if (this.viewMode) {
344
- this.previewType = NgtDropzonePreviewType.DEFAULT;
345
- return;
346
- }
347
- if (this.formContainer && this.formContainer.control
348
- && (this.formControl = this.formContainer.control.get(this.name))) {
349
- this.resetFilesLoad();
350
- this.loadFilePreview(Array.isArray(this.value) ? this.value : [this.value]);
351
- this.updateValidations();
352
- if (this.value) {
353
- this.formControl.markAsDirty();
354
- }
355
- else {
356
- this.formControl.markAsPristine();
357
- }
358
- }
359
- }
360
- resetFilesLoad() {
361
- if (Array.isArray(this.value)) {
362
- this.value.forEach(element => {
363
- if (element) {
364
- element['loaded'] = false;
365
- }
366
- });
367
- }
368
- }
369
- updateValidations() {
370
- if (!this.formControl) {
371
- return;
372
- }
373
- let syncValidators = [];
374
- if (this.isRequired) {
375
- syncValidators.push(Validators.required);
376
- }
377
- syncValidators.push();
378
- setTimeout(() => {
379
- this.formControl.setValidators(syncValidators);
380
- this.formControl.updateValueAndValidity();
381
- });
382
- }
383
- isDisabledByParent() {
384
- return this.ngtForm?.isDisabled
385
- || this.ngtSection?.isDisabled
386
- || this.ngtModal?.isDisabled;
387
- }
388
- destroySubscriptions() {
389
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
390
- this.subscriptions = [];
391
- }
392
- }
393
- NgtDropzoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDropzoneComponent, deps: [{ token: i1.ControlContainer, host: true, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i2.NgtAttachmentHttpService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtSectionComponent, optional: true, skipSelf: true }, { token: i5.NgtModalComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
394
- NgtDropzoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtDropzoneComponent, selector: "ngt-dropzone", inputs: { label: "label", placeholder: "placeholder", helpTextColor: "helpTextColor", helpText: "helpText", helpTitle: "helpTitle", resources: "resources", multipleSelection: "multipleSelection", itemsLimit: "itemsLimit", showFileName: "showFileName", disableClick: "disableClick", disabled: "disabled", viewMode: "viewMode", removable: "removable", canDownloadFile: "canDownloadFile", verticalExpandable: "verticalExpandable", isRequired: "isRequired", hideNgxDropzone: "hideNgxDropzone", acceptedFiles: "acceptedFiles", unacceptedFiles: "unacceptedFiles", maxFileSize: "maxFileSize", previewType: "previewType", name: "name", remoteResource: "remoteResource" }, outputs: { onFileSelected: "onFileSelected", onFileSelectError: "onFileSelectError", onFileUploadFail: "onFileUploadFail", onFileRemoved: "onFileRemoved", onFileUploadInit: "onFileUploadInit", onFileUploaded: "onFileUploaded", onFilePreviewLoaded: "onFilePreviewLoaded" }, providers: [
395
- NgtMakeProvider(NgtDropzoneComponent),
396
- ], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "ngxDropzone", first: true, predicate: NgxDropzoneComponent, descendants: true, static: true }, { propertyName: "ngtDropzoneFileViewer", first: true, predicate: NgtDropzoneFileViewerComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col h-full w-full\" #container>\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\n {{ label }}:\n\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n </label>\n\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\n <div *ngIf=\"loading && !hideNgxDropzone\"\n class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\n <div class=\"div-loader\"></div>\n </div>\n\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\n [disabled]='isDisabled() || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #ngxDropzone>\n <ng-container *ngIf=\"!loading\">\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\n {{ placeholder }}\n </ngx-dropzone-label>\n\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\n <div class=\"flex flex-col w-48 mx-4\"\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\n ngProjectAs=\"ngx-dropzone-preview\">\n </custom-dropzone-preview>\n\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-image-preview>\n </div>\n\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-video-preview>\n\n <p *ngIf=\"showFileName\"\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\n {{ resource?.file?.name || '' }}\n </p>\n </div>\n </ng-container>\n </ng-container>\n </ngx-dropzone>\n </div>\n\n <ngt-dropzone-view *ngIf=\"viewMode\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\n </ngt-dropzone-view>\n\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\n </ngt-dropzone-file-viewer>\n\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\n</div>", styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.ɵb, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview" }, { kind: "component", type: i8.NgxDropzoneVideoPreviewComponent, selector: "ngx-dropzone-video-preview" }, { kind: "component", type: i9.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }, { kind: "component", type: i10.NgtDropzoneFileViewerComponent, selector: "ngt-dropzone-file-viewer", inputs: ["url", "fileName", "fileSize", "disableContent", "canDownloadFile"], outputs: ["onClose"] }, { kind: "component", type: i11.NgtDropzoneViewComponent, selector: "ngt-dropzone-view", inputs: ["resources", "dropzoneHeight", "loading", "placeholder"], outputs: ["onImageClick", "onFileClick"] }, { kind: "component", type: i12.CustomDropzonePreviewComponent, selector: "custom-dropzone-preview" }], viewProviders: [
397
- { provide: ControlContainer, useExisting: NgForm }
398
- ], encapsulation: i0.ViewEncapsulation.None });
399
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDropzoneComponent, decorators: [{
400
- type: Component,
401
- args: [{ selector: 'ngt-dropzone', encapsulation: ViewEncapsulation.None, providers: [
402
- NgtMakeProvider(NgtDropzoneComponent),
403
- ], viewProviders: [
404
- { provide: ControlContainer, useExisting: NgForm }
405
- ], template: "<div class=\"flex flex-col h-full w-full\" #container>\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\n {{ label }}:\n\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\n {{ helpText }}\n </ngt-helper>\n </label>\n\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\n <div *ngIf=\"loading && !hideNgxDropzone\"\n class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\n <div class=\"div-loader\"></div>\n </div>\n\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\n [disabled]='isDisabled() || loading' [expandable]='verticalExpandable'\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #ngxDropzone>\n <ng-container *ngIf=\"!loading\">\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\n {{ placeholder }}\n </ngx-dropzone-label>\n\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\n <div class=\"flex flex-col w-48 mx-4\"\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\n ngProjectAs=\"ngx-dropzone-preview\">\n </custom-dropzone-preview>\n\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-image-preview>\n </div>\n\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\n </ngx-dropzone-video-preview>\n\n <p *ngIf=\"showFileName\"\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\n {{ resource?.file?.name || '' }}\n </p>\n </div>\n </ng-container>\n </ng-container>\n </ngx-dropzone>\n </div>\n\n <ngt-dropzone-view *ngIf=\"viewMode\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\n </ngt-dropzone-view>\n\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\n </ngt-dropzone-file-viewer>\n\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\n</div>", styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
406
- }], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
407
- type: Optional
408
- }, {
409
- type: Host
410
- }] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i2.NgtAttachmentHttpService, decorators: [{
411
- type: Optional
412
- }, {
413
- type: SkipSelf
414
- }] }, { type: i3.NgtFormComponent, decorators: [{
415
- type: Optional
416
- }, {
417
- type: SkipSelf
418
- }] }, { type: i4.NgtSectionComponent, decorators: [{
419
- type: Optional
420
- }, {
421
- type: SkipSelf
422
- }] }, { type: i5.NgtModalComponent, decorators: [{
423
- type: Optional
424
- }, {
425
- type: SkipSelf
426
- }] }]; }, propDecorators: { container: [{
427
- type: ViewChild,
428
- args: ['container']
429
- }], ngxDropzone: [{
430
- type: ViewChild,
431
- args: [NgxDropzoneComponent, { static: true }]
432
- }], ngtDropzoneFileViewer: [{
433
- type: ViewChild,
434
- args: [NgtDropzoneFileViewerComponent, { static: true }]
435
- }], label: [{
436
- type: Input
437
- }], placeholder: [{
438
- type: Input
439
- }], helpTextColor: [{
440
- type: Input
441
- }], helpText: [{
442
- type: Input
443
- }], helpTitle: [{
444
- type: Input
445
- }], resources: [{
446
- type: Input
447
- }], multipleSelection: [{
448
- type: Input
449
- }], itemsLimit: [{
450
- type: Input
451
- }], showFileName: [{
452
- type: Input
453
- }], disableClick: [{
454
- type: Input
455
- }], disabled: [{
456
- type: Input
457
- }], viewMode: [{
458
- type: Input
459
- }], removable: [{
460
- type: Input
461
- }], canDownloadFile: [{
462
- type: Input
463
- }], verticalExpandable: [{
464
- type: Input
465
- }], isRequired: [{
466
- type: Input
467
- }], hideNgxDropzone: [{
468
- type: Input
469
- }], acceptedFiles: [{
470
- type: Input
471
- }], unacceptedFiles: [{
472
- type: Input
473
- }], maxFileSize: [{
474
- type: Input
475
- }], previewType: [{
476
- type: Input
477
- }], name: [{
478
- type: Input
479
- }], remoteResource: [{
480
- type: Input
481
- }], onFileSelected: [{
482
- type: Output
483
- }], onFileSelectError: [{
484
- type: Output
485
- }], onFileUploadFail: [{
486
- type: Output
487
- }], onFileRemoved: [{
488
- type: Output
489
- }], onFileUploadInit: [{
490
- type: Output
491
- }], onFileUploaded: [{
492
- type: Output
493
- }], onFilePreviewLoaded: [{
494
- type: Output
495
- }] } });
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRyb3B6b25lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1kcm9wem9uZS9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRyb3B6b25lL25ndC1kcm9wem9uZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQTBCLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFFOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDL0csT0FBTyxFQUFFLG9CQUFvQixFQUFtQixzQkFBc0Is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QUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVcsY0FBYztzQkFBOUIsTUFBTTtnQkFDVSxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGFBQWE7c0JBQTdCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGNBQWM7c0JBQTlCLE1BQU07Z0JBQ1UsbUJBQW1CO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neERyb3B6b25lQ2hhbmdlRXZlbnQsIE5neERyb3B6b25lQ29tcG9uZW50IH0gZnJvbSAnbmd4LWRyb3B6b25lJztcbmltcG9ydCB7IGZvcmtKb2luLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBWaWV3ZXIgZnJvbSAndmlld2VyanMnO1xuXG5pbXBvcnQgeyBOZ3RCYXNlTmdNb2RlbCwgTmd0TWFrZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vYmFzZS9uZ3QtYmFzZS1uZy1tb2RlbCc7XG5pbXBvcnQgeyBnZXRFbnVtRnJvbVN0cmluZyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bS9lbnVtJztcbmltcG9ydCB7IHV1aWQgfSBmcm9tICcuLi8uLi9oZWxwZXJzL3V1aWQnO1xuaW1wb3J0IHsgTmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtYXR0YWNobWVudC1odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0U3R5bGl6YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZ3Qtc3R5bGl6YWJsZS9uZ3Qtc3R5bGl6YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudCB9IGZyb20gJy4vbmd0LWRyb3B6b25lLWZpbGUtdmlld2VyL25ndC1kcm9wem9uZS1maWxlLXZpZXdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0RHJvcHpvbmVFcnJvclR5cGUsIE5ndERyb3B6b25lRmlsZSwgTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSB9IGZyb20gJy4vbmd0LWRyb3B6b25lLm1ldGEnO1xuaW1wb3J0IHsgTmd0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1mb3JtL25ndC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LXNlY3Rpb24vbmd0LXNlY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LW1vZGFsL25ndC1tb2RhbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1kcm9wem9uZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25ndC1kcm9wem9uZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWRyb3B6b25lLmNvbXBvbmVudC5jc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBOZ3RNYWtlUHJvdmlkZXIoTmd0RHJvcHpvbmVDb21wb25lbnQpLFxuICAgIF0sXG4gICAgdmlld1Byb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd0RHJvcHpvbmVDb21wb25lbnQgZXh0ZW5kcyBOZ3RCYXNlTmdNb2RlbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKSBwdWJsaWMgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoTmd4RHJvcHpvbmVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuZ3hEcm9wem9uZTogTmd4RHJvcHpvbmVDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZChOZ3REcm9wem9uZUZpbGVWaWV3ZXJDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuZ3REcm9wem9uZUZpbGVWaWV3ZXI6IE5ndERyb3B6b25lRmlsZVZpZXdlckNvbXBvbmVudDtcblxuICAgIC8vIFZpc3VhbFxuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dENvbG9yOiBzdHJpbmcgPSAndGV4dC1ncmVlbi01MDAnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGl0bGU6IHN0cmluZztcblxuICAgIC8vIEJlaGF2aW9yXG4gICAgQElucHV0KCkgcHVibGljIHJlc291cmNlczogQXJyYXk8Tmd0RHJvcHpvbmVGaWxlPiA9IFtdO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZVNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc0xpbWl0OiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIHNob3dGaWxlTmFtZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmlld01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVtb3ZhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNhbkRvd25sb2FkRmlsZTogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIHZlcnRpY2FsRXhwYW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1JlcXVpcmVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWRlTmd4RHJvcHpvbmU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGFjY2VwdGVkRmlsZXM6IHN0cmluZyA9ICcqJyAvKiogTWltZSB0eXBlICovO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1bmFjY2VwdGVkRmlsZXM6IHN0cmluZzsgLyoqIE1pbWUgdHlwZSAqLztcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4RmlsZVNpemU6IG51bWJlcjsgLyoqIEJ5dGVzICovO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmV2aWV3VHlwZTogTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSA9IE5ndERyb3B6b25lUHJldmlld1R5cGUuREVGQVVMVDtcbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVTZWxlY3RlZDogRXZlbnRFbWl0dGVyPE5neERyb3B6b25lQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlU2VsZWN0RXJyb3I6IEV2ZW50RW1pdHRlcjxOZ3REcm9wem9uZUVycm9yVHlwZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRGYWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRJbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlVXBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVQcmV2aWV3TG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGRyb3B6b25lSGVpZ2h0OiBzdHJpbmcgPSAnMTgwcHgnO1xuICAgIHB1YmxpYyB1cGxvYWRlZFJlc291cmNlcyA9IFtdO1xuICAgIHB1YmxpYyBmb3JjZURpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBuYXRpdmVWYWx1ZSA9IFtdO1xuICAgIHB1YmxpYyBzaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5ID0gZmFsc2U7XG4gICAgcHVibGljIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbmd0RHJvcHpvbmVMb2FkZXJTdHlsZTogTmd0U3R5bGl6YWJsZVNlcnZpY2U7XG4gICAgcHVibGljIG5neEVsZW1lbnRJZDogc3RyaW5nID0gdXVpZCgpO1xuICAgIHB1YmxpYyBpbWFnZVZpZXdlck9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgbmF2YmFyOiB0cnVlLFxuICAgICAgICB0b29sYmFyOiB7XG4gICAgICAgICAgICB6b29tSW46IHRydWUsXG4gICAgICAgICAgICB6b29tT3V0OiB0cnVlLFxuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgICAgICByb3RhdGVMZWZ0OiB0cnVlLFxuICAgICAgICAgICAgcm90YXRlUmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBwcmV2OiB0cnVlLFxuICAgICAgICAgICAgbmV4dDogdHJ1ZSxcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKVxuICAgICAgICBwdWJsaWMgZm9ybUNvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcblxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RBdHRhY2htZW50SHR0cFNlcnZpY2U6IE5ndEF0dGFjaG1lbnRIdHRwU2VydmljZSxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndEZvcm06IE5ndEZvcm1Db21wb25lbnQsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RTZWN0aW9uOiBOZ3RTZWN0aW9uQ29tcG9uZW50LFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0TW9kYWw6IE5ndE1vZGFsQ29tcG9uZW50XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUxvYWRlclN0eWxlID0gbmV3IE5ndFN0eWxpemFibGVTZXJ2aWNlKCk7XG5cbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUxvYWRlclN0eWxlLmxvYWQodGhpcy5pbmplY3RvciwgJ05ndERyb3B6b25lTG9hZGVyJywge1xuICAgICAgICAgICAgaDogJ2gtOCcsXG4gICAgICAgICAgICBjb2xvcjoge1xuICAgICAgICAgICAgICAgIHRleHQ6ICd0ZXh0LWdyYXktNjAwJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5wcmV2aWV3VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3VHlwZSA9IGdldEVudW1Gcm9tU3RyaW5nKGNoYW5nZXMucHJldmlld1R5cGUuY3VycmVudFZhbHVlLCBOZ3REcm9wem9uZVByZXZpZXdUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRyb3B6b25lSGVpZ2h0ID0gYCR7dGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkgPSB0cnVlO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbWFnZVByZXZpZXcoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gdGhpcy51cGxvYWRlZFJlc291cmNlcy5maWx0ZXIoKHJlc291cmNlKSA9PiB0aGlzLmlzSW1hZ2UocmVzb3VyY2UpKTtcbiAgICAgICAgY29uc3QgaW1hZ2VzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICBpbWFnZXMuZm9yRWFjaCgoaW1hZ2UpID0+IHtcbiAgICAgICAgICAgIGxldCBpbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQuc3JjID0gaW1hZ2UuZmlsZS51cmw7XG5cbiAgICAgICAgICAgIGltYWdlc0Rpdi5hcHBlbmRDaGlsZChpbWFnZUVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uSW1hZ2VDbGljayhpbWFnZXNEaXYsIGluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbWFnZUNsaWNrKGVsZW1lbnQsIGluZGV4Pykge1xuICAgICAgICBpZiAoIXRoaXMudmlld01vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VEaXNhYmxlQ2xpY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbmd0RHJvcHpvbmVDb21wb25lbnQgPSB0aGlzO1xuXG4gICAgICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiBpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlVmlld2VyT3B0aW9ucyA9IHsgLi4udGhpcy5pbWFnZVZpZXdlck9wdGlvbnMsIC4uLnsgaW5pdGlhbFZpZXdJbmRleDogaW5kZXggfSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcihlbGVtZW50LCB7XG4gICAgICAgICAgICAuLi50aGlzLmltYWdlVmlld2VyT3B0aW9ucywgLi4ue1xuICAgICAgICAgICAgICAgIGhpZGRlbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbmd0RHJvcHpvbmVDb21wb25lbnQuZm9yY2VEaXNhYmxlQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmlld2VyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZpZXdlci5zaG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRmlsZUNsaWNrKHVybDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLmZvcmNlRGlzYWJsZUNsaWNrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIudXJsID0gdXJsO1xuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci5maWxlTmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLmZpbGVTaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIuaW5pdCgpO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLm9uQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd05ndERyb3B6b25lRmlsZVZpZXdlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb3JjZURpc2FibGVDbGljayA9IGZhbHNlO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uU2VsZWN0KGV2ZW50OiBOZ3hEcm9wem9uZUNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5yZWplY3RlZEZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWplY3RlZEZpbGUgb2YgPGFueT5ldmVudC5yZWplY3RlZEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ3NpemUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5TSVpFKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZEZpbGUucmVhc29uID09ICdub19tdWx0aXBsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLk5PX01VTFRJUExFKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZEZpbGUucmVhc29uID09ICd0eXBlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuVFlQRSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5ERUZBVUxUKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbXNMaW1pdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMaW1pdCA9PSAxICYmIGV2ZW50LmFkZGVkRmlsZXNcbiAgICAgICAgICAgICAgICAmJiBldmVudC5hZGRlZEZpbGVzLmxlbmd0aCA9PSB0aGlzLml0ZW1zTGltaXQgJiYgdGhpcy51cGxvYWRlZFJlc291cmNlcy5sZW5ndGggPT0gdGhpcy5pdGVtc0xpbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcyA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQuYWRkZWRGaWxlc1xuICAgICAgICAgICAgICAgICYmIGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoICsgdGhpcy51cGxvYWRlZFJlc291cmNlcy5sZW5ndGggPD0gdGhpcy5pdGVtc0xpbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVzKGV2ZW50LmFkZGVkRmlsZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuSVRFTVNfTElNSVQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoZXZlbnQuYWRkZWRGaWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBsb2FkRmlsZXMoZmlsZXM6IEFycmF5PEZpbGU+KSB7XG4gICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBvcmFyeUZpbGVzID0gW107XG4gICAgICAgICAgICBjb25zdCB0ZW1wb3JhcnlBdHRhY2htZW50cyA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHVuYWNjZXB0ZWRGaWxlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vbkZpbGVVcGxvYWRJbml0LmVtaXQoKTtcblxuICAgICAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZS50eXBlLmluY2x1ZGVzKHRoaXMudW5hY2NlcHRlZEZpbGVzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5hY2NlcHRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb2JzZXJ2YWJsZXMucHVzaCh0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS51cGxvYWQodGhpcy5yZW1vdGVSZXNvdXJjZSwgZmlsZSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMgJiYgcmVzcG9uc2UuZGF0YS5hdHRyaWJ1dGVzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVsndXJsJ10gPSByZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMuZGF0YS51cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5RmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByZXNwb25zZS5kYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhWydsb2FkZWQnXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5QXR0YWNobWVudHMucHVzaChyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW9ic2VydmFibGVzLmxlbmd0aCAmJiB1bmFjY2VwdGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlRZUEUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMucHVzaCguLi50ZW1wb3JhcnlGaWxlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGltaXQgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UoWy4uLnRlbXBvcmFyeUF0dGFjaG1lbnRzXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UoWy4uLnRlbXBvcmFyeUF0dGFjaG1lbnRzLCAuLi50aGlzLm5hdGl2ZVZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlVXBsb2FkZWQuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmFjY2VwdGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlRZUEUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlVXBsb2FkRmFpbC5lbWl0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZVByZXZpZXcoYXR0YWNobWVudHM6IGFueSkge1xuICAgICAgICBpZiAoYXR0YWNobWVudHMgJiYgYXR0YWNobWVudHMubGVuZ3RoICYmIGF0dGFjaG1lbnRzWzBdKSB7XG4gICAgICAgICAgICBsZXQgdGVtcG9yYXJ5UmVzb3VyY2UgPSBbXTtcbiAgICAgICAgICAgIGxldCBvYnNlcnZhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKChhdHRhY2htZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgRmlsZSkgJiYgIWF0dGFjaG1lbnQubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFsnbG9hZGVkJ10gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGVzLnB1c2godGhpcy5uZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UucHJldmlldyhhdHRhY2htZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeVJlc291cmNlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuZ2V0QXBpSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IHJlc3BvbnNlLmRhdGEuZ2V0QXR0cmlidXRlKCdmaWxlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMucHVzaCguLi50ZW1wb3JhcnlSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKGF0dGFjaG1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlUHJldmlld0xvYWRlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKSwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZW1vdmUocmVzb3VyY2U6IGFueSkge1xuICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLnNwbGljZSh0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLmluZGV4T2YocmVzb3VyY2UpLCAxKTtcbiAgICAgICAgdGhpcy5uYXRpdmVWYWx1ZSA9IHRoaXMubmF0aXZlVmFsdWUuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5pZCAhPSByZXNvdXJjZS5pZCk7XG4gICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UodGhpcy5uYXRpdmVWYWx1ZSk7XG4gICAgICAgIHRoaXMub25GaWxlUmVtb3ZlZC5lbWl0KHJlc291cmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbWFnZShyZXNvdXJjZTogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpZXdUeXBlID09ICdJTUFHRSdcbiAgICAgICAgICAgIHx8IChcbiAgICAgICAgICAgICAgICByZXNvdXJjZS5maWxlPy50eXBlXG4gICAgICAgICAgICAgICAgJiYgcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdpbWFnZScpXG4gICAgICAgICAgICAgICAgJiYgIXJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygnZHdnJylcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmlkZW8ocmVzb3VyY2U6IGFueSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aWV3VHlwZSA9PSAnVklERU8nIHx8IChyZXNvdXJjZS5maWxlICYmIHJlc291cmNlLmZpbGUudHlwZSAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ3ZpZGVvJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0F1ZGlvKHJlc291cmNlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIChyZXNvdXJjZS5maWxlICYmIHJlc291cmNlLmZpbGUudHlwZSAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ2F1ZGlvJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZpbGUocmVzb3VyY2U6IGFueSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNJbWFnZShyZXNvdXJjZSkgJiYgIXRoaXMuaXNBdWRpbyhyZXNvdXJjZSkgJiYgIXRoaXMuaXNWaWRlbyhyZXNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZEZpbGVTaXplKHJlc291cmNlOiBhbnkpIHtcbiAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHJlc291cmNlLnNpemUgfHwgcmVzb3VyY2UuZmlsZVNpemU7XG5cbiAgICAgICAgICAgIGlmICghc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5maWxlICYmIHJlc291cmNlLmZpbGUuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBzaXplID0gcmVzb3VyY2UuZmlsZS5zaXplO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2l6ZSkgPiAxMDAwMDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUZsb2F0KHNpemUpIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWInO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHNpemUpIC8gMTAwMCkgKyAnIEtiJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbk5hdGl2ZUNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeSh0aGlzLm5hdGl2ZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm5hdGl2ZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy52aWV3TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZShBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRmlsZVByZXZpZXcoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRvd25sb2FkRmlsZShhdHRhY2htZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5uZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UuZG93bmxvYWQoYXR0YWNobWVudCkuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzID0gW107XG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy5uYXRpdmVWYWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLmluaXRDb21wb25lbnQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlbkZpbGVTZWxlY3RvcigpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uZ3hFbGVtZW50SWQpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNEaXNhYmxlZEJ5UGFyZW50KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q29tcG9uZW50KCkge1xuICAgICAgICBpZiAodGhpcy52aWV3TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3VHlwZSA9IE5ndERyb3B6b25lUHJldmlld1R5cGUuREVGQVVMVDtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRhaW5lciAmJiB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbFxuICAgICAgICAgICAgJiYgKHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbC5nZXQodGhpcy5uYW1lKSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlc0xvYWQoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEZpbGVQcmV2aWV3KEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRGaWxlc0xvYWQoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFsnbG9hZGVkJ10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN5bmNWYWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhzeW5jVmFsaWRhdG9ycyk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0Rpc2FibGVkQnlQYXJlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ndEZvcm0/LmlzRGlzYWJsZWRcbiAgICAgICAgICAgIHx8IHRoaXMubmd0U2VjdGlvbj8uaXNEaXNhYmxlZFxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RNb2RhbD8uaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWJzY3JpcHRpb24gPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBoLWZ1bGwgdy1mdWxsXCIgI2NvbnRhaW5lcj5cbiAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwiZmxleCBtYi0yIHRleHQtc21cIj5cbiAgICAgICAge3sgbGFiZWwgfX06XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXJlZC01MDAgZm9udC1ib2xkIHRleHQtbWQgbWwtMVwiICpuZ0lmPVwiaXNSZXF1aXJlZFwiPio8L3NwYW4+XG5cbiAgICAgICAgPG5ndC1oZWxwZXIgKm5nSWY9XCJoZWxwVGV4dFwiIFtoZWxwVGl0bGVdPVwiaGVscFRpdGxlXCIgW2ljb25Db2xvcl09XCJoZWxwVGV4dENvbG9yXCIgY2xhc3M9XCJtbC0xXCI+XG4gICAgICAgICAgICB7eyBoZWxwVGV4dCB9fVxuICAgICAgICA8L25ndC1oZWxwZXI+XG4gICAgPC9sYWJlbD5cblxuICAgIDxkaXYgKm5nSWY9XCIhdmlld01vZGVcIiBjbGFzcz1cImgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmcgJiYgIWhpZGVOZ3hEcm9wem9uZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggYWJzb2x1dGUganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHctZnVsbCBoLWZ1bGwgY3Vyc29yLXdhaXQgei0xMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1sb2FkZXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5neC1kcm9wem9uZSBbaWRdPVwibmd4RWxlbWVudElkXCIgW211bHRpcGxlXT0nbXVsdGlwbGVTZWxlY3Rpb24nIFttYXhGaWxlU2l6ZV09J21heEZpbGVTaXplJ1xuICAgICAgICAgICAgKGNoYW5nZSk9J29uU2VsZWN0KCRldmVudCknIFtjbGFzcy5zaW5nbGUtYXR0YWNobWVudF09J2l0ZW1zTGltaXQgPT0gMScgW2FjY2VwdF09J2FjY2VwdGVkRmlsZXMnXG4gICAgICAgICAgICBbZGlzYWJsZWRdPSdpc0Rpc2FibGVkKCkgfHwgbG9hZGluZycgW2V4cGFuZGFibGVdPSd2ZXJ0aWNhbEV4cGFuZGFibGUnXG4gICAgICAgICAgICBbZGlzYWJsZUNsaWNrXT0nZGlzYWJsZUNsaWNrIHx8IGZvcmNlRGlzYWJsZUNsaWNrJyBbbmdTdHlsZV09XCJ7ICdoZWlnaHQnOiBkcm9wem9uZUhlaWdodCB9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2hpZGRlbic6aGlkZU5neERyb3B6b25lIH1cIiAjbmd4RHJvcHpvbmU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiIXVwbG9hZGVkUmVzb3VyY2VzPy5sZW5ndGhcIiBjbGFzcz1cInB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICAgICAgICAgICAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlc291cmNlIG9mIHVwbG9hZGVkUmVzb3VyY2VzOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LTQ4IG14LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyByZXNvdXJjZT8uZmlsZT8ubmFtZSB8fCAnJyB9fSAoe3sgZ2V0Rm9ybWF0dGVkRmlsZVNpemUocmVzb3VyY2UpIH19KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGN1c3RvbS1kcm9wem9uZS1wcmV2aWV3ICpuZ0lmPVwicHJldmlld1R5cGUgPT0gJ0RFRkFVTFQnICYmIGlzRmlsZShyZXNvdXJjZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlXT0ncmVzb3VyY2UuZmlsZScgW3JlbW92YWJsZV09XCJyZW1vdmFibGVcIiAocmVtb3ZlZCk9XCJvblJlbW92ZShyZXNvdXJjZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkZpbGVDbGljayhyZXNvdXJjZS5maWxlLnVybCwgcmVzb3VyY2UuZmlsZS5uYW1lLCByZXNvdXJjZS5maWxlLnNpemUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ1Byb2plY3RBcz1cIm5neC1kcm9wem9uZS1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2N1c3RvbS1kcm9wem9uZS1wcmV2aWV3PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbWFnZShyZXNvdXJjZSlcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImltYWdlUHJldmlldyhpbmRleClcIiAjZ2FsbGVyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXcgY2xhc3M9XCJpbWFnZS1wcmV2aWV3LWRlZmF1bHQtY2xhc3NcIiBbZmlsZV09XCJyZXNvdXJjZS5maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJyZW1vdmFibGVcIiAocmVtb3ZlZCk9XCJvblJlbW92ZShyZXNvdXJjZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtdmlkZW8tcHJldmlldyAqbmdJZj1cImlzVmlkZW8ocmVzb3VyY2UpIHx8IGlzQXVkaW8ocmVzb3VyY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsZV09XCJyZXNvdXJjZS5maWxlXCIgW3JlbW92YWJsZV09XCJyZW1vdmFibGVcIiAocmVtb3ZlZCk9XCJvblJlbW92ZShyZXNvdXJjZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LWRyb3B6b25lLXZpZGVvLXByZXZpZXc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2hvd0ZpbGVOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCB0cnVuY2F0ZSB0ZXh0LWdyYXktNTAwIHRleHQtY2VudGVyIHRleHQtc20gZm9udC1tb25vIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZXNvdXJjZT8uZmlsZT8ubmFtZSB8fCAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25neC1kcm9wem9uZT5cbiAgICA8L2Rpdj5cblxuICAgIDxuZ3QtZHJvcHpvbmUtdmlldyAqbmdJZj1cInZpZXdNb2RlXCIgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsXCIgW3Jlc291cmNlc109XCJyZXNvdXJjZXNcIiBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2Ryb3B6b25lSGVpZ2h0XT1cImRyb3B6b25lSGVpZ2h0XCJcbiAgICAgICAgKG9uRmlsZUNsaWNrKT1cIm9uRmlsZUNsaWNrKCRldmVudC5wcmV2aWV3VXJsLCAkZXZlbnQubmFtZSwgJGV2ZW50LmZpbGVTaXplKVwiXG4gICAgICAgIChvbkltYWdlQ2xpY2spPVwib25JbWFnZUNsaWNrKCRldmVudC5kaXYsICRldmVudC5pbmRleClcIj5cbiAgICA8L25ndC1kcm9wem9uZS12aWV3PlxuXG4gICAgPG5ndC1kcm9wem9uZS1maWxlLXZpZXdlciBbaGlkZGVuXT1cIiFzaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyXCIgKG9uQ2xvc2UpPVwiZm9yY2VEaXNhYmxlQ2xpY2sgPSBmYWxzZVwiXG4gICAgICAgIFtjYW5Eb3dubG9hZEZpbGVdPVwiY2FuRG93bmxvYWRGaWxlXCIgW2Rpc2FibGVDb250ZW50XT1cImNhbkRvd25sb2FkRmlsZSA/ICdub25lJyA6ICdwb3BvdXQnXCI+XG4gICAgPC9uZ3QtZHJvcHpvbmUtZmlsZS12aWV3ZXI+XG5cbiAgICA8aW5wdXQgKm5nSWY9J2NvbXBvbmVudFJlYWR5JyB0eXBlPVwiaGlkZGVuXCIgW25nTW9kZWxdPVwidmFsdWVcIiBbbmFtZV09XCJuYW1lXCIgW3ZhbHVlXT1cInZhbHVlXCI+XG4gICAgPG5ndC12YWxpZGF0aW9uIFtjb250cm9sXT1cImZvcm1Db250cm9sXCIgW2NvbnRhaW5lcl09XCJmb3JtQ29udGFpbmVyXCI+PC9uZ3QtdmFsaWRhdGlvbj5cbjwvZGl2PiJdfQ==
1
+ import { Component, EventEmitter, Host, Input, Optional, Output, SkipSelf, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
+ import { NgxDropzoneComponent } from 'ngx-dropzone';
4
+ import { forkJoin } from 'rxjs';
5
+ import { map } from 'rxjs/operators';
6
+ import Viewer from 'viewerjs';
7
+ import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
8
+ import { getEnumFromString } from '../../helpers/enum/enum';
9
+ import { uuid } from '../../helpers/uuid';
10
+ import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
11
+ import { NgtDropzoneFileViewerComponent } from './ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component';
12
+ import { NgtDropzoneErrorType, NgtDropzonePreviewType } from './ngt-dropzone.meta';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/forms";
15
+ import * as i2 from "../../services/http/ngt-attachment-http.service";
16
+ import * as i3 from "../ngt-form/ngt-form.component";
17
+ import * as i4 from "../ngt-section/ngt-section.component";
18
+ import * as i5 from "../ngt-modal/ngt-modal.component";
19
+ import * as i6 from "@angular/common";
20
+ import * as i7 from "../ngt-validation/ngt-validation.component";
21
+ import * as i8 from "ngx-dropzone";
22
+ import * as i9 from "../ngt-helper/ngt-helper.component";
23
+ import * as i10 from "./ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component";
24
+ import * as i11 from "./ngt-dropzone-view/ngt-dropzone-view.component";
25
+ import * as i12 from "./custom-dropzone-preview/custom-dropzone-preview.component";
26
+ export class NgtDropzoneComponent extends NgtBaseNgModel {
27
+ ;
28
+ ;
29
+ constructor(formContainer, injector, changeDetector, ngtAttachmentHttpService, ngtForm, ngtSection, ngtModal) {
30
+ super();
31
+ this.formContainer = formContainer;
32
+ this.injector = injector;
33
+ this.changeDetector = changeDetector;
34
+ this.ngtAttachmentHttpService = ngtAttachmentHttpService;
35
+ this.ngtForm = ngtForm;
36
+ this.ngtSection = ngtSection;
37
+ this.ngtModal = ngtModal;
38
+ this.helpTextColor = 'text-green-500';
39
+ // Behavior
40
+ this.resources = [];
41
+ this.multipleSelection = false;
42
+ this.showFileName = false;
43
+ this.disableClick = false;
44
+ this.disabled = false;
45
+ this.viewMode = false;
46
+ this.removable = false;
47
+ this.canDownloadFile = true;
48
+ this.verticalExpandable = false;
49
+ this.acceptedFiles = '*' /** Mime type */;
50
+ this.previewType = NgtDropzonePreviewType.DEFAULT;
51
+ this.onFileSelected = new EventEmitter();
52
+ this.onFileSelectError = new EventEmitter();
53
+ this.onFileUploadFail = new EventEmitter();
54
+ this.onFileRemoved = new EventEmitter();
55
+ this.onFileUploadInit = new EventEmitter();
56
+ this.onFileUploaded = new EventEmitter();
57
+ this.onFilePreviewLoaded = new EventEmitter();
58
+ this.dropzoneHeight = '180px';
59
+ this.uploadedResources = [];
60
+ this.forceDisableClick = false;
61
+ this.nativeValue = [];
62
+ this.showNgtDropzoneFileViewer = false;
63
+ this.componentReady = false;
64
+ this.loading = false;
65
+ this.ngxElementId = uuid();
66
+ this.imageViewerOptions = {
67
+ navbar: true,
68
+ toolbar: {
69
+ zoomIn: true,
70
+ zoomOut: true,
71
+ reset: true,
72
+ rotateLeft: true,
73
+ rotateRight: true,
74
+ prev: true,
75
+ next: true,
76
+ }
77
+ };
78
+ this.subscriptions = [];
79
+ this.ngtDropzoneLoaderStyle = new NgtStylizableService();
80
+ this.ngtDropzoneLoaderStyle.load(this.injector, 'NgtDropzoneLoader', {
81
+ h: 'h-8',
82
+ color: {
83
+ text: 'text-gray-600'
84
+ }
85
+ });
86
+ }
87
+ ngOnChanges(changes) {
88
+ if (changes.previewType) {
89
+ this.previewType = getEnumFromString(changes.previewType.currentValue, NgtDropzonePreviewType);
90
+ }
91
+ }
92
+ ngAfterContentChecked() {
93
+ if (this.container && this.container.nativeElement) {
94
+ this.dropzoneHeight = `${this.container.nativeElement.parentElement.offsetHeight}px`;
95
+ this.changeDetector.detectChanges();
96
+ }
97
+ }
98
+ ngOnInit() {
99
+ setTimeout(() => {
100
+ this.componentReady = true;
101
+ setTimeout(() => {
102
+ this.initComponent();
103
+ });
104
+ }, 500);
105
+ }
106
+ ngOnDestroy() {
107
+ this.destroySubscriptions();
108
+ }
109
+ imagePreview(index) {
110
+ const images = this.uploadedResources.filter((resource) => this.isImage(resource));
111
+ const imagesDiv = document.createElement("div");
112
+ images.forEach((image) => {
113
+ let imageElement = document.createElement("img");
114
+ imageElement.src = image.file.url;
115
+ imagesDiv.appendChild(imageElement);
116
+ });
117
+ this.onImageClick(imagesDiv, index);
118
+ }
119
+ onImageClick(element, index) {
120
+ if (!this.viewMode) {
121
+ this.forceDisableClick = true;
122
+ }
123
+ const ngtDropzoneComponent = this;
124
+ if (index !== null && index !== undefined) {
125
+ this.imageViewerOptions = { ...this.imageViewerOptions, ...{ initialViewIndex: index } };
126
+ }
127
+ const viewer = new Viewer(element, {
128
+ ...this.imageViewerOptions, ...{
129
+ hidden() {
130
+ ngtDropzoneComponent.forceDisableClick = false;
131
+ viewer.destroy();
132
+ }
133
+ }
134
+ });
135
+ viewer.show();
136
+ }
137
+ onFileClick(url, name, size) {
138
+ this.forceDisableClick = true;
139
+ this.showNgtDropzoneFileViewer = true;
140
+ this.ngtDropzoneFileViewer.url = url;
141
+ this.ngtDropzoneFileViewer.fileName = name;
142
+ this.ngtDropzoneFileViewer.fileSize = size;
143
+ this.ngtDropzoneFileViewer.init();
144
+ this.subscriptions.push(this.ngtDropzoneFileViewer.onClose.subscribe(() => {
145
+ this.showNgtDropzoneFileViewer = false;
146
+ this.forceDisableClick = false;
147
+ }));
148
+ }
149
+ async onSelect(event) {
150
+ if (event.rejectedFiles.length) {
151
+ for (const rejectedFile of event.rejectedFiles) {
152
+ if (rejectedFile.reason == 'size') {
153
+ this.onFileSelectError.emit(NgtDropzoneErrorType.SIZE);
154
+ break;
155
+ }
156
+ else if (rejectedFile.reason == 'no_multiple') {
157
+ this.onFileSelectError.emit(NgtDropzoneErrorType.NO_MULTIPLE);
158
+ break;
159
+ }
160
+ else if (rejectedFile.reason == 'type') {
161
+ this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
162
+ break;
163
+ }
164
+ else {
165
+ this.onFileSelectError.emit(NgtDropzoneErrorType.DEFAULT);
166
+ break;
167
+ }
168
+ }
169
+ }
170
+ if (this.itemsLimit) {
171
+ if (this.itemsLimit == 1 && event.addedFiles
172
+ && event.addedFiles.length == this.itemsLimit && this.uploadedResources.length == this.itemsLimit) {
173
+ this.uploadedResources = [];
174
+ }
175
+ if (event.addedFiles
176
+ && event.addedFiles.length + this.uploadedResources.length <= this.itemsLimit) {
177
+ this.onFileSelected.emit(event);
178
+ this.uploadFiles(event.addedFiles);
179
+ }
180
+ else {
181
+ this.onFileSelectError.emit(NgtDropzoneErrorType.ITEMS_LIMIT);
182
+ }
183
+ }
184
+ else {
185
+ this.onFileSelected.emit(event);
186
+ this.uploadFiles(event.addedFiles);
187
+ }
188
+ }
189
+ async uploadFiles(files) {
190
+ if (files && files.length) {
191
+ const temporaryFiles = [];
192
+ const temporaryAttachments = [];
193
+ const observables = [];
194
+ const unacceptedFiles = [];
195
+ this.loading = true;
196
+ this.onFileUploadInit.emit();
197
+ files.forEach(file => {
198
+ if (file.type.includes(this.unacceptedFiles)) {
199
+ return unacceptedFiles.push(file);
200
+ }
201
+ observables.push(this.ngtAttachmentHttpService.upload(this.remoteResource, file).pipe(map((response) => {
202
+ if (response && response.data) {
203
+ if (response.data.attributes && response.data.attributes.data) {
204
+ file['url'] = response.data.attributes.data.url;
205
+ }
206
+ temporaryFiles.push({
207
+ id: response.data.id,
208
+ size: file.size,
209
+ file: file
210
+ });
211
+ response.data['loaded'] = true;
212
+ temporaryAttachments.push(response.data);
213
+ }
214
+ })));
215
+ });
216
+ if (!observables.length && unacceptedFiles.length) {
217
+ this.loading = false;
218
+ return this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
219
+ }
220
+ this.subscriptions.push(forkJoin(observables).subscribe((response) => {
221
+ this.uploadedResources.push(...temporaryFiles);
222
+ if (this.itemsLimit == 1) {
223
+ this.onNativeChange([...temporaryAttachments]);
224
+ }
225
+ else {
226
+ this.onNativeChange([...temporaryAttachments, ...this.nativeValue]);
227
+ }
228
+ this.onFileUploaded.emit();
229
+ this.loading = false;
230
+ if (unacceptedFiles.length) {
231
+ this.onFileSelectError.emit(NgtDropzoneErrorType.TYPE);
232
+ }
233
+ setTimeout(() => this.changeDetector.detectChanges(), 500);
234
+ }, (error) => {
235
+ this.onFileUploadFail.emit(error);
236
+ this.loading = false;
237
+ setTimeout(() => this.changeDetector.detectChanges(), 500);
238
+ }));
239
+ }
240
+ }
241
+ async loadFilePreview(attachments) {
242
+ if (attachments && attachments.length && attachments[0]) {
243
+ let temporaryResource = [];
244
+ let observables = [];
245
+ attachments.forEach((attachment) => {
246
+ if (!(attachment instanceof File) && !attachment.loaded) {
247
+ this.loading = true;
248
+ attachment['loaded'] = true;
249
+ observables.push(this.ngtAttachmentHttpService.preview(attachment)
250
+ .pipe(map((response) => {
251
+ temporaryResource.push({
252
+ id: response.data.getApiId(),
253
+ file: response.data.getAttribute('file')
254
+ });
255
+ })));
256
+ }
257
+ });
258
+ this.subscriptions.push(forkJoin(observables).subscribe((response) => {
259
+ this.uploadedResources.push(...temporaryResource);
260
+ this.onNativeChange(attachments);
261
+ this.onFilePreviewLoaded.emit();
262
+ this.loading = false;
263
+ setTimeout(() => this.changeDetector.detectChanges(), 500);
264
+ }, (error) => {
265
+ this.loading = false;
266
+ }));
267
+ }
268
+ }
269
+ onRemove(resource) {
270
+ this.uploadedResources.splice(this.uploadedResources.indexOf(resource), 1);
271
+ this.nativeValue = this.nativeValue.filter(element => element.id != resource.id);
272
+ this.onNativeChange(this.nativeValue);
273
+ this.onFileRemoved.emit(resource);
274
+ }
275
+ isImage(resource) {
276
+ return this.previewType == 'IMAGE'
277
+ || (resource.file?.type
278
+ && resource.file.type.includes('image')
279
+ && !resource.file.type.includes('dwg'));
280
+ }
281
+ isVideo(resource) {
282
+ return this.previewType == 'VIDEO' || (resource.file && resource.file.type && resource.file.type.includes('video'));
283
+ }
284
+ isAudio(resource) {
285
+ return (resource.file && resource.file.type && resource.file.type.includes('audio'));
286
+ }
287
+ isFile(resource) {
288
+ return !this.isImage(resource) && !this.isAudio(resource) && !this.isVideo(resource);
289
+ }
290
+ getFormattedFileSize(resource) {
291
+ if (resource) {
292
+ let size = resource.size || resource.fileSize;
293
+ if (!size) {
294
+ if (resource.file && resource.file.size) {
295
+ size = resource.file.size;
296
+ }
297
+ else {
298
+ size = 0;
299
+ }
300
+ }
301
+ if (parseFloat(size) > 1000000) {
302
+ return (parseFloat(size) / 1000000).toFixed(2) + ' Mb';
303
+ }
304
+ return Math.round(parseFloat(size) / 1000) + ' Kb';
305
+ }
306
+ }
307
+ onNativeChange(value) {
308
+ if (value === undefined) {
309
+ this.value = [];
310
+ this.nativeValue = [];
311
+ }
312
+ else {
313
+ this.nativeValue = value;
314
+ if (JSON.stringify(this.value) != JSON.stringify(this.nativeValue)) {
315
+ this.value = this.nativeValue;
316
+ }
317
+ }
318
+ }
319
+ change(value) {
320
+ if (value && !this.viewMode) {
321
+ this.onNativeChange(Array.isArray(value) ? value : [value]);
322
+ if (this.componentReady) {
323
+ this.loadFilePreview(Array.isArray(value) ? value : [value]);
324
+ }
325
+ }
326
+ }
327
+ downloadFile(attachment) {
328
+ this.ngtAttachmentHttpService.download(attachment).subscribe(() => { });
329
+ }
330
+ reset() {
331
+ this.uploadedResources = [];
332
+ this.value = [];
333
+ this.nativeValue = [];
334
+ this.initComponent();
335
+ }
336
+ openFileSelector() {
337
+ document.getElementById(this.ngxElementId).click();
338
+ }
339
+ isDisabled() {
340
+ return this.disabled || this.isDisabledByParent();
341
+ }
342
+ initComponent() {
343
+ if (this.viewMode) {
344
+ this.previewType = NgtDropzonePreviewType.DEFAULT;
345
+ return;
346
+ }
347
+ if (this.formContainer && this.formContainer.control
348
+ && (this.formControl = this.formContainer.control.get(this.name))) {
349
+ this.resetFilesLoad();
350
+ this.loadFilePreview(Array.isArray(this.value) ? this.value : [this.value]);
351
+ this.updateValidations();
352
+ if (this.value) {
353
+ this.formControl.markAsDirty();
354
+ }
355
+ else {
356
+ this.formControl.markAsPristine();
357
+ }
358
+ }
359
+ }
360
+ resetFilesLoad() {
361
+ if (Array.isArray(this.value)) {
362
+ this.value.forEach(element => {
363
+ if (element) {
364
+ element['loaded'] = false;
365
+ }
366
+ });
367
+ }
368
+ }
369
+ updateValidations() {
370
+ if (!this.formControl) {
371
+ return;
372
+ }
373
+ let syncValidators = [];
374
+ if (this.isRequired) {
375
+ syncValidators.push(Validators.required);
376
+ }
377
+ syncValidators.push();
378
+ setTimeout(() => {
379
+ this.formControl.setValidators(syncValidators);
380
+ this.formControl.updateValueAndValidity();
381
+ });
382
+ }
383
+ isDisabledByParent() {
384
+ return this.ngtForm?.isDisabled
385
+ || this.ngtSection?.isDisabled
386
+ || this.ngtModal?.isDisabled;
387
+ }
388
+ destroySubscriptions() {
389
+ this.subscriptions.forEach(subscription => subscription.unsubscribe());
390
+ this.subscriptions = [];
391
+ }
392
+ }
393
+ NgtDropzoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDropzoneComponent, deps: [{ token: i1.ControlContainer, host: true, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i2.NgtAttachmentHttpService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtSectionComponent, optional: true, skipSelf: true }, { token: i5.NgtModalComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
394
+ NgtDropzoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtDropzoneComponent, selector: "ngt-dropzone", inputs: { label: "label", placeholder: "placeholder", helpTextColor: "helpTextColor", helpText: "helpText", helpTitle: "helpTitle", resources: "resources", multipleSelection: "multipleSelection", itemsLimit: "itemsLimit", showFileName: "showFileName", disableClick: "disableClick", disabled: "disabled", viewMode: "viewMode", removable: "removable", canDownloadFile: "canDownloadFile", verticalExpandable: "verticalExpandable", isRequired: "isRequired", hideNgxDropzone: "hideNgxDropzone", acceptedFiles: "acceptedFiles", unacceptedFiles: "unacceptedFiles", maxFileSize: "maxFileSize", previewType: "previewType", name: "name", remoteResource: "remoteResource" }, outputs: { onFileSelected: "onFileSelected", onFileSelectError: "onFileSelectError", onFileUploadFail: "onFileUploadFail", onFileRemoved: "onFileRemoved", onFileUploadInit: "onFileUploadInit", onFileUploaded: "onFileUploaded", onFilePreviewLoaded: "onFilePreviewLoaded" }, providers: [
395
+ NgtMakeProvider(NgtDropzoneComponent),
396
+ ], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "ngxDropzone", first: true, predicate: NgxDropzoneComponent, descendants: true, static: true }, { propertyName: "ngtDropzoneFileViewer", first: true, predicate: NgtDropzoneFileViewerComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col h-full w-full\" #container>\r\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\r\n {{ label }}:\r\n\r\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\r\n\r\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\r\n {{ helpText }}\r\n </ngt-helper>\r\n </label>\r\n\r\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\r\n <div *ngIf=\"loading && !hideNgxDropzone\"\r\n class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\r\n <div class=\"div-loader\"></div>\r\n </div>\r\n\r\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\r\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\r\n [disabled]='isDisabled() || loading' [expandable]='verticalExpandable'\r\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\r\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #ngxDropzone>\r\n <ng-container *ngIf=\"!loading\">\r\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\r\n {{ placeholder }}\r\n </ngx-dropzone-label>\r\n\r\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\r\n <div class=\"flex flex-col w-48 mx-4\"\r\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\r\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\r\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\r\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </custom-dropzone-preview>\r\n\r\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\r\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\r\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n\r\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\r\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\r\n </ngx-dropzone-video-preview>\r\n\r\n <p *ngIf=\"showFileName\"\r\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\r\n {{ resource?.file?.name || '' }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ngx-dropzone>\r\n </div>\r\n\r\n <ngt-dropzone-view *ngIf=\"viewMode\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\r\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\r\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\r\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\r\n </ngt-dropzone-view>\r\n\r\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\r\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\r\n </ngt-dropzone-file-viewer>\r\n\r\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\r\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\r\n</div>", styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.ɵb, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview" }, { kind: "component", type: i8.NgxDropzoneVideoPreviewComponent, selector: "ngx-dropzone-video-preview" }, { kind: "component", type: i9.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }, { kind: "component", type: i10.NgtDropzoneFileViewerComponent, selector: "ngt-dropzone-file-viewer", inputs: ["url", "fileName", "fileSize", "disableContent", "canDownloadFile"], outputs: ["onClose"] }, { kind: "component", type: i11.NgtDropzoneViewComponent, selector: "ngt-dropzone-view", inputs: ["resources", "dropzoneHeight", "loading", "placeholder"], outputs: ["onImageClick", "onFileClick"] }, { kind: "component", type: i12.CustomDropzonePreviewComponent, selector: "custom-dropzone-preview" }], viewProviders: [
397
+ { provide: ControlContainer, useExisting: NgForm }
398
+ ], encapsulation: i0.ViewEncapsulation.None });
399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDropzoneComponent, decorators: [{
400
+ type: Component,
401
+ args: [{ selector: 'ngt-dropzone', encapsulation: ViewEncapsulation.None, providers: [
402
+ NgtMakeProvider(NgtDropzoneComponent),
403
+ ], viewProviders: [
404
+ { provide: ControlContainer, useExisting: NgForm }
405
+ ], template: "<div class=\"flex flex-col h-full w-full\" #container>\r\n <label *ngIf=\"label\" class=\"flex mb-2 text-sm\">\r\n {{ label }}:\r\n\r\n <span class=\"text-red-500 font-bold text-md ml-1\" *ngIf=\"isRequired\">*</span>\r\n\r\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\" class=\"ml-1\">\r\n {{ helpText }}\r\n </ngt-helper>\r\n </label>\r\n\r\n <div *ngIf=\"!viewMode\" class=\"h-full w-full relative\">\r\n <div *ngIf=\"loading && !hideNgxDropzone\"\r\n class=\"flex absolute justify-center items-center w-full h-full cursor-wait z-10\">\r\n <div class=\"div-loader\"></div>\r\n </div>\r\n\r\n <ngx-dropzone [id]=\"ngxElementId\" [multiple]='multipleSelection' [maxFileSize]='maxFileSize'\r\n (change)='onSelect($event)' [class.single-attachment]='itemsLimit == 1' [accept]='acceptedFiles'\r\n [disabled]='isDisabled() || loading' [expandable]='verticalExpandable'\r\n [disableClick]='disableClick || forceDisableClick' [ngStyle]=\"{ 'height': dropzoneHeight }\"\r\n [ngClass]=\"{ 'hidden':hideNgxDropzone }\" #ngxDropzone>\r\n <ng-container *ngIf=\"!loading\">\r\n <ngx-dropzone-label *ngIf=\"!uploadedResources?.length\" class=\"px-2\">\r\n {{ placeholder }}\r\n </ngx-dropzone-label>\r\n\r\n <ng-container *ngFor=\"let resource of uploadedResources; let index = index\">\r\n <div class=\"flex flex-col w-48 mx-4\"\r\n title=\"{{ resource?.file?.name || '' }} ({{ getFormattedFileSize(resource) }})\">\r\n <custom-dropzone-preview *ngIf=\"previewType == 'DEFAULT' && isFile(resource)\"\r\n [file]='resource.file' [removable]=\"removable\" (removed)=\"onRemove(resource)\"\r\n (click)=\"onFileClick(resource.file.url, resource.file.name, resource.file.size)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </custom-dropzone-preview>\r\n\r\n <div *ngIf=\"isImage(resource)\" class=\"cursor-pointer\" (click)=\"imagePreview(index)\" #gallery>\r\n <ngx-dropzone-image-preview class=\"image-preview-default-class\" [file]=\"resource.file\"\r\n [removable]=\"removable\" (removed)=\"onRemove(resource)\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n\r\n <ngx-dropzone-video-preview *ngIf=\"isVideo(resource) || isAudio(resource)\"\r\n [file]=\"resource.file\" [removable]=\"removable\" (removed)=\"onRemove(resource)\">\r\n </ngx-dropzone-video-preview>\r\n\r\n <p *ngIf=\"showFileName\"\r\n class=\"w-full truncate text-gray-500 text-center text-sm font-mono mt-2\">\r\n {{ resource?.file?.name || '' }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ngx-dropzone>\r\n </div>\r\n\r\n <ngt-dropzone-view *ngIf=\"viewMode\" class=\"h-full w-full\" [resources]=\"resources\" [loading]=\"loading\"\r\n [placeholder]=\"placeholder\" [dropzoneHeight]=\"dropzoneHeight\"\r\n (onFileClick)=\"onFileClick($event.previewUrl, $event.name, $event.fileSize)\"\r\n (onImageClick)=\"onImageClick($event.div, $event.index)\">\r\n </ngt-dropzone-view>\r\n\r\n <ngt-dropzone-file-viewer [hidden]=\"!showNgtDropzoneFileViewer\" (onClose)=\"forceDisableClick = false\"\r\n [canDownloadFile]=\"canDownloadFile\" [disableContent]=\"canDownloadFile ? 'none' : 'popout'\">\r\n </ngt-dropzone-file-viewer>\r\n\r\n <input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\r\n <ngt-validation [control]=\"formControl\" [container]=\"formContainer\"></ngt-validation>\r\n</div>", styles: [".single-attachment{border:none!important;margin:unset!important;overflow:hidden!important;display:flex!important;justify-content:center!important}.image-preview-default-class{margin:unset!important}custom-dropzone-preview{height:100%!important;min-height:unset!important;margin:unset!important}.div-loader{width:4rem;height:4rem;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
406
+ }], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
407
+ type: Optional
408
+ }, {
409
+ type: Host
410
+ }] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i2.NgtAttachmentHttpService, decorators: [{
411
+ type: Optional
412
+ }, {
413
+ type: SkipSelf
414
+ }] }, { type: i3.NgtFormComponent, decorators: [{
415
+ type: Optional
416
+ }, {
417
+ type: SkipSelf
418
+ }] }, { type: i4.NgtSectionComponent, decorators: [{
419
+ type: Optional
420
+ }, {
421
+ type: SkipSelf
422
+ }] }, { type: i5.NgtModalComponent, decorators: [{
423
+ type: Optional
424
+ }, {
425
+ type: SkipSelf
426
+ }] }]; }, propDecorators: { container: [{
427
+ type: ViewChild,
428
+ args: ['container']
429
+ }], ngxDropzone: [{
430
+ type: ViewChild,
431
+ args: [NgxDropzoneComponent, { static: true }]
432
+ }], ngtDropzoneFileViewer: [{
433
+ type: ViewChild,
434
+ args: [NgtDropzoneFileViewerComponent, { static: true }]
435
+ }], label: [{
436
+ type: Input
437
+ }], placeholder: [{
438
+ type: Input
439
+ }], helpTextColor: [{
440
+ type: Input
441
+ }], helpText: [{
442
+ type: Input
443
+ }], helpTitle: [{
444
+ type: Input
445
+ }], resources: [{
446
+ type: Input
447
+ }], multipleSelection: [{
448
+ type: Input
449
+ }], itemsLimit: [{
450
+ type: Input
451
+ }], showFileName: [{
452
+ type: Input
453
+ }], disableClick: [{
454
+ type: Input
455
+ }], disabled: [{
456
+ type: Input
457
+ }], viewMode: [{
458
+ type: Input
459
+ }], removable: [{
460
+ type: Input
461
+ }], canDownloadFile: [{
462
+ type: Input
463
+ }], verticalExpandable: [{
464
+ type: Input
465
+ }], isRequired: [{
466
+ type: Input
467
+ }], hideNgxDropzone: [{
468
+ type: Input
469
+ }], acceptedFiles: [{
470
+ type: Input
471
+ }], unacceptedFiles: [{
472
+ type: Input
473
+ }], maxFileSize: [{
474
+ type: Input
475
+ }], previewType: [{
476
+ type: Input
477
+ }], name: [{
478
+ type: Input
479
+ }], remoteResource: [{
480
+ type: Input
481
+ }], onFileSelected: [{
482
+ type: Output
483
+ }], onFileSelectError: [{
484
+ type: Output
485
+ }], onFileUploadFail: [{
486
+ type: Output
487
+ }], onFileRemoved: [{
488
+ type: Output
489
+ }], onFileUploadInit: [{
490
+ type: Output
491
+ }], onFileUploaded: [{
492
+ type: Output
493
+ }], onFilePreviewLoaded: [{
494
+ type: Output
495
+ }] } });
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRyb3B6b25lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1kcm9wem9uZS9uZ3QtZHJvcHpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRyb3B6b25lL25ndC1kcm9wem9uZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sUUFBUSxFQUNSLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQTBCLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFFOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDL0csT0FBTyxFQUFFLG9CQUFvQixFQUFtQixzQkFBc0Is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QUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVcsY0FBYztzQkFBOUIsTUFBTTtnQkFDVSxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGFBQWE7c0JBQTdCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGNBQWM7c0JBQTlCLE1BQU07Z0JBQ1UsbUJBQW1CO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyQ29udGVudENoZWNrZWQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0LFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFNraXBTZWxmLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmd4RHJvcHpvbmVDaGFuZ2VFdmVudCwgTmd4RHJvcHpvbmVDb21wb25lbnQgfSBmcm9tICduZ3gtZHJvcHpvbmUnO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IFZpZXdlciBmcm9tICd2aWV3ZXJqcyc7XHJcblxyXG5pbXBvcnQgeyBOZ3RCYXNlTmdNb2RlbCwgTmd0TWFrZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vYmFzZS9uZ3QtYmFzZS1uZy1tb2RlbCc7XHJcbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xyXG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vaGVscGVycy91dWlkJztcclxuaW1wb3J0IHsgTmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtYXR0YWNobWVudC1odHRwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3REcm9wem9uZUZpbGVWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuL25ndC1kcm9wem9uZS1maWxlLXZpZXdlci9uZ3QtZHJvcHpvbmUtZmlsZS12aWV3ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0RHJvcHpvbmVFcnJvclR5cGUsIE5ndERyb3B6b25lRmlsZSwgTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSB9IGZyb20gJy4vbmd0LWRyb3B6b25lLm1ldGEnO1xyXG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0U2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1zZWN0aW9uL25ndC1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5ndE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LW1vZGFsL25ndC1tb2RhbC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25ndC1kcm9wem9uZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRyb3B6b25lLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL25ndC1kcm9wem9uZS5jb21wb25lbnQuY3NzJ10sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTmd0TWFrZVByb3ZpZGVyKE5ndERyb3B6b25lQ29tcG9uZW50KSxcclxuICAgIF0sXHJcbiAgICB2aWV3UHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1cclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5ndERyb3B6b25lQ29tcG9uZW50IGV4dGVuZHMgTmd0QmFzZU5nTW9kZWwgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKSBwdWJsaWMgY29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZChOZ3hEcm9wem9uZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5neERyb3B6b25lOiBOZ3hEcm9wem9uZUNvbXBvbmVudDtcclxuICAgIEBWaWV3Q2hpbGQoTmd0RHJvcHpvbmVGaWxlVmlld2VyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmd0RHJvcHpvbmVGaWxlVmlld2VyOiBOZ3REcm9wem9uZUZpbGVWaWV3ZXJDb21wb25lbnQ7XHJcblxyXG4gICAgLy8gVmlzdWFsXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0Q29sb3I6IHN0cmluZyA9ICd0ZXh0LWdyZWVuLTUwMCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscFRleHQ6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGl0bGU6IHN0cmluZztcclxuXHJcbiAgICAvLyBCZWhhdmlvclxyXG4gICAgQElucHV0KCkgcHVibGljIHJlc291cmNlczogQXJyYXk8Tmd0RHJvcHpvbmVGaWxlPiA9IFtdO1xyXG4gICAgQElucHV0KCkgcHVibGljIG11bHRpcGxlU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXNMaW1pdDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dGaWxlTmFtZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdmlld01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjYW5Eb3dubG9hZEZpbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgcHVibGljIHZlcnRpY2FsRXhwYW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlkZU5neERyb3B6b25lOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGFjY2VwdGVkRmlsZXM6IHN0cmluZyA9ICcqJyAvKiogTWltZSB0eXBlICovO1xyXG4gICAgQElucHV0KCkgcHVibGljIHVuYWNjZXB0ZWRGaWxlczogc3RyaW5nOyAvKiogTWltZSB0eXBlICovO1xyXG4gICAgQElucHV0KCkgcHVibGljIG1heEZpbGVTaXplOiBudW1iZXI7IC8qKiBCeXRlcyAqLztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmV2aWV3VHlwZTogTmd0RHJvcHpvbmVQcmV2aWV3VHlwZSA9IE5ndERyb3B6b25lUHJldmlld1R5cGUuREVGQVVMVDtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcmVtb3RlUmVzb3VyY2U6IGFueTtcclxuXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8Tmd4RHJvcHpvbmVDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVNlbGVjdEVycm9yOiBFdmVudEVtaXR0ZXI8Tmd0RHJvcHpvbmVFcnJvclR5cGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkZpbGVVcGxvYWRGYWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlVXBsb2FkSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25GaWxlVXBsb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRmlsZVByZXZpZXdMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgcHVibGljIGRyb3B6b25lSGVpZ2h0OiBzdHJpbmcgPSAnMTgwcHgnO1xyXG4gICAgcHVibGljIHVwbG9hZGVkUmVzb3VyY2VzID0gW107XHJcbiAgICBwdWJsaWMgZm9yY2VEaXNhYmxlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBuYXRpdmVWYWx1ZSA9IFtdO1xyXG4gICAgcHVibGljIHNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb21wb25lbnRSZWFkeSA9IGZhbHNlO1xyXG4gICAgcHVibGljIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBuZ3REcm9wem9uZUxvYWRlclN0eWxlOiBOZ3RTdHlsaXphYmxlU2VydmljZTtcclxuICAgIHB1YmxpYyBuZ3hFbGVtZW50SWQ6IHN0cmluZyA9IHV1aWQoKTtcclxuICAgIHB1YmxpYyBpbWFnZVZpZXdlck9wdGlvbnM6IGFueSA9IHtcclxuICAgICAgICBuYXZiYXI6IHRydWUsXHJcbiAgICAgICAgdG9vbGJhcjoge1xyXG4gICAgICAgICAgICB6b29tSW46IHRydWUsXHJcbiAgICAgICAgICAgIHpvb21PdXQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc2V0OiB0cnVlLFxyXG4gICAgICAgICAgICByb3RhdGVMZWZ0OiB0cnVlLFxyXG4gICAgICAgICAgICByb3RhdGVSaWdodDogdHJ1ZSxcclxuICAgICAgICAgICAgcHJldjogdHJ1ZSxcclxuICAgICAgICAgICAgbmV4dDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXHJcbiAgICAgICAgcHVibGljIGZvcm1Db250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcblxyXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlOiBOZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RGb3JtOiBOZ3RGb3JtQ29tcG9uZW50LFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0U2VjdGlvbjogTmd0U2VjdGlvbkNvbXBvbmVudCxcclxuXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcclxuICAgICAgICBwcml2YXRlIG5ndE1vZGFsOiBOZ3RNb2RhbENvbXBvbmVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUxvYWRlclN0eWxlID0gbmV3IE5ndFN0eWxpemFibGVTZXJ2aWNlKCk7XHJcblxyXG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVMb2FkZXJTdHlsZS5sb2FkKHRoaXMuaW5qZWN0b3IsICdOZ3REcm9wem9uZUxvYWRlcicsIHtcclxuICAgICAgICAgICAgaDogJ2gtOCcsXHJcbiAgICAgICAgICAgIGNvbG9yOiB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAndGV4dC1ncmF5LTYwMCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMucHJldmlld1R5cGUpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmV2aWV3VHlwZSA9IGdldEVudW1Gcm9tU3RyaW5nKGNoYW5nZXMucHJldmlld1R5cGUuY3VycmVudFZhbHVlLCBOZ3REcm9wem9uZVByZXZpZXdUeXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmRyb3B6b25lSGVpZ2h0ID0gYCR7dGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodH1weGA7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW1hZ2VQcmV2aWV3KGluZGV4KSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gdGhpcy51cGxvYWRlZFJlc291cmNlcy5maWx0ZXIoKHJlc291cmNlKSA9PiB0aGlzLmlzSW1hZ2UocmVzb3VyY2UpKTtcclxuICAgICAgICBjb25zdCBpbWFnZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBpbWFnZXMuZm9yRWFjaCgoaW1hZ2UpID0+IHtcclxuICAgICAgICAgICAgbGV0IGltYWdlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XHJcblxyXG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQuc3JjID0gaW1hZ2UuZmlsZS51cmw7XHJcblxyXG4gICAgICAgICAgICBpbWFnZXNEaXYuYXBwZW5kQ2hpbGQoaW1hZ2VFbGVtZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkltYWdlQ2xpY2soaW1hZ2VzRGl2LCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSW1hZ2VDbGljayhlbGVtZW50LCBpbmRleD8pIHtcclxuICAgICAgICBpZiAoIXRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JjZURpc2FibGVDbGljayA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZ3REcm9wem9uZUNvbXBvbmVudCA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiBpbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VWaWV3ZXJPcHRpb25zID0geyAuLi50aGlzLmltYWdlVmlld2VyT3B0aW9ucywgLi4ueyBpbml0aWFsVmlld0luZGV4OiBpbmRleCB9IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2aWV3ZXIgPSBuZXcgVmlld2VyKGVsZW1lbnQsIHtcclxuICAgICAgICAgICAgLi4udGhpcy5pbWFnZVZpZXdlck9wdGlvbnMsIC4uLntcclxuICAgICAgICAgICAgICAgIGhpZGRlbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZ3REcm9wem9uZUNvbXBvbmVudC5mb3JjZURpc2FibGVDbGljayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZXdlci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmlld2VyLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25GaWxlQ2xpY2sodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5mb3JjZURpc2FibGVDbGljayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci51cmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5uZ3REcm9wem9uZUZpbGVWaWV3ZXIuZmlsZU5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLmZpbGVTaXplID0gc2l6ZTtcclxuICAgICAgICB0aGlzLm5ndERyb3B6b25lRmlsZVZpZXdlci5pbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubmd0RHJvcHpvbmVGaWxlVmlld2VyLm9uQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93Tmd0RHJvcHpvbmVGaWxlVmlld2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VEaXNhYmxlQ2xpY2sgPSBmYWxzZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG9uU2VsZWN0KGV2ZW50OiBOZ3hEcm9wem9uZUNoYW5nZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVqZWN0ZWRGaWxlIG9mIDxhbnk+ZXZlbnQucmVqZWN0ZWRGaWxlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlamVjdGVkRmlsZS5yZWFzb24gPT0gJ3NpemUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlNJWkUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZEZpbGUucmVhc29uID09ICdub19tdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuTk9fTVVMVElQTEUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZEZpbGUucmVhc29uID09ICd0eXBlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlU2VsZWN0RXJyb3IuZW1pdChOZ3REcm9wem9uZUVycm9yVHlwZS5UWVBFKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLkRFRkFVTFQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGltaXQgPT0gMSAmJiBldmVudC5hZGRlZEZpbGVzXHJcbiAgICAgICAgICAgICAgICAmJiBldmVudC5hZGRlZEZpbGVzLmxlbmd0aCA9PSB0aGlzLml0ZW1zTGltaXQgJiYgdGhpcy51cGxvYWRlZFJlc291cmNlcy5sZW5ndGggPT0gdGhpcy5pdGVtc0xpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5hZGRlZEZpbGVzXHJcbiAgICAgICAgICAgICAgICAmJiBldmVudC5hZGRlZEZpbGVzLmxlbmd0aCArIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMubGVuZ3RoIDw9IHRoaXMuaXRlbXNMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoZXZlbnQuYWRkZWRGaWxlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdEVycm9yLmVtaXQoTmd0RHJvcHpvbmVFcnJvclR5cGUuSVRFTVNfTElNSVQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlcyhldmVudC5hZGRlZEZpbGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHVwbG9hZEZpbGVzKGZpbGVzOiBBcnJheTxGaWxlPikge1xyXG4gICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVtcG9yYXJ5RmlsZXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdGVtcG9yYXJ5QXR0YWNobWVudHMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdW5hY2NlcHRlZEZpbGVzID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9uRmlsZVVwbG9hZEluaXQuZW1pdCgpO1xyXG5cclxuICAgICAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUuaW5jbHVkZXModGhpcy51bmFjY2VwdGVkRmlsZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuYWNjZXB0ZWRGaWxlcy5wdXNoKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG9ic2VydmFibGVzLnB1c2godGhpcy5uZ3RBdHRhY2htZW50SHR0cFNlcnZpY2UudXBsb2FkKHRoaXMucmVtb3RlUmVzb3VyY2UsIGZpbGUpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5hdHRyaWJ1dGVzICYmIHJlc3BvbnNlLmRhdGEuYXR0cmlidXRlcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVsndXJsJ10gPSByZXNwb25zZS5kYXRhLmF0dHJpYnV0ZXMuZGF0YS51cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5RmlsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YVsnbG9hZGVkJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5QXR0YWNobWVudHMucHVzaChyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW9ic2VydmFibGVzLmxlbmd0aCAmJiB1bmFjY2VwdGVkRmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlRZUEUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRSZXNvdXJjZXMucHVzaCguLi50ZW1wb3JhcnlGaWxlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xpbWl0ID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OYXRpdmVDaGFuZ2UoWy4uLnRlbXBvcmFyeUF0dGFjaG1lbnRzXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKFsuLi50ZW1wb3JhcnlBdHRhY2htZW50cywgLi4udGhpcy5uYXRpdmVWYWx1ZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRmlsZVVwbG9hZGVkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5hY2NlcHRlZEZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3RFcnJvci5lbWl0KE5ndERyb3B6b25lRXJyb3JUeXBlLlRZUEUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25GaWxlVXBsb2FkRmFpbC5lbWl0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZVByZXZpZXcoYXR0YWNobWVudHM6IGFueSkge1xyXG4gICAgICAgIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggJiYgYXR0YWNobWVudHNbMF0pIHtcclxuICAgICAgICAgICAgbGV0IHRlbXBvcmFyeVJlc291cmNlID0gW107XHJcbiAgICAgICAgICAgIGxldCBvYnNlcnZhYmxlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaCgoYXR0YWNobWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgRmlsZSkgJiYgIWF0dGFjaG1lbnQubG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFsnbG9hZGVkJ10gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKHRoaXMubmd0QXR0YWNobWVudEh0dHBTZXJ2aWNlLnByZXZpZXcoYXR0YWNobWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnlSZXNvdXJjZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlc3BvbnNlLmRhdGEuZ2V0QXBpSWQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogcmVzcG9uc2UuZGF0YS5nZXRBdHRyaWJ1dGUoJ2ZpbGUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkUmVzb3VyY2VzLnB1c2goLi4udGVtcG9yYXJ5UmVzb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKGF0dGFjaG1lbnRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbGVQcmV2aWV3TG9hZGVkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLCA1MDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblJlbW92ZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcy5zcGxpY2UodGhpcy51cGxvYWRlZFJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKSwgMSk7XHJcbiAgICAgICAgdGhpcy5uYXRpdmVWYWx1ZSA9IHRoaXMubmF0aXZlVmFsdWUuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5pZCAhPSByZXNvdXJjZS5pZCk7XHJcbiAgICAgICAgdGhpcy5vbk5hdGl2ZUNoYW5nZSh0aGlzLm5hdGl2ZVZhbHVlKTtcclxuICAgICAgICB0aGlzLm9uRmlsZVJlbW92ZWQuZW1pdChyZXNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzSW1hZ2UocmVzb3VyY2U6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpZXdUeXBlID09ICdJTUFHRSdcclxuICAgICAgICAgICAgfHwgKFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UuZmlsZT8udHlwZVxyXG4gICAgICAgICAgICAgICAgJiYgcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdpbWFnZScpXHJcbiAgICAgICAgICAgICAgICAmJiAhcmVzb3VyY2UuZmlsZS50eXBlLmluY2x1ZGVzKCdkd2cnKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1ZpZGVvKHJlc291cmNlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aWV3VHlwZSA9PSAnVklERU8nIHx8IChyZXNvdXJjZS5maWxlICYmIHJlc291cmNlLmZpbGUudHlwZSAmJiByZXNvdXJjZS5maWxlLnR5cGUuaW5jbHVkZXMoJ3ZpZGVvJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0F1ZGlvKHJlc291cmNlOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS50eXBlICYmIHJlc291cmNlLmZpbGUudHlwZS5pbmNsdWRlcygnYXVkaW8nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRmlsZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzSW1hZ2UocmVzb3VyY2UpICYmICF0aGlzLmlzQXVkaW8ocmVzb3VyY2UpICYmICF0aGlzLmlzVmlkZW8ocmVzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWRGaWxlU2l6ZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHJlc291cmNlKSB7XHJcbiAgICAgICAgICAgIGxldCBzaXplID0gcmVzb3VyY2Uuc2l6ZSB8fCByZXNvdXJjZS5maWxlU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICghc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmZpbGUgJiYgcmVzb3VyY2UuZmlsZS5zaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHJlc291cmNlLmZpbGUuc2l6ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNpemUpID4gMTAwMDAwMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUZsb2F0KHNpemUpIC8gMTAwMDAwMCkudG9GaXhlZCgyKSArICcgTWInO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHNpemUpIC8gMTAwMCkgKyAnIEtiJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkgIT0gSlNPTi5zdHJpbmdpZnkodGhpcy5uYXRpdmVWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm5hdGl2ZVZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ2UodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy52aWV3TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uTmF0aXZlQ2hhbmdlKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlYWR5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRGaWxlUHJldmlldyhBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRvd25sb2FkRmlsZShhdHRhY2htZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLm5ndEF0dGFjaG1lbnRIdHRwU2VydmljZS5kb3dubG9hZChhdHRhY2htZW50KS5zdWJzY3JpYmUoKCkgPT4geyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZFJlc291cmNlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gW107XHJcbiAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5GaWxlU2VsZWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5uZ3hFbGVtZW50SWQpLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0Rpc2FibGVkQnlQYXJlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmV2aWV3VHlwZSA9IE5ndERyb3B6b25lUHJldmlld1R5cGUuREVGQVVMVDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvcm1Db250YWluZXIgJiYgdGhpcy5mb3JtQ29udGFpbmVyLmNvbnRyb2xcclxuICAgICAgICAgICAgJiYgKHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbC5nZXQodGhpcy5uYW1lKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVzTG9hZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRGaWxlUHJldmlldyhBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IFt0aGlzLnZhbHVlXSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldEZpbGVzTG9hZCgpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbJ2xvYWRlZCddID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZhbGlkYXRpb25zKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3luY1ZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xyXG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCgpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0Rpc2FibGVkQnlQYXJlbnQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmd0Rm9ybT8uaXNEaXNhYmxlZFxyXG4gICAgICAgICAgICB8fCB0aGlzLm5ndFNlY3Rpb24/LmlzRGlzYWJsZWRcclxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RNb2RhbD8uaXNEaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaC1mdWxsIHctZnVsbFwiICNjb250YWluZXI+XHJcbiAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwiZmxleCBtYi0yIHRleHQtc21cIj5cclxuICAgICAgICB7eyBsYWJlbCB9fTpcclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXJlZC01MDAgZm9udC1ib2xkIHRleHQtbWQgbWwtMVwiICpuZ0lmPVwiaXNSZXF1aXJlZFwiPio8L3NwYW4+XHJcblxyXG4gICAgICAgIDxuZ3QtaGVscGVyICpuZ0lmPVwiaGVscFRleHRcIiBbaGVscFRpdGxlXT1cImhlbHBUaXRsZVwiIFtpY29uQ29sb3JdPVwiaGVscFRleHRDb2xvclwiIGNsYXNzPVwibWwtMVwiPlxyXG4gICAgICAgICAgICB7eyBoZWxwVGV4dCB9fVxyXG4gICAgICAgIDwvbmd0LWhlbHBlcj5cclxuICAgIDwvbGFiZWw+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIiF2aWV3TW9kZVwiIGNsYXNzPVwiaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nICYmICFoaWRlTmd4RHJvcHpvbmVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggYWJzb2x1dGUganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHctZnVsbCBoLWZ1bGwgY3Vyc29yLXdhaXQgei0xMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxvYWRlclwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmd4LWRyb3B6b25lIFtpZF09XCJuZ3hFbGVtZW50SWRcIiBbbXVsdGlwbGVdPSdtdWx0aXBsZVNlbGVjdGlvbicgW21heEZpbGVTaXplXT0nbWF4RmlsZVNpemUnXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPSdvblNlbGVjdCgkZXZlbnQpJyBbY2xhc3Muc2luZ2xlLWF0dGFjaG1lbnRdPSdpdGVtc0xpbWl0ID09IDEnIFthY2NlcHRdPSdhY2NlcHRlZEZpbGVzJ1xyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPSdpc0Rpc2FibGVkKCkgfHwgbG9hZGluZycgW2V4cGFuZGFibGVdPSd2ZXJ0aWNhbEV4cGFuZGFibGUnXHJcbiAgICAgICAgICAgIFtkaXNhYmxlQ2xpY2tdPSdkaXNhYmxlQ2xpY2sgfHwgZm9yY2VEaXNhYmxlQ2xpY2snIFtuZ1N0eWxlXT1cInsgJ2hlaWdodCc6IGRyb3B6b25lSGVpZ2h0IH1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdoaWRkZW4nOmhpZGVOZ3hEcm9wem9uZSB9XCIgI25neERyb3B6b25lPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxuZ3gtZHJvcHpvbmUtbGFiZWwgKm5nSWY9XCIhdXBsb2FkZWRSZXNvdXJjZXM/Lmxlbmd0aFwiIGNsYXNzPVwicHgtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XHJcbiAgICAgICAgICAgICAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZXNvdXJjZSBvZiB1cGxvYWRlZFJlc291cmNlczsgbGV0IGluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LTQ4IG14LTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHJlc291cmNlPy5maWxlPy5uYW1lIHx8ICcnIH19ICh7eyBnZXRGb3JtYXR0ZWRGaWxlU2l6ZShyZXNvdXJjZSkgfX0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjdXN0b20tZHJvcHpvbmUtcHJldmlldyAqbmdJZj1cInByZXZpZXdUeXBlID09ICdERUZBVUxUJyAmJiBpc0ZpbGUocmVzb3VyY2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlXT0ncmVzb3VyY2UuZmlsZScgW3JlbW92YWJsZV09XCJyZW1vdmFibGVcIiAocmVtb3ZlZCk9XCJvblJlbW92ZShyZXNvdXJjZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRmlsZUNsaWNrKHJlc291cmNlLmZpbGUudXJsLCByZXNvdXJjZS5maWxlLm5hbWUsIHJlc291cmNlLmZpbGUuc2l6ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdQcm9qZWN0QXM9XCJuZ3gtZHJvcHpvbmUtcHJldmlld1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2N1c3RvbS1kcm9wem9uZS1wcmV2aWV3PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzSW1hZ2UocmVzb3VyY2UpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJpbWFnZVByZXZpZXcoaW5kZXgpXCIgI2dhbGxlcnk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXcgY2xhc3M9XCJpbWFnZS1wcmV2aWV3LWRlZmF1bHQtY2xhc3NcIiBbZmlsZV09XCJyZXNvdXJjZS5maWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiIChyZW1vdmVkKT1cIm9uUmVtb3ZlKHJlc291cmNlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LWRyb3B6b25lLXZpZGVvLXByZXZpZXcgKm5nSWY9XCJpc1ZpZGVvKHJlc291cmNlKSB8fCBpc0F1ZGlvKHJlc291cmNlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsZV09XCJyZXNvdXJjZS5maWxlXCIgW3JlbW92YWJsZV09XCJyZW1vdmFibGVcIiAocmVtb3ZlZCk9XCJvblJlbW92ZShyZXNvdXJjZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtZHJvcHpvbmUtdmlkZW8tcHJldmlldz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2hvd0ZpbGVOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHRydW5jYXRlIHRleHQtZ3JheS01MDAgdGV4dC1jZW50ZXIgdGV4dC1zbSBmb250LW1vbm8gbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmVzb3VyY2U/LmZpbGU/Lm5hbWUgfHwgJycgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmd4LWRyb3B6b25lPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5ndC1kcm9wem9uZS12aWV3ICpuZ0lmPVwidmlld01vZGVcIiBjbGFzcz1cImgtZnVsbCB3LWZ1bGxcIiBbcmVzb3VyY2VzXT1cInJlc291cmNlc1wiIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtkcm9wem9uZUhlaWdodF09XCJkcm9wem9uZUhlaWdodFwiXHJcbiAgICAgICAgKG9uRmlsZUNsaWNrKT1cIm9uRmlsZUNsaWNrKCRldmVudC5wcmV2aWV3VXJsLCAkZXZlbnQubmFtZSwgJGV2ZW50LmZpbGVTaXplKVwiXHJcbiAgICAgICAgKG9uSW1hZ2VDbGljayk9XCJvbkltYWdlQ2xpY2soJGV2ZW50LmRpdiwgJGV2ZW50LmluZGV4KVwiPlxyXG4gICAgPC9uZ3QtZHJvcHpvbmUtdmlldz5cclxuXHJcbiAgICA8bmd0LWRyb3B6b25lLWZpbGUtdmlld2VyIFtoaWRkZW5dPVwiIXNob3dOZ3REcm9wem9uZUZpbGVWaWV3ZXJcIiAob25DbG9zZSk9XCJmb3JjZURpc2FibGVDbGljayA9IGZhbHNlXCJcclxuICAgICAgICBbY2FuRG93bmxvYWRGaWxlXT1cImNhbkRvd25sb2FkRmlsZVwiIFtkaXNhYmxlQ29udGVudF09XCJjYW5Eb3dubG9hZEZpbGUgPyAnbm9uZScgOiAncG9wb3V0J1wiPlxyXG4gICAgPC9uZ3QtZHJvcHpvbmUtZmlsZS12aWV3ZXI+XHJcblxyXG4gICAgPGlucHV0ICpuZ0lmPSdjb21wb25lbnRSZWFkeScgdHlwZT1cImhpZGRlblwiIFtuZ01vZGVsXT1cInZhbHVlXCIgW25hbWVdPVwibmFtZVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxyXG4gICAgPG5ndC12YWxpZGF0aW9uIFtjb250cm9sXT1cImZvcm1Db250cm9sXCIgW2NvbnRhaW5lcl09XCJmb3JtQ29udGFpbmVyXCI+PC9uZ3QtdmFsaWRhdGlvbj5cclxuPC9kaXY+Il19