@colijnit/sharedcomponents 1.0.57 → 1.0.58

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 (157) hide show
  1. package/bundles/colijnit-sharedcomponents.umd.js +3555 -6
  2. package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
  3. package/colijnit-sharedcomponents.d.ts +17 -0
  4. package/colijnit-sharedcomponents.metadata.json +1 -1
  5. package/esm2015/colijnit-sharedcomponents.js +18 -1
  6. package/esm2015/lib/businessobject/build-images-and-documentation-result.js +2 -0
  7. package/esm2015/lib/businessobject/co-document-right.bo.js +3 -0
  8. package/esm2015/lib/businessobject/drag-drop-container-element.js +2 -0
  9. package/esm2015/lib/businessobject/drag-drop-container.js +7 -0
  10. package/esm2015/lib/components/activity-list/activity-list.component.js +130 -0
  11. package/esm2015/lib/components/activity-list/activity-list.module.js +24 -0
  12. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.component.js +47 -0
  13. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.module.js +20 -0
  14. package/esm2015/lib/components/file-upload/file-upload.component.js +189 -0
  15. package/esm2015/lib/components/file-upload/file-upload.module.js +25 -0
  16. package/esm2015/lib/components/file-upload-popup/file-upload-popup.component.js +397 -0
  17. package/esm2015/lib/components/file-upload-popup/file-upload-popup.module.js +30 -0
  18. package/esm2015/lib/components/files-upload/components/base-file-upload.component.js +469 -0
  19. package/esm2015/lib/components/files-upload/components/drag-drop-container.component.js +115 -0
  20. package/esm2015/lib/components/files-upload/files-upload.component.js +131 -0
  21. package/esm2015/lib/components/files-upload/files-upload.module.js +47 -0
  22. package/esm2015/lib/components/image-display/image-display.component.js +36 -0
  23. package/esm2015/lib/components/image-display/image-display.module.js +23 -0
  24. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.component.js +89 -0
  25. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.module.js +21 -0
  26. package/esm2015/lib/components/tile-renderer/tile-render.component.js +80 -0
  27. package/esm2015/lib/components/tile-renderer/tile-render.module.js +26 -0
  28. package/esm2015/lib/decorator/input-boolean.decorator.js +34 -0
  29. package/esm2015/lib/enum/document-email-report.enum.js +18 -0
  30. package/esm2015/lib/enum/domain-multiple-name.enum.js +13 -0
  31. package/esm2015/lib/enum/file-type.js +14 -0
  32. package/esm2015/lib/enum/files-upload-config-objects.js +3 -0
  33. package/esm2015/lib/enum/icon.enum.js +7 -1
  34. package/esm2015/lib/enum/internal-param.enum.js +38 -0
  35. package/esm2015/lib/enum/read-write-access-config-names.enum.js +2 -0
  36. package/esm2015/lib/enum/table-name.enum.js +86 -0
  37. package/esm2015/lib/enum/tag-category.enum.js +22 -0
  38. package/esm2015/lib/enum/tags-component-config-names.js +2 -0
  39. package/esm2015/lib/enum/tile-size-type.js +7 -0
  40. package/esm2015/lib/event/co-drag-event.js +2 -0
  41. package/esm2015/lib/event/co-drop-event.js +2 -0
  42. package/esm2015/lib/interface/key-value-pair.js +2 -0
  43. package/esm2015/lib/interface/operation-callback-simple-function.js +4 -0
  44. package/esm2015/lib/model/icon-svg.js +7 -1
  45. package/esm2015/lib/model/tag-tree-item.bo.js +16 -0
  46. package/esm2015/lib/model/tree-object.js +15 -0
  47. package/esm2015/lib/pipe/file-type-image.pipe.js +51 -0
  48. package/esm2015/lib/pipe/master-pipes.js +4 -2
  49. package/esm2015/lib/service/drag-drop.service.js +365 -0
  50. package/esm2015/lib/service/shared-connector.service.js +10 -1
  51. package/esm2015/lib/service/shared.service.js +2 -2
  52. package/esm2015/lib/utils/array-utils.js +202 -0
  53. package/esm2015/lib/utils/check-precision-and-scale-result.js +2 -0
  54. package/esm2015/lib/utils/check-within-stepped-bounds-result.js +2 -0
  55. package/esm2015/lib/utils/co-document-shared-field-logic.js +50 -0
  56. package/esm2015/lib/utils/enum-utils.js +128 -0
  57. package/esm2015/lib/utils/is-nill.function.js +5 -0
  58. package/esm2015/lib/utils/number-utils.js +390 -0
  59. package/esm2015/lib/utils/object-utils.js +278 -0
  60. package/esm2015/lib/utils/ref-code-utils.js +49 -0
  61. package/esm2015/lib/utils/string-utils.js +30 -1
  62. package/esm2015/public-api.js +5 -1
  63. package/fesm2015/colijnit-sharedcomponents.js +3528 -6
  64. package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
  65. package/lib/businessobject/build-images-and-documentation-result.d.ts +5 -0
  66. package/lib/businessobject/co-document-right.bo.d.ts +6 -0
  67. package/lib/businessobject/drag-drop-container-element.d.ts +6 -0
  68. package/lib/businessobject/drag-drop-container.d.ts +6 -0
  69. package/lib/components/access/read-write-access.scss +25 -0
  70. package/lib/components/access/style/_layout.scss +23 -0
  71. package/lib/components/access/style/_material-definition.scss +12 -0
  72. package/lib/components/access/style/_theme.scss +4 -0
  73. package/lib/components/access/style/material.scss +4 -0
  74. package/lib/components/activity-list/activity-list.component.d.ts +33 -0
  75. package/lib/components/activity-list/activity-list.module.d.ts +2 -0
  76. package/lib/components/activity-list/style/_layout.scss +68 -0
  77. package/lib/components/activity-list/style/_material-definition.scss +0 -0
  78. package/lib/components/activity-list/style/_theme.scss +4 -0
  79. package/lib/components/activity-list/style/material.scss +4 -0
  80. package/lib/components/app-file-dropzone/app-file-dropzone.component.d.ts +14 -0
  81. package/lib/components/app-file-dropzone/app-file-dropzone.module.d.ts +2 -0
  82. package/lib/components/app-file-dropzone/style/_layout.scss +61 -0
  83. package/lib/components/app-file-dropzone/style/_material-definition.scss +0 -0
  84. package/lib/components/app-file-dropzone/style/_theme.scss +4 -0
  85. package/lib/components/app-file-dropzone/style/material.scss +4 -0
  86. package/lib/components/file-upload/file-upload.component.d.ts +42 -0
  87. package/lib/components/file-upload/file-upload.module.d.ts +2 -0
  88. package/lib/components/file-upload/style/_layout.scss +59 -0
  89. package/lib/components/file-upload/style/_material-definition.scss +2 -0
  90. package/lib/components/file-upload/style/_theme.scss +4 -0
  91. package/lib/components/file-upload/style/material.scss +4 -0
  92. package/lib/components/file-upload-popup/file-upload-popup.component.d.ts +75 -0
  93. package/lib/components/file-upload-popup/file-upload-popup.module.d.ts +2 -0
  94. package/lib/components/file-upload-popup/style/_layout.scss +48 -0
  95. package/lib/components/file-upload-popup/style/_material-definition.scss +2 -0
  96. package/lib/components/file-upload-popup/style/_theme.scss +5 -0
  97. package/lib/components/file-upload-popup/style/material.scss +4 -0
  98. package/lib/components/files-upload/components/base-file-upload.component.d.ts +98 -0
  99. package/lib/components/files-upload/components/drag-drop-container.component.d.ts +34 -0
  100. package/lib/components/files-upload/files-upload.component.d.ts +32 -0
  101. package/lib/components/files-upload/files-upload.module.d.ts +2 -0
  102. package/lib/components/files-upload/style/_layout.scss +49 -0
  103. package/lib/components/files-upload/style/_material-definition.scss +0 -0
  104. package/lib/components/files-upload/style/_theme.scss +5 -0
  105. package/lib/components/files-upload/style/material.scss +4 -0
  106. package/lib/components/image-display/image-display.component.d.ts +14 -0
  107. package/lib/components/image-display/image-display.module.d.ts +2 -0
  108. package/lib/components/image-display/style/_layout.scss +56 -0
  109. package/lib/components/image-display/style/_material-definition.scss +4 -0
  110. package/lib/components/image-display/style/_theme.scss +6 -0
  111. package/lib/components/image-display/style/material.scss +3 -0
  112. package/lib/components/multi-property-toggler/multiple-property-toggler.component.d.ts +27 -0
  113. package/lib/components/multi-property-toggler/multiple-property-toggler.module.d.ts +2 -0
  114. package/lib/components/multi-property-toggler/style/_layout.scss +24 -0
  115. package/lib/components/multi-property-toggler/style/_material-definition.scss +0 -0
  116. package/lib/components/multi-property-toggler/style/_theme.scss +4 -0
  117. package/lib/components/multi-property-toggler/style/material.scss +4 -0
  118. package/lib/components/tile-renderer/style/_layout.scss +90 -0
  119. package/lib/components/tile-renderer/style/_material-definition.scss +0 -0
  120. package/lib/components/tile-renderer/style/_theme.scss +4 -0
  121. package/lib/components/tile-renderer/style/material.scss +4 -0
  122. package/lib/components/tile-renderer/tile-render.component.d.ts +31 -0
  123. package/lib/components/tile-renderer/tile-render.module.d.ts +2 -0
  124. package/lib/decorator/input-boolean.decorator.d.ts +8 -0
  125. package/lib/enum/document-email-report.enum.d.ts +15 -0
  126. package/lib/enum/domain-multiple-name.enum.d.ts +10 -0
  127. package/lib/enum/file-type.d.ts +7 -0
  128. package/lib/enum/files-upload-config-objects.d.ts +22 -0
  129. package/lib/enum/icon.enum.d.ts +6 -0
  130. package/lib/enum/internal-param.enum.d.ts +34 -0
  131. package/lib/enum/read-write-access-config-names.enum.d.ts +4 -0
  132. package/lib/enum/table-name.enum.d.ts +84 -0
  133. package/lib/enum/tag-category.enum.d.ts +19 -0
  134. package/lib/enum/tags-component-config-names.d.ts +4 -0
  135. package/lib/enum/tile-size-type.d.ts +4 -0
  136. package/lib/event/co-drag-event.d.ts +5 -0
  137. package/lib/event/co-drop-event.d.ts +8 -0
  138. package/lib/interface/key-value-pair.d.ts +4 -0
  139. package/lib/interface/operation-callback-simple-function.d.ts +4 -0
  140. package/lib/model/tag-tree-item.bo.d.ts +18 -0
  141. package/lib/model/tree-object.d.ts +8 -0
  142. package/lib/pipe/file-type-image.pipe.d.ts +12 -0
  143. package/lib/service/drag-drop.service.d.ts +86 -0
  144. package/lib/service/shared-connector.service.d.ts +2 -0
  145. package/lib/style/_variables.scss +1 -1
  146. package/lib/utils/array-utils.d.ts +63 -0
  147. package/lib/utils/check-precision-and-scale-result.d.ts +4 -0
  148. package/lib/utils/check-within-stepped-bounds-result.d.ts +8 -0
  149. package/lib/utils/co-document-shared-field-logic.d.ts +7 -0
  150. package/lib/utils/enum-utils.d.ts +31 -0
  151. package/lib/utils/is-nill.function.d.ts +1 -0
  152. package/lib/utils/number-utils.d.ts +125 -0
  153. package/lib/utils/object-utils.d.ts +40 -0
  154. package/lib/utils/ref-code-utils.d.ts +10 -0
  155. package/lib/utils/string-utils.d.ts +16 -0
  156. package/package.json +1 -1
  157. package/public-api.d.ts +4 -0
@@ -0,0 +1,469 @@
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { ComponentFactoryResolver, Directive, EventEmitter, HostBinding, HostListener, Input, Output, ViewContainerRef } from "@angular/core";
3
+ import { TableName } from "../../../enum/table-name.enum";
4
+ import { DictionaryService } from "../../../service/dictionary.service";
5
+ import { FileType } from "@colijnit/mainapi/build/enum/file-type.enum";
6
+ import { OperationWithAlwaysSuccessCallback } from "../../../interface/operation-callback-simple-function";
7
+ import { ArrayUtils } from "../../../utils/array-utils";
8
+ import { RefCodeUtils } from "../../../utils/ref-code-utils";
9
+ import { CoDocumentSharedFieldLogic } from "../../../utils/co-document-shared-field-logic";
10
+ import { ObjectRightType } from "@colijnit/sharedapi/build/enum/object-right-type.enum";
11
+ import { InputBoolean } from "../../../decorator/input-boolean.decorator";
12
+ import { AppFileDropzoneComponent } from "../../app-file-dropzone/app-file-dropzone.component";
13
+ import { FileUtils } from "@colijnit/mainapi/build/utils/file-utils";
14
+ import { CoDocument } from "@colijnit/mainapi/build/model/co-document";
15
+ import { CoDocumentType } from "@colijnit/mainapi/build/enum/co-document-type.enum";
16
+ import { FileUploadPopupComponent } from "../../file-upload-popup/file-upload-popup.component";
17
+ // A base component that lets the user make a list of files from its device. Doesn't actually upload, but outputs chosen files as filesChanged.
18
+ export class BaseFileUploadComponent {
19
+ // private static readonly _dummyTrueFunction: OperationCallbackSimpleFunction = (object: any) => Promise.resolve(true);
20
+ constructor(
21
+ //protected _promptService: PromptService,
22
+ _dictionaryService,
23
+ //protected _userService: UserService,
24
+ _container, _factory) {
25
+ this._dictionaryService = _dictionaryService;
26
+ this._container = _container;
27
+ this._factory = _factory;
28
+ this.documents = [];
29
+ // The ability to drop files on the page
30
+ this.fullPageDrop = false;
31
+ // If user gets the ability of adding files.
32
+ this.canAdd = true;
33
+ // Show add button
34
+ this.addWithButton = true;
35
+ // If user gets the ability of deleting files.
36
+ this.canDelete = true;
37
+ this.noDragDropOrdering = false;
38
+ this.askBeforeDelete = true;
39
+ this.resizeImages = false;
40
+ this.lockOperation = OperationWithAlwaysSuccessCallback;
41
+ this.unlockOperation = OperationWithAlwaysSuccessCallback;
42
+ this.beforeDeleteOperation = OperationWithAlwaysSuccessCallback;
43
+ this.afterDeleteOperation = OperationWithAlwaysSuccessCallback;
44
+ this.beforeCreateOperation = OperationWithAlwaysSuccessCallback;
45
+ this.afterCreateOperation = OperationWithAlwaysSuccessCallback;
46
+ this.beforeEditOperation = OperationWithAlwaysSuccessCallback;
47
+ this.dontAskBeforeDelete = false;
48
+ this.noOwnDeleteOperation = false;
49
+ this.useWithoutSettingProps = false;
50
+ this.medicalUserGroups = false;
51
+ // Use with customFileDropEvent
52
+ this.useCustomFileDropEvent = false;
53
+ // Use in conjunction with useCustomFileDropEvent
54
+ this.customFileDropEvent = new EventEmitter();
55
+ // Emits if user wants to add multiple documents at once
56
+ this.documentsAdded = new EventEmitter();
57
+ this.documentDeleted = new EventEmitter();
58
+ // Emits every time the order of documents was changed
59
+ this.sortableListChanged = new EventEmitter();
60
+ this.documentChangeEvent = new EventEmitter();
61
+ // Use this if consumer requires to perform extra actions, like locking a parent businessObject if it contains the collection of documents. Emit with true when popup opened, false for close
62
+ this.popupOpenedStateChange = new EventEmitter();
63
+ this._documentKey = "";
64
+ this._readonly = false;
65
+ }
66
+ // The fileType that the documents should be saved as, leave empty to automatically detect filetype. Also determines file picker filter
67
+ set fileType(value) {
68
+ if (value) {
69
+ this._fileType = value;
70
+ //TODO Documentdataloader fix
71
+ //this._coDocumentDataLoader.loadAllowedTypes().then(() => {this.handleAcceptedFileTypesLoaded(value)});
72
+ }
73
+ }
74
+ get fileType() {
75
+ return this._fileType;
76
+ }
77
+ set documentKey(value) {
78
+ this._documentKey = value + ""; // force string
79
+ }
80
+ get documentKey() {
81
+ return this._documentKey;
82
+ }
83
+ set readonly(value) {
84
+ this._readonly = value;
85
+ if (this._popup && this._popup.instance) {
86
+ this._popup.instance.readonly = value;
87
+ }
88
+ }
89
+ get readonly() {
90
+ return this._readonly;
91
+ }
92
+ set maxUploadSizeParam(value) {
93
+ if (value) {
94
+ this._setInternalParamObj(value);
95
+ }
96
+ }
97
+ onDrop(event) {
98
+ event.preventDefault();
99
+ event.stopPropagation();
100
+ if (!this.useCustomFileDropEvent) {
101
+ this.filesPicked(event.dataTransfer.files);
102
+ }
103
+ else {
104
+ this.customFileDropEvent.emit(event.dataTransfer.files);
105
+ }
106
+ this._clearDropzone();
107
+ }
108
+ onDragEnd(event) {
109
+ event.dataTransfer.clearData();
110
+ this._clearDropzone();
111
+ }
112
+ onDragOver(event) {
113
+ event.preventDefault();
114
+ }
115
+ onDragEnter(event) {
116
+ this._dragEnterTarget = event.target;
117
+ this._showDropzone();
118
+ }
119
+ onDragLeave(event) {
120
+ if (event.target === this._dragEnterTarget) {
121
+ this._clearDropzone();
122
+ }
123
+ }
124
+ ngOnDestroy() {
125
+ this._clearDropzone();
126
+ }
127
+ _showDropzone() {
128
+ if (!this._dropZone) {
129
+ const fact = this._factory.resolveComponentFactory(AppFileDropzoneComponent);
130
+ this._dropZone = this._container.createComponent(fact);
131
+ this._dropZone.instance.customDropActionMessage = this.dropMessage;
132
+ }
133
+ }
134
+ _clearDropzone() {
135
+ this._container.clear();
136
+ if (this._dropZone) {
137
+ this._dropZone.destroy();
138
+ this._dropZone = undefined;
139
+ }
140
+ }
141
+ // Remove file from upload array.
142
+ handleDelete(file) {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ let success = yield this.beforeDeleteOperation(file);
145
+ try {
146
+ if (success) {
147
+ yield this._delete(file);
148
+ success = true;
149
+ }
150
+ }
151
+ finally {
152
+ yield this.afterDeleteOperation(file);
153
+ }
154
+ return Promise.resolve(success);
155
+ });
156
+ }
157
+ _delete(file) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ let doDelete = true;
160
+ if (!this.dontAskBeforeDelete) {
161
+ //TODO make dialogService
162
+ //doDelete = await this._promptService.showYesNo("MESSAGE_DELETE_RECORD_QUESTION");
163
+ }
164
+ if (doDelete) {
165
+ if (!this.noOwnDeleteOperation) {
166
+ ArrayUtils.RemoveElement(file, this.documents);
167
+ }
168
+ this.documentDeleted.emit(file);
169
+ }
170
+ });
171
+ }
172
+ handleSortingChange(docs) {
173
+ this.sortableListChanged.emit(docs);
174
+ }
175
+ handleFileChange(event) {
176
+ return __awaiter(this, void 0, void 0, function* () {
177
+ if (event && event.target && event.target.files && event.target.files.length > 0) {
178
+ // check file sizes and extension
179
+ //Todo: fix this
180
+ //const allowedExtensions = await this._baseDataDalRepository.getAllowedExtensions();
181
+ let allFilesAreSmallEnough = true;
182
+ let allFilesHaveAllowedExtensions = true;
183
+ const sizeToCompare = this._maxUploadFileSize ? this._maxUploadFileSize : undefined;
184
+ const len = event.target.files.length;
185
+ for (let i = 0; i < len; i++) {
186
+ const uploadSizeAllowed = FileUtils.CheckMaxUploadSize(event.target.files[i], sizeToCompare);
187
+ if (!uploadSizeAllowed) {
188
+ allFilesAreSmallEnough = false;
189
+ break;
190
+ }
191
+ const extensionAllowed = true; //FileUtils.CheckExtension(event.target.files[i], allowedExtensions);
192
+ if (!extensionAllowed) {
193
+ allFilesHaveAllowedExtensions = false;
194
+ break;
195
+ }
196
+ }
197
+ if (!allFilesAreSmallEnough) {
198
+ //TODO make dialogService
199
+ //this._promptService.showWarning(this._dictionaryService.get("FILE_TOO_LARGE_TO_UPLOAD", true, "" + [FileUtils.getMaxUploadSizeInMb(sizeToCompare)]));
200
+ }
201
+ else if (!allFilesHaveAllowedExtensions) {
202
+ //const extensionsList = allowedExtensions.map(allowedExtension => allowedExtension.extension).sort().join(", ");
203
+ //this._promptService.showWarning(this._dictionaryService.get("FILE_HAS_DISALLOWED_EXTENSION", false, extensionsList));
204
+ }
205
+ else {
206
+ const filesToAdd = yield this.convertFilesIntoCoDocuments(event.target.files);
207
+ if (filesToAdd.length > 1) {
208
+ this.documentsAdded.emit(filesToAdd);
209
+ }
210
+ else {
211
+ if (this.useWithoutSettingProps) {
212
+ this.documentsAdded.next(filesToAdd);
213
+ }
214
+ else {
215
+ this.documentUnderEdit = filesToAdd[0];
216
+ this.openPopup();
217
+ }
218
+ }
219
+ }
220
+ }
221
+ });
222
+ }
223
+ handleEditDocumentClick(docToEdit) {
224
+ return __awaiter(this, void 0, void 0, function* () {
225
+ this.documentUnderEdit = docToEdit;
226
+ const showPopup = yield this.beforeEditOperation(docToEdit);
227
+ if (showPopup) {
228
+ this.openPopup();
229
+ }
230
+ });
231
+ }
232
+ openPopup() {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ this._createAndFillPopupInstance();
235
+ this._docChangeSub = this._popup.instance.documentChangeEvent.subscribe((doc) => {
236
+ this.documentChangeEvent.emit(doc);
237
+ });
238
+ });
239
+ }
240
+ openPopupToAddDocumentByUrl() {
241
+ this._createDocumentToAddByUrl();
242
+ this._createAndFillPopupInstance(true);
243
+ this._docChangeSub = this._popup.instance.documentChangeEvent.subscribe((doc) => {
244
+ doc.fileName = doc.filePath;
245
+ this.documentChangeEvent.emit(doc);
246
+ });
247
+ }
248
+ _createDocumentToAddByUrl() {
249
+ this.documentUnderEdit = new CoDocument();
250
+ this.documentUnderEdit.table = this.documentTable;
251
+ this.documentUnderEdit.key = this.documentKey;
252
+ this.documentUnderEdit.fileType = this.fileType;
253
+ this.documentUnderEdit.documentType = CoDocumentType.SaveAsLinkOnRandomLocation;
254
+ this.documentUnderEdit.pathIsUrl = true;
255
+ //TODO Fix user Input
256
+ //this.documentUnderEdit.creationUser = this._userService.userName.toUpperCase();
257
+ //this.documentUnderEdit.modifiedUser = this._userService.userName.toUpperCase();
258
+ this.documentUnderEdit.creationDate = new Date();
259
+ this.documentUnderEdit.modifiedDate = new Date();
260
+ }
261
+ _createAndFillPopupInstance(addDocumentByUrl = false) {
262
+ this.popupOpenedStateChange.emit(true);
263
+ const factory = this._factory.resolveComponentFactory(FileUploadPopupComponent);
264
+ this._popup = this._container.createComponent(factory);
265
+ this._popup.instance.readonly = this._readonly;
266
+ this._popup.instance.addDocumentByUrl = addDocumentByUrl;
267
+ this._popup.instance.hasPublicAccessVisible = this.documentTable === TableName.Goods;
268
+ this._popup.instance.showDocumentReportPicker = (this.documentTable === TableName.Transactions || this.documentTable === TableName.TransactionLines);
269
+ this._popup.instance.documentUnderEdit = this.documentUnderEdit;
270
+ this._popup.instance.filesUploadConfigObjects = this.filesUploadConfigObjects;
271
+ this._popup.instance.medicalUserGroups = this.medicalUserGroups;
272
+ this._popup.instance.tagCategory = this.tagCategory;
273
+ this._popup.instance.displayReadWriteAccess = this.displayReadWriteAccess;
274
+ this._popup.instance.tagReferenceTable = this.tagReferenceTable;
275
+ this._popup.instance.publicationIds = RefCodeUtils.GetMultiRefCodeChoices(this.documentUnderEdit.publication);
276
+ this._popup.instance.storeGroupIds = this.documentUnderEdit.retailFormulas;
277
+ this._popup.instance.fileType = this.fileType;
278
+ this._prepareFileRights();
279
+ this._popupCloseSub = this._popup.instance.popupCloseEvent.subscribe(() => {
280
+ this._unlockDocument();
281
+ this.popupOpenedStateChange.emit(false);
282
+ this._popupCloseSub.unsubscribe();
283
+ this._docChangeSub.unsubscribe();
284
+ this._popup.destroy();
285
+ this._popup = undefined;
286
+ });
287
+ }
288
+ convertFilesIntoCoDocuments(files) {
289
+ return __awaiter(this, void 0, void 0, function* () {
290
+ const amountOfFiles = files.length;
291
+ const filesToAdd = [];
292
+ for (let i = 0; i < amountOfFiles; i++) {
293
+ const fileAsDocument = yield this._getFileAsDocument(files[i]);
294
+ fileAsDocument.index = CoDocumentSharedFieldLogic.GenerateAvailableIndexNr(this.documents || []) + i;
295
+ filesToAdd.push(fileAsDocument);
296
+ }
297
+ return filesToAdd;
298
+ });
299
+ }
300
+ filesPicked(files) {
301
+ return __awaiter(this, void 0, void 0, function* () {
302
+ if (files && files.length) {
303
+ let allFilesAreValid = true;
304
+ const amountOfFiles = files.length;
305
+ for (let i = 0; i < amountOfFiles; i++) {
306
+ if (!FileUtils.CheckMaxUploadSize(files[i], this._maxUploadFileSize)) {
307
+ allFilesAreValid = false;
308
+ break;
309
+ }
310
+ }
311
+ if (!allFilesAreValid) {
312
+ //TODO make dialogService
313
+ //this._promptService.showWarning(this._dictionaryService.get("FILE_TOO_LARGE_TO_UPLOAD", true, "" + FileUtils.getMaxUploadSizeInMb(this._maxUploadFileSize).toString()));
314
+ }
315
+ else {
316
+ const filesToAdd = yield this.convertFilesIntoCoDocuments(files);
317
+ if (filesToAdd.length > 1 || this.useWithoutSettingProps) {
318
+ this.documentsAdded.emit(filesToAdd);
319
+ }
320
+ else {
321
+ this.documentUnderEdit = filesToAdd[0]; // Setting docUnderEdit opens the popup window
322
+ this.openPopup();
323
+ }
324
+ }
325
+ }
326
+ });
327
+ }
328
+ handleAcceptedFileTypesLoaded(value) {
329
+ //TODO fix loading
330
+ //this.acceptedUploadFormats = this._coDocumentDataLoader.getAllowedExtensionsForType(value);
331
+ }
332
+ _getFileAsDocument(file) {
333
+ return __awaiter(this, void 0, void 0, function* () {
334
+ const fileAsCoDocument = yield FileUtils.ReadFileAsNewCoDocument(file, this.resizeImages);
335
+ // set some extra known fields for the codocument:
336
+ fileAsCoDocument.table = this.documentTable;
337
+ fileAsCoDocument.key = this.documentKey;
338
+ //TODO fix add users
339
+ //fileAsCoDocument.creationUser = this._userService.userName.toUpperCase();
340
+ //fileAsCoDocument.modifiedUser = this._userService.userName.toUpperCase();
341
+ fileAsCoDocument.creationDate = new Date();
342
+ fileAsCoDocument.modifiedDate = new Date();
343
+ fileAsCoDocument.fileType = this.fileType ? this.fileType : FileUtils.IsImageFile(file) ? FileType.Image : FileType.Document;
344
+ if (fileAsCoDocument) {
345
+ return fileAsCoDocument;
346
+ }
347
+ });
348
+ }
349
+ _setInternalParamObj(value) {
350
+ return __awaiter(this, void 0, void 0, function* () {
351
+ //TODO fix params
352
+ //const param: InternalParameterObject = await this._generalDalRepository.getInternalParamObject(value);
353
+ //this._maxUploadFileSize = isNaN(parseInt(param.value, 0)) ? undefined : parseInt(param.value, 0);
354
+ });
355
+ }
356
+ _lockDocument() {
357
+ return __awaiter(this, void 0, void 0, function* () {
358
+ if (!this.documentUnderEdit.documentId) {
359
+ return true; // New document does not have an ID and therefore does not have to be locked
360
+ }
361
+ const lockOk = yield this.lockOperation(CoDocument);
362
+ return lockOk;
363
+ });
364
+ }
365
+ _unlockDocument() {
366
+ return __awaiter(this, void 0, void 0, function* () {
367
+ if (!this.documentUnderEdit.documentId) {
368
+ return true; // New document does not have an ID and therefore does not have to be locked
369
+ }
370
+ const unlockOk = yield this.unlockOperation(CoDocument);
371
+ return unlockOk;
372
+ });
373
+ }
374
+ _prepareFileRights() {
375
+ const len = this.documentUnderEdit.rights.length;
376
+ for (let i = 0; i < len; i++) {
377
+ const right = this.documentUnderEdit.rights[i];
378
+ if (right.rightLevel === ObjectRightType.ReadWrite) {
379
+ this._popup.instance.userGroupsForWrite.push(right.userGroupId);
380
+ }
381
+ if (right.rightLevel === ObjectRightType.ReadOnly) {
382
+ this._popup.instance.userGroupsForRead.push(right.userGroupId);
383
+ }
384
+ }
385
+ }
386
+ }
387
+ BaseFileUploadComponent.decorators = [
388
+ { type: Directive }
389
+ ];
390
+ BaseFileUploadComponent.ctorParameters = () => [
391
+ { type: DictionaryService },
392
+ { type: ViewContainerRef },
393
+ { type: ComponentFactoryResolver }
394
+ ];
395
+ BaseFileUploadComponent.propDecorators = {
396
+ fileType: [{ type: Input }],
397
+ documents: [{ type: Input }],
398
+ documentTable: [{ type: Input }],
399
+ documentKey: [{ type: Input }],
400
+ fullPageDrop: [{ type: Input }],
401
+ canAdd: [{ type: Input }],
402
+ dropMessage: [{ type: Input }],
403
+ addWithButton: [{ type: Input }],
404
+ canDelete: [{ type: Input }],
405
+ noDragDropOrdering: [{ type: Input }],
406
+ readonly: [{ type: Input }],
407
+ askBeforeDelete: [{ type: Input }],
408
+ resizeImages: [{ type: Input }],
409
+ lockOperation: [{ type: Input }],
410
+ unlockOperation: [{ type: Input }],
411
+ beforeDeleteOperation: [{ type: Input }],
412
+ afterDeleteOperation: [{ type: Input }],
413
+ beforeCreateOperation: [{ type: Input }],
414
+ afterCreateOperation: [{ type: Input }],
415
+ beforeEditOperation: [{ type: Input }],
416
+ dontAskBeforeDelete: [{ type: Input }],
417
+ noOwnDeleteOperation: [{ type: Input }],
418
+ maxUploadSizeParam: [{ type: Input }],
419
+ useWithoutSettingProps: [{ type: Input }],
420
+ filesUploadConfigObjects: [{ type: Input }],
421
+ medicalUserGroups: [{ type: Input }],
422
+ tagCategory: [{ type: Input }],
423
+ tagReferenceTable: [{ type: Input }],
424
+ displayReadWriteAccess: [{ type: Input }],
425
+ useCustomFileDropEvent: [{ type: Input }],
426
+ customFileDropEvent: [{ type: Output }],
427
+ documentsAdded: [{ type: Output }],
428
+ documentDeleted: [{ type: Output }],
429
+ sortableListChanged: [{ type: Output }],
430
+ documentChangeEvent: [{ type: Output }],
431
+ popupOpenedStateChange: [{ type: Output }],
432
+ hidden: [{ type: HostBinding, args: ["class.hidden",] }],
433
+ onDrop: [{ type: HostListener, args: ["drop", ["$event"],] }],
434
+ onDragEnd: [{ type: HostListener, args: ["dragend", ["$event"],] }],
435
+ onDragOver: [{ type: HostListener, args: ["dragover", ["$event"],] }],
436
+ onDragEnter: [{ type: HostListener, args: ["dragenter", ["$event"],] }],
437
+ onDragLeave: [{ type: HostListener, args: ["dragleave", ["$event"],] }]
438
+ };
439
+ __decorate([
440
+ InputBoolean()
441
+ ], BaseFileUploadComponent.prototype, "noDragDropOrdering", void 0);
442
+ __decorate([
443
+ InputBoolean()
444
+ ], BaseFileUploadComponent.prototype, "readonly", null);
445
+ __decorate([
446
+ InputBoolean()
447
+ ], BaseFileUploadComponent.prototype, "askBeforeDelete", void 0);
448
+ __decorate([
449
+ InputBoolean()
450
+ ], BaseFileUploadComponent.prototype, "resizeImages", void 0);
451
+ __decorate([
452
+ InputBoolean()
453
+ ], BaseFileUploadComponent.prototype, "dontAskBeforeDelete", void 0);
454
+ __decorate([
455
+ InputBoolean()
456
+ ], BaseFileUploadComponent.prototype, "noOwnDeleteOperation", void 0);
457
+ __decorate([
458
+ InputBoolean()
459
+ ], BaseFileUploadComponent.prototype, "useWithoutSettingProps", void 0);
460
+ __decorate([
461
+ InputBoolean()
462
+ ], BaseFileUploadComponent.prototype, "medicalUserGroups", void 0);
463
+ __decorate([
464
+ InputBoolean()
465
+ ], BaseFileUploadComponent.prototype, "displayReadWriteAccess", void 0);
466
+ __decorate([
467
+ InputBoolean()
468
+ ], BaseFileUploadComponent.prototype, "useCustomFileDropEvent", void 0);
469
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWxlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9maWxlcy11cGxvYWQvY29tcG9uZW50cy9iYXNlLWZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRSxPQUFPLEVBRUgsa0NBQWtDLEVBQ3JDLE1BQU0sdURBQXVELENBQUM7QUFJL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUV6RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFDdEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDckUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9E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REMsWUFBWSxFQUFFO2dFQUN3QjtBQUl2QztJQURDLFlBQVksRUFBRTs2REFDc0I7QUE0QnJDO0lBREMsWUFBWSxFQUFFO29FQUM2QjtBQUk1QztJQURDLFlBQVksRUFBRTtxRUFDOEI7QUFhN0M7SUFEQyxZQUFZLEVBQUU7dUVBQ2dDO0FBTy9DO0lBREMsWUFBWSxFQUFFO2tFQUMyQjtBQVUxQztJQURDLFlBQVksRUFBRTt1RUFDd0I7QUFJdkM7SUFEVSxZQUFZLEVBQUU7dUVBQ3VCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudEZhY3RvcnksXHJcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBDb21wb25lbnRSZWYsXHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0QmluZGluZyxcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIElucHV0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7U2NyZWVuQ29uZmlnQWRhcHRlckNvbXBvbmVudH0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192MTJcIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7VGFibGVOYW1lfSBmcm9tIFwiLi4vLi4vLi4vZW51bS90YWJsZS1uYW1lLmVudW1cIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2UvZGljdGlvbmFyeS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7RmlsZVR5cGV9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL2ZpbGUtdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7XHJcbiAgICBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uLFxyXG4gICAgT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFja1xyXG59IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2Uvb3BlcmF0aW9uLWNhbGxiYWNrLXNpbXBsZS1mdW5jdGlvblwiO1xyXG5pbXBvcnQge0ludGVybmFsUGFyYW19IGZyb20gXCIuLi8uLi8uLi9lbnVtL2ludGVybmFsLXBhcmFtLmVudW1cIjtcclxuaW1wb3J0IHtGaWxlc1VwbG9hZENvbmZpZ09iamVjdHN9IGZyb20gXCIuLi8uLi8uLi9lbnVtL2ZpbGVzLXVwbG9hZC1jb25maWctb2JqZWN0c1wiO1xyXG5pbXBvcnQge1RhZ0NhdGVnb3J5fSBmcm9tIFwiLi4vLi4vLi4vZW51bS90YWctY2F0ZWdvcnkuZW51bVwiO1xyXG5pbXBvcnQge0FycmF5VXRpbHN9IGZyb20gXCIuLi8uLi8uLi91dGlscy9hcnJheS11dGlsc1wiO1xyXG5pbXBvcnQge1JlZkNvZGVVdGlsc30gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlZi1jb2RlLXV0aWxzXCI7XHJcbmltcG9ydCB7Q29Eb2N1bWVudFNoYXJlZEZpZWxkTG9naWN9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jby1kb2N1bWVudC1zaGFyZWQtZmllbGQtbG9naWNcIjtcclxuaW1wb3J0IHtDb0RvY3VtZW50UmlnaHR9IGZyb20gXCIuLi8uLi8uLi9idXNpbmVzc29iamVjdC9jby1kb2N1bWVudC1yaWdodC5ib1wiO1xyXG5pbXBvcnQge09iamVjdFJpZ2h0VHlwZX0gZnJvbSBcIkBjb2xpam5pdC9zaGFyZWRhcGkvYnVpbGQvZW51bS9vYmplY3QtcmlnaHQtdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7SW5wdXRCb29sZWFufSBmcm9tIFwiLi4vLi4vLi4vZGVjb3JhdG9yL2lucHV0LWJvb2xlYW4uZGVjb3JhdG9yXCI7XHJcbmltcG9ydCB7QXBwRmlsZURyb3B6b25lQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vYXBwLWZpbGUtZHJvcHpvbmUvYXBwLWZpbGUtZHJvcHpvbmUuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RmlsZVV0aWxzfSBmcm9tIFwiQGNvbGlqbml0L21haW5hcGkvYnVpbGQvdXRpbHMvZmlsZS11dGlsc1wiO1xyXG5pbXBvcnQge0NvRG9jdW1lbnR9IGZyb20gXCJAY29saWpuaXQvbWFpbmFwaS9idWlsZC9tb2RlbC9jby1kb2N1bWVudFwiO1xyXG5pbXBvcnQge0NvRG9jdW1lbnRUeXBlfSBmcm9tIFwiQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9jby1kb2N1bWVudC10eXBlLmVudW1cIjtcclxuaW1wb3J0IHtGaWxlVXBsb2FkUG9wdXBDb21wb25lbnR9IGZyb20gXCIuLi8uLi9maWxlLXVwbG9hZC1wb3B1cC9maWxlLXVwbG9hZC1wb3B1cC5jb21wb25lbnRcIjtcclxuXHJcblxyXG5cclxuLy8gQSBiYXNlIGNvbXBvbmVudCB0aGF0IGxldHMgdGhlIHVzZXIgbWFrZSBhIGxpc3Qgb2YgZmlsZXMgZnJvbSBpdHMgZGV2aWNlLiBEb2Vzbid0IGFjdHVhbGx5IHVwbG9hZCwgYnV0IG91dHB1dHMgY2hvc2VuIGZpbGVzIGFzIGZpbGVzQ2hhbmdlZC5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIFNjcmVlbkNvbmZpZ0FkYXB0ZXJDb21wb25lbnQsIE9uRGVzdHJveSB7XHJcbiAgICBkZWNpbWFsczogbnVtYmVyO1xyXG4gICAgZm9yY2VSZWFkb25seTogYm9vbGVhbjtcclxuICAgIG1heExlbmd0aDogbnVtYmVyO1xyXG4gICAgb2JqZWN0Q29uZmlnTmFtZTogc3RyaW5nO1xyXG4gICAgcmVkRXJyb3JCYWNrZ3JvdW5kOiBib29sZWFuO1xyXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgLy8gVGhlIGZpbGVUeXBlIHRoYXQgdGhlIGRvY3VtZW50cyBzaG91bGQgYmUgc2F2ZWQgYXMsIGxlYXZlIGVtcHR5IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGZpbGV0eXBlLiBBbHNvIGRldGVybWluZXMgZmlsZSBwaWNrZXIgZmlsdGVyXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBmaWxlVHlwZSh2YWx1ZTogRmlsZVR5cGUpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsZVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgLy9UT0RPIERvY3VtZW50ZGF0YWxvYWRlciBmaXhcclxuICAgICAgICAgICAgLy90aGlzLl9jb0RvY3VtZW50RGF0YUxvYWRlci5sb2FkQWxsb3dlZFR5cGVzKCkudGhlbigoKSA9PiB7dGhpcy5oYW5kbGVBY2NlcHRlZEZpbGVUeXBlc0xvYWRlZCh2YWx1ZSl9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmaWxlVHlwZSgpOiBGaWxlVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZG9jdW1lbnRzOiBDb0RvY3VtZW50W10gPSBbXTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRvY3VtZW50VGFibGU6IFRhYmxlTmFtZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBkb2N1bWVudEtleSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXkgPSB2YWx1ZSArIFwiXCI7IC8vIGZvcmNlIHN0cmluZ1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZG9jdW1lbnRLZXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnRLZXk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIGFiaWxpdHkgdG8gZHJvcCBmaWxlcyBvbiB0aGUgcGFnZVxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmdWxsUGFnZURyb3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBJZiB1c2VyIGdldHMgdGhlIGFiaWxpdHkgb2YgYWRkaW5nIGZpbGVzLlxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYW5BZGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZHJvcE1lc3NhZ2U6IHN0cmluZztcclxuXHJcbiAgICAvLyBTaG93IGFkZCBidXR0b25cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYWRkV2l0aEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLy8gSWYgdXNlciBnZXRzIHRoZSBhYmlsaXR5IG9mIGRlbGV0aW5nIGZpbGVzLlxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYW5EZWxldGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyBub0RyYWdEcm9wT3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQElucHV0Qm9vbGVhbigpXHJcbiAgICBwdWJsaWMgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmIHRoaXMuX3BvcHVwLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnJlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyBhc2tCZWZvcmVEZWxldGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyByZXNpemVJbWFnZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxvY2tPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdW5sb2NrT3BlcmF0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gT3BlcmF0aW9uV2l0aEFsd2F5c1N1Y2Nlc3NDYWxsYmFjaztcclxuXHJcblxyXG5cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJlZm9yZURlbGV0ZU9wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhZnRlckRlbGV0ZU9wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBiZWZvcmVDcmVhdGVPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYWZ0ZXJDcmVhdGVPcGVyYXRpb246IE9wZXJhdGlvbkNhbGxiYWNrU2ltcGxlRnVuY3Rpb24gPSBPcGVyYXRpb25XaXRoQWx3YXlzU3VjY2Vzc0NhbGxiYWNrO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYmVmb3JlRWRpdE9wZXJhdGlvbjogT3BlcmF0aW9uQ2FsbGJhY2tTaW1wbGVGdW5jdGlvbiA9IE9wZXJhdGlvbldpdGhBbHdheXNTdWNjZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIEBJbnB1dEJvb2xlYW4oKVxyXG4gICAgcHVibGljIGRvbnRBc2tCZWZvcmVEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQElucHV0Qm9vbGVhbigpXHJcbiAgICBwdWJsaWMgbm9Pd25EZWxldGVPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9maWxlVHlwZTogRmlsZVR5cGU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgbWF4VXBsb2FkU2l6ZVBhcmFtKHZhbHVlOiBJbnRlcm5hbFBhcmFtKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldEludGVybmFsUGFyYW1PYmoodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgQElucHV0Qm9vbGVhbigpXHJcbiAgICBwdWJsaWMgdXNlV2l0aG91dFNldHRpbmdQcm9wczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZmlsZXNVcGxvYWRDb25maWdPYmplY3RzOiBGaWxlc1VwbG9hZENvbmZpZ09iamVjdHM7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIEBJbnB1dEJvb2xlYW4oKVxyXG4gICAgcHVibGljIG1lZGljYWxVc2VyR3JvdXBzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0YWdDYXRlZ29yeTogVGFnQ2F0ZWdvcnk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0YWdSZWZlcmVuY2VUYWJsZTogVGFibGVOYW1lO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASW5wdXRCb29sZWFuKClcclxuICAgIHB1YmxpYyBkaXNwbGF5UmVhZFdyaXRlQWNjZXNzOiBib29sZWFuO1xyXG5cclxuICAgIC8vIFVzZSB3aXRoIGN1c3RvbUZpbGVEcm9wRXZlbnRcclxuICAgIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gICAgcHVibGljIHVzZUN1c3RvbUZpbGVEcm9wRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCB1c2VDdXN0b21GaWxlRHJvcEV2ZW50XHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBjdXN0b21GaWxlRHJvcEV2ZW50OiBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlTGlzdD4oKTtcclxuXHJcbiAgICAvLyBFbWl0cyBpZiB1c2VyIHdhbnRzIHRvIGFkZCBtdWx0aXBsZSBkb2N1bWVudHMgYXQgb25jZVxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnRzQWRkZWQ6IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50W10+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWxldGVkOiBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPENvRG9jdW1lbnQ+KCk7XHJcblxyXG4gICAgLy8gRW1pdHMgZXZlcnkgdGltZSB0aGUgb3JkZXIgb2YgZG9jdW1lbnRzIHdhcyBjaGFuZ2VkXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZWFkb25seSBzb3J0YWJsZUxpc3RDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudFtdPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGRvY3VtZW50Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxDb0RvY3VtZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29Eb2N1bWVudD4oKTtcclxuXHJcbiAgICAvLyBVc2UgdGhpcyBpZiBjb25zdW1lciByZXF1aXJlcyB0byBwZXJmb3JtIGV4dHJhIGFjdGlvbnMsIGxpa2UgbG9ja2luZyBhIHBhcmVudCBidXNpbmVzc09iamVjdCBpZiBpdCBjb250YWlucyB0aGUgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMuIEVtaXQgd2l0aCB0cnVlIHdoZW4gcG9wdXAgb3BlbmVkLCBmYWxzZSBmb3IgY2xvc2VcclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHBvcHVwT3BlbmVkU3RhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oaWRkZW5cIilcclxuICAgIHB1YmxpYyBoaWRkZW46IGJvb2xlYW47XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyb3BcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgcHVibGljIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZUN1c3RvbUZpbGVEcm9wRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlc1BpY2tlZChldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRmlsZURyb3BFdmVudC5lbWl0KGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jbGVhckRyb3B6b25lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdlbmRcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgcHVibGljIG9uRHJhZ0VuZChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YSgpO1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgcHVibGljIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcihcImRyYWdlbnRlclwiLCBbXCIkZXZlbnRcIl0pXHJcbiAgICBwdWJsaWMgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RyYWdFbnRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgICB0aGlzLl9zaG93RHJvcHpvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKFwiZHJhZ2xlYXZlXCIsIFtcIiRldmVudFwiXSlcclxuICAgIHB1YmxpYyBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZHJhZ0VudGVyVGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRvY3VtZW50VW5kZXJFZGl0OiBDb0RvY3VtZW50O1xyXG4gICAgcHVibGljIGFjY2VwdGVkVXBsb2FkRm9ybWF0czogc3RyaW5nO1xyXG5cclxuICAgIHByb3RlY3RlZCBfbWF4VXBsb2FkRmlsZVNpemU6IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIF9kcmFnRW50ZXJUYXJnZXQ6IEV2ZW50VGFyZ2V0O1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRLZXk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9kcm9wWm9uZTogQ29tcG9uZW50UmVmPEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIF9wb3B1cDogQ29tcG9uZW50UmVmPEZpbGVVcGxvYWRQb3B1cENvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIF9kb2NDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX3BvcHVwQ2xvc2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX2R1bW15VHJ1ZUZ1bmN0aW9uOiBPcGVyYXRpb25DYWxsYmFja1NpbXBsZUZ1bmN0aW9uID0gKG9iamVjdDogYW55KSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcblxyXG4gICAgICAgIC8vcHJvdGVjdGVkIF9wcm9tcHRTZXJ2aWNlOiBQcm9tcHRTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgICAgIC8vcHJvdGVjdGVkIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9jb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9mYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgLy9wcm90ZWN0ZWQgX2dlbmVyYWxEYWxSZXBvc2l0b3J5OiBHZW5lcmFsRGFsUmVwb3NpdG9yeSxcclxuICAgICAgICAvL3Byb3RlY3RlZCBfZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgICAgIC8vcHJvdGVjdGVkIF9iYXNlRGF0YURhbFJlcG9zaXRvcnk6IEJhc2VEYXRhRGFsUmVwb3NpdG9yeSxcclxuICAgICAgICAvL3Byb3RlY3RlZCBfY29Eb2N1bWVudERhdGFMb2FkZXI6IENvRG9jdW1lbnREYXRhTG9hZGVyU2VydmljZVxyXG4gICAgKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyRHJvcHpvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zaG93RHJvcHpvbmUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcm9wWm9uZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmYWN0OiBDb21wb25lbnRGYWN0b3J5PEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudD4gPSB0aGlzLl9mYWN0b3J5LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KEFwcEZpbGVEcm9wem9uZUNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3Bab25lID0gdGhpcy5fY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0KTtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcFpvbmUuaW5zdGFuY2UuY3VzdG9tRHJvcEFjdGlvbk1lc3NhZ2UgPSB0aGlzLmRyb3BNZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jbGVhckRyb3B6b25lKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wWm9uZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcm9wWm9uZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3Bab25lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgZmlsZSBmcm9tIHVwbG9hZCBhcnJheS5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVEZWxldGUoZmlsZTogQ29Eb2N1bWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5iZWZvcmVEZWxldGVPcGVyYXRpb24oZmlsZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlbGV0ZShmaWxlKTtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZnRlckRlbGV0ZU9wZXJhdGlvbihmaWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdWNjZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9kZWxldGUoZmlsZTogQ29Eb2N1bWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGxldCBkb0RlbGV0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRvbnRBc2tCZWZvcmVEZWxldGUpIHtcclxuICAgICAgICAgIC8vVE9ETyBtYWtlIGRpYWxvZ1NlcnZpY2VcclxuICAgICAgICAgICAgLy9kb0RlbGV0ZSA9IGF3YWl0IHRoaXMuX3Byb21wdFNlcnZpY2Uuc2hvd1llc05vKFwiTUVTU0FHRV9ERUxFVEVfUkVDT1JEX1FVRVNUSU9OXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG9EZWxldGUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm5vT3duRGVsZXRlT3BlcmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoZmlsZSwgdGhpcy5kb2N1bWVudHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnREZWxldGVkLmVtaXQoZmlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVTb3J0aW5nQ2hhbmdlKGRvY3M6IENvRG9jdW1lbnRbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc29ydGFibGVMaXN0Q2hhbmdlZC5lbWl0KGRvY3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5maWxlcyAmJiBldmVudC50YXJnZXQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBmaWxlIHNpemVzIGFuZCBleHRlbnNpb25cclxuICAgICAgICAgICAgLy9Ub2RvOiBmaXggdGhpc1xyXG4gICAgICAgICAgICAvL2NvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gYXdhaXQgdGhpcy5fYmFzZURhdGFEYWxSZXBvc2l0b3J5LmdldEFsbG93ZWRFeHRlbnNpb25zKCk7XHJcbiAgICAgICAgICAgIGxldCBhbGxGaWxlc0FyZVNtYWxsRW5vdWdoOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGFsbEZpbGVzSGF2ZUFsbG93ZWRFeHRlbnNpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZVRvQ29tcGFyZTogbnVtYmVyID0gdGhpcy5fbWF4VXBsb2FkRmlsZVNpemUgPyB0aGlzLl9tYXhVcGxvYWRGaWxlU2l6ZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBldmVudC50YXJnZXQuZmlsZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwbG9hZFNpemVBbGxvd2VkID0gRmlsZVV0aWxzLkNoZWNrTWF4VXBsb2FkU2l6ZShldmVudC50YXJnZXQuZmlsZXNbaV0sIHNpemVUb0NvbXBhcmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1cGxvYWRTaXplQWxsb3dlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbEZpbGVzQXJlU21hbGxFbm91Z2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbkFsbG93ZWQgPSB0cnVlLy9GaWxlVXRpbHMuQ2hlY2tFeHRlbnNpb24oZXZlbnQudGFyZ2V0LmZpbGVzW2ldLCBhbGxvd2VkRXh0ZW5zaW9ucyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbkFsbG93ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxGaWxlc0hhdmVBbGxvd2VkRXh0ZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWFsbEZpbGVzQXJlU21hbGxFbm91Z2gpIHtcclxuICAgICAgICAgICAgICAvL1RPRE8gbWFrZSBkaWFsb2dTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuX3Byb21wdFNlcnZpY2Uuc2hvd1dhcm5pbmcodGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiRklMRV9UT09fTEFSR0VfVE9fVVBMT0FEXCIsIHRydWUsIFwiXCIgKyBbRmlsZVV0aWxzLmdldE1heFVwbG9hZFNpemVJbk1iKHNpemVUb0NvbXBhcmUpXSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFhbGxGaWxlc0hhdmVBbGxvd2VkRXh0ZW5zaW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zdCBleHRlbnNpb25zTGlzdCA9IGFsbG93ZWRFeHRlbnNpb25zLm1hcChhbGxvd2VkRXh0ZW5zaW9uID0+IGFsbG93ZWRFeHRlbnNpb24uZXh0ZW5zaW9uKS5zb3J0KCkuam9pbihcIiwgXCIpO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLl9wcm9tcHRTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkZJTEVfSEFTX0RJU0FMTE9XRURfRVhURU5TSU9OXCIsIGZhbHNlLCBleHRlbnNpb25zTGlzdCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXNUb0FkZDogQ29Eb2N1bWVudFtdID0gYXdhaXQgdGhpcy5jb252ZXJ0RmlsZXNJbnRvQ29Eb2N1bWVudHMoZXZlbnQudGFyZ2V0LmZpbGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNUb0FkZC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHNBZGRlZC5lbWl0KGZpbGVzVG9BZGQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VXaXRob3V0U2V0dGluZ1Byb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzQWRkZWQubmV4dChmaWxlc1RvQWRkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0ID0gZmlsZXNUb0FkZFswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUVkaXREb2N1bWVudENsaWNrKGRvY1RvRWRpdDogQ29Eb2N1bWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQgPSBkb2NUb0VkaXQ7XHJcbiAgICAgICAgY29uc3Qgc2hvd1BvcHVwOiBib29sZWFuID0gYXdhaXQgdGhpcy5iZWZvcmVFZGl0T3BlcmF0aW9uKGRvY1RvRWRpdCk7XHJcbiAgICAgICAgaWYgKHNob3dQb3B1cCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5Qb3B1cCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlblBvcHVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUFuZEZpbGxQb3B1cEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RvY0NoYW5nZVN1YiA9IHRoaXMuX3BvcHVwLmluc3RhbmNlLmRvY3VtZW50Q2hhbmdlRXZlbnQuc3Vic2NyaWJlKChkb2M6IENvRG9jdW1lbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENoYW5nZUV2ZW50LmVtaXQoZG9jKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlblBvcHVwVG9BZGREb2N1bWVudEJ5VXJsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZURvY3VtZW50VG9BZGRCeVVybCgpO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUFuZEZpbGxQb3B1cEluc3RhbmNlKHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl9kb2NDaGFuZ2VTdWIgPSB0aGlzLl9wb3B1cC5pbnN0YW5jZS5kb2N1bWVudENoYW5nZUV2ZW50LnN1YnNjcmliZSgoZG9jOiBDb0RvY3VtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGRvYy5maWxlTmFtZSA9IGRvYy5maWxlUGF0aDtcclxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENoYW5nZUV2ZW50LmVtaXQoZG9jKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVEb2N1bWVudFRvQWRkQnlVcmwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdCA9IG5ldyBDb0RvY3VtZW50KCk7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC50YWJsZSA9IHRoaXMuZG9jdW1lbnRUYWJsZTtcclxuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LmtleSA9IHRoaXMuZG9jdW1lbnRLZXk7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5maWxlVHlwZSA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5kb2N1bWVudFR5cGUgPSBDb0RvY3VtZW50VHlwZS5TYXZlQXNMaW5rT25SYW5kb21Mb2NhdGlvbjtcclxuICAgICAgICB0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnBhdGhJc1VybCA9IHRydWU7XHJcbiAgICAgICAgLy9UT0RPIEZpeCB1c2VyIElucHV0XHJcbiAgICAgICAgLy90aGlzLmRvY3VtZW50VW5kZXJFZGl0LmNyZWF0aW9uVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXJOYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgLy90aGlzLmRvY3VtZW50VW5kZXJFZGl0Lm1vZGlmaWVkVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXJOYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5jcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQubW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVBbmRGaWxsUG9wdXBJbnN0YW5jZShhZGREb2N1bWVudEJ5VXJsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBvcHVwT3BlbmVkU3RhdGVDaGFuZ2UuZW1pdCh0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxGaWxlVXBsb2FkUG9wdXBDb21wb25lbnQ+ID0gdGhpcy5fZmFjdG9yeS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShGaWxlVXBsb2FkUG9wdXBDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3B1cCA9IHRoaXMuX2NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnJlYWRvbmx5ID0gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuYWRkRG9jdW1lbnRCeVVybCA9IGFkZERvY3VtZW50QnlVcmw7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuaGFzUHVibGljQWNjZXNzVmlzaWJsZSA9IHRoaXMuZG9jdW1lbnRUYWJsZSA9PT0gVGFibGVOYW1lLkdvb2RzO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLnNob3dEb2N1bWVudFJlcG9ydFBpY2tlciA9ICh0aGlzLmRvY3VtZW50VGFibGUgPT09IFRhYmxlTmFtZS5UcmFuc2FjdGlvbnMgfHwgdGhpcy5kb2N1bWVudFRhYmxlID09PSBUYWJsZU5hbWUuVHJhbnNhY3Rpb25MaW5lcyk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuZG9jdW1lbnRVbmRlckVkaXQgPSB0aGlzLmRvY3VtZW50VW5kZXJFZGl0O1xyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLmZpbGVzVXBsb2FkQ29uZmlnT2JqZWN0cyA9IHRoaXMuZmlsZXNVcGxvYWRDb25maWdPYmplY3RzO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwLmluc3RhbmNlLm1lZGljYWxVc2VyR3JvdXBzID0gdGhpcy5tZWRpY2FsVXNlckdyb3VwcztcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS50YWdDYXRlZ29yeSA9IHRoaXMudGFnQ2F0ZWdvcnk7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UuZGlzcGxheVJlYWRXcml0ZUFjY2VzcyA9IHRoaXMuZGlzcGxheVJlYWRXcml0ZUFjY2VzcztcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS50YWdSZWZlcmVuY2VUYWJsZSA9IHRoaXMudGFnUmVmZXJlbmNlVGFibGU7XHJcbiAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UucHVibGljYXRpb25JZHMgPSBSZWZDb2RlVXRpbHMuR2V0TXVsdGlSZWZDb2RlQ2hvaWNlcyh0aGlzLmRvY3VtZW50VW5kZXJFZGl0LnB1YmxpY2F0aW9uKTtcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5zdG9yZUdyb3VwSWRzID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yZXRhaWxGb3JtdWxhcztcclxuICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS5maWxlVHlwZSA9IHRoaXMuZmlsZVR5cGU7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVGaWxlUmlnaHRzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcHVwQ2xvc2VTdWIgPSB0aGlzLl9wb3B1cC5pbnN0YW5jZS5wb3B1cENsb3NlRXZlbnQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fdW5sb2NrRG9jdW1lbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5wb3B1cE9wZW5lZFN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cENsb3NlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY0NoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBjb252ZXJ0RmlsZXNJbnRvQ29Eb2N1bWVudHMoZmlsZXM6IEZpbGVMaXN0KTogUHJvbWlzZTxDb0RvY3VtZW50W10+IHtcclxuICAgICAgICBjb25zdCBhbW91bnRPZkZpbGVzOiBudW1iZXIgPSBmaWxlcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgZmlsZXNUb0FkZDogQ29Eb2N1bWVudFtdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhbW91bnRPZkZpbGVzOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZUFzRG9jdW1lbnQ6IENvRG9jdW1lbnQgPSBhd2FpdCB0aGlzLl9nZXRGaWxlQXNEb2N1bWVudChmaWxlc1tpXSk7XHJcbiAgICAgICAgICAgIGZpbGVBc0RvY3VtZW50LmluZGV4ID0gQ29Eb2N1bWVudFNoYXJlZEZpZWxkTG9naWMuR2VuZXJhdGVBdmFpbGFibGVJbmRleE5yKHRoaXMuZG9jdW1lbnRzIHx8IFtdKSArIGk7XHJcbiAgICAgICAgICAgIGZpbGVzVG9BZGQucHVzaChmaWxlQXNEb2N1bWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaWxlc1RvQWRkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBmaWxlc1BpY2tlZChmaWxlczogRmlsZUxpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxldCBhbGxGaWxlc0FyZVZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZGaWxlczogbnVtYmVyID0gZmlsZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYW1vdW50T2ZGaWxlczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIUZpbGVVdGlscy5DaGVja01heFVwbG9hZFNpemUoZmlsZXNbaV0sIHRoaXMuX21heFVwbG9hZEZpbGVTaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbEZpbGVzQXJlVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFhbGxGaWxlc0FyZVZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgLy9UT0RPIG1ha2UgZGlhbG9nU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLy90aGlzLl9wcm9tcHRTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkZJTEVfVE9PX0xBUkdFX1RPX1VQTE9BRFwiLCB0cnVlLCBcIlwiICsgRmlsZVV0aWxzLmdldE1heFVwbG9hZFNpemVJbk1iKHRoaXMuX21heFVwbG9hZEZpbGVTaXplKS50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlc1RvQWRkOiBDb0RvY3VtZW50W10gPSBhd2FpdCB0aGlzLmNvbnZlcnRGaWxlc0ludG9Db0RvY3VtZW50cyhmaWxlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGVzVG9BZGQubGVuZ3RoID4gMSB8fCB0aGlzLnVzZVdpdGhvdXRTZXR0aW5nUHJvcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50c0FkZGVkLmVtaXQoZmlsZXNUb0FkZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRVbmRlckVkaXQgPSBmaWxlc1RvQWRkWzBdOyAvLyBTZXR0aW5nIGRvY1VuZGVyRWRpdCBvcGVucyB0aGUgcG9wdXAgd2luZG93XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuUG9wdXAoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQWNjZXB0ZWRGaWxlVHlwZXNMb2FkZWQodmFsdWU6IEZpbGVUeXBlKTogdm9pZCB7XHJcbiAgICAgICAgLy9UT0RPIGZpeCBsb2FkaW5nXHJcbiAgICAgICAgLy90aGlzLmFjY2VwdGVkVXBsb2FkRm9ybWF0cyA9IHRoaXMuX2NvRG9jdW1lbnREYXRhTG9hZGVyLmdldEFsbG93ZWRFeHRlbnNpb25zRm9yVHlwZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RmlsZUFzRG9jdW1lbnQoZmlsZTogRmlsZSk6IFByb21pc2U8Q29Eb2N1bWVudD4ge1xyXG4gICAgICAgIGNvbnN0IGZpbGVBc0NvRG9jdW1lbnQ6IENvRG9jdW1lbnQgPSBhd2FpdCBGaWxlVXRpbHMuUmVhZEZpbGVBc05ld0NvRG9jdW1lbnQoZmlsZSwgdGhpcy5yZXNpemVJbWFnZXMpO1xyXG4gICAgICAgIC8vIHNldCBzb21lIGV4dHJhIGtub3duIGZpZWxkcyBmb3IgdGhlIGNvZG9jdW1lbnQ6XHJcbiAgICAgICAgZmlsZUFzQ29Eb2N1bWVudC50YWJsZSA9IHRoaXMuZG9jdW1lbnRUYWJsZTtcclxuICAgICAgICBmaWxlQXNDb0RvY3VtZW50LmtleSA9IHRoaXMuZG9jdW1lbnRLZXk7XHJcbiAgICAgICAgLy9UT0RPIGZpeCBhZGQgdXNlcnNcclxuICAgICAgICAvL2ZpbGVBc0NvRG9jdW1lbnQuY3JlYXRpb25Vc2VyID0gdGhpcy5fdXNlclNlcnZpY2UudXNlck5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAvL2ZpbGVBc0NvRG9jdW1lbnQubW9kaWZpZWRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UudXNlck5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBmaWxlQXNDb0RvY3VtZW50LmNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgZmlsZUFzQ29Eb2N1bWVudC5tb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGZpbGVBc0NvRG9jdW1lbnQuZmlsZVR5cGUgPSB0aGlzLmZpbGVUeXBlID8gdGhpcy5maWxlVHlwZSA6IEZpbGVVdGlscy5Jc0ltYWdlRmlsZShmaWxlKSA/IEZpbGVUeXBlLkltYWdlIDogRmlsZVR5cGUuRG9jdW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChmaWxlQXNDb0RvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWxlQXNDb0RvY3VtZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9zZXRJbnRlcm5hbFBhcmFtT2JqKHZhbHVlOiBJbnRlcm5hbFBhcmFtKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy9UT0RPIGZpeCBwYXJhbXNcclxuICAgICAgICAvL2NvbnN0IHBhcmFtOiBJbnRlcm5hbFBhcmFtZXRlck9iamVjdCA9IGF3YWl0IHRoaXMuX2dlbmVyYWxEYWxSZXBvc2l0b3J5LmdldEludGVybmFsUGFyYW1PYmplY3QodmFsdWUpO1xyXG4gICAgICAgIC8vdGhpcy5fbWF4VXBsb2FkRmlsZVNpemUgPSBpc05hTihwYXJzZUludChwYXJhbS52YWx1ZSwgMCkpID8gdW5kZWZpbmVkIDogcGFyc2VJbnQocGFyYW0udmFsdWUsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgX2xvY2tEb2N1bWVudCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRVbmRlckVkaXQuZG9jdW1lbnRJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTmV3IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYW4gSUQgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBoYXZlIHRvIGJlIGxvY2tlZFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbG9ja09rOiBib29sZWFuID0gYXdhaXQgdGhpcy5sb2NrT3BlcmF0aW9uKENvRG9jdW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBsb2NrT2s7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfdW5sb2NrRG9jdW1lbnQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgIGlmICghdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5kb2N1bWVudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIE5ldyBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGFuIElEIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgaGF2ZSB0byBiZSBsb2NrZWRcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdW5sb2NrT2s6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLnVubG9ja09wZXJhdGlvbihDb0RvY3VtZW50KTtcclxuICAgICAgcmV0dXJuIHVubG9ja09rO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVGaWxlUmlnaHRzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yaWdodHMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByaWdodDogQ29Eb2N1bWVudFJpZ2h0ID0gdGhpcy5kb2N1bWVudFVuZGVyRWRpdC5yaWdodHNbaV07XHJcbiAgICAgICAgICAgIGlmIChyaWdodC5yaWdodExldmVsID09PSBPYmplY3RSaWdodFR5cGUuUmVhZFdyaXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5pbnN0YW5jZS51c2VyR3JvdXBzRm9yV3JpdGUucHVzaChyaWdodC51c2VyR3JvdXBJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJpZ2h0LnJpZ2h0TGV2ZWwgPT09IE9iamVjdFJpZ2h0VHlwZS5SZWFkT25seSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuaW5zdGFuY2UudXNlckdyb3Vwc0ZvclJlYWQucHVzaChyaWdodC51c2VyR3JvdXBJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19