@arsedizioni/ars-utils 18.5.61 → 19.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +14 -12
  2. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  3. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +41 -41
  4. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  5. package/fesm2022/arsedizioni-ars-utils-core.mjs +99 -99
  6. package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
  7. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +15 -13
  8. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
  9. package/fesm2022/arsedizioni-ars-utils-help.mjs +13 -13
  10. package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
  11. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +14 -12
  12. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  13. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +6 -6
  14. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
  15. package/fesm2022/arsedizioni-ars-utils-tinymce.mjs +7 -7
  16. package/fesm2022/arsedizioni-ars-utils-tinymce.mjs.map +1 -1
  17. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +58 -58
  18. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  19. package/fesm2022/arsedizioni-ars-utils-ui.mjs +34 -34
  20. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  21. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +7 -7
  22. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
  23. package/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
  24. package/package.json +9 -33
  25. package/clipper.ui/ui/clipper.scss +0 -530
  26. package/esm2022/arsedizioni-ars-utils.mjs +0 -5
  27. package/esm2022/clipper.common/arsedizioni-ars-utils-clipper.common.mjs +0 -5
  28. package/esm2022/clipper.common/common/common.module.mjs +0 -16
  29. package/esm2022/clipper.common/common/definitions.mjs +0 -2041
  30. package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +0 -100
  31. package/esm2022/clipper.common/common/messages.mjs +0 -36
  32. package/esm2022/clipper.common/common/services/clipper.service.mjs +0 -1009
  33. package/esm2022/clipper.common/public_api.mjs +0 -5
  34. package/esm2022/clipper.ui/arsedizioni-ars-utils-clipper.ui.mjs +0 -5
  35. package/esm2022/clipper.ui/documents.mjs +0 -50
  36. package/esm2022/clipper.ui/public_api.mjs +0 -18
  37. package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +0 -766
  38. package/esm2022/clipper.ui/ui/document/document.component.mjs +0 -688
  39. package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +0 -118
  40. package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +0 -441
  41. package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +0 -217
  42. package/esm2022/clipper.ui/ui/references/references.component.mjs +0 -380
  43. package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +0 -116
  44. package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +0 -339
  45. package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +0 -251
  46. package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +0 -17
  47. package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +0 -106
  48. package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +0 -120
  49. package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +0 -531
  50. package/esm2022/core/arsedizioni-ars-utils-core.mjs +0 -5
  51. package/esm2022/core/core.module.mjs +0 -151
  52. package/esm2022/core/dateFnsAdapter.mjs +0 -203
  53. package/esm2022/core/definitions.mjs +0 -47
  54. package/esm2022/core/directives/autoFocusDirective.mjs +0 -22
  55. package/esm2022/core/directives/changeDateIntervalDirective.mjs +0 -48
  56. package/esm2022/core/directives/copyClipboardDirective.mjs +0 -46
  57. package/esm2022/core/directives/validators.mjs +0 -502
  58. package/esm2022/core/pipes/format.pipe.mjs +0 -53
  59. package/esm2022/core/pipes/replace.pipe.mjs +0 -29
  60. package/esm2022/core/pipes/safe-html.pipe.mjs +0 -24
  61. package/esm2022/core/pipes/safe-url.pipe.mjs +0 -24
  62. package/esm2022/core/pipes/search-callback.pipe.mjs +0 -21
  63. package/esm2022/core/pipes/search-filter.pipe.mjs +0 -50
  64. package/esm2022/core/public_api.mjs +0 -22
  65. package/esm2022/core/selectable.mjs +0 -131
  66. package/esm2022/core/services/broadcast.service.mjs +0 -35
  67. package/esm2022/core/services/broadcastChannelManager.mjs +0 -80
  68. package/esm2022/core/services/environment.service.mjs +0 -29
  69. package/esm2022/core/services/screen.service.mjs +0 -23
  70. package/esm2022/core/services/theme.service.mjs +0 -140
  71. package/esm2022/core/system.mjs +0 -664
  72. package/esm2022/evolution.common/arsedizioni-ars-utils-evolution.common.mjs +0 -5
  73. package/esm2022/evolution.common/common/common.module.mjs +0 -16
  74. package/esm2022/evolution.common/common/definitions.mjs +0 -454
  75. package/esm2022/evolution.common/common/interceptors/auth.interceptor.mjs +0 -100
  76. package/esm2022/evolution.common/common/messages.mjs +0 -8
  77. package/esm2022/evolution.common/common/services/evolution.service.mjs +0 -488
  78. package/esm2022/evolution.common/public_api.mjs +0 -5
  79. package/esm2022/help/arsedizioni-ars-utils-help.mjs +0 -5
  80. package/esm2022/help/components/help-viewer/help-viewer.component.mjs +0 -442
  81. package/esm2022/help/definitions.mjs +0 -2
  82. package/esm2022/help/help.module.mjs +0 -12
  83. package/esm2022/help/public_api.mjs +0 -7
  84. package/esm2022/help/services/help.service.mjs +0 -77
  85. package/esm2022/public_api.mjs +0 -15
  86. package/esm2022/support.common/arsedizioni-ars-utils-support.common.mjs +0 -5
  87. package/esm2022/support.common/common/common.module.mjs +0 -16
  88. package/esm2022/support.common/common/definitions.mjs +0 -29
  89. package/esm2022/support.common/common/interceptors/auth.interceptor.mjs +0 -100
  90. package/esm2022/support.common/common/messages.mjs +0 -13
  91. package/esm2022/support.common/common/services/support.service.mjs +0 -287
  92. package/esm2022/support.common/public_api.mjs +0 -8
  93. package/esm2022/support.ui/arsedizioni-ars-utils-support.ui.mjs +0 -5
  94. package/esm2022/support.ui/public_api.mjs +0 -5
  95. package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +0 -80
  96. package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +0 -233
  97. package/esm2022/tinymce/arsedizioni-ars-utils-tinymce.mjs +0 -5
  98. package/esm2022/tinymce/full-screen-editor/full-screen-editor.component.mjs +0 -48
  99. package/esm2022/tinymce/public_api.mjs +0 -7
  100. package/esm2022/tinymce/tinymce.module.mjs +0 -19
  101. package/esm2022/tinymce/utils.mjs +0 -150
  102. package/esm2022/ui/arsedizioni-ars-utils-ui.mjs +0 -5
  103. package/esm2022/ui/public_api.mjs +0 -12
  104. package/esm2022/ui/ui/components/button-selector/button-selector.component.mjs +0 -150
  105. package/esm2022/ui/ui/components/button-toggle/button-toggle.component.mjs +0 -51
  106. package/esm2022/ui/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
  107. package/esm2022/ui/ui/components/chips-selector/chips-selector.component.mjs +0 -272
  108. package/esm2022/ui/ui/components/file-input/file-input.component.mjs +0 -264
  109. package/esm2022/ui/ui/components/file-preview/file-preview.component.mjs +0 -73
  110. package/esm2022/ui/ui/components/filter-bar/filter-bar.component.mjs +0 -356
  111. package/esm2022/ui/ui/definitions.mjs +0 -2
  112. package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +0 -47
  113. package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +0 -101
  114. package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +0 -86
  115. package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +0 -51
  116. package/esm2022/ui/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
  117. package/esm2022/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
  118. package/esm2022/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
  119. package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +0 -49
  120. package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +0 -89
  121. package/esm2022/ui/ui/dialogs/select/select-dialog.component.mjs +0 -374
  122. package/esm2022/ui/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
  123. package/esm2022/ui/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
  124. package/esm2022/ui/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
  125. package/esm2022/ui/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
  126. package/esm2022/ui/ui/dialogs/toast/toast.component.mjs +0 -32
  127. package/esm2022/ui/ui/directives/resize-table-column.directive.mjs +0 -63
  128. package/esm2022/ui/ui/filters.mjs +0 -43
  129. package/esm2022/ui/ui/paginatorIntl.mjs +0 -34
  130. package/esm2022/ui/ui/services/dialog.service.mjs +0 -417
  131. package/esm2022/ui/ui/services/ui.service.mjs +0 -21
  132. package/esm2022/ui/ui/ui.module.mjs +0 -21
  133. package/esm2022/ui.application/arsedizioni-ars-utils-ui.application.mjs +0 -5
  134. package/esm2022/ui.application/public_api.mjs +0 -21
  135. package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +0 -150
  136. package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +0 -51
  137. package/esm2022/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
  138. package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +0 -272
  139. package/esm2022/ui.application/ui/components/file-input/file-input.component.mjs +0 -264
  140. package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +0 -73
  141. package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +0 -356
  142. package/esm2022/ui.application/ui/definitions.mjs +0 -31
  143. package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
  144. package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
  145. package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
  146. package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +0 -374
  147. package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
  148. package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
  149. package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
  150. package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
  151. package/esm2022/ui.application/ui/directives/resize-table-column.directive.mjs +0 -63
  152. package/esm2022/ui.application/ui/filters.mjs +0 -43
  153. package/esm2022/ui.application/ui/services/applicationDialog.service.mjs +0 -304
  154. package/esm2022/ui.application/ui/ui.module.mjs +0 -30
  155. package/esm2022/ui.oauth/arsedizioni-ars-utils-ui.oauth.mjs +0 -5
  156. package/esm2022/ui.oauth/public_api.mjs +0 -6
  157. package/esm2022/ui.oauth/ui/components/login/login-oauth.component.mjs +0 -199
  158. package/esm2022/ui.oauth/ui/definitions.mjs +0 -7
  159. package/esm2022/ui.oauth/ui/ui.module.mjs +0 -13
  160. package/styles/ui.colors.scss +0 -77
  161. package/styles/ui.scss +0 -318
  162. package/ui/ui/components/button-selector/button-selector.component.d.ts +0 -52
  163. package/ui/ui/components/button-toggle/button-toggle.component.d.ts +0 -28
  164. package/ui/ui/components/calendar-empty-header/calendar-empy-header.component.d.ts +0 -11
  165. package/ui/ui/components/chips-selector/chips-selector.component.d.ts +0 -82
  166. package/ui/ui/components/file-input/file-input.component.d.ts +0 -88
  167. package/ui/ui/components/file-preview/file-preview.component.d.ts +0 -26
  168. package/ui/ui/components/filter-bar/filter-bar.component.d.ts +0 -83
  169. package/ui/ui/dialogs/prompt/prompt-dialog.component.d.ts +0 -18
  170. package/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.d.ts +0 -18
  171. package/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.d.ts +0 -18
  172. package/ui/ui/dialogs/select/select-dialog.component.d.ts +0 -122
  173. package/ui/ui/dialogs/select-file/select-file-dialog.component.d.ts +0 -36
  174. package/ui/ui/dialogs/select-picture/select-picture-dialog.component.d.ts +0 -26
  175. package/ui/ui/dialogs/select-tree/select-tree-dialog.component.d.ts +0 -98
  176. package/ui/ui/dialogs/send-to/send-to-dialog.component.d.ts +0 -28
  177. package/ui/ui/directives/resize-table-column.directive.d.ts +0 -19
  178. package/ui/ui/filters.d.ts +0 -57
@@ -1,441 +0,0 @@
1
- import { Clipboard } from '@angular/cdk/clipboard';
2
- import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
- import { ClipperMessages, ClipperModel, ClipperModule, ClipperQueryReferencesMode, ClipperService } from '@arsedizioni/ars-utils/clipper.common';
4
- import { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';
5
- import { ApplicationDialogService, SendToDialogComponent } from '@arsedizioni/ars-utils/ui.application';
6
- import saveAs from 'file-saver';
7
- import { ClipperReferencesComponent } from '../references/references.component';
8
- import { finalize } from 'rxjs';
9
- import * as i0 from "@angular/core";
10
- export class ClipperDocumentManager {
11
- constructor() {
12
- this.clipboard = inject(Clipboard);
13
- this.clipperService = inject(ClipperService);
14
- this.broadcastService = inject(BroadcastService);
15
- this.dialogService = inject(ApplicationDialogService);
16
- }
17
- /**
18
- * Export a document in pdf format
19
- * @param item : the document to export
20
- */
21
- exportPdf(item) {
22
- if (!this.clipperService.loggedIn())
23
- return;
24
- if (!item)
25
- return;
26
- this.dialogService
27
- .confirm("Confermi l'esportazione?", 'Attenzione!')
28
- .componentInstance.choosen.subscribe((data) => {
29
- if (data.result === 'ok') {
30
- const id = item.id || item.documentId;
31
- this.dialogService.busy('Esportazione in corso...');
32
- this.clipperService.exportPdf(id)
33
- .pipe(finalize(() => this.dialogService.clearBusy()))
34
- .subscribe(r => {
35
- saveAs(r, (item.title1 ? item.title1 : id) + '.pdf');
36
- });
37
- }
38
- });
39
- }
40
- /**
41
- * Export current document list or just the selected documents as a csv
42
- * @param documentIds: the document id list
43
- * @param searchParams: the search params
44
- * @param format: the export format: 1) list 2) deadlines
45
- */
46
- exportItems(documentIds, searchParams = null, format = 1) {
47
- if (!this.clipperService.loggedIn())
48
- return;
49
- let model = { ids: documentIds ?? [], query: null, format: format };
50
- if (!model.ids || model.ids.length === 0) {
51
- model.query = searchParams;
52
- }
53
- this.dialogService.busy('Salvataggio in corso...');
54
- this.clipperService.export(model)
55
- .pipe(finalize(() => this.dialogService.clearBusy()))
56
- .subscribe(r => {
57
- if (r.type === 'application/json') {
58
- r.text().then(json => this.dialogService.error(JSON.parse(json).message));
59
- }
60
- else {
61
- if (format === 1) {
62
- saveAs(r, 'elenco.csv');
63
- }
64
- else {
65
- saveAs(r, 'scadenze.ics');
66
- }
67
- }
68
- });
69
- }
70
- /**
71
- * Export a single deadline
72
- * @param item : the document to export
73
- */
74
- exportDeadline(item) {
75
- this.exportItems([item.documentId], null, 2);
76
- }
77
- /**
78
- * Archive a list of items
79
- * @param items: the item list
80
- */
81
- addToArchive(items) {
82
- this.broadcastService.sendMessage(ClipperMessages.COMMAND_ARCHIVE_ADD, items);
83
- }
84
- /**
85
- * Create a new deadline
86
- * @param item : the item to add
87
- */
88
- addToCalendar(item) {
89
- this.broadcastService.sendMessage(ClipperMessages.COMMAND_CALENDAR_ADD, item);
90
- }
91
- /**
92
- * Add a list of items to working documents
93
- * @param items : the item list
94
- */
95
- addItemsToWorkingDocuments(items) {
96
- this.broadcastService.sendMessage(ClipperMessages.COMMAND_WORKING_ADD, items);
97
- }
98
- /**
99
- * Add a list of items to working documents
100
- * @param items : the item list
101
- */
102
- addItemsToBag(items) {
103
- if (!this.clipperService.loggedIn())
104
- return;
105
- this.clipperService.addToBag(items?.map(n => n.documentId ?? n.id) ?? []);
106
- }
107
- /**
108
- * Copy metadata to clipboard
109
- * @param item : the item to copy
110
- */
111
- copyMetadataToClipboard(item) {
112
- if (!item || item.model === ClipperModel.Coordinamento)
113
- return;
114
- let meta = (item.id ?? item.documentId) + '\t' +
115
- item.title1?.replaceAll("\r\n", " ") + '\t';
116
- if (item.title2)
117
- meta += item.title2.replaceAll("\r\n", " ");
118
- meta += '\t';
119
- if (item.number)
120
- meta += item.number;
121
- meta += '\t';
122
- if (item.publishingDate) {
123
- item.publishingDate = new Date(item.publishingDate);
124
- meta += SystemUtils.formatDate(item.publishingDate);
125
- }
126
- else if (item.date) {
127
- item.date = new Date(item.date);
128
- meta += SystemUtils.formatDate(item.date);
129
- }
130
- meta += '\t';
131
- if (item.originDescription)
132
- meta += item.originDescription;
133
- this.clipboard.copy(meta);
134
- this.dialogService.toast("Metadati copiati negli appunti.");
135
- }
136
- /**
137
- * Show a document permalink
138
- * @param item : the item to show the link for
139
- */
140
- showLink(item) {
141
- if (!item)
142
- return;
143
- let id = item.id ? item.id : item.documentId;
144
- const channels = item.channelName
145
- ? 'Canali: ' + item.channelName + '<br>'
146
- : '';
147
- let origin = item.origin
148
- ? 'Origine: ' +
149
- item.origin +
150
- ' - ' +
151
- (item.originDescription ? item.originDescription : '') +
152
- '<br>'
153
- : '';
154
- const topics = item.topics ? 'Argomento: ' + item.topics + '<br>' : '';
155
- if (!id)
156
- return;
157
- let message = "<p >Il link che trovi qui sotto è un riferimento diretto al documento selezionato.</p>" +
158
- "<p >Lo puoi utilizzare nella tua documentazione o inviarlo per email ad un tuo collega. La persona che desidererà visualizzare il documento dovrà necessariamente essere un utente abbonato.</p>" +
159
- "<p >Seleziona e copia (fai CTRL+C) il link qui sotto.</p>" +
160
- "<div class='small accent'>" +
161
- 'https://clipper.arsedizioni.it/?id=' +
162
- id +
163
- '</div>' +
164
- '<br>' +
165
- '<hr>' +
166
- '<p class="small">' +
167
- channels +
168
- origin +
169
- topics;
170
- '</p>';
171
- this.dialogService.info(message, 'Copia link', 'Chiudi');
172
- }
173
- /**
174
- * Send documents links by email
175
- * @param items : the document list
176
- */
177
- sendItemsTo(items) {
178
- if (!this.clipperService.loggedIn())
179
- return;
180
- if (!items || items.length === 0)
181
- return;
182
- const d = this.dialogService.open(SendToDialogComponent, {
183
- ariaLabel: 'invia documenti per email',
184
- autoFocus: false,
185
- restoreFocus: false,
186
- disableClose: false,
187
- closeOnNavigation: false,
188
- data: {
189
- info: 'Puoi inviare i documenti a chi vuoi ma, per poterli visualizzare, è necessario essere un utente abbonato.',
190
- count: items.length,
191
- },
192
- minWidth: '375px',
193
- maxWidth: '600px',
194
- width: '100%',
195
- });
196
- d.componentInstance.done
197
- .subscribe((data) => {
198
- data.ids = items?.map(n => n.documentId ?? n.id) ?? [];
199
- this.dialogService.busy('Invio in corso...');
200
- this.clipperService.sendTo(data)
201
- .pipe(finalize(() => this.dialogService.clearBusy()))
202
- .subscribe(r => {
203
- if (!r.success) {
204
- this.dialogService.error(r.message);
205
- }
206
- else {
207
- this.dialogService.toast('Invio completato con successo.');
208
- d.close();
209
- }
210
- });
211
- });
212
- }
213
- /**
214
- * Display a document report
215
- * @param documentId : the document id
216
- * @param title: the document short title
217
- */
218
- openReport(documentId, title = null) {
219
- if (!this.clipperService.loggedIn())
220
- return;
221
- if (!documentId)
222
- return;
223
- this.clipperService.report(documentId)
224
- .pipe(finalize(() => this.dialogService.clearBusy()))
225
- .subscribe(r => {
226
- saveAs(r, (title ? title : documentId) + '.html');
227
- });
228
- }
229
- /**
230
- * Open an item
231
- * This should be always overridden
232
- * @param documentId : the document id
233
- * @param query : the query document
234
- * @param newWindow: true if the document must be open into a new window
235
- */
236
- open(_documentId, _query = null, _newWindow = false) {
237
- }
238
- /**
239
- * Display a document report
240
- * @param item : the document
241
- */
242
- report(item) {
243
- if (!item)
244
- return;
245
- if (item.model != ClipperModel.NormativaVigente && item.model != ClipperModel.Scadenze) {
246
- this.dialogService.info("Questa funzionalità non è disponibile per questo tipo di documento.");
247
- return;
248
- }
249
- else {
250
- this.openReport(item.documentId, item.title1);
251
- }
252
- }
253
- /**
254
- * Browse document references
255
- * @param document id : the document id
256
- * @param mode : the reference mode
257
- */
258
- openReferences(documentId, mode = ClipperQueryReferencesMode.ReferencesIn) {
259
- if (!documentId)
260
- return;
261
- const d = this.dialogService.open(ClipperReferencesComponent, {
262
- ariaLabel: 'riferimenti legati al documento',
263
- autoFocus: false,
264
- restoreFocus: false,
265
- disableClose: false,
266
- closeOnNavigation: false,
267
- data: { documentId: documentId, mode: mode },
268
- minWidth: '375px',
269
- maxWidth: '1200px',
270
- width: '100%',
271
- height: '100%',
272
- });
273
- d.afterClosed()
274
- .subscribe((r) => {
275
- if (r && r.documentId)
276
- this.open(r.documentId);
277
- });
278
- }
279
- /**
280
- * Manage clipper bag
281
- */
282
- openBag() {
283
- let items = [];
284
- this.clipperService.bag().forEach(n => {
285
- let title = n.title1 ?? n.title2;
286
- items.push({
287
- template: title,
288
- bag: n,
289
- searchBag: { name: title },
290
- });
291
- });
292
- const d = this.dialogService.select({
293
- title: 'Gestisci documenti di lavoro',
294
- multipleSelection: false,
295
- mustSelect: false,
296
- okCaption: 'SELEZIONA',
297
- items: items,
298
- total: items?.length ?? 0,
299
- canDelete: true,
300
- canView: true,
301
- });
302
- d.componentInstance.view
303
- .subscribe((r) => {
304
- let item = r.bag;
305
- this.open(item.documentId);
306
- });
307
- d.componentInstance.delete
308
- .subscribe((r) => {
309
- var item = r.selectedItems[0].bag;
310
- this.clipperService.removeFromBag(item.documentId).add(() => {
311
- this.dialogService.toast('Operazione completata con successo.');
312
- for (let p = 0; p < r.items.length; p++) {
313
- if (r.items[p].bag.DocumentId === item.DocumentId) {
314
- r.items.splice(p, 1);
315
- if (r.items.length === 0)
316
- d.close();
317
- return;
318
- }
319
- }
320
- });
321
- });
322
- }
323
- /**
324
- * Print current document
325
- */
326
- print() {
327
- let f = document.getElementById('clipper-document-iframe');
328
- f?.contentWindow.postMessage('{"type": "print"}', '*');
329
- }
330
- /**
331
- * Find in current document
332
- */
333
- find() {
334
- this.dialogService.info('Per cercare nel documento premi CTRL + F.');
335
- }
336
- ////
337
- // AI Assistant
338
- ////
339
- /**
340
- * AI: concern me service
341
- * @param document: the document
342
- */
343
- AI_concernMe(document) {
344
- if (!document)
345
- return;
346
- this.broadcastService.sendMessage(ClipperMessages.AI_CONCERN_ME, document);
347
- }
348
- ////
349
- // Registro e scadenzario
350
- ////
351
- /**
352
- * Checks if a module is supported by RS
353
- * @param module : the module to check
354
- * @returns: true if the module is supported
355
- */
356
- isModuleSupportedByRS(module) {
357
- return module === ClipperModule.GazzetteBollettiniEFontiDiverse ||
358
- module === ClipperModule.NormativaVigente ||
359
- module === ClipperModule.ScadenzeESegnalazioni;
360
- }
361
- /**
362
- * Checks if a model is supported by RS
363
- * @param model : the model to check
364
- * @returns: true if the model is supported
365
- */
366
- isModelSupportedByRS(model) {
367
- return model === ClipperModel.AggiornamentoNormativo ||
368
- model === ClipperModel.NormativaVigente ||
369
- model === ClipperModel.Scadenze;
370
- }
371
- /**
372
- * Checks if all documents are supported by RS
373
- * @param documents : the list of documents
374
- * @returns: true if all documents supports RS
375
- */
376
- canSupportRS(documents) {
377
- let allow = false;
378
- documents.forEach(n => {
379
- allow = this.isModelSupportedByRS(n.model);
380
- if (!allow)
381
- return;
382
- });
383
- return allow;
384
- }
385
- /**
386
- * Checks if RS is enabled for all given documents
387
- * @param documents : the documents to check
388
- * @returns true if alla documents ar RS enabled
389
- */
390
- RS_enabled(documents) {
391
- if (!documents || documents.length === 0)
392
- return false;
393
- let allow = false;
394
- documents.forEach(n => {
395
- allow = n && (n.model === ClipperModel.NormativaVigente ||
396
- n.model === ClipperModel.AggiornamentoNormativo ||
397
- n.model === ClipperModel.Scadenze);
398
- if (!allow)
399
- return;
400
- });
401
- return allow;
402
- }
403
- /**
404
- * New law
405
- * @param documents: the array of documents to link to the law
406
- */
407
- RS_newLaw(documents) {
408
- if (!this.clipperService.supportsRS() || !documents)
409
- return;
410
- this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_NEW_LAW, documents);
411
- }
412
- /**
413
- * New activity
414
- * @param document: the document to link to the activity
415
- */
416
- RS_newActivity(document) {
417
- if (!this.clipperService.supportsRS() || !document)
418
- return;
419
- this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_NEW_ACTIVITY, document);
420
- }
421
- /**
422
- * Document usage report
423
- * @param document: the law
424
- */
425
- RS_usageReport(document) {
426
- if (!this.clipperService.supportsRS() || !document)
427
- return;
428
- this.broadcastService.sendMessage(ClipperMessages.INTEROP_RS_USAGE_REPORT, document);
429
- }
430
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: ClipperDocumentManager, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
431
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: ClipperDocumentManager, isStandalone: true, selector: "ng-component", ngImport: i0, template: '<div></div>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
432
- }
433
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: ClipperDocumentManager, decorators: [{
434
- type: Component,
435
- args: [{
436
- template: '<div></div>',
437
- standalone: true,
438
- changeDetection: ChangeDetectionStrategy.OnPush
439
- }]
440
- }] });
441
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fycy11dGlscy9jbGlwcGVyLnVpL3VpL2RvY3VtZW50LW1hbmFnZXIvZG9jdW1lbnQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFxRCxlQUFlLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSwwQkFBMEIsRUFBMEQsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDNVAsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTVFLE9BQU8sRUFBRSx3QkFBd0IsRUFBc0MscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1SSxPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFnQywwQkFBMEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBUWhDLE1BQU0sT0FBTyxzQkFBc0I7SUFMbkM7UUFPYyxjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7S0ErYTlEO0lBM2FHOzs7R0FHRDtJQUNDLFNBQVMsQ0FBQyxJQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFBRSxP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LFNBQVMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsUUFBb0M7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMzRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQ7OztNQUdFO0lBQ0YsY0FBYyxDQUFDLFFBQW9DO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekYsQ0FBQzsrR0FqYlEsc0JBQXNCO21HQUF0QixzQkFBc0Isd0VBSnJCLGFBQWE7OzRGQUlkLHNCQUFzQjtrQkFMbEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNsRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50SW5mbywgQ2xpcHBlckV4cG9ydERvY3VtZW50c1BhcmFtcywgQ2xpcHBlck1lc3NhZ2VzLCBDbGlwcGVyTW9kZWwsIENsaXBwZXJNb2R1bGUsIENsaXBwZXJRdWVyeVJlZmVyZW5jZXNNb2RlLCBDbGlwcGVyU2VhcmNoUGFyYW1zLCBDbGlwcGVyU2VuZERvY3VtZW50c0J5RW1haWxQYXJhbXMsIENsaXBwZXJTZXJ2aWNlIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jbGlwcGVyLmNvbW1vbic7XHJcbmltcG9ydCB7IEJyb2FkY2FzdFNlcnZpY2UsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgRGlhbG9nUmVzdWx0IH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy91aSc7XHJcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGlhbG9nU2VydmljZSwgU2VsZWN0YWJsZUl0ZW0sIFNlbGVjdERpYWxvZ0RlbGV0ZSwgU2VuZFRvRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy91aS5hcHBsaWNhdGlvbic7XHJcbmltcG9ydCBzYXZlQXMgZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCB7IENsaXBwZXJSZWZlcmVuY2VEaWFsb2dSZXN1bHQsIENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVmZXJlbmNlcy9yZWZlcmVuY2VzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+JyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2xpcHBlckRvY3VtZW50TWFuYWdlciB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGNsaXBib2FyZCA9IGluamVjdChDbGlwYm9hcmQpO1xyXG4gICAgcHVibGljIGNsaXBwZXJTZXJ2aWNlID0gaW5qZWN0KENsaXBwZXJTZXJ2aWNlKTtcclxuICAgIHByb3RlY3RlZCBicm9hZGNhc3RTZXJ2aWNlID0gaW5qZWN0KEJyb2FkY2FzdFNlcnZpY2UpO1xyXG4gICAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoQXBwbGljYXRpb25EaWFsb2dTZXJ2aWNlKTtcclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gKiBFeHBvcnQgYSBkb2N1bWVudCBpbiBwZGYgZm9ybWF0XHJcbiAqIEBwYXJhbSBpdGVtIDogdGhlIGRvY3VtZW50IHRvIGV4cG9ydFxyXG4gKi9cclxuICAgIGV4cG9ydFBkZihpdGVtOiBDbGlwcGVyRG9jdW1lbnRJbmZvKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsaXBwZXJTZXJ2aWNlLmxvZ2dlZEluKCkpIHJldHVybjtcclxuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybjtcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2VcclxuICAgICAgICAgICAgLmNvbmZpcm0oXCJDb25mZXJtaSBsJ2VzcG9ydGF6aW9uZT9cIiwgJ0F0dGVuemlvbmUhJylcclxuICAgICAgICAgICAgLmNvbXBvbmVudEluc3RhbmNlLmNob29zZW4uc3Vic2NyaWJlKChkYXRhOiBEaWFsb2dSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdCA9PT0gJ29rJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbS5pZCB8fCBpdGVtLmRvY3VtZW50SWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmJ1c3koJ0VzcG9ydGF6aW9uZSBpbiBjb3Jzby4uLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcHBlclNlcnZpY2UuZXhwb3J0UGRmKGlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xlYXJCdXN5KCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUFzKHIsIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxIDogaWQpICsgJy5wZGYnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXhwb3J0IGN1cnJlbnQgZG9jdW1lbnQgbGlzdCBvciBqdXN0IHRoZSBzZWxlY3RlZCBkb2N1bWVudHMgYXMgYSBjc3ZcclxuICAgICAqIEBwYXJhbSBkb2N1bWVudElkczogdGhlIGRvY3VtZW50IGlkIGxpc3RcclxuICAgICAqIEBwYXJhbSBzZWFyY2hQYXJhbXM6IHRoZSBzZWFyY2ggcGFyYW1zXHJcbiAgICAgKiBAcGFyYW0gZm9ybWF0OiB0aGUgZXhwb3J0IGZvcm1hdDogMSkgbGlzdCAyKSBkZWFkbGluZXNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0SXRlbXMoXHJcbiAgICAgICAgZG9jdW1lbnRJZHM6IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBzZWFyY2hQYXJhbXM6IENsaXBwZXJTZWFyY2hQYXJhbXMgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcclxuICAgICAgICBmb3JtYXQ6IG51bWJlciA9IDEpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2xpcHBlclNlcnZpY2UubG9nZ2VkSW4oKSkgcmV0dXJuO1xyXG4gICAgICAgIGxldCBtb2RlbDogQ2xpcHBlckV4cG9ydERvY3VtZW50c1BhcmFtcyA9IHsgaWRzOiBkb2N1bWVudElkcyA/PyBbXSwgcXVlcnk6IG51bGwsIGZvcm1hdDogZm9ybWF0IH07XHJcbiAgICAgICAgaWYgKCFtb2RlbC5pZHMgfHwgbW9kZWwuaWRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBtb2RlbC5xdWVyeSA9IHNlYXJjaFBhcmFtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmJ1c3koJ1NhbHZhdGFnZ2lvIGluIGNvcnNvLi4uJyk7XHJcbiAgICAgICAgdGhpcy5jbGlwcGVyU2VydmljZS5leHBvcnQobW9kZWwpXHJcbiAgICAgICAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMuZGlhbG9nU2VydmljZS5jbGVhckJ1c3koKSkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUociA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAnYXBwbGljYXRpb24vanNvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICByLnRleHQoKS50aGVuKGpzb24gPT4gdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKEpTT04ucGFyc2UoanNvbikubWVzc2FnZSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVBcyhyLCAnZWxlbmNvLmNzdicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVBcyhyLCAnc2NhZGVuemUuaWNzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4cG9ydCBhIHNpbmdsZSBkZWFkbGluZVxyXG4gICAgICogQHBhcmFtIGl0ZW0gOiB0aGUgZG9jdW1lbnQgdG8gZXhwb3J0XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydERlYWRsaW5lKGl0ZW06IENsaXBwZXJEb2N1bWVudEluZm8pIHtcclxuICAgICAgICB0aGlzLmV4cG9ydEl0ZW1zKFtpdGVtLmRvY3VtZW50SWRdLCBudWxsLCAyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyY2hpdmUgYSBsaXN0IG9mIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gaXRlbXM6IHRoZSBpdGVtIGxpc3RcclxuICAgICAqL1xyXG4gICAgYWRkVG9BcmNoaXZlKGl0ZW1zOiBDbGlwcGVyRG9jdW1lbnRJbmZvW10pIHtcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoQ2xpcHBlck1lc3NhZ2VzLkNPTU1BTkRfQVJDSElWRV9BREQsIGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG5ldyBkZWFkbGluZVxyXG4gICAgICogQHBhcmFtIGl0ZW0gOiB0aGUgaXRlbSB0byBhZGRcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWxlbmRhcihpdGVtOiBDbGlwcGVyRG9jdW1lbnRJbmZvKSB7XHJcbiAgICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5DT01NQU5EX0NBTEVOREFSX0FERCwgaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZCBhIGxpc3Qgb2YgaXRlbXMgdG8gd29ya2luZyBkb2N1bWVudHNcclxuICAgICogQHBhcmFtIGl0ZW1zIDogdGhlIGl0ZW0gbGlzdFxyXG4gICAgKi9cclxuICAgIGFkZEl0ZW1zVG9Xb3JraW5nRG9jdW1lbnRzKGl0ZW1zOiBDbGlwcGVyRG9jdW1lbnRJbmZvW10pIHtcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoQ2xpcHBlck1lc3NhZ2VzLkNPTU1BTkRfV09SS0lOR19BREQsIGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQWRkIGEgbGlzdCBvZiBpdGVtcyB0byB3b3JraW5nIGRvY3VtZW50c1xyXG4gICAgKiBAcGFyYW0gaXRlbXMgOiB0aGUgaXRlbSBsaXN0XHJcbiAgICAqL1xyXG4gICAgYWRkSXRlbXNUb0JhZyhpdGVtczogQ2xpcHBlckRvY3VtZW50SW5mb1tdKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsaXBwZXJTZXJ2aWNlLmxvZ2dlZEluKCkpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNsaXBwZXJTZXJ2aWNlLmFkZFRvQmFnKGl0ZW1zPy5tYXAobiA9PiBuLmRvY3VtZW50SWQgPz8gbi5pZCkgPz8gW10pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcHkgbWV0YWRhdGEgdG8gY2xpcGJvYXJkXHJcbiAgICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBpdGVtIHRvIGNvcHlcclxuICAgICAqL1xyXG4gICAgY29weU1ldGFkYXRhVG9DbGlwYm9hcmQoaXRlbTogQ2xpcHBlckRvY3VtZW50SW5mbykge1xyXG4gICAgICAgIGlmICghaXRlbSB8fCBpdGVtLm1vZGVsID09PSBDbGlwcGVyTW9kZWwuQ29vcmRpbmFtZW50bykgcmV0dXJuO1xyXG4gICAgICAgIGxldCBtZXRhID1cclxuICAgICAgICAgICAgKGl0ZW0uaWQgPz8gaXRlbS5kb2N1bWVudElkKSArICdcXHQnICtcclxuICAgICAgICAgICAgaXRlbS50aXRsZTE/LnJlcGxhY2VBbGwoXCJcXHJcXG5cIiwgXCIgXCIpICsgJ1xcdCc7XHJcbiAgICAgICAgaWYgKGl0ZW0udGl0bGUyKVxyXG4gICAgICAgICAgICBtZXRhICs9IGl0ZW0udGl0bGUyLnJlcGxhY2VBbGwoXCJcXHJcXG5cIiwgXCIgXCIpO1xyXG4gICAgICAgIG1ldGEgKz0gJ1xcdCc7XHJcbiAgICAgICAgaWYgKGl0ZW0ubnVtYmVyKVxyXG4gICAgICAgICAgICBtZXRhICs9IGl0ZW0ubnVtYmVyO1xyXG4gICAgICAgIG1ldGEgKz0gJ1xcdCc7XHJcbiAgICAgICAgaWYgKGl0ZW0ucHVibGlzaGluZ0RhdGUpIHtcclxuICAgICAgICAgICAgaXRlbS5wdWJsaXNoaW5nRGF0ZSA9IG5ldyBEYXRlKGl0ZW0ucHVibGlzaGluZ0RhdGUpO1xyXG4gICAgICAgICAgICBtZXRhICs9IFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoaXRlbS5wdWJsaXNoaW5nRGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLmRhdGUpIHtcclxuICAgICAgICAgICAgaXRlbS5kYXRlID0gbmV3IERhdGUoaXRlbS5kYXRlKTtcclxuICAgICAgICAgICAgbWV0YSArPSBTeXN0ZW1VdGlscy5mb3JtYXREYXRlKGl0ZW0uZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1ldGEgKz0gJ1xcdCc7XHJcbiAgICAgICAgaWYgKGl0ZW0ub3JpZ2luRGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIG1ldGEgKz0gaXRlbS5vcmlnaW5EZXNjcmlwdGlvblxyXG4gICAgICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkobWV0YSk7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRvYXN0KFwiTWV0YWRhdGkgY29waWF0aSBuZWdsaSBhcHB1bnRpLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYSBkb2N1bWVudCBwZXJtYWxpbmtcclxuICAgICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gc2hvdyB0aGUgbGluayBmb3JcclxuICAgICAqL1xyXG4gICAgc2hvd0xpbmsoaXRlbTogQ2xpcHBlckRvY3VtZW50SW5mbykge1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xyXG4gICAgICAgIGxldCBpZCA9IGl0ZW0uaWQgPyBpdGVtLmlkIDogaXRlbS5kb2N1bWVudElkO1xyXG4gICAgICAgIGNvbnN0IGNoYW5uZWxzID0gaXRlbS5jaGFubmVsTmFtZVxyXG4gICAgICAgICAgICA/ICdDYW5hbGk6ICcgKyBpdGVtLmNoYW5uZWxOYW1lICsgJzxicj4nXHJcbiAgICAgICAgICAgIDogJyc7XHJcbiAgICAgICAgbGV0IG9yaWdpbiA9IGl0ZW0ub3JpZ2luXHJcbiAgICAgICAgICAgID8gJ09yaWdpbmU6ICcgK1xyXG4gICAgICAgICAgICBpdGVtLm9yaWdpbiArXHJcbiAgICAgICAgICAgICcgLSAnICtcclxuICAgICAgICAgICAgKGl0ZW0ub3JpZ2luRGVzY3JpcHRpb24gPyBpdGVtLm9yaWdpbkRlc2NyaXB0aW9uIDogJycpICtcclxuICAgICAgICAgICAgJzxicj4nXHJcbiAgICAgICAgICAgIDogJyc7XHJcbiAgICAgICAgY29uc3QgdG9waWNzID0gaXRlbS50b3BpY3MgPyAnQXJnb21lbnRvOiAnICsgaXRlbS50b3BpY3MgKyAnPGJyPicgOiAnJztcclxuICAgICAgICBpZiAoIWlkKSByZXR1cm47XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPVxyXG4gICAgICAgICAgICBcIjxwID5JbCBsaW5rIGNoZSB0cm92aSBxdWkgc290dG8gw6ggdW4gcmlmZXJpbWVudG8gZGlyZXR0byBhbCBkb2N1bWVudG8gc2VsZXppb25hdG8uPC9wPlwiICtcclxuICAgICAgICAgICAgXCI8cCA+TG8gcHVvaSB1dGlsaXp6YXJlIG5lbGxhIHR1YSBkb2N1bWVudGF6aW9uZSBvIGludmlhcmxvIHBlciBlbWFpbCBhZCB1biB0dW8gY29sbGVnYS4gTGEgcGVyc29uYSBjaGUgZGVzaWRlcmVyw6AgdmlzdWFsaXp6YXJlIGlsIGRvY3VtZW50byBkb3Zyw6AgbmVjZXNzYXJpYW1lbnRlIGVzc2VyZSB1biB1dGVudGUgYWJib25hdG8uPC9wPlwiICtcclxuICAgICAgICAgICAgXCI8cCA+U2VsZXppb25hIGUgY29waWEgKGZhaSBDVFJMK0MpIGlsIGxpbmsgcXVpIHNvdHRvLjwvcD5cIiArXHJcbiAgICAgICAgICAgIFwiPGRpdiBjbGFzcz0nc21hbGwgYWNjZW50Jz5cIiArXHJcbiAgICAgICAgICAgICdodHRwczovL2NsaXBwZXIuYXJzZWRpemlvbmkuaXQvP2lkPScgK1xyXG4gICAgICAgICAgICBpZCArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgJzxicj4nICtcclxuICAgICAgICAgICAgJzxocj4nICtcclxuICAgICAgICAgICAgJzxwIGNsYXNzPVwic21hbGxcIj4nICtcclxuICAgICAgICAgICAgY2hhbm5lbHMgK1xyXG4gICAgICAgICAgICBvcmlnaW4gK1xyXG4gICAgICAgICAgICB0b3BpY3NcclxuICAgICAgICAnPC9wPic7XHJcblxyXG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5pbmZvKG1lc3NhZ2UsICdDb3BpYSBsaW5rJywgJ0NoaXVkaScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VuZCBkb2N1bWVudHMgbGlua3MgYnkgZW1haWxcclxuICAgICAqIEBwYXJhbSBpdGVtcyA6IHRoZSBkb2N1bWVudCBsaXN0XHJcbiAgICAgKi9cclxuICAgIHNlbmRJdGVtc1RvKGl0ZW1zOiBDbGlwcGVyRG9jdW1lbnRJbmZvW10pIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2xpcHBlclNlcnZpY2UubG9nZ2VkSW4oKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKFNlbmRUb0RpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgICAgICBhcmlhTGFiZWw6ICdpbnZpYSBkb2N1bWVudGkgcGVyIGVtYWlsJyxcclxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZSxcclxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgICAgICAgICAgY2xvc2VPbk5hdmlnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICBpbmZvOlxyXG4gICAgICAgICAgICAgICAgICAgICdQdW9pIGludmlhcmUgaSBkb2N1bWVudGkgYSBjaGkgdnVvaSBtYSwgcGVyIHBvdGVybGkgdmlzdWFsaXp6YXJlLCDDqCBuZWNlc3NhcmlvIGVzc2VyZSB1biB1dGVudGUgYWJib25hdG8uJyxcclxuICAgICAgICAgICAgICAgIGNvdW50OiBpdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICAgICAgICBtYXhXaWR0aDogJzYwMHB4JyxcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBkLmNvbXBvbmVudEluc3RhbmNlLmRvbmVcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogQ2xpcHBlclNlbmREb2N1bWVudHNCeUVtYWlsUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmlkcyA9IGl0ZW1zPy5tYXAobiA9PiBuLmRvY3VtZW50SWQgPz8gbi5pZCkgPz8gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYnVzeSgnSW52aW8gaW4gY29yc28uLi4nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpcHBlclNlcnZpY2Uuc2VuZFRvKGRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kaWFsb2dTZXJ2aWNlLmNsZWFyQnVzeSgpKSlcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKHIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UudG9hc3QoJ0ludmlvIGNvbXBsZXRhdG8gY29uIHN1Y2Nlc3NvLicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheSBhIGRvY3VtZW50IHJlcG9ydFxyXG4gICAgICogQHBhcmFtIGRvY3VtZW50SWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgICAqIEBwYXJhbSB0aXRsZTogdGhlIGRvY3VtZW50IHNob3J0IHRpdGxlXHJcbiAgICAgKi9cclxuICAgIG9wZW5SZXBvcnQoZG9jdW1lbnRJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2xpcHBlclNlcnZpY2UubG9nZ2VkSW4oKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghZG9jdW1lbnRJZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2xpcHBlclNlcnZpY2UucmVwb3J0KGRvY3VtZW50SWQpXHJcbiAgICAgICAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMuZGlhbG9nU2VydmljZS5jbGVhckJ1c3koKSkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUociA9PiB7XHJcbiAgICAgICAgICAgICAgICBzYXZlQXMociwgKHRpdGxlID8gdGl0bGUgOiBkb2N1bWVudElkKSArICcuaHRtbCcpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogT3BlbiBhbiBpdGVtXHJcbiAgICAqIFRoaXMgc2hvdWxkIGJlIGFsd2F5cyBvdmVycmlkZGVuXHJcbiAgICAqIEBwYXJhbSBkb2N1bWVudElkIDogdGhlIGRvY3VtZW50IGlkXHJcbiAgICAqIEBwYXJhbSBxdWVyeSA6IHRoZSBxdWVyeSBkb2N1bWVudFxyXG4gICAgKiBAcGFyYW0gbmV3V2luZG93OiB0cnVlIGlmIHRoZSBkb2N1bWVudCBtdXN0IGJlIG9wZW4gaW50byBhIG5ldyB3aW5kb3dcclxuICAgICovXHJcbiAgICBvcGVuKFxyXG4gICAgICAgIF9kb2N1bWVudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIF9xdWVyeTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICAgICAgX25ld1dpbmRvdzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5IGEgZG9jdW1lbnQgcmVwb3J0XHJcbiAgICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudFxyXG4gICAgICovXHJcbiAgICByZXBvcnQoaXRlbTogQ2xpcHBlckRvY3VtZW50SW5mbykge1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChpdGVtLm1vZGVsICE9IENsaXBwZXJNb2RlbC5Ob3JtYXRpdmFWaWdlbnRlICYmIGl0ZW0ubW9kZWwgIT0gQ2xpcHBlck1vZGVsLlNjYWRlbnplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5pbmZvKFwiUXVlc3RhIGZ1bnppb25hbGl0w6Agbm9uIMOoIGRpc3BvbmliaWxlIHBlciBxdWVzdG8gdGlwbyBkaSBkb2N1bWVudG8uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuUmVwb3J0KGl0ZW0uZG9jdW1lbnRJZCwgaXRlbS50aXRsZTEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJyb3dzZSBkb2N1bWVudCByZWZlcmVuY2VzXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnQgaWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgICAqIEBwYXJhbSBtb2RlIDogdGhlIHJlZmVyZW5jZSBtb2RlXHJcbiAgICAgKi9cclxuICAgIG9wZW5SZWZlcmVuY2VzKGRvY3VtZW50SWQ6IHN0cmluZywgbW9kZTogQ2xpcHBlclF1ZXJ5UmVmZXJlbmNlc01vZGUgPSBDbGlwcGVyUXVlcnlSZWZlcmVuY2VzTW9kZS5SZWZlcmVuY2VzSW4pIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50SWQpIHJldHVybjtcclxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQ2xpcHBlclJlZmVyZW5jZXNDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgYXJpYUxhYmVsOiAncmlmZXJpbWVudGkgbGVnYXRpIGFsIGRvY3VtZW50bycsXHJcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2UsXHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YTogeyBkb2N1bWVudElkOiBkb2N1bWVudElkLCBtb2RlOiBtb2RlIH0sXHJcbiAgICAgICAgICAgIG1pbldpZHRoOiAnMzc1cHgnLFxyXG4gICAgICAgICAgICBtYXhXaWR0aDogJzEyMDBweCcsXHJcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGQuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyOiBDbGlwcGVyUmVmZXJlbmNlRGlhbG9nUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAociAmJiByLmRvY3VtZW50SWQpIHRoaXMub3BlbihyLmRvY3VtZW50SWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hbmFnZSBjbGlwcGVyIGJhZ1xyXG4gICAgICovXHJcbiAgICBvcGVuQmFnKCkge1xyXG4gICAgICAgIGxldCBpdGVtczogU2VsZWN0YWJsZUl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY2xpcHBlclNlcnZpY2UuYmFnKCkuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgbGV0IHRpdGxlID0gbi50aXRsZTEgPz8gbi50aXRsZTI7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgYmFnOiBuLFxyXG4gICAgICAgICAgICAgICAgc2VhcmNoQmFnOiB7IG5hbWU6IHRpdGxlIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2VsZWN0KHtcclxuICAgICAgICAgICAgdGl0bGU6ICdHZXN0aXNjaSBkb2N1bWVudGkgZGkgbGF2b3JvJyxcclxuICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBtdXN0U2VsZWN0OiBmYWxzZSxcclxuICAgICAgICAgICAgb2tDYXB0aW9uOiAnU0VMRVpJT05BJyxcclxuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zLFxyXG4gICAgICAgICAgICB0b3RhbDogaXRlbXM/Lmxlbmd0aCA/PyAwLFxyXG4gICAgICAgICAgICBjYW5EZWxldGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNhblZpZXc6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZC5jb21wb25lbnRJbnN0YW5jZS52aWV3XHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHI6IFNlbGVjdGFibGVJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHIuYmFnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuKGl0ZW0uZG9jdW1lbnRJZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGQuY29tcG9uZW50SW5zdGFuY2UuZGVsZXRlXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHI6IFNlbGVjdERpYWxvZ0RlbGV0ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSByLnNlbGVjdGVkSXRlbXNbMF0uYmFnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGlwcGVyU2VydmljZS5yZW1vdmVGcm9tQmFnKGl0ZW0uZG9jdW1lbnRJZCkuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRvYXN0KCdPcGVyYXppb25lIGNvbXBsZXRhdGEgY29uIHN1Y2Nlc3NvLicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHIuaXRlbXMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLml0ZW1zW3BdLmJhZy5Eb2N1bWVudElkID09PSBpdGVtLkRvY3VtZW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLml0ZW1zLnNwbGljZShwLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5pdGVtcy5sZW5ndGggPT09IDApIGQuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmludCBjdXJyZW50IGRvY3VtZW50XHJcbiAgICAgKi9cclxuICAgIHByaW50KCkge1xyXG4gICAgICAgIGxldCBmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaXBwZXItZG9jdW1lbnQtaWZyYW1lJykgYXMgYW55O1xyXG4gICAgICAgIGY/LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3tcInR5cGVcIjogXCJwcmludFwifScsICcqJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIGluIGN1cnJlbnQgZG9jdW1lbnRcclxuICAgICAqL1xyXG4gICAgZmluZCgpIHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuaW5mbygnUGVyIGNlcmNhcmUgbmVsIGRvY3VtZW50byBwcmVtaSBDVFJMICsgRi4nKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vL1xyXG4gICAgLy8gQUkgQXNzaXN0YW50XHJcbiAgICAvLy8vXHJcbiAgICAgIC8qKlxyXG4gICAgICogQUk6IGNvbmNlcm4gbWUgc2VydmljZVxyXG4gICAgICogQHBhcmFtIGRvY3VtZW50OiB0aGUgZG9jdW1lbnRcclxuICAgICAqL1xyXG4gICAgICBBSV9jb25jZXJuTWUoZG9jdW1lbnQ6IENsaXBwZXJEb2N1bWVudEluZm8gfCBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZS5zZW5kTWVzc2FnZShDbGlwcGVyTWVzc2FnZXMuQUlfQ09OQ0VSTl9NRSwgZG9jdW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLy9cclxuICAgIC8vIFJlZ2lzdHJvIGUgc2NhZGVuemFyaW9cclxuICAgIC8vLy9cclxuXHJcbiAgICAvKipcclxuICAgICogQ2hlY2tzIGlmIGEgbW9kdWxlIGlzIHN1cHBvcnRlZCBieSBSU1xyXG4gICAgKiBAcGFyYW0gbW9kdWxlIDogdGhlIG1vZHVsZSB0byBjaGVja1xyXG4gICAgKiBAcmV0dXJuczogdHJ1ZSBpZiB0aGUgbW9kdWxlIGlzIHN1cHBvcnRlZFxyXG4gICAgKi9cclxuICAgIGlzTW9kdWxlU3VwcG9ydGVkQnlSUyhtb2R1bGU6IENsaXBwZXJNb2R1bGUpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbW9kdWxlID09PSBDbGlwcGVyTW9kdWxlLkdhenpldHRlQm9sbGV0dGluaUVGb250aURpdmVyc2UgfHxcclxuICAgICAgICAgICAgbW9kdWxlID09PSBDbGlwcGVyTW9kdWxlLk5vcm1hdGl2YVZpZ2VudGUgfHxcclxuICAgICAgICAgICAgbW9kdWxlID09PSBDbGlwcGVyTW9kdWxlLlNjYWRlbnplRVNlZ25hbGF6aW9uaTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBhIG1vZGVsIGlzIHN1cHBvcnRlZCBieSBSU1xyXG4gICAgICogQHBhcmFtIG1vZGVsIDogdGhlIG1vZGVsIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJuczogdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgc3VwcG9ydGVkXHJcbiAgICAgKi9cclxuICAgIGlzTW9kZWxTdXBwb3J0ZWRCeVJTKG1vZGVsOiBDbGlwcGVyTW9kZWwpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbW9kZWwgPT09IENsaXBwZXJNb2RlbC5BZ2dpb3JuYW1lbnRvTm9ybWF0aXZvIHx8XHJcbiAgICAgICAgICAgIG1vZGVsID09PSBDbGlwcGVyTW9kZWwuTm9ybWF0aXZhVmlnZW50ZSB8fFxyXG4gICAgICAgICAgICBtb2RlbCA9PT0gQ2xpcHBlck1vZGVsLlNjYWRlbnplO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2hlY2tzIGlmIGFsbCBkb2N1bWVudHMgYXJlIHN1cHBvcnRlZCBieSBSU1xyXG4gICAgKiBAcGFyYW0gZG9jdW1lbnRzIDogdGhlIGxpc3Qgb2YgZG9jdW1lbnRzXHJcbiAgICAqIEByZXR1cm5zOiB0cnVlIGlmIGFsbCBkb2N1bWVudHMgc3VwcG9ydHMgUlNcclxuICAgICovXHJcbiAgICBjYW5TdXBwb3J0UlMoZG9jdW1lbnRzOiBDbGlwcGVyRG9jdW1lbnRJbmZvW10pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgYWxsb3cgPSBmYWxzZTtcclxuICAgICAgICBkb2N1bWVudHMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgYWxsb3cgPSB0aGlzLmlzTW9kZWxTdXBwb3J0ZWRCeVJTKG4ubW9kZWwpO1xyXG4gICAgICAgICAgICBpZiAoIWFsbG93KSByZXR1cm47XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGFsbG93O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIFJTIGlzIGVuYWJsZWQgZm9yIGFsbCBnaXZlbiBkb2N1bWVudHNcclxuICAgICAqIEBwYXJhbSBkb2N1bWVudHMgOiB0aGUgZG9jdW1lbnRzIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbGEgZG9jdW1lbnRzIGFyIFJTIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgUlNfZW5hYmxlZChkb2N1bWVudHM6IENsaXBwZXJEb2N1bWVudEluZm9bXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghZG9jdW1lbnRzIHx8IGRvY3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBsZXQgYWxsb3cgPSBmYWxzZTtcclxuICAgICAgICBkb2N1bWVudHMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICAgICAgYWxsb3cgPSBuICYmIChuLm1vZGVsID09PSBDbGlwcGVyTW9kZWwuTm9ybWF0aXZhVmlnZW50ZSB8fFxyXG4gICAgICAgICAgICAgICAgbi5tb2RlbCA9PT0gQ2xpcHBlck1vZGVsLkFnZ2lvcm5hbWVudG9Ob3JtYXRpdm8gfHxcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJNb2RlbC5TY2FkZW56ZSk7XHJcbiAgICAgICAgICAgIGlmICghYWxsb3cpIHJldHVybjtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gYWxsb3c7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIE5ldyBsYXdcclxuICAgICogQHBhcmFtIGRvY3VtZW50czogdGhlIGFycmF5IG9mIGRvY3VtZW50cyB0byBsaW5rIHRvIHRoZSBsYXdcclxuICAgICovXHJcbiAgICBSU19uZXdMYXcoZG9jdW1lbnRzOiBDbGlwcGVyRG9jdW1lbnRJbmZvW10gfCBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsaXBwZXJTZXJ2aWNlLnN1cHBvcnRzUlMoKSB8fCAhZG9jdW1lbnRzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX05FV19MQVcsIGRvY3VtZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZXcgYWN0aXZpdHlcclxuICAgICAqIEBwYXJhbSBkb2N1bWVudDogdGhlIGRvY3VtZW50IHRvIGxpbmsgdG8gdGhlIGFjdGl2aXR5XHJcbiAgICAgKi9cclxuICAgIFJTX25ld0FjdGl2aXR5KGRvY3VtZW50OiBDbGlwcGVyRG9jdW1lbnRJbmZvIHwgbnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jbGlwcGVyU2VydmljZS5zdXBwb3J0c1JTKCkgfHwgIWRvY3VtZW50KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKENsaXBwZXJNZXNzYWdlcy5JTlRFUk9QX1JTX05FV19BQ1RJVklUWSwgZG9jdW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBEb2N1bWVudCB1c2FnZSByZXBvcnRcclxuICAgICogQHBhcmFtIGRvY3VtZW50OiB0aGUgbGF3XHJcbiAgICAqL1xyXG4gICAgUlNfdXNhZ2VSZXBvcnQoZG9jdW1lbnQ6IENsaXBwZXJEb2N1bWVudEluZm8gfCBudWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsaXBwZXJTZXJ2aWNlLnN1cHBvcnRzUlMoKSB8fCAhZG9jdW1lbnQpIHJldHVybjtcclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoQ2xpcHBlck1lc3NhZ2VzLklOVEVST1BfUlNfVVNBR0VfUkVQT1JULCBkb2N1bWVudCk7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iXX0=