@pega/angular-sdk-components 23.1.10 → 24.1.10

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 (192) hide show
  1. package/esm2022/lib/_bridge/angular-pconnect.mjs +18 -6
  2. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +4 -4
  3. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +3 -1
  4. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +1 -1
  5. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +4 -4
  6. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +4 -4
  7. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +4 -4
  8. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +5 -5
  9. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +3 -3
  10. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +9 -6
  11. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +5 -5
  12. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +5 -5
  13. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +5 -5
  14. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +4 -4
  15. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +5 -5
  16. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +5 -5
  17. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +16 -9
  18. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +4 -4
  19. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +4 -4
  20. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +3 -3
  21. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +6 -6
  22. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +5 -7
  23. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +109 -45
  24. package/esm2022/lib/_components/field/currency/currency.component.mjs +34 -17
  25. package/esm2022/lib/_components/field/date/date.component.mjs +6 -6
  26. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +21 -42
  27. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +38 -10
  28. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +7 -12
  29. package/esm2022/lib/_components/field/email/email.component.mjs +5 -5
  30. package/esm2022/lib/_components/field/group/group.component.mjs +9 -6
  31. package/esm2022/lib/_components/field/integer/integer.component.mjs +5 -5
  32. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +3 -3
  33. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +307 -0
  34. package/esm2022/lib/_components/field/multiselect/utils.mjs +187 -0
  35. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +27 -8
  36. package/esm2022/lib/_components/field/phone/phone.component.mjs +5 -5
  37. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +7 -12
  38. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +6 -6
  39. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +7 -6
  40. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +5 -5
  41. package/esm2022/lib/_components/field/text/text.component.mjs +5 -5
  42. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +5 -7
  43. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +5 -5
  44. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +5 -5
  45. package/esm2022/lib/_components/field/time/time.component.mjs +8 -6
  46. package/esm2022/lib/_components/field/url/url.component.mjs +8 -6
  47. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +38 -26
  48. package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +18 -0
  49. package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +71 -0
  50. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +35 -39
  51. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +1 -1
  52. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +3 -3
  53. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +41 -13
  54. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +3 -3
  55. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +5 -6
  56. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +3 -3
  57. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +36 -40
  58. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +4 -4
  59. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +5 -6
  60. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +10 -13
  61. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +3 -3
  62. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +6 -6
  63. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +11 -7
  64. package/esm2022/lib/_components/infra/reference/reference.component.mjs +5 -5
  65. package/esm2022/lib/_components/infra/region/region.component.mjs +4 -4
  66. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +5 -5
  67. package/esm2022/lib/_components/infra/stages/stages.component.mjs +5 -5
  68. package/esm2022/lib/_components/infra/view/view.component.mjs +6 -6
  69. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +5 -5
  70. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +5 -5
  71. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +38 -9
  72. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +6 -12
  73. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +5 -5
  74. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +6 -8
  75. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +5 -5
  76. package/esm2022/lib/_components/template/details/details.component.mjs +5 -5
  77. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +5 -5
  78. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +5 -5
  79. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +5 -5
  80. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +5 -5
  81. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +5 -5
  82. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +5 -5
  83. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +5 -6
  84. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +4 -4
  85. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +9 -19
  86. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +10 -5
  87. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +4 -4
  88. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +5 -5
  89. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +4 -4
  90. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +1 -1
  91. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +35 -31
  92. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +1 -2
  93. package/esm2022/lib/_components/template/list-view/utils.mjs +1 -1
  94. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +5 -5
  95. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +4 -4
  96. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +4 -4
  97. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +4 -4
  98. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +4 -4
  99. package/esm2022/lib/_components/template/page/page.component.mjs +5 -5
  100. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +5 -5
  101. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +5 -6
  102. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +5 -7
  103. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +2 -2
  104. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +49 -28
  105. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +7 -9
  106. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +4 -4
  107. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +5 -5
  108. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +4 -4
  109. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +4 -4
  110. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +4 -4
  111. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +5 -5
  112. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +4 -4
  113. package/esm2022/lib/_components/template/utils.mjs +1 -1
  114. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +4 -4
  115. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +5 -5
  116. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +8 -6
  117. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +4 -4
  118. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +231 -424
  119. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +6 -7
  120. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +5 -9
  121. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +18 -22
  122. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +6 -6
  123. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +5 -5
  124. package/esm2022/lib/_components/widget/todo/todo.component.mjs +8 -7
  125. package/esm2022/lib/_components/widget/utility/utility.component.mjs +5 -5
  126. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +5 -5
  127. package/esm2022/lib/_helpers/case-utils.mjs +1 -1
  128. package/esm2022/lib/_helpers/currency-utils.mjs +1 -1
  129. package/esm2022/lib/_helpers/event-util.mjs +1 -1
  130. package/esm2022/lib/_helpers/field-group-utils.mjs +1 -1
  131. package/esm2022/lib/_helpers/filter-utils.mjs +1 -1
  132. package/esm2022/lib/_helpers/formatters/boolean.mjs +1 -1
  133. package/esm2022/lib/_helpers/formatters/currency.mjs +2 -2
  134. package/esm2022/lib/_helpers/formatters/date.mjs +1 -1
  135. package/esm2022/lib/_helpers/formatters/format-utils.mjs +3 -3
  136. package/esm2022/lib/_helpers/formatters/index.mjs +1 -1
  137. package/esm2022/lib/_helpers/instructions-utils.mjs +36 -0
  138. package/esm2022/lib/_helpers/tab-utils.mjs +1 -1
  139. package/esm2022/lib/_helpers/template-utils.mjs +4 -4
  140. package/esm2022/lib/_helpers/utils.mjs +6 -6
  141. package/esm2022/lib/_messages/error-messages.service.mjs +3 -3
  142. package/esm2022/lib/_messages/get-login-status.service.mjs +3 -3
  143. package/esm2022/lib/_messages/oauth-response.service.mjs +3 -3
  144. package/esm2022/lib/_messages/progress-spinner.service.mjs +3 -3
  145. package/esm2022/lib/_messages/reset-pconnect.service.mjs +3 -3
  146. package/esm2022/lib/_messages/update-worklist.service.mjs +3 -3
  147. package/esm2022/lib/_services/case.service.mjs +4 -4
  148. package/esm2022/lib/_services/datapage.service.mjs +5 -5
  149. package/esm2022/lib/_services/server-config.service.mjs +3 -3
  150. package/esm2022/public-api.mjs +3 -1
  151. package/fesm2022/pega-angular-sdk-components.mjs +1996 -1429
  152. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  153. package/lib/_bridge/angular-pconnect.d.ts +2 -0
  154. package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +2 -0
  155. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +2 -0
  156. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -1
  157. package/lib/_components/field/check-box/check-box.component.d.ts +18 -0
  158. package/lib/_components/field/currency/currency.component.d.ts +7 -5
  159. package/lib/_components/field/date-time/date-time.component.d.ts +1 -1
  160. package/lib/_components/field/decimal/decimal.component.d.ts +9 -1
  161. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -1
  162. package/lib/_components/field/multiselect/multiselect.component.d.ts +64 -0
  163. package/lib/_components/field/multiselect/utils.d.ts +8 -0
  164. package/lib/_components/field/percentage/percentage.component.d.ts +6 -0
  165. package/lib/_components/field/time/time.component.d.ts +1 -0
  166. package/lib/_components/field/url/url.component.d.ts +1 -0
  167. package/lib/_components/field/user-reference/user-reference.component.d.ts +9 -4
  168. package/lib/_components/infra/Containers/base-components/flow-container-base.component.d.ts +8 -0
  169. package/lib/_components/infra/Containers/base-components/helper.d.ts +1 -0
  170. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +6 -7
  171. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +3 -2
  172. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
  173. package/lib/_components/infra/assignment/assignment.component.d.ts +2 -2
  174. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
  175. package/lib/_components/infra/navbar/navbar.component.d.ts +2 -0
  176. package/lib/_components/template/case-summary/case-summary.component.d.ts +2 -0
  177. package/lib/_components/template/field-value-list/field-value-list.component.d.ts +2 -1
  178. package/lib/_components/template/list-view/list-view.component.d.ts +8 -4
  179. package/lib/_components/template/simple-table-manual/helpers.d.ts +1 -1
  180. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +2 -0
  181. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +2 -0
  182. package/lib/_components/widget/attachment/attachment.component.d.ts +30 -54
  183. package/lib/_components/widget/file-utility/file-utility.component.d.ts +3 -3
  184. package/lib/_components/widget/todo/todo.component.d.ts +4 -3
  185. package/lib/_helpers/common.d.ts +1 -1
  186. package/lib/_helpers/field-group-utils.d.ts +1 -1
  187. package/lib/_helpers/filter-utils.d.ts +1 -1
  188. package/lib/_helpers/formatters/common.d.ts +2 -2
  189. package/lib/_helpers/instructions-utils.d.ts +4 -0
  190. package/lib/doc/KeyReleaseUpdates.md +18 -1
  191. package/package.json +3 -3
  192. package/public-api.d.ts +2 -0
@@ -1,6 +1,8 @@
1
- import { Component, Input, forwardRef } from '@angular/core';
1
+ import { Component, Input, forwardRef, ViewChild } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { MatButtonModule } from '@angular/material/button';
4
+ import { MatMenuModule } from '@angular/material/menu';
5
+ import { MatIconModule } from '@angular/material/icon';
4
6
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
5
7
  import download from 'downloadjs';
6
8
  import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
@@ -9,7 +11,9 @@ import * as i1 from "../../../_bridge/angular-pconnect";
9
11
  import * as i2 from "../../../_helpers/utils";
10
12
  import * as i3 from "@angular/common";
11
13
  import * as i4 from "@angular/material/progress-spinner";
12
- import * as i5 from "@angular/material/button";
14
+ import * as i5 from "@angular/material/menu";
15
+ import * as i6 from "@angular/material/icon";
16
+ import * as i7 from "@angular/material/button";
13
17
  export class AttachmentComponent {
14
18
  constructor(angularPConnect, utils, ngZone) {
15
19
  this.angularPConnect = angularPConnect;
@@ -23,95 +27,23 @@ export class AttachmentComponent {
23
27
  this.bDisabled$ = false;
24
28
  this.bVisible$ = true;
25
29
  this.bLoading$ = false;
26
- this.arFiles$ = [];
27
- this.arFileList$ = [];
28
- this.arMenuList$ = [];
29
30
  this.bShowSelector$ = true;
30
- this.bShowJustDelete$ = false;
31
31
  this.fileTemp = {};
32
32
  this.allowMultiple$ = false;
33
33
  this.extensions$ = '';
34
34
  this.status = '';
35
35
  this.validateMessage = '';
36
+ this.localizedVal = PCore.getLocaleUtils().getLocaleValue;
37
+ this.localeCategory = 'CosmosFields';
38
+ this.uploadMultipleFilesLabel = this.localizedVal('file_upload_text_multiple', this.localeCategory);
39
+ this.uploadSingleFileLabel = this.localizedVal('file_upload_text_one', this.localeCategory);
40
+ this.filesWithError = [];
41
+ this.files = [];
36
42
  this.fileDownload = (data, fileName, ext) => {
37
43
  const file = ext ? `${fileName}.${ext}` : fileName;
38
44
  download(atob(data), file);
39
45
  };
40
46
  this.getAttachmentKey = (name = '') => (name ? `attachmentsList.${name}` : 'attachmentsList');
41
- this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
42
- let actions;
43
- let isDownloadable = false;
44
- if (att.progress && att.progress !== 100) {
45
- actions = [
46
- {
47
- id: `Cancel-${att.ID}`,
48
- text: this.pConn$.getLocalizedValue('Cancel', '', ''),
49
- icon: 'times',
50
- onClick: cancelFile
51
- }
52
- ];
53
- }
54
- else if (att.links) {
55
- const isFile = att.type === 'FILE';
56
- const ID = att.ID.replace(/\s/gi, '');
57
- const actionsMap = new Map([
58
- [
59
- 'download',
60
- {
61
- id: `download-${ID}`,
62
- text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
63
- icon: isFile ? 'download' : 'open',
64
- onClick: downloadFile
65
- }
66
- ],
67
- [
68
- 'delete',
69
- {
70
- id: `Delete-${ID}`,
71
- text: this.pConn$.getLocalizedValue('Delete', '', ''),
72
- icon: 'trash',
73
- onClick: deleteFile
74
- }
75
- ]
76
- ]);
77
- actions = [];
78
- actionsMap.forEach((action, actionKey) => {
79
- if (att.links[actionKey]) {
80
- actions.push(action);
81
- }
82
- });
83
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
84
- isDownloadable = att.links.download;
85
- }
86
- else if (att.error) {
87
- actions = [
88
- {
89
- id: `Remove-${att.ID}`,
90
- text: this.pConn$.getLocalizedValue('Remove', '', ''),
91
- icon: 'trash',
92
- onClick: removeFile
93
- }
94
- ];
95
- }
96
- return {
97
- id: att.ID,
98
- visual: {
99
- icon: this.utils.getIconForAttachment(att),
100
- progress: att.progress == 100 ? undefined : att.progress
101
- },
102
- primary: {
103
- type: att.type,
104
- name: att.error ? att.fileName : att.name,
105
- icon: 'trash',
106
- click: removeFile
107
- },
108
- secondary: {
109
- text: att.meta,
110
- error: att.error
111
- },
112
- actions
113
- };
114
- };
115
47
  this.validateFileExtension = (fileObj, allowedExtensions) => {
116
48
  if (!allowedExtensions) {
117
49
  return true;
@@ -127,10 +59,31 @@ export class AttachmentComponent {
127
59
  ngOnInit() {
128
60
  // // First thing in initialization is registering and subscribing to the AngularPConnect service
129
61
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
130
- this.removeFileFromList$ = { onClick: this._removeFileFromList.bind(this) };
131
62
  this.caseID = PCore.getStoreValue('.pyID', 'caseInfo.content', this.pConn$.getContextName());
132
- // let configProps: any = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
63
+ this.srcImg = this.utils.getImageSrc('document-doc', this.utils.getSDKStaticContentUrl());
64
+ this.deleteIcon = this.utils.getImageSrc('trash', this.utils.getSDKStaticContentUrl());
133
65
  this.checkAndUpdate();
66
+ this.getAttachments();
67
+ }
68
+ getAttachments() {
69
+ let tempUploadedFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
70
+ tempUploadedFiles = tempUploadedFiles.filter(f => f.label === this.valueRef && f.delete !== true);
71
+ this.files?.map(f => {
72
+ return f.responseProps?.pzInsKey && !f.responseProps.pzInsKey.includes('temp')
73
+ ? {
74
+ ...f,
75
+ props: {
76
+ ...f.props,
77
+ onDelete: () => this.deleteFile(f)
78
+ }
79
+ }
80
+ : { ...f };
81
+ });
82
+ this.files = [...this.files, ...tempUploadedFiles];
83
+ PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
84
+ return () => {
85
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
86
+ };
134
87
  }
135
88
  checkAndUpdate() {
136
89
  // Should always check the bridge to see if the component should
@@ -141,64 +94,14 @@ export class AttachmentComponent {
141
94
  this.updateSelf();
142
95
  }
143
96
  }
144
- ngOnDestroy() {
145
- if (this.angularPConnectData.unsubscribeFn) {
146
- this.angularPConnectData.unsubscribeFn();
147
- }
148
- PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
149
- }
150
97
  // Callback passed when subscribing to store change
151
98
  onStateChange() {
152
99
  this.checkAndUpdate();
153
100
  }
154
- updateAttachmentsInfo() {
155
- // @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
156
- if (!this.pConn$.attachmentsInfo) {
157
- // @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
158
- this.pConn$.attachmentsInfo = {
159
- type: 'File',
160
- attachmentFieldName: this.att_valueRef,
161
- category: this.att_categoryName
162
- };
163
- }
164
- }
165
- processFile(file, i) {
166
- file.props.type = file.responseProps.pyMimeFileExtension;
167
- file.props.mimeType = file.responseProps.pyMimeFileExtension;
168
- file.props.ID = file.responseProps.pzInsKey;
169
- const arMenuList = [
170
- {
171
- icon: 'download',
172
- text: this.pConn$.getLocalizedValue('Download', '', ''),
173
- onClick: () => this._downloadFileFromList(this.value$.pxResults[i])
174
- },
175
- {
176
- icon: 'trash',
177
- text: this.pConn$.getLocalizedValue('Delete', '', ''),
178
- onClick: () => this._removeFileFromList(this.arFileList$[i])
179
- }
180
- ];
181
- const arFilesAttachmentIDs = [];
182
- this.arFileList$.forEach(arFile => {
183
- arFilesAttachmentIDs.push(arFile.id);
184
- });
185
- if (!arFilesAttachmentIDs.includes(file.props.ID)) {
186
- this.arFileList$.push(this.getNewListUtilityItemProps({
187
- att: file.props,
188
- downloadFile: null,
189
- cancelFile: null,
190
- deleteFile: null,
191
- removeFile: null
192
- }));
193
- }
194
- this.arFileList$[i].actions = arMenuList;
195
- this.arFileList$[i].noDeleteIcon = true;
196
- this.bShowSelector$ = false;
197
- }
198
101
  updateSelf() {
199
102
  const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
200
103
  const stateProps = this.pConn$.getStateProps();
201
- const { value, label, extensions } = configProps;
104
+ const { value, label, extensions, displayMode } = configProps;
202
105
  if (configProps.required != null) {
203
106
  this.bRequired$ = this.utils.getBooleanValue(configProps.required);
204
107
  }
@@ -215,7 +118,6 @@ export class AttachmentComponent {
215
118
  if (configProps.allowMultiple != null) {
216
119
  this.allowMultiple$ = this.utils.getBooleanValue(configProps.allowMultiple);
217
120
  }
218
- this.bShowJustDelete$ = true;
219
121
  this.label$ = label;
220
122
  this.value$ = value;
221
123
  this.status = stateProps.status;
@@ -223,83 +125,47 @@ export class AttachmentComponent {
223
125
  this.extensions$ = extensions;
224
126
  this.valueRef = this.pConn$.getStateProps().value;
225
127
  this.valueRef = this.valueRef.startsWith('.') ? this.valueRef.substring(1) : this.valueRef;
128
+ this.displayMode = displayMode;
226
129
  /* this is a temporary fix because required is supposed to be passed as a boolean and NOT as a string */
227
130
  let { required, disabled } = configProps;
228
131
  [required, disabled] = [required, disabled].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
229
- this.att_categoryName = '';
132
+ this.categoryName = '';
230
133
  if (value && value.pyCategoryName) {
231
- this.att_categoryName = value.pyCategoryName;
134
+ this.categoryName = value.pyCategoryName;
135
+ }
136
+ if (value?.pxResults && +value.pyCount > 0) {
137
+ this.files = value.pxResults.map(f => this.buildFilePropsFromResponse(f));
232
138
  }
233
- this.att_valueRef = this.pConn$.getStateProps().value;
234
- this.att_valueRef = this.att_valueRef.indexOf('.') === 0 ? this.att_valueRef.substring(1) : this.att_valueRef;
235
139
  this.updateAttachments();
236
140
  }
237
- updateAttachments() {
238
- const attachmentsFromServer = this.value$ && this.value$.pxResults && +this.value$.pyCount > 0;
239
- if (attachmentsFromServer) {
240
- this.updateAttachmentsFromServer();
241
- }
242
- else {
243
- // Get the attachments from the Redux
244
- this.myFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
245
- if (this.myFiles?.length && this.arFiles$.length === 0) {
246
- this.arFileList$ = this.myFiles.map(att => {
247
- return this.getNewListUtilityItemProps({
248
- att,
249
- downloadFile: null,
250
- cancelFile: null,
251
- deleteFile: null,
252
- removeFile: null
253
- });
254
- });
141
+ buildFilePropsFromResponse(respObj) {
142
+ return {
143
+ props: {
144
+ meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
145
+ name: respObj.pyAttachName,
146
+ icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
147
+ },
148
+ responseProps: {
149
+ ...respObj
255
150
  }
256
- const myFilesAttachmentIDs = [];
257
- this.myFiles.forEach(myFile => {
258
- myFilesAttachmentIDs.push(myFile.ID);
259
- });
260
- this.arFiles$.forEach(arFile => {
261
- if (!myFilesAttachmentIDs.includes(arFile.ID)) {
262
- this.myFiles = [...this.myFiles, arFile];
263
- }
264
- });
265
- }
266
- this.bShowJustDelete$ = true;
267
- this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
268
- if (this.arFileList$.length > 0) {
269
- this.CheckForInvalidAttachment();
270
- }
271
- PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
151
+ };
272
152
  }
273
- updateAttachmentsFromServer() {
274
- this.value$.pxResults.forEach((attachment, i) => {
275
- const file = this.buildFilePropsFromResponse(attachment);
276
- if (file.responseProps) {
277
- this.updateAttachmentsInfo();
278
- if (file.responseProps.pzInsKey && !file.responseProps.pzInsKey.includes('temp')) {
279
- this.processFile(file, i);
280
- }
281
- if (file) {
282
- const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
283
- const index = currentAttachmentList.findIndex(element => element.props.ID === file.props.ID);
284
- let tempFiles = [];
285
- if (index < 0) {
286
- tempFiles = [file];
287
- }
288
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...tempFiles], {
289
- pageReference: 'context_data',
290
- isArrayDeepMerge: false
291
- });
292
- }
293
- }
294
- });
153
+ updateAttachments() {
154
+ if (this.files.length > 0 && this.displayMode !== 'DISPLAY_ONLY') {
155
+ const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
156
+ // block duplicate files to redux store when added 1 after another to prevent multiple duplicates being added to the case on submit
157
+ const tempFiles = this.files.filter(f => currentAttachmentList.findIndex(fr => fr.ID === f.ID) === -1 && !f.inProgress && f.responseProps);
158
+ const updatedAttList = [...currentAttachmentList, ...tempFiles];
159
+ this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), updatedAttList);
160
+ }
295
161
  }
296
162
  resetAttachmentStoredState() {
297
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), undefined, {
163
+ PCore.getStateUtils().updateState(this.pConn$?.getContextName(), this.getAttachmentKey(this.valueRef), undefined, {
298
164
  pageReference: 'context_data',
299
165
  isArrayDeepMerge: false
300
166
  });
301
167
  }
302
- _downloadFileFromList(fileObj) {
168
+ downloadFile(fileObj) {
303
169
  PCore.getAttachmentUtils()
304
170
  // @ts-ignore - 3rd parameter "responseEncoding" should be optional
305
171
  .downloadAttachment(fileObj.pzInsKey, this.pConn$.getContextName())
@@ -311,278 +177,219 @@ export class AttachmentComponent {
311
177
  console.log(e);
312
178
  });
313
179
  }
314
- CheckForInvalidAttachment() {
315
- let isValid = true;
316
- this.arFileList$.forEach(file => {
317
- if (file.secondary.error) {
318
- isValid = false;
319
- }
180
+ getCurrentAttachmentsList(key, context) {
181
+ return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
182
+ }
183
+ validateMaxSize(fileObj, maxSizeInMB) {
184
+ const fileSize = (fileObj.size / 1048576).toFixed(2);
185
+ return parseFloat(fileSize) < parseFloat(maxSizeInMB);
186
+ }
187
+ updateAttachmentState(pConn, key, attachments) {
188
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), key, attachments, {
189
+ pageReference: 'context_data',
190
+ isArrayDeepMerge: false
320
191
  });
321
- if (isValid) {
322
- // @ts-ignore
323
- PCore.getMessageManager().clearMessages({
324
- type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
325
- property: this.pConn$.getStateProps().value,
326
- pageReference: this.pConn$.getPageReference(),
327
- context: this.pConn$.getContextName()
328
- });
329
- }
330
192
  }
331
- _removeFileFromList(item) {
332
- const fileListIndex = this.arFileList$.findIndex(element => element?.id === item?.id);
333
- const fileIndex = this.arFiles$.findIndex(element => element?.ID === item?.id);
193
+ deleteFile(file) {
334
194
  const attachmentsList = [];
335
- let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
336
- if (this.value$ && this.value$.pxResults && +this.value$.pyCount > 0 && item.actions) {
337
- const updatedAttachments = currentAttachmentList.map(attachment => {
338
- if (attachment?.ID === this.arFileList$[fileListIndex].id || attachment?.props?.ID === this.arFileList$[fileListIndex].id) {
339
- return { ...attachment, delete: true, label: this.valueRef };
195
+ let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
196
+ // If file to be deleted is the one added in previous stage i.e. for which a file instance is created in server
197
+ // no need to filter currentAttachmentList as we will get another entry of file in redux with delete & label
198
+ // eslint-disable-next-line no-unsafe-optional-chaining
199
+ if (this.value$ && this.value$?.pxResults && +this.value$?.pyCount > 0 && file.responseProps && file?.responseProps?.pzInsKey !== 'temp') {
200
+ const updatedAttachments = this.files.map(f => {
201
+ if (f.responseProps && f.responseProps.pzInsKey === file.responseProps.pzInsKey) {
202
+ return { ...f, delete: true, label: this.valueRef };
340
203
  }
341
- return attachment;
204
+ return f;
342
205
  });
343
206
  // updating the redux store to help form-handler in passing the data to delete the file from server
344
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), updatedAttachments, {
345
- pageReference: 'context_data',
346
- isArrayDeepMerge: false
347
- });
348
- }
207
+ this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...updatedAttachments]);
208
+ const newlyAddedFiles = this.files.filter(f => !!f.ID);
209
+ const filesPostDelete = this.files.filter(f => f.responseProps?.pzInsKey !== 'temp' && f.responseProps?.pzInsKey !== file.responseProps?.pzInsKey);
210
+ this.files = [...filesPostDelete, ...newlyAddedFiles];
211
+ } // if the file being deleted is the added in this stage i.e. whose data is not yet created in server
349
212
  else {
350
- currentAttachmentList = currentAttachmentList.filter(f => f.ID !== item.id);
351
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...attachmentsList], {
352
- pageReference: 'context_data',
353
- isArrayDeepMerge: false
354
- });
213
+ // filter newly added files in this stage, later the updated current stage files will be added to redux once files state is updated
214
+ currentAttachmentList = currentAttachmentList.filter(f => f.ID !== file.ID);
215
+ this.files = this.files.filter(f => f.ID !== file.ID);
216
+ this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...currentAttachmentList, ...attachmentsList]);
217
+ if (file.inProgress) {
218
+ // @ts-ignore - 3rd parameter "responseEncoding" should be optional
219
+ PCore.getAttachmentUtils().cancelRequest(file.ID, pConn.getContextName());
220
+ }
221
+ }
222
+ this.filesWithError = this.filesWithError?.filter(f => f.ID !== file.ID);
223
+ if (this.filesWithError.length === 0) {
224
+ this.clearFieldErrorMessages();
225
+ }
226
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
227
+ this.fileInput && this.fileInput.nativeElement.value ? null : '';
228
+ }
229
+ onFileAdded(event) {
230
+ let addedFiles = Array.from(event.target.files);
231
+ addedFiles = this.allowMultiple$ ? addedFiles : [addedFiles[0]];
232
+ const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || '5';
233
+ this.tempFilesToBeUploaded = [
234
+ ...addedFiles.map((f, index) => {
235
+ f.ID = `${new Date().getTime()}I${index}`;
236
+ f.inProgress = true;
237
+ f.props = {
238
+ type: f.type,
239
+ name: f.name,
240
+ icon: this.utils.getIconFromFileType(f.type),
241
+ onDelete: () => this.deleteFile(f)
242
+ };
243
+ if (!this.validateMaxSize(f, maxAttachmentSize)) {
244
+ f.props.error = true;
245
+ f.inProgress = false;
246
+ f.props.meta = this.pConn$.getLocalizedValue(`File is too big. Max allowed size is ${maxAttachmentSize}MB.`, '', '');
247
+ }
248
+ else if (!this.validateFileExtension(f, this.extensions$)) {
249
+ f.props.error = true;
250
+ f.inProgress = false;
251
+ f.props.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
252
+ }
253
+ if (f.props.error) {
254
+ const fieldName = this.pConn$.getStateProps().value;
255
+ const context = this.pConn$.getContextName();
256
+ PCore.getMessageManager().addMessages({
257
+ messages: [
258
+ {
259
+ type: 'error',
260
+ // @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
261
+ message: pConn.getLocalizedValue('Error with one or more files', '', '')
262
+ }
263
+ ],
264
+ property: fieldName,
265
+ pageReference: this.pConn$.getPageReference(),
266
+ context
267
+ });
268
+ }
269
+ return f;
270
+ })
271
+ ];
272
+ const tempFilesWithError = this.tempFilesToBeUploaded.filter(f => f.props.error);
273
+ if (tempFilesWithError.length > 0) {
274
+ this.filesWithError = tempFilesWithError;
355
275
  }
356
- if (fileListIndex > -1) {
357
- this.arFileList$.splice(fileListIndex, 1);
276
+ if (!this.allowMultiple$) {
277
+ this.files = [...this.tempFilesToBeUploaded];
358
278
  }
359
- if (fileIndex > -1) {
360
- this.arFiles$.splice(fileIndex, 1);
279
+ else {
280
+ this.files = [...this.files, ...this.tempFilesToBeUploaded];
361
281
  }
362
- this.CheckForInvalidAttachment();
363
- this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
282
+ this.uploadFiles();
364
283
  }
365
- getCurrentAttachmentsList(key, context) {
366
- return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
284
+ clearFieldErrorMessages() {
285
+ const fieldName = this.pConn$.getStateProps().value;
286
+ const context = this.pConn$.getContextName();
287
+ PCore.getMessageManager().clearMessages({
288
+ type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
289
+ property: fieldName,
290
+ pageReference: this.pConn$.getPageReference(),
291
+ context
292
+ });
367
293
  }
368
- errorHandler(isFetchCanceled, file) {
294
+ onUploadProgress() { }
295
+ errorHandler(isFetchCanceled, attachedFile) {
369
296
  return error => {
370
297
  if (!isFetchCanceled(error)) {
371
298
  let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
372
299
  if (error.response && error.response.data && error.response.data.errorDetails) {
373
300
  uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
374
301
  }
375
- for (const myFile of this.myFiles) {
376
- if (myFile.ID === file.ID) {
377
- myFile.meta = uploadFailMsg;
378
- myFile.error = true;
379
- myFile.fileName = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
380
- }
381
- }
382
- this.bShowSelector$ = false;
383
- this.arFileList$ = this.myFiles.map(att => {
384
- if (att.id) {
385
- return att;
302
+ this.files.map(f => {
303
+ if (f.ID === attachedFile.ID) {
304
+ f.props.meta = uploadFailMsg;
305
+ f.props.error = true;
306
+ f.props.onDelete = () => this.deleteFile(f);
307
+ f.props.icon = this.utils.getIconFromFileType(f.type);
308
+ f.props.name = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
309
+ f.inProgress = false;
310
+ const fieldName = this.pConn$.getStateProps().value;
311
+ const context = this.pConn$.getContextName();
312
+ // set errors to property to block submit even on errors in file upload
313
+ PCore.getMessageManager().addMessages({
314
+ messages: [
315
+ {
316
+ type: 'error',
317
+ // @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
318
+ message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
319
+ }
320
+ ],
321
+ property: fieldName,
322
+ pageReference: this.pConn$.getPageReference(),
323
+ context
324
+ });
325
+ delete f.props.progress;
386
326
  }
387
- return this.getNewListUtilityItemProps({
388
- att,
389
- downloadFile: null,
390
- cancelFile: null,
391
- deleteFile: null,
392
- removeFile: null
393
- });
327
+ return f;
394
328
  });
395
- PCore.getMessageManager().addMessages({
396
- // @ts-ignore
397
- messages: [
398
- {
399
- type: 'error',
400
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
401
- }
402
- ],
403
- property: this.pConn$.getStateProps().value,
404
- pageReference: this.pConn$.getPageReference(),
405
- context: this.pConn$.getContextName()
406
- });
407
- this.bShowJustDelete$ = true;
408
- this.bLoading$ = false;
409
329
  }
410
330
  throw error;
411
331
  };
412
332
  }
413
- uploadMyFiles(event) {
414
- let arrAttachmentFiles = [];
415
- if (this.arFiles$.length) {
416
- arrAttachmentFiles = this.arFiles$;
417
- }
418
- else {
419
- arrAttachmentFiles = this.arFileList$;
420
- }
421
- this.arFiles$ = [...arrAttachmentFiles, ...this.getFiles(event.target.files)];
422
- // convert FileList to an array
423
- this.myFiles = Array.from(this.arFiles$);
424
- this.bLoading$ = true;
425
- const filesToBeUploaded = this.myFiles
333
+ uploadFiles() {
334
+ const filesToBeUploaded = this.files
426
335
  .filter(e => {
427
- if (e.id) {
428
- return false;
429
- }
430
- const isFileUploaded = e && e.progress === 100;
431
- const fileHasError = e && e.error;
336
+ const isFileUploaded = e.props && e.props.progress === 100;
337
+ const fileHasError = e.props && e.props.error;
432
338
  const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
433
339
  return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
434
340
  })
435
- .map(f => PCore.getAttachmentUtils().uploadAttachment(f, () => {
341
+ .map(f => window.PCore.getAttachmentUtils().uploadAttachment(f, () => {
436
342
  this.onUploadProgress();
437
343
  }, isFetchCanceled => {
438
344
  return this.errorHandler(isFetchCanceled, f);
439
345
  }, this.pConn$.getContextName()));
440
346
  Promise.allSettled(filesToBeUploaded)
441
347
  .then((fileResponses) => {
442
- this.handleFileUploadSuccess(fileResponses);
443
- })
444
- .catch(error => {
445
- console.log(error);
446
- this.handleFileUploadFailure();
447
- });
448
- }
449
- handleFileUploadSuccess(fileResponses) {
450
- const successFileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
451
- let reqObj;
452
- if (successFileResponses.length > 0) {
453
- const tempFilesUploaded = [...this.arFiles$.filter(file => !file.id)];
454
- let newAttachments = [];
455
- tempFilesUploaded.forEach(fileRes => {
456
- const index = successFileResponses.findIndex((fr) => fr.value.clientFileID === fileRes.ID);
457
- if (index >= 0) {
458
- reqObj = {
459
- type: 'File',
460
- label: this.att_valueRef,
461
- category: this.att_categoryName,
462
- handle: successFileResponses[index].value.ID,
463
- ID: fileRes.ID,
464
- name: fileRes.name
465
- };
466
- newAttachments = [...newAttachments, reqObj];
467
- }
468
- });
469
- const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName()).filter(f => f.label !== this.att_valueRef);
470
- PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...newAttachments], {
471
- pageReference: 'context_data',
472
- isArrayDeepMerge: false
473
- });
474
- this.arFiles$ = tempFilesUploaded;
475
- this.ngZone.run(() => {
476
- this.bShowSelector$ = this.allowMultiple$;
477
- this.arFiles$.forEach(file => {
478
- if (!file.error) {
479
- file.meta = this.pConn$.getLocalizedValue('File uploaded successfully', '', '');
348
+ fileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
349
+ if (fileResponses.length > 0) {
350
+ this.files.forEach(f => {
351
+ const index = fileResponses.findIndex((fr) => fr.value.clientFileID === f.ID);
352
+ if (index >= 0) {
353
+ f.props.meta = this.pConn$.getLocalizedValue('Uploaded successfully', '', '');
354
+ f.props.progress = 100;
355
+ f.inProgress = false;
356
+ f.handle = fileResponses[index].value.ID;
357
+ f.label = this.valueRef;
358
+ f.category = this.categoryName;
359
+ f.responseProps = {
360
+ pzInsKey: 'temp',
361
+ pyAttachName: f.props.name
362
+ };
480
363
  }
481
364
  });
482
- this.arFileList$ = this.myFiles.map(att => {
483
- if (att.id) {
484
- return att;
485
- }
486
- return this.getNewListUtilityItemProps({
487
- att,
488
- downloadFile: null,
489
- cancelFile: null,
490
- deleteFile: null,
491
- removeFile: null
492
- });
493
- });
494
- this.CheckForInvalidAttachment();
495
- this.bShowJustDelete$ = true;
496
- this.bLoading$ = false;
497
- });
498
- }
499
- }
500
- handleFileUploadFailure() {
501
- this.bShowJustDelete$ = true;
502
- this.bLoading$ = false;
503
- this.bShowSelector$ = this.allowMultiple$;
504
- this.myFiles.forEach(file => {
505
- if (file?.secondary?.error) {
506
- file.meta = 'File uploaded failed';
365
+ this.updateAttachments();
366
+ if (this.filesWithError?.length === 0) {
367
+ this.clearFieldErrorMessages();
368
+ }
507
369
  }
370
+ })
371
+ .catch(error => {
372
+ console.log(error);
508
373
  });
509
- this.arFileList$ = this.myFiles.map(att => {
510
- return this.getNewListUtilityItemProps({
511
- att,
512
- downloadFile: null,
513
- cancelFile: null,
514
- deleteFile: null,
515
- removeFile: null
516
- });
517
- });
518
- this.bShowJustDelete$ = true;
519
- this.bLoading$ = false;
520
374
  }
521
- onUploadProgress() { }
522
- getFiles(arFiles) {
523
- const files = this.allowMultiple$ ? arFiles : [arFiles[0]];
524
- return this.setNewFiles(files);
525
- }
526
- setNewFiles(arFiles) {
527
- let index = 0;
528
- const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || 5;
529
- for (const file of arFiles) {
530
- file.mimeType = file.type;
531
- file.icon = this.utils.getIconFromFileType(file.type);
532
- file.ID = `${new Date().getTime()}I${index}`;
533
- if (!this.validateMaxSize(file, maxAttachmentSize)) {
534
- file.error = true;
535
- file.meta = this.pConn$.getLocalizedValue('File is too big. Max allowed size is 5MB.', '', '');
536
- }
537
- else if (!this.validateFileExtension(file, this.extensions$)) {
538
- file.error = true;
539
- file.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
540
- }
541
- if (file.error) {
542
- const fieldName = this.pConn$.getStateProps().value;
543
- const context = this.pConn$.getContextName();
544
- PCore.getMessageManager().addMessages({
545
- // @ts-ignore
546
- messages: [
547
- {
548
- type: 'error',
549
- message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
550
- }
551
- ],
552
- property: fieldName,
553
- pageReference: this.pConn$.getPageReference(),
554
- context
555
- });
556
- }
557
- index++;
375
+ ngOnDestroy() {
376
+ if (this.angularPConnectData.unsubscribeFn) {
377
+ this.angularPConnectData.unsubscribeFn();
558
378
  }
559
- return [...arFiles];
560
- }
561
- validateMaxSize(fileObj, maxSizeInMB) {
562
- const fileSize = (fileObj.size / 1048576).toFixed(2);
563
- return parseFloat(fileSize) < parseFloat(maxSizeInMB);
564
- }
565
- buildFilePropsFromResponse(respObj) {
566
- return {
567
- props: {
568
- meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
569
- name: respObj.pyAttachName,
570
- icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
571
- },
572
- responseProps: {
573
- ...respObj
574
- }
575
- };
379
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
576
380
  }
577
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
578
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, ngImport: i0, template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{ allowMultiple$ ? 'Upload files' : 'Upload file' }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatProgressSpinnerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.MatProgressSpinner; }), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
382
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["uploader"], descendants: true }], ngImport: i0, template: "<div class=\"file-upload-container\" *ngIf=\"bVisible$\">\n <span class=\"attachment-label\" [ngClass]=\"{ 'file-label': bRequired$ }\">{{ label$ }}</span>\n <div *ngIf=\"(files.length === 0 && !allowMultiple$) || allowMultiple$\">\n <div\n style=\"margin-bottom: 10px\"\n id=\"attachment-container\"\n [ngClass]=\"validateMessage ? 'psdk-modal-file-selector-error' : 'psdk-modal-file-selector'\"\n >\n <div [hidden]=\"true\" id=\"attachment-ID\">\n {{ valueRef }}\n </div>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"valueRef\" [multiple]=\"allowMultiple$\" (change)=\"onFileAdded($event)\" />\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n <div *ngIf=\"files && files.length > 0\">\n <div *ngFor=\"let file of files\">\n <div class=\"psdk-attachment-card\">\n <div className=\"psdk-utility-card-icon\">\n <img *ngIf=\"!file.inProgress\" class=\"psdk-attachment-card-svg-icon\" src=\"{{ srcImg }}\" />\n <mat-spinner *ngIf=\"file.inProgress\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n </div>\n <div class=\"psdk-attachment-card-main\">\n <div class=\"psdk-attachment-card-main-primary-label\">{{ file.props.name }}</div>\n <div *ngIf=\"file.props.meta\" [ngStyle]=\"{ color: file.props.error ? 'red' : null }\">{{ file.props.meta }}</div>\n </div>\n <div class=\"psdk-attachment-action\">\n <button id=\"delete-attachment\" *ngIf=\"file.ID\" class=\"psdk-utility-button\" (click)=\"deleteFile(file)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ deleteIcon }}\" />\n </button>\n <div *ngIf=\"!file.ID\">\n <button id=\"setting-button\" mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"downloadFile(file.responseProps ? file.responseProps : {})\">Download</button>\n <button mat-menu-item (click)=\"deleteFile(file)\">Delete</button>\n </mat-menu>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);padding:.5rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);padding:.5rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}.psdk-attachment-card{display:flex;align-items:center;border:.0625rem solid rgb(207,207,207);border-radius:.25rem;padding:.25rem 0rem .25rem .25rem;min-height:3rem;margin-bottom:.5rem}.psdk-attachment-card-main-primary-label{font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:normal}.psdk-attachment-card-main{flex-grow:2;margin-left:5px}.psdk-attachment-action{flex-grow:1;text-align:right}.psdk-attachment-card-svg-icon{width:2.5rem}.psdk-utility-button{background:none;border:none;margin-right:.5rem;cursor:pointer}.psdk-utility-card-action-svg-icon{width:1.4rem;display:inline-block}.file-div{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.5rem;text-align:center;position:relative}.file-div-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.5rem;text-align:center;position:relative}.attachment-label{display:block;margin-bottom:10px}.file-label:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatProgressSpinnerModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatProgressSpinner), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i5.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i7.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i7.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
579
383
  }
580
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, decorators: [{
384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentComponent, decorators: [{
581
385
  type: Component,
582
- args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{ allowMultiple$ ? 'Upload files' : 'Upload file' }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"] }]
583
- }], ctorParameters: function () { return [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }]; }, propDecorators: { pConn$: [{
386
+ args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatMenuModule, MatIconModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"file-upload-container\" *ngIf=\"bVisible$\">\n <span class=\"attachment-label\" [ngClass]=\"{ 'file-label': bRequired$ }\">{{ label$ }}</span>\n <div *ngIf=\"(files.length === 0 && !allowMultiple$) || allowMultiple$\">\n <div\n style=\"margin-bottom: 10px\"\n id=\"attachment-container\"\n [ngClass]=\"validateMessage ? 'psdk-modal-file-selector-error' : 'psdk-modal-file-selector'\"\n >\n <div [hidden]=\"true\" id=\"attachment-ID\">\n {{ valueRef }}\n </div>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"valueRef\" [multiple]=\"allowMultiple$\" (change)=\"onFileAdded($event)\" />\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n <div *ngIf=\"files && files.length > 0\">\n <div *ngFor=\"let file of files\">\n <div class=\"psdk-attachment-card\">\n <div className=\"psdk-utility-card-icon\">\n <img *ngIf=\"!file.inProgress\" class=\"psdk-attachment-card-svg-icon\" src=\"{{ srcImg }}\" />\n <mat-spinner *ngIf=\"file.inProgress\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n </div>\n <div class=\"psdk-attachment-card-main\">\n <div class=\"psdk-attachment-card-main-primary-label\">{{ file.props.name }}</div>\n <div *ngIf=\"file.props.meta\" [ngStyle]=\"{ color: file.props.error ? 'red' : null }\">{{ file.props.meta }}</div>\n </div>\n <div class=\"psdk-attachment-action\">\n <button id=\"delete-attachment\" *ngIf=\"file.ID\" class=\"psdk-utility-button\" (click)=\"deleteFile(file)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ deleteIcon }}\" />\n </button>\n <div *ngIf=\"!file.ID\">\n <button id=\"setting-button\" mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"downloadFile(file.responseProps ? file.responseProps : {})\">Download</button>\n <button mat-menu-item (click)=\"deleteFile(file)\">Delete</button>\n </mat-menu>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);padding:.5rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);padding:.5rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}.psdk-attachment-card{display:flex;align-items:center;border:.0625rem solid rgb(207,207,207);border-radius:.25rem;padding:.25rem 0rem .25rem .25rem;min-height:3rem;margin-bottom:.5rem}.psdk-attachment-card-main-primary-label{font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:normal}.psdk-attachment-card-main{flex-grow:2;margin-left:5px}.psdk-attachment-action{flex-grow:1;text-align:right}.psdk-attachment-card-svg-icon{width:2.5rem}.psdk-utility-button{background:none;border:none;margin-right:.5rem;cursor:pointer}.psdk-utility-card-action-svg-icon{width:1.4rem;display:inline-block}.file-div{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.5rem;text-align:center;position:relative}.file-div-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.5rem;text-align:center;position:relative}.attachment-label{display:block;margin-bottom:10px}.file-label:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}\n"] }]
387
+ }], ctorParameters: () => [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }], propDecorators: { pConn$: [{
584
388
  type: Input
585
389
  }], formGroup$: [{
586
390
  type: Input
391
+ }], fileInput: [{
392
+ type: ViewChild,
393
+ args: ['uploader', { static: false }]
587
394
  }] } });
588
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7QUFpQnhHLE1BQU0sT0FBTyxtQkFBbUI7SUFpQzlCLFlBQ1UsZUFBdUMsRUFDdkMsS0FBWSxFQUNaLE1BQWM7UUFGZCxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFdBQU0sR0FBTixNQUFNLENBQVE7UUFoQ3hCLHVDQUF1QztRQUN2Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBRTlDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFFWixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixj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QUFDLFlBQVk7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQzthQUNsRTtZQUNELGFBQWEsRUFBRTtnQkFDYixHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7SUFDSixDQUFDOytHQXRxQlUsbUJBQW1CO21HQUFuQixtQkFBbUIsa0lDekJoQyxtbkRBK0JBLHkwQkRSWSxZQUFZLHlmQUFFLHdCQUF3QixnVEFBRSxlQUFlLDBWQUFtQix3QkFBd0I7OzRGQUVqRyxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBR2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztzSkFHckcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE5nWm9uZSwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkanMnO1xuaW1wb3J0IHsgQW5ndWxhclBDb25uZWN0RGF0YSwgQW5ndWxhclBDb25uZWN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvYW5ndWxhci1wY29ubmVjdCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQQ29ubkZpZWxkUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9fdHlwZXMvUENvbm5Qcm9wcy5pbnRlcmZhY2UnO1xuXG5pbnRlcmZhY2UgQXR0YWNobWVudFByb3BzIGV4dGVuZHMgT21pdDxQQ29ubkZpZWxkUHJvcHMsICd2YWx1ZSc+IHtcbiAgLy8gSWYgYW55LCBlbnRlciBhZGRpdGlvbmFsIHByb3BzIHRoYXQgb25seSBleGlzdCBvbiB0aGlzIGNvbXBvbmVudFxuICB2YWx1ZTogYW55O1xuICBleHRlbnNpb25zOiBhbnk7XG4gIGFsbG93TXVsdGlwbGU6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdHRhY2htZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdHRhY2htZW50LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBmb3J3YXJkUmVmKCgpID0+IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCldXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuICBASW5wdXQoKSBmb3JtR3JvdXAkOiBGb3JtR3JvdXA7XG5cbiAgLy8gRm9yIGludGVyYWN0aW9uIHdpdGggQW5ndWxhclBDb25uZWN0XG4gIGFuZ3VsYXJQQ29ubmVjdERhdGE6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7fTtcblxuICBsYWJlbCQgPSAnJztcbiAgdmFsdWUkOiBhbnk7XG4gIGJSZXF1aXJlZCQgPSBmYWxzZTtcbiAgYlJlYWRvbmx5JCA9IGZhbHNlO1xuICBiRGlzYWJsZWQkID0gZmFsc2U7XG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGJMb2FkaW5nJCA9IGZhbHNlO1xuICBhckZpbGVzJDogYW55W10gPSBbXTtcbiAgYXJGaWxlTGlzdCQ6IGFueVtdID0gW107XG4gIHJlbW92ZUZpbGVGcm9tTGlzdCQ6IGFueTtcbiAgYXJNZW51TGlzdCQ6IGFueVtdID0gW107XG4gIGJTaG93U2VsZWN0b3IkID0gdHJ1ZTtcbiAgYlNob3dKdXN0RGVsZXRlJCA9IGZhbHNlO1xuICBhdHRfdmFsdWVSZWY6IGFueTtcbiAgYXR0X2NhdGVnb3J5TmFtZTogc3RyaW5nO1xuICBhdHRfaWQ6IHN0cmluZztcbiAgbXlGaWxlczogYW55O1xuICBmaWxlVGVtcDogYW55ID0ge307XG4gIGNhc2VJRDogYW55O1xuICBhbGxvd011bHRpcGxlJCA9IGZhbHNlO1xuICBleHRlbnNpb25zJCA9ICcnO1xuICBzdGF0dXMgPSAnJztcbiAgdmFsaWRhdGVNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgdmFsdWVSZWY6IHN0cmluZztcbiAgaW1hZ2VQYXRoJDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIC8vIEZpcnN0IHRoaW5nIGluIGluaXRpYWxpemF0aW9uIGlzIHJlZ2lzdGVyaW5nIGFuZCBzdWJzY3JpYmluZyB0byB0aGUgQW5ndWxhclBDb25uZWN0IHNlcnZpY2VcbiAgICB0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5yZWdpc3RlckFuZFN1YnNjcmliZUNvbXBvbmVudCh0aGlzLCB0aGlzLm9uU3RhdGVDaGFuZ2UpO1xuXG4gICAgdGhpcy5yZW1vdmVGaWxlRnJvbUxpc3QkID0geyBvbkNsaWNrOiB0aGlzLl9yZW1vdmVGaWxlRnJvbUxpc3QuYmluZCh0aGlzKSB9O1xuXG4gICAgdGhpcy5jYXNlSUQgPSBQQ29yZS5nZXRTdG9yZVZhbHVlKCcucHlJRCcsICdjYXNlSW5mby5jb250ZW50JywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG5cbiAgICAvLyBsZXQgY29uZmlnUHJvcHM6IGFueSA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKTtcbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlKCk7XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkNBU0VfRVZFTlRTLkFTU0lHTk1FTlRfU1VCTUlTU0lPTiwgdGhpcy5jYXNlSUQpO1xuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHNJbmZvKCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBQcm9wZXJ0eSAnYXR0YWNobWVudHNJbmZvJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdDMTFuRW52J1xuICAgIGlmICghdGhpcy5wQ29ubiQuYXR0YWNobWVudHNJbmZvKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIC0gUHJvcGVydHkgJ2F0dGFjaG1lbnRzSW5mbycgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQzExbkVudidcbiAgICAgIHRoaXMucENvbm4kLmF0dGFjaG1lbnRzSW5mbyA9IHtcbiAgICAgICAgdHlwZTogJ0ZpbGUnLFxuICAgICAgICBhdHRhY2htZW50RmllbGROYW1lOiB0aGlzLmF0dF92YWx1ZVJlZixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuYXR0X2NhdGVnb3J5TmFtZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzRmlsZShmaWxlLCBpKSB7XG4gICAgZmlsZS5wcm9wcy50eXBlID0gZmlsZS5yZXNwb25zZVByb3BzLnB5TWltZUZpbGVFeHRlbnNpb247XG4gICAgZmlsZS5wcm9wcy5taW1lVHlwZSA9IGZpbGUucmVzcG9uc2VQcm9wcy5weU1pbWVGaWxlRXh0ZW5zaW9uO1xuICAgIGZpbGUucHJvcHMuSUQgPSBmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG5cbiAgICBjb25zdCBhck1lbnVMaXN0ID0gW1xuICAgICAge1xuICAgICAgICBpY29uOiAnZG93bmxvYWQnLFxuICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRG93bmxvYWQnLCAnJywgJycpLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLl9kb3dubG9hZEZpbGVGcm9tTGlzdCh0aGlzLnZhbHVlJC5weFJlc3VsdHNbaV0pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRGVsZXRlJywgJycsICcnKSxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5fcmVtb3ZlRmlsZUZyb21MaXN0KHRoaXMuYXJGaWxlTGlzdCRbaV0pXG4gICAgICB9XG4gICAgXTtcblxuICAgIGNvbnN0IGFyRmlsZXNBdHRhY2htZW50SURzOiBhbnkgPSBbXTtcbiAgICB0aGlzLmFyRmlsZUxpc3QkLmZvckVhY2goYXJGaWxlID0+IHtcbiAgICAgIGFyRmlsZXNBdHRhY2htZW50SURzLnB1c2goYXJGaWxlLmlkKTtcbiAgICB9KTtcblxuICAgIGlmICghYXJGaWxlc0F0dGFjaG1lbnRJRHMuaW5jbHVkZXMoZmlsZS5wcm9wcy5JRCkpIHtcbiAgICAgIHRoaXMuYXJGaWxlTGlzdCQucHVzaChcbiAgICAgICAgdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgYXR0OiBmaWxlLnByb3BzLFxuICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFyRmlsZUxpc3QkW2ldLmFjdGlvbnMgPSBhck1lbnVMaXN0O1xuICAgIHRoaXMuYXJGaWxlTGlzdCRbaV0ubm9EZWxldGVJY29uID0gdHJ1ZTtcblxuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZVNlbGYoKSB7XG4gICAgY29uc3QgY29uZmlnUHJvcHM6IEF0dGFjaG1lbnRQcm9wcyA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKSBhcyBBdHRhY2htZW50UHJvcHM7XG4gICAgY29uc3Qgc3RhdGVQcm9wczogYW55ID0gdGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpO1xuXG4gICAgY29uc3QgeyB2YWx1ZSwgbGFiZWwsIGV4dGVuc2lvbnMgfSA9IGNvbmZpZ1Byb3BzO1xuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlcXVpcmVkICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlcXVpcmVkJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1Byb3BzLnZpc2liaWxpdHkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5iVmlzaWJsZSQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy52aXNpYmlsaXR5KTtcbiAgICB9XG5cbiAgICAvLyBkaXNhYmxlZFxuICAgIGlmIChjb25maWdQcm9wcy5kaXNhYmxlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYkRpc2FibGVkJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMucmVhZE9ubHkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5iUmVhZG9ubHkkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMucmVhZE9ubHkpO1xuICAgIH1cblxuICAgIGlmIChjb25maWdQcm9wcy5hbGxvd011bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWxsb3dNdWx0aXBsZSQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5hbGxvd011bHRpcGxlKTtcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMubGFiZWwkID0gbGFiZWw7XG4gICAgdGhpcy52YWx1ZSQgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXRlUHJvcHMuc3RhdHVzO1xuICAgIHRoaXMudmFsaWRhdGVNZXNzYWdlID0gdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnZhbGlkYXRlTWVzc2FnZTtcbiAgICB0aGlzLmV4dGVuc2lvbnMkID0gZXh0ZW5zaW9ucztcbiAgICB0aGlzLnZhbHVlUmVmID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIHRoaXMudmFsdWVSZWYgPSB0aGlzLnZhbHVlUmVmLnN0YXJ0c1dpdGgoJy4nKSA/IHRoaXMudmFsdWVSZWYuc3Vic3RyaW5nKDEpIDogdGhpcy52YWx1ZVJlZjtcblxuICAgIC8qIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGJlY2F1c2UgcmVxdWlyZWQgaXMgc3VwcG9zZWQgdG8gYmUgcGFzc2VkIGFzIGEgYm9vbGVhbiBhbmQgTk9UIGFzIGEgc3RyaW5nICovXG4gICAgbGV0IHsgcmVxdWlyZWQsIGRpc2FibGVkIH0gPSBjb25maWdQcm9wcztcbiAgICBbcmVxdWlyZWQsIGRpc2FibGVkXSA9IFtyZXF1aXJlZCwgZGlzYWJsZWRdLm1hcChwcm9wID0+IHByb3AgPT09IHRydWUgfHwgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wID09PSAndHJ1ZScpKTtcblxuICAgIHRoaXMuYXR0X2NhdGVnb3J5TmFtZSA9ICcnO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5weUNhdGVnb3J5TmFtZSkge1xuICAgICAgdGhpcy5hdHRfY2F0ZWdvcnlOYW1lID0gdmFsdWUucHlDYXRlZ29yeU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5hdHRfdmFsdWVSZWYgPSAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWU7XG4gICAgdGhpcy5hdHRfdmFsdWVSZWYgPSB0aGlzLmF0dF92YWx1ZVJlZi5pbmRleE9mKCcuJykgPT09IDAgPyB0aGlzLmF0dF92YWx1ZVJlZi5zdWJzdHJpbmcoMSkgOiB0aGlzLmF0dF92YWx1ZVJlZjtcblxuICAgIHRoaXMudXBkYXRlQXR0YWNobWVudHMoKTtcbiAgfVxuXG4gIHVwZGF0ZUF0dGFjaG1lbnRzKCkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzRnJvbVNlcnZlciA9IHRoaXMudmFsdWUkICYmIHRoaXMudmFsdWUkLnB4UmVzdWx0cyAmJiArdGhpcy52YWx1ZSQucHlDb3VudCA+IDA7XG5cbiAgICBpZiAoYXR0YWNobWVudHNGcm9tU2VydmVyKSB7XG4gICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzRnJvbVNlcnZlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgdGhlIGF0dGFjaG1lbnRzIGZyb20gdGhlIFJlZHV4XG4gICAgICB0aGlzLm15RmlsZXMgPSB0aGlzLmdldEN1cnJlbnRBdHRhY2htZW50c0xpc3QodGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG5cbiAgICAgIGlmICh0aGlzLm15RmlsZXM/Lmxlbmd0aCAmJiB0aGlzLmFyRmlsZXMkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmFyRmlsZUxpc3QkID0gdGhpcy5teUZpbGVzLm1hcChhdHQgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgICAgIGF0dCxcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXlGaWxlc0F0dGFjaG1lbnRJRHM6IGFueSA9IFtdO1xuICAgICAgdGhpcy5teUZpbGVzLmZvckVhY2gobXlGaWxlID0+IHtcbiAgICAgICAgbXlGaWxlc0F0dGFjaG1lbnRJRHMucHVzaChteUZpbGUuSUQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXJGaWxlcyQuZm9yRWFjaChhckZpbGUgPT4ge1xuICAgICAgICBpZiAoIW15RmlsZXNBdHRhY2htZW50SURzLmluY2x1ZGVzKGFyRmlsZS5JRCkpIHtcbiAgICAgICAgICB0aGlzLm15RmlsZXMgPSBbLi4udGhpcy5teUZpbGVzLCBhckZpbGVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSAhKHRoaXMuYXJGaWxlTGlzdCQ/Lmxlbmd0aCA+IDApIHx8IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG5cbiAgICBpZiAodGhpcy5hckZpbGVMaXN0JC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcbiAgICB9XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sXG4gICAgICB0aGlzLnJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNhc2VJRFxuICAgICk7XG4gIH1cblxuICB1cGRhdGVBdHRhY2htZW50c0Zyb21TZXJ2ZXIoKSB7XG4gICAgdGhpcy52YWx1ZSQucHhSZXN1bHRzLmZvckVhY2goKGF0dGFjaG1lbnQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGU6IGFueSA9IHRoaXMuYnVpbGRGaWxlUHJvcHNGcm9tUmVzcG9uc2UoYXR0YWNobWVudCk7XG4gICAgICBpZiAoZmlsZS5yZXNwb25zZVByb3BzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0YWNobWVudHNJbmZvKCk7XG4gICAgICAgIGlmIChmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXkgJiYgIWZpbGUucmVzcG9uc2VQcm9wcy5wekluc0tleS5pbmNsdWRlcygndGVtcCcpKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50LnByb3BzLklEID09PSBmaWxlLnByb3BzLklEKTtcbiAgICAgICAgICBsZXQgdGVtcEZpbGVzOiBhbnkgPSBbXTtcbiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0ZW1wRmlsZXMgPSBbZmlsZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgUENvcmUuZ2V0U3RhdGVVdGlscygpLnVwZGF0ZVN0YXRlKFxuICAgICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgICAgICBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi50ZW1wRmlsZXNdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgICAgICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXNldEF0dGFjaG1lbnRTdG9yZWRTdGF0ZSgpIHtcbiAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUodGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdW5kZWZpbmVkLCB7XG4gICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBfZG93bmxvYWRGaWxlRnJvbUxpc3QoZmlsZU9iajogYW55KSB7XG4gICAgUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKClcbiAgICAgIC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwicmVzcG9uc2VFbmNvZGluZ1wiIHNob3VsZCBiZSBvcHRpb25hbFxuICAgICAgLmRvd25sb2FkQXR0YWNobWVudChmaWxlT2JqLnB6SW5zS2V5LCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKVxuICAgICAgLnRoZW4oKGNvbnRlbnQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlT2JqLnB5QXR0YWNoTmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZChjb250ZW50LmRhdGEsIGZpbGVPYmoucHlGaWxlTmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBmaWxlRG93bmxvYWQgPSAoZGF0YSwgZmlsZU5hbWUsIGV4dCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBleHQgPyBgJHtmaWxlTmFtZX0uJHtleHR9YCA6IGZpbGVOYW1lO1xuICAgIGRvd25sb2FkKGF0b2IoZGF0YSksIGZpbGUpO1xuICB9O1xuXG4gIGdldEF0dGFjaG1lbnRLZXkgPSAobmFtZSA9ICcnKSA9PiAobmFtZSA/IGBhdHRhY2htZW50c0xpc3QuJHtuYW1lfWAgOiAnYXR0YWNobWVudHNMaXN0Jyk7XG5cbiAgQ2hlY2tGb3JJbnZhbGlkQXR0YWNobWVudCgpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgdGhpcy5hckZpbGVMaXN0JC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgaWYgKGZpbGUuc2Vjb25kYXJ5LmVycm9yKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5jbGVhck1lc3NhZ2VzKHtcbiAgICAgICAgdHlwZTogUENvcmUuZ2V0Q29uc3RhbnRzKCkuTUVTU0FHRVMuTUVTU0FHRVNfVFlQRV9FUlJPUixcbiAgICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZSxcbiAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICBjb250ZXh0OiB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfcmVtb3ZlRmlsZUZyb21MaXN0KGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGZpbGVMaXN0SW5kZXggPSB0aGlzLmFyRmlsZUxpc3QkLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnQ/LmlkID09PSBpdGVtPy5pZCk7XG4gICAgY29uc3QgZmlsZUluZGV4ID0gdGhpcy5hckZpbGVzJC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50Py5JRCA9PT0gaXRlbT8uaWQpO1xuXG4gICAgY29uc3QgYXR0YWNobWVudHNMaXN0ID0gW107XG4gICAgbGV0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKTtcbiAgICBpZiAodGhpcy52YWx1ZSQgJiYgdGhpcy52YWx1ZSQucHhSZXN1bHRzICYmICt0aGlzLnZhbHVlJC5weUNvdW50ID4gMCAmJiBpdGVtLmFjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHRhY2htZW50cyA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5tYXAoYXR0YWNobWVudCA9PiB7XG4gICAgICAgIGlmIChhdHRhY2htZW50Py5JRCA9PT0gdGhpcy5hckZpbGVMaXN0JFtmaWxlTGlzdEluZGV4XS5pZCB8fCBhdHRhY2htZW50Py5wcm9wcz8uSUQgPT09IHRoaXMuYXJGaWxlTGlzdCRbZmlsZUxpc3RJbmRleF0uaWQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5hdHRhY2htZW50LCBkZWxldGU6IHRydWUsIGxhYmVsOiB0aGlzLnZhbHVlUmVmIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gdXBkYXRpbmcgdGhlIHJlZHV4IHN0b3JlIHRvIGhlbHAgZm9ybS1oYW5kbGVyIGluIHBhc3NpbmcgdGhlIGRhdGEgdG8gZGVsZXRlIHRoZSBmaWxlIGZyb20gc2VydmVyXG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUodGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdXBkYXRlZEF0dGFjaG1lbnRzLCB7XG4gICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICBpc0FycmF5RGVlcE1lcmdlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maWx0ZXIoZiA9PiBmLklEICE9PSBpdGVtLmlkKTtcbiAgICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZShcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSxcbiAgICAgICAgWy4uLmN1cnJlbnRBdHRhY2htZW50TGlzdCwgLi4uYXR0YWNobWVudHNMaXN0XSxcbiAgICAgICAge1xuICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVMaXN0SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5hckZpbGVMaXN0JC5zcGxpY2UoZmlsZUxpc3RJbmRleCwgMSk7XG4gICAgfVxuICAgIGlmIChmaWxlSW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5hckZpbGVzJC5zcGxpY2UoZmlsZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcblxuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSAhKHRoaXMuYXJGaWxlTGlzdCQ/Lmxlbmd0aCA+IDApIHx8IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG4gIH1cblxuICBnZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KGtleSwgY29udGV4dCkge1xuICAgIHJldHVybiBQQ29yZS5nZXRTdG9yZVZhbHVlKGAuJHtrZXl9YCwgJ2NvbnRleHRfZGF0YScsIGNvbnRleHQpIHx8IFtdO1xuICB9XG5cbiAgZXJyb3JIYW5kbGVyKGlzRmV0Y2hDYW5jZWxlZCwgZmlsZSkge1xuICAgIHJldHVybiBlcnJvciA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hDYW5jZWxlZChlcnJvcikpIHtcbiAgICAgICAgbGV0IHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnU29tZXRoaW5nIHdlbnQgd3JvbmcnLCAnJywgJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2UuZGF0YSAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlscykge1xuICAgICAgICAgIHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZShlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlsc1swXS5sb2NhbGl6ZWRWYWx1ZSwgJycsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG15RmlsZSBvZiB0aGlzLm15RmlsZXMpIHtcbiAgICAgICAgICBpZiAobXlGaWxlLklEID09PSBmaWxlLklEKSB7XG4gICAgICAgICAgICBteUZpbGUubWV0YSA9IHVwbG9hZEZhaWxNc2c7XG4gICAgICAgICAgICBteUZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgbXlGaWxlLmZpbGVOYW1lID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ1VuYWJsZSB0byB1cGxvYWQgZmlsZScsICcnLCAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgICAgICBpZiAoYXR0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgICBhdHQsXG4gICAgICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgICAgZGVsZXRlRmlsZTogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZSxcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgY29udGV4dDogdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfTtcbiAgfVxuXG4gIHVwbG9hZE15RmlsZXMoZXZlbnQ6IGFueSkge1xuICAgIGxldCBhcnJBdHRhY2htZW50RmlsZXM6IGFueSA9IFtdO1xuICAgIGlmICh0aGlzLmFyRmlsZXMkLmxlbmd0aCkge1xuICAgICAgYXJyQXR0YWNobWVudEZpbGVzID0gdGhpcy5hckZpbGVzJDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyQXR0YWNobWVudEZpbGVzID0gdGhpcy5hckZpbGVMaXN0JDtcbiAgICB9XG4gICAgdGhpcy5hckZpbGVzJCA9IFsuLi5hcnJBdHRhY2htZW50RmlsZXMsIC4uLnRoaXMuZ2V0RmlsZXMoZXZlbnQudGFyZ2V0LmZpbGVzKV07XG5cbiAgICAvLyBjb252ZXJ0IEZpbGVMaXN0IHRvIGFuIGFycmF5XG4gICAgdGhpcy5teUZpbGVzID0gQXJyYXkuZnJvbSh0aGlzLmFyRmlsZXMkKTtcblxuICAgIHRoaXMuYkxvYWRpbmckID0gdHJ1ZTtcblxuICAgIGNvbnN0IGZpbGVzVG9CZVVwbG9hZGVkID0gdGhpcy5teUZpbGVzXG4gICAgICAuZmlsdGVyKGUgPT4ge1xuICAgICAgICBpZiAoZS5pZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZCA9IGUgJiYgZS5wcm9ncmVzcyA9PT0gMTAwO1xuICAgICAgICBjb25zdCBmaWxlSGFzRXJyb3IgPSBlICYmIGUuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcCA9IGUucmVzcG9uc2VQcm9wcyAmJiBlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG4gICAgICAgIHJldHVybiAhaXNGaWxlVXBsb2FkZWQgJiYgIWZpbGVIYXNFcnJvciAmJiAhaXNGaWxlVXBsb2FkZWRpbkxhc3RTdGVwO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZiA9PlxuICAgICAgICBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKS51cGxvYWRBdHRhY2htZW50KFxuICAgICAgICAgIGYsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZFByb2dyZXNzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc0ZldGNoQ2FuY2VsZWQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyKGlzRmV0Y2hDYW5jZWxlZCwgZik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICBQcm9taXNlLmFsbFNldHRsZWQoZmlsZXNUb0JlVXBsb2FkZWQpXG4gICAgICAudGhlbigoZmlsZVJlc3BvbnNlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZVVwbG9hZFN1Y2Nlc3MoZmlsZVJlc3BvbnNlcyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVVcGxvYWRGYWlsdXJlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVVcGxvYWRTdWNjZXNzKGZpbGVSZXNwb25zZXMpIHtcbiAgICBjb25zdCBzdWNjZXNzRmlsZVJlc3BvbnNlcyA9IGZpbGVSZXNwb25zZXMuZmlsdGVyKGZyID0+IGZyLnN0YXR1cyAhPT0gJ3JlamVjdGVkJyk7IC8vIGluIGNhc2Ugb2YgZGVsZXRpbmcgYW4gaW4gcHJvZ3Jlc3MgZmlsZSwgcHJvbWlzZSBnZXRzIGNhbmNlbGxlZCBidXQgc3RpbGwgZW50ZXJzIHRoZW4gYmxvY2tcbiAgICBsZXQgcmVxT2JqO1xuICAgIGlmIChzdWNjZXNzRmlsZVJlc3BvbnNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0ZW1wRmlsZXNVcGxvYWRlZCA9IFsuLi50aGlzLmFyRmlsZXMkLmZpbHRlcihmaWxlID0+ICFmaWxlLmlkKV07XG4gICAgICBsZXQgbmV3QXR0YWNobWVudHM6IGFueSA9IFtdO1xuICAgICAgdGVtcEZpbGVzVXBsb2FkZWQuZm9yRWFjaChmaWxlUmVzID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdWNjZXNzRmlsZVJlc3BvbnNlcy5maW5kSW5kZXgoKGZyOiBhbnkpID0+IGZyLnZhbHVlLmNsaWVudEZpbGVJRCA9PT0gZmlsZVJlcy5JRCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmVxT2JqID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZpbGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuYXR0X3ZhbHVlUmVmLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuYXR0X2NhdGVnb3J5TmFtZSxcbiAgICAgICAgICAgIGhhbmRsZTogc3VjY2Vzc0ZpbGVSZXNwb25zZXNbaW5kZXhdLnZhbHVlLklELFxuICAgICAgICAgICAgSUQ6IGZpbGVSZXMuSUQsXG4gICAgICAgICAgICBuYW1lOiBmaWxlUmVzLm5hbWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzID0gWy4uLm5ld0F0dGFjaG1lbnRzLCByZXFPYmpdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKS5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5sYWJlbCAhPT0gdGhpcy5hdHRfdmFsdWVSZWZcbiAgICAgICk7XG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUoXG4gICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgIFsuLi5jdXJyZW50QXR0YWNobWVudExpc3QsIC4uLm5ld0F0dGFjaG1lbnRzXSxcbiAgICAgICAge1xuICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmFyRmlsZXMkID0gdGVtcEZpbGVzVXBsb2FkZWQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSB0aGlzLmFsbG93TXVsdGlwbGUkO1xuICAgICAgICB0aGlzLmFyRmlsZXMkLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKCFmaWxlLmVycm9yKSB7XG4gICAgICAgICAgICBmaWxlLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHknLCAnJywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYXJGaWxlTGlzdCQgPSB0aGlzLm15RmlsZXMubWFwKGF0dCA9PiB7XG4gICAgICAgICAgaWYgKGF0dC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICAgICAgYXR0LFxuICAgICAgICAgICAgZG93bmxvYWRGaWxlOiBudWxsLFxuICAgICAgICAgICAgY2FuY2VsRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgICByZW1vdmVGaWxlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuQ2hlY2tGb3JJbnZhbGlkQXR0YWNobWVudCgpO1xuXG4gICAgICAgIHRoaXMuYlNob3dKdXN0RGVsZXRlJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYkxvYWRpbmckID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGaWxlVXBsb2FkRmFpbHVyZSgpIHtcbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMuYkxvYWRpbmckID0gZmFsc2U7XG4gICAgdGhpcy5iU2hvd1NlbGVjdG9yJCA9IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG4gICAgdGhpcy5teUZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAoZmlsZT8uc2Vjb25kYXJ5Py5lcnJvcikge1xuICAgICAgICBmaWxlLm1ldGEgPSAnRmlsZSB1cGxvYWRlZCBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgYXR0LFxuICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMgPSAoeyBhdHQsIGNhbmNlbEZpbGUsIGRvd25sb2FkRmlsZSwgZGVsZXRlRmlsZSwgcmVtb3ZlRmlsZSB9KSA9PiB7XG4gICAgbGV0IGFjdGlvbnM7XG4gICAgbGV0IGlzRG93bmxvYWRhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoYXR0LnByb2dyZXNzICYmIGF0dC5wcm9ncmVzcyAhPT0gMTAwKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGBDYW5jZWwtJHthdHQuSUR9YCxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQ2FuY2VsJywgJycsICcnKSxcbiAgICAgICAgICBpY29uOiAndGltZXMnLFxuICAgICAgICAgIG9uQ2xpY2s6IGNhbmNlbEZpbGVcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKGF0dC5saW5rcykge1xuICAgICAgY29uc3QgaXNGaWxlID0gYXR0LnR5cGUgPT09ICdGSUxFJztcbiAgICAgIGNvbnN0IElEID0gYXR0LklELnJlcGxhY2UoL1xccy9naSwgJycpO1xuICAgICAgY29uc3QgYWN0aW9uc01hcCA9IG5ldyBNYXAoW1xuICAgICAgICBbXG4gICAgICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYGRvd25sb2FkLSR7SUR9YCxcbiAgICAgICAgICAgIHRleHQ6IGlzRmlsZSA/IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdEb3dubG9hZCcsICcnLCAnJykgOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnT3BlbicsICcnLCAnJyksXG4gICAgICAgICAgICBpY29uOiBpc0ZpbGUgPyAnZG93bmxvYWQnIDogJ29wZW4nLFxuICAgICAgICAgICAgb25DbGljazogZG93bmxvYWRGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGBEZWxldGUtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0RlbGV0ZScsICcnLCAnJyksXG4gICAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgICAgb25DbGljazogZGVsZXRlRmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgXSk7XG4gICAgICBhY3Rpb25zID0gW107XG4gICAgICBhY3Rpb25zTWFwLmZvckVhY2goKGFjdGlvbiwgYWN0aW9uS2V5KSA9PiB7XG4gICAgICAgIGlmIChhdHQubGlua3NbYWN0aW9uS2V5XSkge1xuICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGlzRG93bmxvYWRhYmxlID0gYXR0LmxpbmtzLmRvd25sb2FkO1xuICAgIH0gZWxzZSBpZiAoYXR0LmVycm9yKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGBSZW1vdmUtJHthdHQuSUR9YCxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnUmVtb3ZlJywgJycsICcnKSxcbiAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgIG9uQ2xpY2s6IHJlbW92ZUZpbGVcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGF0dC5JRCxcbiAgICAgIHZpc3VhbDoge1xuICAgICAgICBpY29uOiB0aGlzLnV0aWxzLmdldEljb25Gb3JBdHRhY2htZW50KGF0dCksXG4gICAgICAgIHByb2dyZXNzOiBhdHQucHJvZ3Jlc3MgPT0gMTAwID8gdW5kZWZpbmVkIDogYXR0LnByb2dyZXNzXG4gICAgICB9LFxuICAgICAgcHJpbWFyeToge1xuICAgICAgICB0eXBlOiBhdHQudHlwZSxcbiAgICAgICAgbmFtZTogYXR0LmVycm9yID8gYXR0LmZpbGVOYW1lIDogYXR0Lm5hbWUsXG4gICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgIGNsaWNrOiByZW1vdmVGaWxlXG4gICAgICB9LFxuICAgICAgc2Vjb25kYXJ5OiB7XG4gICAgICAgIHRleHQ6IGF0dC5tZXRhLFxuICAgICAgICBlcnJvcjogYXR0LmVycm9yXG4gICAgICB9LFxuICAgICAgYWN0aW9uc1xuICAgIH07XG4gIH07XG5cbiAgb25VcGxvYWRQcm9ncmVzcygpIHt9XG5cbiAgZ2V0RmlsZXMoYXJGaWxlczogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFsbG93TXVsdGlwbGUkID8gYXJGaWxlcyA6IFthckZpbGVzWzBdXTtcbiAgICByZXR1cm4gdGhpcy5zZXROZXdGaWxlcyhmaWxlcyk7XG4gIH1cblxuICBzZXROZXdGaWxlcyhhckZpbGVzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBtYXhBdHRhY2htZW50U2l6ZSA9IFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldE1heEF0dGFjaG1lbnRTaXplKCkgfHwgNTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXJGaWxlcykge1xuICAgICAgZmlsZS5taW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgIGZpbGUuaWNvbiA9IHRoaXMudXRpbHMuZ2V0SWNvbkZyb21GaWxlVHlwZShmaWxlLnR5cGUpO1xuICAgICAgZmlsZS5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZmlsZSwgbWF4QXR0YWNobWVudFNpemUpKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmaWxlLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSBpcyB0b28gYmlnLiBNYXggYWxsb3dlZCBzaXplIGlzIDVNQi4nLCAnJywgJycpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy52YWxpZGF0ZUZpbGVFeHRlbnNpb24oZmlsZSwgdGhpcy5leHRlbnNpb25zJCkpIHtcbiAgICAgICAgZmlsZS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZpbGUubWV0YSA9IGAke3RoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdGaWxlIGhhcyBpbnZhbGlkIGV4dGVuc2lvbi4gQWxsb3dlZCBleHRlbnNpb25zIGFyZTonLCAnJywgJycpfSAke3RoaXMuZXh0ZW5zaW9ucyQucmVwbGFjZUFsbChcbiAgICAgICAgICAnLicsXG4gICAgICAgICAgJydcbiAgICAgICAgKX1gO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGUuZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5hckZpbGVzXTtcbiAgfVxuXG4gIHZhbGlkYXRlTWF4U2l6ZShmaWxlT2JqLCBtYXhTaXplSW5NQik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpbGVTaXplID0gKGZpbGVPYmouc2l6ZSAvIDEwNDg1NzYpLnRvRml4ZWQoMik7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZmlsZVNpemUpIDwgcGFyc2VGbG9hdChtYXhTaXplSW5NQik7XG4gIH1cblxuICB2YWxpZGF0ZUZpbGVFeHRlbnNpb24gPSAoZmlsZU9iaiwgYWxsb3dlZEV4dGVuc2lvbnMpID0+IHtcbiAgICBpZiAoIWFsbG93ZWRFeHRlbnNpb25zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbkxpc3QgPSBhbGxvd2VkRXh0ZW5zaW9uc1xuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKGl0ZW0gPT4gaXRlbS5yZXBsYWNlQWxsKCcuJywgJycpLnRyaW0oKSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU9iai5uYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gYWxsb3dlZEV4dGVuc2lvbkxpc3QuaW5jbHVkZXMoZXh0ZW5zaW9uKTtcbiAgfTtcblxuICBidWlsZEZpbGVQcm9wc0Zyb21SZXNwb25zZShyZXNwT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG1ldGE6IGAke3Jlc3BPYmoucHlDYXRlZ29yeU5hbWV9LCAke3Jlc3BPYmoucHhDcmVhdGVPcGVyYXRvcn1gLFxuICAgICAgICBuYW1lOiByZXNwT2JqLnB5QXR0YWNoTmFtZSxcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKHJlc3BPYmoucHlNaW1lRmlsZUV4dGVuc2lvbilcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVByb3BzOiB7XG4gICAgICAgIC4uLnJlc3BPYmpcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHNkay1sYWJlbC1pbmZpeC1yZWFkb25seVwiICpuZ0lmPVwiYlZpc2libGUkXCI+XG4gIDxzcGFuIGNsYXNzPVwicHNkay1sYWJlbC13cmFwcGVyLXJlYWRvbmx5XCI+XG4gICAgPGxhYmVsIFtuZ0NsYXNzXT1cInsgJ3BzZGstbGFiZWwtcmVhZG9ubHknOiB0cnVlLCAnbGFiZWwtcmVxdWlyZWQnOiBiUmVxdWlyZWQkID09PSB0cnVlIH1cIiBbaHRtbEZvcl09XCJhdHRfdmFsdWVSZWZcIj57eyBsYWJlbCQgfX08L2xhYmVsPlxuICA8L3NwYW4+XG4gIDxkaXZcbiAgICBbbmdDbGFzc109XCJ7ICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3InOiBzdGF0dXMgIT09ICdlcnJvcicsICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3ItZXJyb3InOiBzdGF0dXMgPT09ICdlcnJvcicgfVwiXG4gICAgaWQ9XCJhdHRhY2htZW50LWNvbnRhaW5lclwiXG4gICAgKm5nSWY9XCJiU2hvd1NlbGVjdG9yJFwiXG4gID5cbiAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJiTG9hZGluZyRcIiBjbGFzcz1cInByb2dyZXNzLXNwaW5uZXJcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8aW5wdXQgaGlkZGVuIHR5cGU9XCJmaWxlXCIgW3JlcXVpcmVkXT1cImJSZXF1aXJlZCRcIiAjdXBsb2FkZXIgW2lkXT1cImF0dF92YWx1ZVJlZlwiIFttdWx0aXBsZV09XCJhbGxvd011bHRpcGxlJFwiIChjaGFuZ2UpPVwidXBsb2FkTXlGaWxlcygkZXZlbnQpXCIgLz5cblxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJiRGlzYWJsZWQkXCIgKGNsaWNrKT1cInVwbG9hZGVyLmNsaWNrKClcIj5cbiAgICAgIHt7IGFsbG93TXVsdGlwbGUkID8gJ1VwbG9hZCBmaWxlcycgOiAnVXBsb2FkIGZpbGUnIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8c3BhbiAqbmdJZj1cInZhbGlkYXRlTWVzc2FnZVwiIGNsYXNzPVwiZmlsZS1lcnJvclwiPnt7IHZhbGlkYXRlTWVzc2FnZSB9fTwvc3Bhbj5cblxuICA8ZGl2IGNsYXNzPVwicHNkay1hdHRhY2htZW50LWxpc3RcIiAqbmdJZj1cImFyRmlsZUxpc3QkICE9IG51bGwgJiYgYXJGaWxlTGlzdCQubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGF0dGFjaG1lbnQgb2YgYXJGaWxlTGlzdCRcIj5cbiAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC5ub0RlbGV0ZUljb24gIT09IHRydWU7IGVsc2Ugc2hvd2Z1bGxcIlxuICAgICAgICBuYW1lPVwiU3VtbWFyeUl0ZW1cIlxuICAgICAgICBbcHJvcHNdPVwieyBpdGVtJDogYXR0YWNobWVudCwgbWVudUljb25PdmVycmlkZSQ6ICd0cmFzaCcsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVGaWxlRnJvbUxpc3QkIH1cIlxuICAgICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd2Z1bGw+XG4gICAgICAgIDxjb21wb25lbnQtbWFwcGVyIG5hbWU9XCJTdW1tYXJ5SXRlbVwiIFtwcm9wc109XCJ7IGl0ZW0kOiBhdHRhY2htZW50LCBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JCB9XCI+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7OztBQWlCeEcsTUFBTSxPQUFPLG1CQUFtQjtJQW9DOUIsWUFDVSxlQUF1QyxFQUN2QyxLQUFZLEVBQ1osTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5DeEIsdUNBQXVDO1FBQ3ZDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFHOUMsV0FBTSxH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dCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgTmdab25lLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCBkb3dubG9hZCBmcm9tICdkb3dubG9hZGpzJztcbmltcG9ydCB7IEFuZ3VsYXJQQ29ubmVjdERhdGEsIEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBDb21wb25lbnRNYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2NvbXBvbmVudC1tYXBwZXIvY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUENvbm5GaWVsZFByb3BzIH0gZnJvbSAnLi4vLi4vLi4vX3R5cGVzL1BDb25uUHJvcHMuaW50ZXJmYWNlJztcblxuaW50ZXJmYWNlIEF0dGFjaG1lbnRQcm9wcyBleHRlbmRzIE9taXQ8UENvbm5GaWVsZFByb3BzLCAndmFsdWUnPiB7XG4gIC8vIElmIGFueSwgZW50ZXIgYWRkaXRpb25hbCBwcm9wcyB0aGF0IG9ubHkgZXhpc3Qgb24gdGhpcyBjb21wb25lbnRcbiAgdmFsdWU6IGFueTtcbiAgZXh0ZW5zaW9uczogYW55O1xuICBhbGxvd011bHRpcGxlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYXR0YWNobWVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXR0YWNobWVudC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdE1lbnVNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXVxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwQ29ubiQ6IHR5cGVvZiBQQ29ubmVjdDtcbiAgQElucHV0KCkgZm9ybUdyb3VwJDogRm9ybUdyb3VwO1xuXG4gIC8vIEZvciBpbnRlcmFjdGlvbiB3aXRoIEFuZ3VsYXJQQ29ubmVjdFxuICBhbmd1bGFyUENvbm5lY3REYXRhOiBBbmd1bGFyUENvbm5lY3REYXRhID0ge307XG4gIEBWaWV3Q2hpbGQoJ3VwbG9hZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcblxuICBsYWJlbCQgPSAnJztcbiAgdmFsdWUkOiBhbnk7XG4gIGJSZXF1aXJlZCQgPSBmYWxzZTtcbiAgYlJlYWRvbmx5JCA9IGZhbHNlO1xuICBiRGlzYWJsZWQkID0gZmFsc2U7XG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGJMb2FkaW5nJCA9IGZhbHNlO1xuICBiU2hvd1NlbGVjdG9yJCA9IHRydWU7XG4gIGF0dF9jYXRlZ29yeU5hbWU6IHN0cmluZztcbiAgZmlsZVRlbXA6IGFueSA9IHt9O1xuICBjYXNlSUQ6IGFueTtcbiAgYWxsb3dNdWx0aXBsZSQgPSBmYWxzZTtcbiAgZXh0ZW5zaW9ucyQgPSAnJztcbiAgc3RhdHVzID0gJyc7XG4gIHZhbGlkYXRlTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gIHZhbHVlUmVmOiBzdHJpbmc7XG4gIGltYWdlUGF0aCQ6IHN0cmluZztcbiAgbG9jYWxpemVkVmFsID0gUENvcmUuZ2V0TG9jYWxlVXRpbHMoKS5nZXRMb2NhbGVWYWx1ZTtcbiAgbG9jYWxlQ2F0ZWdvcnkgPSAnQ29zbW9zRmllbGRzJztcbiAgdXBsb2FkTXVsdGlwbGVGaWxlc0xhYmVsID0gdGhpcy5sb2NhbGl6ZWRWYWwoJ2ZpbGVfdXBsb2FkX3RleHRfbXVsdGlwbGUnLCB0aGlzLmxvY2FsZUNhdGVnb3J5KTtcbiAgdXBsb2FkU2luZ2xlRmlsZUxhYmVsID0gdGhpcy5sb2NhbGl6ZWRWYWwoJ2ZpbGVfdXBsb2FkX3RleHRfb25lJywgdGhpcy5sb2NhbGVDYXRlZ29yeSk7XG4gIGZpbGVzV2l0aEVycm9yOiBhbnkgPSBbXTtcbiAgZmlsZXM6IGFueSA9IFtdO1xuICBjYXRlZ29yeU5hbWU6IHN0cmluZztcbiAgZGlzcGxheU1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3JjSW1nOiBhbnk7XG4gIGRlbGV0ZUljb246IHN0cmluZztcbiAgdGVtcEZpbGVzVG9CZVVwbG9hZGVkOiBhbnlbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbmd1bGFyUENvbm5lY3Q6IEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jYXNlSUQgPSBQQ29yZS5nZXRTdG9yZVZhbHVlKCcucHlJRCcsICdjYXNlSW5mby5jb250ZW50JywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgdGhpcy5zcmNJbWcgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdkb2N1bWVudC1kb2MnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5kZWxldGVJY29uID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygndHJhc2gnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZ2V0QXR0YWNobWVudHMoKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIGxldCB0ZW1wVXBsb2FkZWRGaWxlcyA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy52YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuICAgIHRlbXBVcGxvYWRlZEZpbGVzID0gdGVtcFVwbG9hZGVkRmlsZXMuZmlsdGVyKGYgPT4gZi5sYWJlbCA9PT0gdGhpcy52YWx1ZVJlZiAmJiBmLmRlbGV0ZSAhPT0gdHJ1ZSk7XG4gICAgdGhpcy5maWxlcz8ubWFwKGYgPT4ge1xuICAgICAgcmV0dXJuIGYucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXkgJiYgIWYucmVzcG9uc2VQcm9wcy5wekluc0tleS5pbmNsdWRlcygndGVtcCcpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIC4uLmYucHJvcHMsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogeyAuLi5mIH07XG4gICAgfSk7XG4gICAgdGhpcy5maWxlcyA9IFsuLi50aGlzLmZpbGVzLCAuLi50ZW1wVXBsb2FkZWRGaWxlc107XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sXG4gICAgICB0aGlzLnJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNhc2VJRFxuICAgICk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuQ0FTRV9FVkVOVFMuQVNTSUdOTUVOVF9TVUJNSVNTSU9OLCB0aGlzLmNhc2VJRCk7XG4gICAgfTtcbiAgfVxuXG4gIGNoZWNrQW5kVXBkYXRlKCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgY2hlY2sgdGhlIGJyaWRnZSB0byBzZWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGRcbiAgICAvLyB1cGRhdGUgaXRzZWxmIChyZS1yZW5kZXIpXG4gICAgY29uc3QgYlVwZGF0ZVNlbGYgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5zaG91bGRDb21wb25lbnRVcGRhdGUodGhpcyk7XG5cbiAgICAvLyBPTkxZIGNhbGwgdXBkYXRlU2VsZiB3aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZVxuICAgIGlmIChiVXBkYXRlU2VsZikge1xuICAgICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlU2VsZigpIHtcbiAgICBjb25zdCBjb25maWdQcm9wczogQXR0YWNobWVudFByb3BzID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIEF0dGFjaG1lbnRQcm9wcztcbiAgICBjb25zdCBzdGF0ZVByb3BzOiBhbnkgPSB0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCk7XG4gICAgY29uc3QgeyB2YWx1ZSwgbGFiZWwsIGV4dGVuc2lvbnMsIGRpc3BsYXlNb2RlIH0gPSBjb25maWdQcm9wcztcblxuICAgIGlmIChjb25maWdQcm9wcy5yZXF1aXJlZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJSZXF1aXJlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGlmIChjb25maWdQcm9wcy52aXNpYmlsaXR5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gZGlzYWJsZWRcbiAgICBpZiAoY29uZmlnUHJvcHMuZGlzYWJsZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJEaXNhYmxlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlYWRPbmx5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlYWRvbmx5JCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlYWRPbmx5KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmFsbG93TXVsdGlwbGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYWJlbCQgPSBsYWJlbDtcbiAgICB0aGlzLnZhbHVlJCA9IHZhbHVlO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdGVQcm9wcy5zdGF0dXM7XG5cbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZSA9IHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YS52YWxpZGF0ZU1lc3NhZ2U7XG4gICAgdGhpcy5leHRlbnNpb25zJCA9IGV4dGVuc2lvbnM7XG4gICAgdGhpcy52YWx1ZVJlZiA9ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZTtcbiAgICB0aGlzLnZhbHVlUmVmID0gdGhpcy52YWx1ZVJlZi5zdGFydHNXaXRoKCcuJykgPyB0aGlzLnZhbHVlUmVmLnN1YnN0cmluZygxKSA6IHRoaXMudmFsdWVSZWY7XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IGRpc3BsYXlNb2RlO1xuICAgIC8qIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGJlY2F1c2UgcmVxdWlyZWQgaXMgc3VwcG9zZWQgdG8gYmUgcGFzc2VkIGFzIGEgYm9vbGVhbiBhbmQgTk9UIGFzIGEgc3RyaW5nICovXG4gICAgbGV0IHsgcmVxdWlyZWQsIGRpc2FibGVkIH0gPSBjb25maWdQcm9wcztcbiAgICBbcmVxdWlyZWQsIGRpc2FibGVkXSA9IFtyZXF1aXJlZCwgZGlzYWJsZWRdLm1hcChwcm9wID0+IHByb3AgPT09IHRydWUgfHwgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wID09PSAndHJ1ZScpKTtcblxuICAgIHRoaXMuY2F0ZWdvcnlOYW1lID0gJyc7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLnB5Q2F0ZWdvcnlOYW1lKSB7XG4gICAgICB0aGlzLmNhdGVnb3J5TmFtZSA9IHZhbHVlLnB5Q2F0ZWdvcnlOYW1lO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZT8ucHhSZXN1bHRzICYmICt2YWx1ZS5weUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlLnB4UmVzdWx0cy5tYXAoZiA9PiB0aGlzLmJ1aWxkRmlsZVByb3BzRnJvbVJlc3BvbnNlKGYpKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzKCk7XG4gIH1cblxuICBidWlsZEZpbGVQcm9wc0Zyb21SZXNwb25zZShyZXNwT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG1ldGE6IGAke3Jlc3BPYmoucHlDYXRlZ29yeU5hbWV9LCAke3Jlc3BPYmoucHhDcmVhdGVPcGVyYXRvcn1gLFxuICAgICAgICBuYW1lOiByZXNwT2JqLnB5QXR0YWNoTmFtZSxcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKHJlc3BPYmoucHlNaW1lRmlsZUV4dGVuc2lvbilcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVByb3BzOiB7XG4gICAgICAgIC4uLnJlc3BPYmpcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlNb2RlICE9PSAnRElTUExBWV9PTkxZJykge1xuICAgICAgY29uc3QgY3VycmVudEF0dGFjaG1lbnRMaXN0ID0gdGhpcy5nZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICAvLyBibG9jayBkdXBsaWNhdGUgZmlsZXMgdG8gcmVkdXggc3RvcmUgd2hlbiBhZGRlZCAxIGFmdGVyIGFub3RoZXIgdG8gcHJldmVudCBtdWx0aXBsZSBkdXBsaWNhdGVzIGJlaW5nIGFkZGVkIHRvIHRoZSBjYXNlIG9uIHN1Ym1pdFxuICAgICAgY29uc3QgdGVtcEZpbGVzID0gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiBjdXJyZW50QXR0YWNobWVudExpc3QuZmluZEluZGV4KGZyID0+IGZyLklEID09PSBmLklEKSA9PT0gLTEgJiYgIWYuaW5Qcm9ncmVzcyAmJiBmLnJlc3BvbnNlUHJvcHMpO1xuICAgICAgY29uc3QgdXBkYXRlZEF0dExpc3QgPSBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi50ZW1wRmlsZXNdO1xuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50U3RhdGUodGhpcy5wQ29ubiQsIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgdXBkYXRlZEF0dExpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlKCkge1xuICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZSh0aGlzLnBDb25uJD8uZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMudmFsdWVSZWYpLCB1bmRlZmluZWQsIHtcbiAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShmaWxlT2JqOiBhbnkpIHtcbiAgICBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKVxuICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgc2hvdWxkIGJlIG9wdGlvbmFsXG4gICAgICAuZG93bmxvYWRBdHRhY2htZW50KGZpbGVPYmoucHpJbnNLZXksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpXG4gICAgICAudGhlbigoY29udGVudDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGVPYmoucHlBdHRhY2hOYW1lLnNwbGl0KCcuJykucG9wKCk7XG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkKGNvbnRlbnQuZGF0YSwgZmlsZU9iai5weUZpbGVOYW1lLCBleHRlbnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZpbGVEb3dubG9hZCA9IChkYXRhLCBmaWxlTmFtZSwgZXh0KSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGV4dCA/IGAke2ZpbGVOYW1lfS4ke2V4dH1gIDogZmlsZU5hbWU7XG4gICAgZG93bmxvYWQoYXRvYihkYXRhKSwgZmlsZSk7XG4gIH07XG5cbiAgZ2V0QXR0YWNobWVudEtleSA9IChuYW1lID0gJycpID0+IChuYW1lID8gYGF0dGFjaG1lbnRzTGlzdC4ke25hbWV9YCA6ICdhdHRhY2htZW50c0xpc3QnKTtcblxuICBnZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KGtleSwgY29udGV4dCkge1xuICAgIHJldHVybiBQQ29yZS5nZXRTdG9yZVZhbHVlKGAuJHtrZXl9YCwgJ2NvbnRleHRfZGF0YScsIGNvbnRleHQpIHx8IFtdO1xuICB9XG5cbiAgdmFsaWRhdGVNYXhTaXplKGZpbGVPYmosIG1heFNpemVJbk1CKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmlsZVNpemUgPSAoZmlsZU9iai5zaXplIC8gMTA0ODU3NikudG9GaXhlZCgyKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChmaWxlU2l6ZSkgPCBwYXJzZUZsb2F0KG1heFNpemVJbk1CKTtcbiAgfVxuXG4gIHZhbGlkYXRlRmlsZUV4dGVuc2lvbiA9IChmaWxlT2JqLCBhbGxvd2VkRXh0ZW5zaW9ucykgPT4ge1xuICAgIGlmICghYWxsb3dlZEV4dGVuc2lvbnMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9uTGlzdCA9IGFsbG93ZWRFeHRlbnNpb25zXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLnJlcGxhY2VBbGwoJy4nLCAnJykudHJpbSgpKTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlT2JqLm5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBhbGxvd2VkRXh0ZW5zaW9uTGlzdC5pbmNsdWRlcyhleHRlbnNpb24pO1xuICB9O1xuXG4gIHVwZGF0ZUF0dGFjaG1lbnRTdGF0ZShwQ29ubiwga2V5LCBhdHRhY2htZW50cykge1xuICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZSh0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpLCBrZXksIGF0dGFjaG1lbnRzLCB7XG4gICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVGaWxlKGZpbGUpIHtcbiAgICBjb25zdCBhdHRhY2htZW50c0xpc3Q6IGFueVtdID0gW107XG4gICAgbGV0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy52YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuXG4gICAgLy8gSWYgZmlsZSB0byBiZSBkZWxldGVkIGlzIHRoZSBvbmUgYWRkZWQgaW4gcHJldmlvdXMgc3RhZ2UgaS5lLiBmb3Igd2hpY2ggYSBmaWxlIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gc2VydmVyXG4gICAgLy8gbm8gbmVlZCB0byBmaWx0ZXIgY3VycmVudEF0dGFjaG1lbnRMaXN0IGFzIHdlIHdpbGwgZ2V0IGFub3RoZXIgZW50cnkgb2YgZmlsZSBpbiByZWR1eCB3aXRoIGRlbGV0ZSAmIGxhYmVsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuc2FmZS1vcHRpb25hbC1jaGFpbmluZ1xuICAgIGlmICh0aGlzLnZhbHVlJCAmJiB0aGlzLnZhbHVlJD8ucHhSZXN1bHRzICYmICt0aGlzLnZhbHVlJD8ucHlDb3VudCA+IDAgJiYgZmlsZS5yZXNwb25zZVByb3BzICYmIGZpbGU/LnJlc3BvbnNlUHJvcHM/LnB6SW5zS2V5ICE9PSAndGVtcCcpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHRhY2htZW50cyA9IHRoaXMuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICBpZiAoZi5yZXNwb25zZVByb3BzICYmIGYucmVzcG9uc2VQcm9wcy5wekluc0tleSA9PT0gZmlsZS5yZXNwb25zZVByb3BzLnB6SW5zS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZiwgZGVsZXRlOiB0cnVlLCBsYWJlbDogdGhpcy52YWx1ZVJlZiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHVwZGF0aW5nIHRoZSByZWR1eCBzdG9yZSB0byBoZWxwIGZvcm0taGFuZGxlciBpbiBwYXNzaW5nIHRoZSBkYXRhIHRvIGRlbGV0ZSB0aGUgZmlsZSBmcm9tIHNlcnZlclxuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50U3RhdGUodGhpcy5wQ29ubiQsIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgWy4uLnVwZGF0ZWRBdHRhY2htZW50c10pO1xuICAgICAgY29uc3QgbmV3bHlBZGRlZEZpbGVzID0gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiAhIWYuSUQpO1xuICAgICAgY29uc3QgZmlsZXNQb3N0RGVsZXRlID0gdGhpcy5maWxlcy5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5yZXNwb25zZVByb3BzPy5wekluc0tleSAhPT0gJ3RlbXAnICYmIGYucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXkgIT09IGZpbGUucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXlcbiAgICAgICk7XG4gICAgICB0aGlzLmZpbGVzID0gWy4uLmZpbGVzUG9zdERlbGV0ZSwgLi4ubmV3bHlBZGRlZEZpbGVzXTtcbiAgICB9IC8vICBpZiB0aGUgZmlsZSBiZWluZyBkZWxldGVkIGlzIHRoZSBhZGRlZCBpbiB0aGlzIHN0YWdlICBpLmUuIHdob3NlIGRhdGEgaXMgbm90IHlldCBjcmVhdGVkIGluIHNlcnZlclxuICAgIGVsc2Uge1xuICAgICAgLy8gZmlsdGVyIG5ld2x5IGFkZGVkIGZpbGVzIGluIHRoaXMgc3RhZ2UsIGxhdGVyIHRoZSB1cGRhdGVkIGN1cnJlbnQgc3RhZ2UgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byByZWR1eCBvbmNlIGZpbGVzIHN0YXRlIGlzIHVwZGF0ZWRcbiAgICAgIGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maWx0ZXIoZiA9PiBmLklEICE9PSBmaWxlLklEKTtcbiAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcihmID0+IGYuSUQgIT09IGZpbGUuSUQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRTdGF0ZSh0aGlzLnBDb25uJCwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMudmFsdWVSZWYpLCBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi5hdHRhY2htZW50c0xpc3RdKTtcbiAgICAgIGlmIChmaWxlLmluUHJvZ3Jlc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgc2hvdWxkIGJlIG9wdGlvbmFsXG4gICAgICAgIFBDb3JlLmdldEF0dGFjaG1lbnRVdGlscygpLmNhbmNlbFJlcXVlc3QoZmlsZS5JRCwgcENvbm4uZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWxlc1dpdGhFcnJvciA9IHRoaXMuZmlsZXNXaXRoRXJyb3I/LmZpbHRlcihmID0+IGYuSUQgIT09IGZpbGUuSUQpO1xuICAgIGlmICh0aGlzLmZpbGVzV2l0aEVycm9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhckZpZWxkRXJyb3JNZXNzYWdlcygpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgIHRoaXMuZmlsZUlucHV0ICYmIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPyBudWxsIDogJyc7XG4gIH1cblxuICBvbkZpbGVBZGRlZChldmVudCkge1xuICAgIGxldCBhZGRlZEZpbGVzID0gQXJyYXkuZnJvbShldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIGFkZGVkRmlsZXMgPSB0aGlzLmFsbG93TXVsdGlwbGUkID8gYWRkZWRGaWxlcyA6IFthZGRlZEZpbGVzWzBdXTtcbiAgICBjb25zdCBtYXhBdHRhY2htZW50U2l6ZSA9IFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldE1heEF0dGFjaG1lbnRTaXplKCkgfHwgJzUnO1xuICAgIHRoaXMudGVtcEZpbGVzVG9CZVVwbG9hZGVkID0gW1xuICAgICAgLi4uYWRkZWRGaWxlcy5tYXAoKGY6IGFueSwgaW5kZXgpID0+IHtcbiAgICAgICAgZi5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG4gICAgICAgIGYuaW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIGYucHJvcHMgPSB7XG4gICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgIG5hbWU6IGYubmFtZSxcbiAgICAgICAgICBpY29uOiB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZi50eXBlKSxcbiAgICAgICAgICBvbkRlbGV0ZTogKCkgPT4gdGhpcy5kZWxldGVGaWxlKGYpXG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZiwgbWF4QXR0YWNobWVudFNpemUpKSB7XG4gICAgICAgICAgZi5wcm9wcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgZi5wcm9wcy5tZXRhID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoYEZpbGUgaXMgdG9vIGJpZy4gTWF4IGFsbG93ZWQgc2l6ZSBpcyAke21heEF0dGFjaG1lbnRTaXplfU1CLmAsICcnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsaWRhdGVGaWxlRXh0ZW5zaW9uKGYsIHRoaXMuZXh0ZW5zaW9ucyQpKSB7XG4gICAgICAgICAgZi5wcm9wcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgZi5wcm9wcy5tZXRhID0gYCR7dGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoXG4gICAgICAgICAgICAnRmlsZSBoYXMgaW52YWxpZCBleHRlbnNpb24uIEFsbG93ZWQgZXh0ZW5zaW9ucyBhcmU6JyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApfSAke3RoaXMuZXh0ZW5zaW9ucyQucmVwbGFjZUFsbCgnLicsICcnKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmLnByb3BzLmVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgICAgICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIFR5cGUgJ3sgdHlwZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IH0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ01lc3NhZ2VzQ29uZmlnT2JqZWN0Jy5cbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBwQ29ubi5nZXRMb2NhbGl6ZWRWYWx1ZSgnRXJyb3Igd2l0aCBvbmUgb3IgbW9yZSBmaWxlcycsICcnLCAnJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHByb3BlcnR5OiBmaWVsZE5hbWUsXG4gICAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGY7XG4gICAgICB9KVxuICAgIF07XG4gICAgY29uc3QgdGVtcEZpbGVzV2l0aEVycm9yID0gdGhpcy50ZW1wRmlsZXNUb0JlVXBsb2FkZWQuZmlsdGVyKGYgPT4gZi5wcm9wcy5lcnJvcik7XG4gICAgaWYgKHRlbXBGaWxlc1dpdGhFcnJvci5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpbGVzV2l0aEVycm9yID0gdGVtcEZpbGVzV2l0aEVycm9yO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYWxsb3dNdWx0aXBsZSQpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSBbLi4udGhpcy50ZW1wRmlsZXNUb0JlVXBsb2FkZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbGVzID0gWy4uLnRoaXMuZmlsZXMsIC4uLnRoaXMudGVtcEZpbGVzVG9CZVVwbG9hZGVkXTtcbiAgICB9XG4gICAgdGhpcy51cGxvYWRGaWxlcygpO1xuICB9XG5cbiAgY2xlYXJGaWVsZEVycm9yTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuY2xlYXJNZXNzYWdlcyh7XG4gICAgICB0eXBlOiBQQ29yZS5nZXRDb25zdGFudHMoKS5NRVNTQUdFUy5NRVNTQUdFU19UWVBFX0VSUk9SLFxuICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgIHBhZ2VSZWZlcmVuY2U6IHRoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKSxcbiAgICAgIGNvbnRleHRcbiAgICB9KTtcbiAgfVxuXG4gIG9uVXBsb2FkUHJvZ3Jlc3MoKSB7fVxuXG4gIGVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGF0dGFjaGVkRmlsZSkge1xuICAgIHJldHVybiBlcnJvciA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hDYW5jZWxlZChlcnJvcikpIHtcbiAgICAgICAgbGV0IHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnU29tZXRoaW5nIHdlbnQgd3JvbmcnLCAnJywgJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2UuZGF0YSAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlscykge1xuICAgICAgICAgIHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZShlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlsc1swXS5sb2NhbGl6ZWRWYWx1ZSwgJycsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICAgIGlmIChmLklEID09PSBhdHRhY2hlZEZpbGUuSUQpIHtcbiAgICAgICAgICAgIGYucHJvcHMubWV0YSA9IHVwbG9hZEZhaWxNc2c7XG4gICAgICAgICAgICBmLnByb3BzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIGYucHJvcHMub25EZWxldGUgPSAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZik7XG4gICAgICAgICAgICBmLnByb3BzLmljb24gPSB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZi50eXBlKTtcbiAgICAgICAgICAgIGYucHJvcHMubmFtZSA9IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdVbmFibGUgdG8gdXBsb2FkIGZpbGUnLCAnJywgJycpO1xuICAgICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAgICAgICAgIC8vIHNldCBlcnJvcnMgdG8gcHJvcGVydHkgdG8gYmxvY2sgc3VibWl0IGV2ZW4gb24gZXJyb3JzIGluIGZpbGUgdXBsb2FkXG4gICAgICAgICAgICBQQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2VzKHtcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIFR5cGUgJ3sgdHlwZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IH0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ01lc3NhZ2VzQ29uZmlnT2JqZWN0Jy5cbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBmLnByb3BzLnByb2dyZXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9O1xuICB9XG5cbiAgdXBsb2FkRmlsZXMoKSB7XG4gICAgY29uc3QgZmlsZXNUb0JlVXBsb2FkZWQgPSB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKGUgPT4ge1xuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZCA9IGUucHJvcHMgJiYgZS5wcm9wcy5wcm9ncmVzcyA9PT0gMTAwO1xuICAgICAgICBjb25zdCBmaWxlSGFzRXJyb3IgPSBlLnByb3BzICYmIGUucHJvcHMuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcCA9IGUucmVzcG9uc2VQcm9wcyAmJiBlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG4gICAgICAgIHJldHVybiAhaXNGaWxlVXBsb2FkZWQgJiYgIWZpbGVIYXNFcnJvciAmJiAhaXNGaWxlVXBsb2FkZWRpbkxhc3RTdGVwO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZiA9PlxuICAgICAgICB3aW5kb3cuUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCkudXBsb2FkQXR0YWNobWVudChcbiAgICAgICAgICBmLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNGZXRjaENhbmNlbGVkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGYpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICApXG4gICAgICApO1xuICAgIFByb21pc2UuYWxsU2V0dGxlZChmaWxlc1RvQmVVcGxvYWRlZClcbiAgICAgIC50aGVuKChmaWxlUmVzcG9uc2VzOiBhbnkpID0+IHtcbiAgICAgICAgZmlsZVJlc3BvbnNlcyA9IGZpbGVSZXNwb25zZXMuZmlsdGVyKGZyID0+IGZyLnN0YXR1cyAhPT0gJ3JlamVjdGVkJyk7IC8vIGluIGNhc2Ugb2YgZGVsZXRpbmcgYW4gaW4gcHJvZ3Jlc3MgZmlsZSwgcHJvbWlzZSBnZXRzIGNhbmNlbGxlZCBidXQgc3RpbGwgZW50ZXJzIHRoZW4gYmxvY2tcbiAgICAgICAgaWYgKGZpbGVSZXNwb25zZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmlsZVJlc3BvbnNlcy5maW5kSW5kZXgoKGZyOiBhbnkpID0+IGZyLnZhbHVlLmNsaWVudEZpbGVJRCA9PT0gZi5JRCk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBmLnByb3BzLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnVXBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJycsICcnKTtcbiAgICAgICAgICAgICAgZi5wcm9wcy5wcm9ncmVzcyA9IDEwMDtcbiAgICAgICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGYuaGFuZGxlID0gZmlsZVJlc3BvbnNlc1tpbmRleF0udmFsdWUuSUQ7XG4gICAgICAgICAgICAgIGYubGFiZWwgPSB0aGlzLnZhbHVlUmVmO1xuICAgICAgICAgICAgICBmLmNhdGVnb3J5ID0gdGhpcy5jYXRlZ29yeU5hbWU7XG4gICAgICAgICAgICAgIGYucmVzcG9uc2VQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBwekluc0tleTogJ3RlbXAnLFxuICAgICAgICAgICAgICAgIHB5QXR0YWNoTmFtZTogZi5wcm9wcy5uYW1lXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50cygpO1xuICAgICAgICAgIGlmICh0aGlzLmZpbGVzV2l0aEVycm9yPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWVsZEVycm9yTWVzc2FnZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkNBU0VfRVZFTlRTLkFTU0lHTk1FTlRfU1VCTUlTU0lPTiwgdGhpcy5jYXNlSUQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsZS11cGxvYWQtY29udGFpbmVyXCIgKm5nSWY9XCJiVmlzaWJsZSRcIj5cbiAgPHNwYW4gY2xhc3M9XCJhdHRhY2htZW50LWxhYmVsXCIgW25nQ2xhc3NdPVwieyAnZmlsZS1sYWJlbCc6IGJSZXF1aXJlZCQgfVwiPnt7IGxhYmVsJCB9fTwvc3Bhbj5cbiAgPGRpdiAqbmdJZj1cIihmaWxlcy5sZW5ndGggPT09IDAgJiYgIWFsbG93TXVsdGlwbGUkKSB8fCBhbGxvd011bHRpcGxlJFwiPlxuICAgIDxkaXZcbiAgICAgIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTBweFwiXG4gICAgICBpZD1cImF0dGFjaG1lbnQtY29udGFpbmVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cInZhbGlkYXRlTWVzc2FnZSA/ICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3ItZXJyb3InIDogJ3BzZGstbW9kYWwtZmlsZS1zZWxlY3RvcidcIlxuICAgID5cbiAgICAgIDxkaXYgW2hpZGRlbl09XCJ0cnVlXCIgaWQ9XCJhdHRhY2htZW50LUlEXCI+XG4gICAgICAgIHt7IHZhbHVlUmVmIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxpbnB1dCBoaWRkZW4gdHlwZT1cImZpbGVcIiBbcmVxdWlyZWRdPVwiYlJlcXVpcmVkJFwiICN1cGxvYWRlciBbaWRdPVwidmFsdWVSZWZcIiBbbXVsdGlwbGVdPVwiYWxsb3dNdWx0aXBsZSRcIiAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImJEaXNhYmxlZCRcIiAoY2xpY2spPVwidXBsb2FkZXIuY2xpY2soKVwiPlxuICAgICAgICB7e1xuICAgICAgICAgIGFsbG93TXVsdGlwbGUkXG4gICAgICAgICAgICA/IHVwbG9hZE11bHRpcGxlRmlsZXNMYWJlbCA9PT0gJ2ZpbGVfdXBsb2FkX3RleHRfbXVsdGlwbGUnXG4gICAgICAgICAgICAgID8gJ0Nob29zZSBmaWxlcydcbiAgICAgICAgICAgICAgOiB1cGxvYWRNdWx0aXBsZUZpbGVzTGFiZWxcbiAgICAgICAgICAgIDogdXBsb2FkU2luZ2xlRmlsZUxhYmVsID09PSAnZmlsZV91cGxvYWRfdGV4dF9vbmUnXG4gICAgICAgICAgICAgID8gJ0Nob29zZSBhIGZpbGUnXG4gICAgICAgICAgICAgIDogdXBsb2FkU2luZ2xlRmlsZUxhYmVsXG4gICAgICAgIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxzcGFuICpuZ0lmPVwidmFsaWRhdGVNZXNzYWdlXCIgY2xhc3M9XCJmaWxlLWVycm9yXCI+e3sgdmFsaWRhdGVNZXNzYWdlIH19PC9zcGFuPlxuICA8ZGl2ICpuZ0lmPVwiZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWF0dGFjaG1lbnQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBzZGstdXRpbGl0eS1jYXJkLWljb25cIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiIWZpbGUuaW5Qcm9ncmVzc1wiIGNsYXNzPVwicHNkay1hdHRhY2htZW50LWNhcmQtc3ZnLWljb25cIiBzcmM9XCJ7eyBzcmNJbWcgfX1cIiAvPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImZpbGUuaW5Qcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiIGRpYW1ldGVyPVwiNDBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstYXR0YWNobWVudC1jYXJkLW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1hdHRhY2htZW50LWNhcmQtbWFpbi1wcmltYXJ5LWxhYmVsXCI+e3sgZmlsZS5wcm9wcy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGUucHJvcHMubWV0YVwiIFtuZ1N0eWxlXT1cInsgY29sb3I6IGZpbGUucHJvcHMuZXJyb3IgPyAncmVkJyA6IG51bGwgfVwiPnt7IGZpbGUucHJvcHMubWV0YSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstYXR0YWNobWVudC1hY3Rpb25cIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLWF0dGFjaG1lbnRcIiAqbmdJZj1cImZpbGUuSURcIiBjbGFzcz1cInBzZGstdXRpbGl0eS1idXR0b25cIiAoY2xpY2spPVwiZGVsZXRlRmlsZShmaWxlKVwiPlxuICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbi1zdmctaWNvblwiIHNyYz1cInt7IGRlbGV0ZUljb24gfX1cIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsZS5JRFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNldHRpbmctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25NZW51XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2FjdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGZpbGUucmVzcG9uc2VQcm9wcyA/IGZpbGUucmVzcG9uc2VQcm9wcyA6IHt9KVwiPkRvd25sb2FkPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlRmlsZShmaWxlKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==