@arsedizioni/ars-utils 18.1.74 → 18.1.76

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 (113) hide show
  1. package/clipper.common/common/common.module.d.ts +1 -2
  2. package/clipper.common/common/definitions.d.ts +317 -0
  3. package/clipper.common/common/interceptors/auth.interceptor.d.ts +2 -5
  4. package/clipper.common/common/messages.d.ts +4 -0
  5. package/clipper.common/common/services/clipper.service.d.ts +12 -36
  6. package/clipper.ui/{ui/document/documents.d.ts → documents.d.ts} +2 -6
  7. package/clipper.ui/public_api.d.ts +6 -5
  8. package/clipper.ui/ui/browser-dialog/browser-dialog.component.d.ts +30 -143
  9. package/clipper.ui/ui/clipper.scss +270 -106
  10. package/clipper.ui/ui/document/document.component.d.ts +64 -118
  11. package/clipper.ui/ui/document-index/document-index.component.d.ts +34 -0
  12. package/clipper.ui/ui/document-manager/document-manager.d.ts +126 -0
  13. package/clipper.ui/ui/document-menu/document-menu.component.d.ts +28 -0
  14. package/clipper.ui/ui/references/references.component.d.ts +39 -73
  15. package/clipper.ui/ui/search-calendar/search-calendar.component.d.ts +40 -0
  16. package/clipper.ui/ui/search-dialog/search-dialog.component.d.ts +37 -40
  17. package/clipper.ui/ui/search-facets/search-facets.component.d.ts +22 -70
  18. package/clipper.ui/ui/search-free-text-help/search-free-text-help.component.d.ts +0 -1
  19. package/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.d.ts +8 -12
  20. package/clipper.ui/ui/search-result-item/search-result-item.component.d.ts +6 -4
  21. package/clipper.ui/ui/search-result-manager/search-result-manager.d.ts +147 -0
  22. package/esm2022/clipper.common/common/common.module.mjs +2 -3
  23. package/esm2022/clipper.common/common/definitions.mjs +1536 -0
  24. package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +15 -15
  25. package/esm2022/clipper.common/common/messages.mjs +6 -1
  26. package/esm2022/clipper.common/common/services/clipper.service.mjs +65 -65
  27. package/esm2022/clipper.ui/documents.mjs +51 -0
  28. package/esm2022/clipper.ui/public_api.mjs +7 -6
  29. package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +320 -785
  30. package/esm2022/clipper.ui/ui/document/document.component.mjs +213 -320
  31. package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +121 -0
  32. package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +431 -0
  33. package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +56 -0
  34. package/esm2022/clipper.ui/ui/references/references.component.mjs +244 -438
  35. package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +116 -0
  36. package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +216 -205
  37. package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +157 -209
  38. package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +7 -8
  39. package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +22 -23
  40. package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +12 -10
  41. package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +462 -0
  42. package/esm2022/help/components/help-viewer/help-viewer.component.mjs +25 -28
  43. package/esm2022/support.common/common/definitions.mjs +21 -0
  44. package/esm2022/support.common/common/services/support.service.mjs +9 -7
  45. package/esm2022/support.common/public_api.mjs +2 -2
  46. package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +3 -3
  47. package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +4 -5
  48. package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +3 -3
  49. package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +3 -3
  50. package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +3 -3
  51. package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +3 -3
  52. package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +3 -3
  53. package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +3 -3
  54. package/esm2022/ui.application/public_api.mjs +4 -1
  55. package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +163 -0
  56. package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +47 -0
  57. package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +239 -0
  58. package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +23 -24
  59. package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +3 -3
  60. package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +3 -3
  61. package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +3 -3
  62. package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +3 -3
  63. package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +3 -3
  64. package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +3 -3
  65. package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +3 -3
  66. package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +3 -3
  67. package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +3 -3
  68. package/esm2022/ui.application/ui/messages.mjs +3 -3
  69. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +1608 -1507
  70. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  71. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +2283 -2407
  72. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  73. package/fesm2022/arsedizioni-ars-utils-help.mjs +25 -28
  74. package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
  75. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +8 -6
  76. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  77. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +5 -6
  78. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
  79. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +450 -47
  80. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  81. package/fesm2022/arsedizioni-ars-utils-ui.mjs +12 -12
  82. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  83. package/help/components/help-viewer/help-viewer.component.d.ts +6 -10
  84. package/package.json +13 -13
  85. package/styles/ui.scss +140 -0
  86. package/support.common/common/services/support.service.d.ts +2 -2
  87. package/support.common/public_api.d.ts +1 -1
  88. package/ui.application/public_api.d.ts +3 -0
  89. package/ui.application/ui/components/button-selector/button-selector.component.d.ts +49 -0
  90. package/ui.application/ui/components/button-toggle/button-toggle.component.d.ts +26 -0
  91. package/ui.application/ui/components/chips-selector/chips-selector.component.d.ts +70 -0
  92. package/ui.application/ui/components/file-preview/file-preview.component.d.ts +4 -8
  93. package/ui.application/ui/messages.d.ts +2 -2
  94. package/clipper.common/common/clipper.d.ts +0 -119
  95. package/clipper.common/common/search.d.ts +0 -49
  96. package/clipper.ui/ui/document/base/document-base.component.d.ts +0 -38
  97. package/clipper.ui/ui/document/document-index/document-index.component.d.ts +0 -38
  98. package/clipper.ui/ui/document/document-menu/document-menu.component.d.ts +0 -30
  99. package/clipper.ui/ui/last-15-days/last-15-days.component.d.ts +0 -41
  100. package/esm2022/clipper.common/common/clipper.mjs +0 -1371
  101. package/esm2022/clipper.common/common/search.mjs +0 -69
  102. package/esm2022/clipper.ui/ui/document/base/document-base.component.mjs +0 -194
  103. package/esm2022/clipper.ui/ui/document/document-index/document-index.component.mjs +0 -121
  104. package/esm2022/clipper.ui/ui/document/document-menu/document-menu.component.mjs +0 -88
  105. package/esm2022/clipper.ui/ui/document/documents.mjs +0 -49
  106. package/esm2022/clipper.ui/ui/last-15-days/last-15-days.component.mjs +0 -107
  107. package/esm2022/help/components/help-search-query-builder/help-search-query-builder.component.mjs +0 -114
  108. package/esm2022/support.common/common/support.mjs +0 -21
  109. package/esm2022/ui.oauth/ui/components/login/loginOAuth.component.mjs +0 -198
  110. package/help/components/help-search-query-builder/help-search-query-builder.component.d.ts +0 -29
  111. package/help/help.scss +0 -72
  112. package/ui.oauth/ui/components/login/loginOAuth.component.d.ts +0 -38
  113. /package/support.common/common/{support.d.ts → definitions.d.ts} +0 -0
@@ -1,181 +1,213 @@
1
- import { Component, Inject, ViewChild } from '@angular/core';
2
- import { MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent } from '@angular/material/dialog';
3
- import { MatMenuModule } from '@angular/material/menu';
4
- import { MatPaginatorModule } from '@angular/material/paginator';
5
- import { DateFormat, SelectableModel, SystemUtils } from '@arsedizioni/ars-utils/core';
6
- import { fromEvent, Subject } from 'rxjs';
7
- import { startOfDay, startOfToday, subDays } from 'date-fns';
8
- import { ClipperDocumentBaseComponent } from '../document/base/document-base.component';
9
- import { ClipperDefinitions } from '@arsedizioni/ars-utils/clipper.common';
10
- import { takeUntil } from 'rxjs/operators';
11
- import { MatSidenavModule } from '@angular/material/sidenav';
12
- import { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';
13
- import saveAs from 'file-saver';
14
- import { MatProgressBarModule } from '@angular/material/progress-bar';
15
- import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
16
- import { ClipperDocumentMenuComponent } from '../document/document-menu/document-menu.component';
17
- import { MatBadgeModule } from '@angular/material/badge';
1
+ import { Breakpoints } from '@angular/cdk/layout';
2
+ import { ChangeDetectionStrategy, Component, ViewChild, inject } from '@angular/core';
18
3
  import { FormsModule } from '@angular/forms';
4
+ import { MatBadgeModule } from '@angular/material/badge';
5
+ import { MatButtonModule } from '@angular/material/button';
19
6
  import { MatCheckboxModule } from '@angular/material/checkbox';
20
- import { NgStyle, NgClass } from '@angular/common';
7
+ import { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';
21
8
  import { MatIconModule } from '@angular/material/icon';
9
+ import { MatMenuModule } from '@angular/material/menu';
10
+ import { MatPaginatorModule } from '@angular/material/paginator';
11
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
12
+ import { MatSidenavModule } from '@angular/material/sidenav';
13
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
22
14
  import { MatTooltipModule } from '@angular/material/tooltip';
23
- import { MatButtonModule } from '@angular/material/button';
15
+ import { ClipperDocumentSnapshotMode } from '@arsedizioni/ars-utils/clipper.common';
16
+ import { SelectableModel, SystemUtils } from '@arsedizioni/ars-utils/core';
17
+ import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
24
18
  import { FlexModule } from '@ngbracket/ngx-layout/flex';
19
+ import { fromEvent } from 'rxjs';
20
+ import { debounceTime, takeUntil } from 'rxjs/operators';
21
+ import { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';
22
+ import { ClipperSearchFacetsComponent } from '../search-facets/search-facets.component';
23
+ import { ClipperSearchResultManager } from '../search-result-manager/search-result-manager';
24
+ import { ClipperSearchResultItemComponent } from '../search-result-item/search-result-item.component';
25
25
  import * as i0 from "@angular/core";
26
- import * as i1 from "@arsedizioni/ars-utils/ui";
27
- import * as i2 from "@arsedizioni/ars-utils/clipper.common";
28
- import * as i3 from "@arsedizioni/ars-utils/core";
29
- import * as i4 from "@ngbracket/ngx-layout";
30
- import * as i5 from "@angular/material/dialog";
31
- import * as i6 from "@ngbracket/ngx-layout/flex";
32
- import * as i7 from "@angular/material/button";
33
- import * as i8 from "@angular/material/tooltip";
34
- import * as i9 from "@angular/material/icon";
35
- import * as i10 from "@angular/material/checkbox";
36
- import * as i11 from "@angular/forms";
37
- import * as i12 from "@angular/material/menu";
38
- import * as i13 from "@angular/material/badge";
39
- import * as i14 from "@ngbracket/ngx-layout/extended";
40
- import * as i15 from "@angular/material/sidenav";
41
- import * as i16 from "@angular/material/progress-bar";
42
- import * as i17 from "@angular/material/paginator";
43
- export class ClipperReferencesComponent extends ClipperDocumentBaseComponent {
44
- constructor($dialog, $clipper, $screen, media, dialogRef, _data) {
45
- super($dialog, $clipper);
46
- this.$dialog = $dialog;
47
- this.$clipper = $clipper;
48
- this.$screen = $screen;
49
- this.media = media;
50
- this.dialogRef = dialogRef;
51
- this.__d$ = new Subject();
26
+ import * as i1 from "@ngbracket/ngx-layout/flex";
27
+ import * as i2 from "@angular/material/button";
28
+ import * as i3 from "@angular/material/tooltip";
29
+ import * as i4 from "@angular/material/icon";
30
+ import * as i5 from "@angular/material/checkbox";
31
+ import * as i6 from "@angular/material/slide-toggle";
32
+ import * as i7 from "@angular/forms";
33
+ import * as i8 from "@angular/material/menu";
34
+ import * as i9 from "@angular/material/badge";
35
+ import * as i10 from "@angular/material/paginator";
36
+ import * as i11 from "@ngbracket/ngx-layout/extended";
37
+ import * as i12 from "@angular/material/sidenav";
38
+ export class ClipperReferencesComponent extends ClipperSearchResultManager {
39
+ constructor() {
40
+ super(...arguments);
41
+ this.height = -1;
42
+ this.dialogRef = inject((MatDialogRef));
43
+ this.dialogData = inject(MAT_DIALOG_DATA) ?? { mode: ClipperDocumentSnapshotMode.ReferencesIn };
52
44
  this.title = null;
53
- this.selection = new SelectableModel(true, 'documentId');
54
- this.snapshot = null;
55
- this.facetsMode = 'side';
56
- this.facetsClosed = false;
57
- this.contentHeight = null;
58
- this.contextMenuPosition = { x: '0px', y: '0px' };
59
- this.mq = null;
60
- this.anchor = null;
61
45
  this.item = null;
62
- // Choose the title
63
- switch (_data.mode) {
64
- case ClipperDefinitions.SM_REFERENCES_IN:
65
- this.title = 'Documenti richiamati nelle note o nel testo';
66
- break;
67
- case ClipperDefinitions.SM_REFERENCES_OUT:
68
- this.title = 'Documenti che richiamano quello in visione';
69
- break;
70
- case ClipperDefinitions.SM_CHANGES_IN:
71
- this.title = 'Modifiche subite';
72
- break;
73
- case ClipperDefinitions.SM_CHANGES_OUT:
74
- this.title = 'Modifiche apportate';
75
- break;
76
- case ClipperDefinitions.SM_JURIS:
77
- this.title = 'Giurisprudenza associata';
78
- break;
79
- }
80
- if (_data.anchorTitle)
81
- this.title += ' - ' + _data.anchorTitle;
82
- this.anchor = _data.anchor;
83
- // Use service snapshot
84
- this.snapshot = $clipper.referencesSnapshot;
85
- if (!this.snapshot)
86
- this.snapshot = {
87
- searchParams: {},
88
- };
89
- if (this.snapshot.searchParams.mode !== _data.mode ||
90
- this.snapshot.searchParams.documentId !== _data.id ||
91
- this.snapshot.searchParams.anchor !== _data.anchor) {
92
- this.snapshot.searchParams = {
93
- mode: _data.mode,
94
- model: _data.model,
95
- anchor: _data.anchor,
96
- documentId: _data.id,
97
- useModifierInfo: _data.mode === ClipperDefinitions.SM_CHANGES_OUT,
98
- returnModifierInfo: _data.mode !== ClipperDefinitions.SM_CHANGES_OUT,
99
- first: 0,
100
- count: 25,
101
- };
102
- // Store snapshot
103
- $clipper.referencesSnapshot = this.snapshot;
104
- // New search
105
- this.fetch(true);
106
- }
107
- else {
108
- setTimeout(() => {
109
- // Display current snapshot facets if necessary
110
- this.displayFacets();
111
- this.restoreScrollPosition();
112
- }, 250);
113
- }
114
46
  }
115
47
  ngOnInit() {
116
- // React to media query changes
117
- this.media
118
- .asObservable()
119
- .pipe(takeUntil(this.__d$))
120
- .subscribe((changes) => {
121
- this.mq = changes[0].mqAlias;
122
- this.updateFacetsVisibility();
48
+ if (this.dialogData) {
49
+ switch (this.dialogData.mode) {
50
+ case ClipperDocumentSnapshotMode.ReferencesIn:
51
+ this.title = "Documenti richiamati nelle note o nel testo";
52
+ break;
53
+ case ClipperDocumentSnapshotMode.ReferencesOut:
54
+ this.title = "Documenti che richiamano quello in visione";
55
+ break;
56
+ case ClipperDocumentSnapshotMode.ChangesIn:
57
+ this.title = "Modifiche subite";
58
+ break;
59
+ case ClipperDocumentSnapshotMode.ChangesOut:
60
+ this.title = "Modifiche apportate";
61
+ break;
62
+ case ClipperDocumentSnapshotMode.Juris:
63
+ this.title = "Giurisprudenza associata";
64
+ break;
65
+ }
66
+ if (this.dialogData.anchorTitle) {
67
+ this.title += " - " + this.dialogData.anchorTitle;
68
+ }
69
+ // Use service snapshot
70
+ this.snapshot = this.clipperService.referencesSnapshot ?? { searchParams: {}, interval: "-1" };
71
+ if (this.filterParams.documentSnapshotMode !== this.dialogData.mode ||
72
+ this.filterParams.documentId !== this.dialogData.id ||
73
+ this.filterParams.anchor !== this.dialogData.anchor) {
74
+ this.filterParams = {
75
+ documentSnapshotMode: this.dialogData.mode,
76
+ model: this.dialogData.model,
77
+ anchor: this.dialogData.anchor,
78
+ documentId: this.dialogData.id,
79
+ useModifierInfo: this.dialogData.mode === ClipperDocumentSnapshotMode.ChangesOut,
80
+ returnModifierInfo: this.dialogData.mode !== ClipperDocumentSnapshotMode.ChangesOut,
81
+ first: 0,
82
+ count: 15,
83
+ };
84
+ this.clipperService.referencesSnapshot = this.snapshot;
85
+ }
86
+ }
87
+ // Initialize selection
88
+ this.selection = new SelectableModel(true, 'documentId');
89
+ // Observe layout changes
90
+ this.breakpointObserver
91
+ .observe([
92
+ Breakpoints.XSmall,
93
+ Breakpoints.Small,
94
+ Breakpoints.Medium,
95
+ Breakpoints.Large,
96
+ Breakpoints.XLarge,
97
+ ])
98
+ .pipe(takeUntil(this.unsubscribe))
99
+ .subscribe(result => {
100
+ for (const query of Object.keys(result.breakpoints)) {
101
+ if (result.breakpoints[query]) {
102
+ this.handleFilterPaneVisibility();
103
+ }
104
+ }
123
105
  });
124
- this.updateFacetsVisibility();
125
106
  // React to window size change
126
107
  fromEvent(window, 'resize')
127
- .pipe(takeUntil(this.__d$))
108
+ .pipe(takeUntil(this.unsubscribe), debounceTime(500))
128
109
  .subscribe(() => {
129
- // Update view
130
- this.updateView();
110
+ this.resize();
131
111
  });
132
- this.adjustView();
112
+ }
113
+ ngOnDestroy() {
114
+ this.unsubscribe.next();
115
+ this.unsubscribe.complete();
116
+ }
117
+ ngAfterViewInit() {
133
118
  setTimeout(() => {
134
- // React to sidenav state change
135
- if (this.facetsSidenav)
136
- this.facetsSidenav.openedChange
137
- .subscribe(() => {
138
- this.adjustView();
139
- });
140
- // Configure facet seach component
141
- if (this.facetsSearch) {
142
- this.facetsSearch.changed.subscribe(() => {
143
- if (this.facetsSearch.fromDate) {
144
- this.snapshot.searchParams.fromDate = this.facetsSearch.fromDate;
145
- this.snapshot.searchParams.toDate = this.facetsSearch.toDate;
146
- this.snapshot.searchParams.year = this.facetsSearch.fromDate.getFullYear();
119
+ // Handle filter pane
120
+ this.handleFilterPaneVisibility();
121
+ // Handle facets
122
+ if (this.facets) {
123
+ this.facets.changed
124
+ .subscribe((value) => {
125
+ this.snapshot.facets = value;
126
+ if (this.snapshot.facets.fromDate) {
127
+ this.filterParams.fromDate = this.snapshot.facets.fromDate;
128
+ this.filterParams.toDate = this.snapshot.facets.toDate;
129
+ this.filterParams.year = this.snapshot.facets.fromDate.getFullYear();
147
130
  }
148
- else if (this.facetsSearch.changedInterval) {
149
- this.snapshot.searchParams.year = null;
150
- this.snapshot.searchParams.fromDate = null;
151
- this.snapshot.searchParams.toDate = null;
131
+ else if (this.snapshot.facets.changedInterval) {
132
+ this.filterParams.year = null;
133
+ this.filterParams.fromDate = null;
134
+ this.filterParams.toDate = null;
152
135
  }
153
- if (this.facetsSearch.sector || this.facetsSearch.changedSector)
154
- this.snapshot.searchParams.sector = this.facetsSearch.sector;
155
- if (this.facetsSearch.type || this.facetsSearch.changedType)
156
- this.snapshot.searchParams.type = this.facetsSearch.type;
157
- if (this.facetsSearch.author || this.facetsSearch.changedAuthor)
158
- this.snapshot.searchParams.author = this.facetsSearch.author;
159
- if (this.facetsSearch.reason || this.facetsSearch.changedReason)
160
- this.snapshot.searchParams.reason = this.facetsSearch.reason;
161
- this.snapshot.searchParams.anchor = this.facetsSearch.anchor
162
- ? this.facetsSearch.anchor
163
- : this.anchor;
136
+ if (this.snapshot.facets.sector || this.snapshot.facets.changedSector)
137
+ this.filterParams.sector = this.snapshot.facets.sector;
138
+ if (this.snapshot.facets.type || this.snapshot.facets.changedType)
139
+ this.filterParams.type = this.snapshot.facets.type;
140
+ if (this.snapshot.facets.author || this.snapshot.facets.changedAuthor)
141
+ this.filterParams.author = this.snapshot.facets.author;
164
142
  this.fetch(true);
165
143
  });
166
144
  }
167
- }, 250);
145
+ }, 0);
146
+ if (this.snapshot.interval === "-1") {
147
+ this.snapshot.interval = null;
148
+ this.fetch(true);
149
+ }
150
+ else {
151
+ // Display current snapshot facets if necessary
152
+ this.restoreFacets();
153
+ this.restoreScrollPosition();
154
+ }
155
+ this.resize();
156
+ this.changeDetector.detectChanges();
168
157
  }
169
- ngOnDestroy() {
170
- this.__d$.next();
171
- this.__d$.complete();
158
+ /**
159
+ * Resize
160
+ */
161
+ resize() {
162
+ setTimeout(() => {
163
+ let elem = document.getElementById('clipper-references-scrollable');
164
+ if (elem) {
165
+ const height = this.dialogService.getCurrentDialogScrollableHeight(['clipper-references-fixed'], window.innerHeight);
166
+ if (height != this.height) {
167
+ elem.setAttribute('style', 'height:' + height + 'px !important;max-height:' + height + 'px !important');
168
+ this.height = height;
169
+ this.resize();
170
+ }
171
+ }
172
+ else {
173
+ this.resize();
174
+ }
175
+ }, 100);
172
176
  }
173
- onContextMenu(event, item) {
174
- event.preventDefault();
175
- this.contextMenuPosition.x = event.clientX + 'px';
176
- this.contextMenuPosition.y = event.clientY + 'px';
177
- this.contextMenu.menuData = { item: item };
178
- this.contextMenu.openMenu();
177
+ /**
178
+ * Show hide filter pane manually
179
+ */
180
+ toggleFilterPane() {
181
+ this.filterPaneClosed = !this.filterPaneClosed;
182
+ this.filterPane?.toggle();
183
+ }
184
+ /**
185
+ * Handle filter pane visibility
186
+ */
187
+ handleFilterPaneVisibility() {
188
+ if (this.filterPane) {
189
+ if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||
190
+ this.breakpointObserver.isMatched(Breakpoints.Small) ||
191
+ this.breakpointObserver.isMatched(Breakpoints.Medium)) {
192
+ if (this.filterPane.opened) {
193
+ this.filterPane.close();
194
+ }
195
+ this.filterPane.mode = 'over';
196
+ this.filterPane.disableClose = false;
197
+ this.filterPaneHasBackdrop = true;
198
+ }
199
+ else {
200
+ if (!this.filterPane.opened && !this.filterPaneClosed) {
201
+ this.filterPane.open();
202
+ }
203
+ else if (this.filterPane.opened && this.filterPaneClosed) {
204
+ this.filterPane.close();
205
+ }
206
+ this.filterPane.mode = 'side';
207
+ this.filterPane.disableClose = true;
208
+ this.filterPaneHasBackdrop = false;
209
+ }
210
+ }
179
211
  }
180
212
  /**
181
213
  * Close dialog
@@ -188,118 +220,19 @@ export class ClipperReferencesComponent extends ClipperDocumentBaseComponent {
188
220
  * Save scroll position
189
221
  */
190
222
  saveScrollPosition() {
191
- this.$clipper.scrollable.savePosition(this.snapshot.searchParams.documentId, '#references_container');
223
+ this.clipperService.scrollable.savePosition(this.filterParams.documentId, '#references_container');
192
224
  }
193
225
  /**
194
226
  * Reset scroll position
195
227
  */
196
228
  resetScrollPosition() {
197
- document.querySelector('#references_container').scrollTo(0, 0);
229
+ document.querySelector('#clipper-references-scroller').scrollTo(0, 0);
198
230
  }
199
231
  /**
200
232
  * Restore scroll position
201
233
  */
202
234
  restoreScrollPosition() {
203
- this.$clipper.scrollable.tryRestorePosition(this.snapshot.searchParams.documentId, '#references_container');
204
- }
205
- /**
206
- * Update menu buttons visibility when the menu is closed
207
- */
208
- updateMenuButtonsVisibility() {
209
- this.snapshot.items.forEach((n) => {
210
- n.isMenuOpen = false;
211
- });
212
- }
213
- /**
214
- * Adjust view
215
- */
216
- adjustView() {
217
- setTimeout(() => {
218
- this.updateView();
219
- }, 250);
220
- }
221
- /**
222
- * Update view
223
- */
224
- updateView() {
225
- // Update router height
226
- let a = window.innerHeight;
227
- let b = document.getElementById('clipper-references-fixed');
228
- try {
229
- if (!a || !b || a === 0)
230
- this.adjustView();
231
- let hb = b.clientHeight;
232
- if (hb === 0)
233
- this.adjustView();
234
- this.contentHeight = a - (hb + 12);
235
- }
236
- catch { }
237
- }
238
- /**
239
- * Update sidenav visibility
240
- * @param mq : the current media query
241
- */
242
- updateFacetsVisibility() {
243
- if (this.mq === 'xs') {
244
- this.facetsMode = 'over';
245
- if (this.facetsSearch &&
246
- this.facetsSearch.hasFacets &&
247
- this.facetsSidenav &&
248
- this.facetsSidenav.opened)
249
- this.facetsSidenav.close();
250
- }
251
- else {
252
- this.facetsMode = 'side';
253
- if (this.facetsSearch &&
254
- this.facetsSearch.hasFacets &&
255
- this.facetsSidenav &&
256
- !this.facetsClosed)
257
- this.facetsSidenav.toggle(true);
258
- }
259
- }
260
- /**
261
- * Open facetsSidenav sidebar
262
- */
263
- facetsOpen() {
264
- this.facetsClosed = false;
265
- this.facetsSidenav.open();
266
- }
267
- /**
268
- * Close facets sidebar
269
- * @param closedManually : ture if facets has been closed manually by clicking the button
270
- */
271
- facetsClose(closedManually = false) {
272
- if (this.mq !== 'xs')
273
- this.facetsClosed = closedManually;
274
- this.facetsSidenav.close();
275
- }
276
- /**
277
- * Export a document in pdf format
278
- * @param item : the document to export
279
- */
280
- exportPdf(item) {
281
- if (!this.$clipper.loggedIn)
282
- return;
283
- if (!item || item.model === 11)
284
- return;
285
- this.$dialog
286
- .confirm("Confermi l'esportazione?", 'Attenzione!')
287
- .componentInstance.choosen
288
- .subscribe((r) => {
289
- if (r.result === 'ok') {
290
- this.$dialog.busy('Esportazione in corso...');
291
- this.$clipper
292
- .exportPdf(item.documentId)
293
- .subscribe({
294
- next: (r2) => {
295
- saveAs(r2, (item.title1 ? item.title1 : item.documentId) + '.pdf');
296
- },
297
- complete: () => {
298
- this.$dialog.clearBusy();
299
- }
300
- });
301
- }
302
- });
235
+ this.clipperService.scrollable.tryRestorePosition(this.filterParams.documentId, '#clipper-references-scroller');
303
236
  }
304
237
  /**
305
238
  * Send document links by email
@@ -313,140 +246,32 @@ export class ClipperReferencesComponent extends ClipperDocumentBaseComponent {
313
246
  * @param newSearch: true if is a new search
314
247
  */
315
248
  fetch(newSearch = false) {
316
- if (!this.$clipper.loggedIn)
249
+ if (!this.clipperService.loggedIn)
317
250
  return;
318
251
  if (newSearch)
319
- this.snapshot.searchParams.first = 0;
320
- this.snapshot.searchParams.useModifierInfo =
321
- this.snapshot.searchParams.mode === ClipperDefinitions.SM_CHANGES_OUT;
322
- this.snapshot.searchParams.returnModifierInfo =
323
- this.snapshot.searchParams.mode !== ClipperDefinitions.SM_CHANGES_OUT;
324
- this.$dialog.busy('Ricerca in corso...');
325
- this.$clipper.references(this.snapshot.searchParams)
252
+ this.filterParams.first = 0;
253
+ this.filterParams.useModifierInfo =
254
+ this.filterParams.documentSnapshotMode === ClipperDocumentSnapshotMode.ChangesOut;
255
+ this.filterParams.returnModifierInfo =
256
+ this.filterParams.documentSnapshotMode !== ClipperDocumentSnapshotMode.ChangesOut;
257
+ this.dialogService.busy('Ricerca in corso...');
258
+ this.clipperService.references(this.filterParams)
326
259
  .subscribe({
327
260
  next: (r) => {
328
261
  if (!r.success)
329
- this.$dialog.error(r.message);
262
+ this.dialogService.error(r.message);
330
263
  else {
331
- const today = startOfToday();
332
- let group = '';
333
- this.snapshot.total = r.value?.total ?? 0;
334
- this.snapshot.items = r.value?.items ?? [];
335
- this.snapshot.items.forEach((n) => {
336
- if (n.model === ClipperDefinitions.DM_SCADENZA ||
337
- n.model === ClipperDefinitions.DM_SEGNALAZIONE) {
338
- switch (n.model) {
339
- case ClipperDefinitions.DM_SCADENZA:
340
- n.originDescription = 'Scadenza';
341
- break;
342
- case ClipperDefinitions.DM_SEGNALAZIONE:
343
- n.originDescription = 'Segnalazione';
344
- break;
345
- }
346
- if (n.expiringInfo) {
347
- let parts = n.expiringInfo.split('|');
348
- if (parts.length === 3)
349
- n.description = parts[2];
350
- }
351
- if (n.expiringDate) {
352
- n.date = startOfDay(new Date(n.expiringDate));
353
- const d = startOfDay(subDays(n.date, 15));
354
- n.isExpiring = today <= n.date && today >= d;
355
- n.isExpired = n.date < today;
356
- }
357
- }
358
- else {
359
- if (n.date) {
360
- n.date = startOfDay(new Date(n.date));
361
- const d = startOfDay(subDays(startOfToday(), 7));
362
- n.isNew = n.date > d;
363
- }
364
- if (n.anchors) {
365
- let anchorType;
366
- let anchors = [];
367
- n.anchors.forEach((a) => {
368
- if (a.type === 20)
369
- return;
370
- if (a.type !== anchorType) {
371
- if (a.type >= 3)
372
- anchors.push({ text: a.typeDescription });
373
- anchorType = a.type;
374
- }
375
- let score = a.score;
376
- if (score > 7)
377
- score -= 7;
378
- else if (score > 5)
379
- score -= 5;
380
- else if (score > 3)
381
- score -= 3;
382
- anchors.push({
383
- text: a.text,
384
- title: a.title,
385
- documentId: a.documentId,
386
- uri: a.uri,
387
- veryRelevant: score > 0.6,
388
- });
389
- });
390
- n.anchors = anchors;
391
- }
392
- if (n.validityState > 0) {
393
- n.validityDescription = 'Il documento non è più vigente';
394
- n.isExpired = true;
395
- if (n.validUntilDate) {
396
- const expiringDate = startOfDay(new Date(n.validUntilDate));
397
- if (expiringDate < today) {
398
- n.validityDescription =
399
- 'Il documento non è più vigente dal ' +
400
- SystemUtils.formatDate(expiringDate) +
401
- '.';
402
- }
403
- else {
404
- n.validityDescription =
405
- 'Il documento non sarà più vigente dal ' +
406
- SystemUtils.formatDate(expiringDate) +
407
- '.';
408
- n.isExpired = false;
409
- }
410
- }
411
- }
412
- if (n.expiringDate) {
413
- n.date = startOfDay(new Date(n.expiringDate));
414
- n.isExpired = n.date < today;
415
- }
416
- }
417
- let year = SystemUtils.formatDate(n.date, DateFormat.LongMonthAndYear).toLowerCase();
418
- if (group !== year) {
419
- n.group = year;
420
- group = year;
421
- }
422
- if (n.taxonomy) {
423
- n.taxonomyNodes = n.taxonomy.split('\r\n');
424
- if (this.snapshot.searchParams.model ===
425
- ClipperDefinitions.DM_GUIDA ||
426
- this.snapshot.searchParams.model ===
427
- ClipperDefinitions.DM_GUIDA_NORMATIVA ||
428
- this.snapshot.searchParams.model ===
429
- ClipperDefinitions.DM_SCHEDA_ADEMPIMENTI) {
430
- for (let i = 0; i < n.taxonomyNodes.length; i++) {
431
- let node = n.taxonomyNodes[i];
432
- let p = node.indexOf('>');
433
- if (p !== -1)
434
- n.taxonomyNodes[i] = node
435
- .substring(p + 1)
436
- .replace(/\>/gi, ' > ');
437
- }
438
- }
439
- }
440
- });
264
+ this.prepareResults(r.value);
441
265
  // Handle facets
442
266
  if (this.snapshot.total > 0) {
267
+ this.snapshot.facets.hasTooManyResults = this.snapshot.total >= 1000;
443
268
  if (newSearch)
444
269
  // Update facets
445
- this.displayFacets(this.snapshot.searchParams);
270
+ this.fetchFacets();
446
271
  }
447
272
  else {
448
- this.facetsSearch.reset();
449
- this.facetsSidenav.close();
273
+ this.facets.reset();
274
+ this.filterPane.close();
450
275
  }
451
276
  if (newSearch) {
452
277
  if (this.paginator)
@@ -456,7 +281,7 @@ export class ClipperReferencesComponent extends ClipperDocumentBaseComponent {
456
281
  }
457
282
  },
458
283
  complete: () => {
459
- this.$dialog.clearBusy();
284
+ this.dialogService.clearBusy();
460
285
  }
461
286
  });
462
287
  }
@@ -465,93 +290,74 @@ export class ClipperReferencesComponent extends ClipperDocumentBaseComponent {
465
290
  * @param e : the MatPaginator PageEvent data
466
291
  */
467
292
  fetchMore(e) {
468
- let first = e.pageIndex * this.snapshot.searchParams.count;
469
- this.snapshot.searchParams.first = first;
293
+ let first = e.pageIndex * this.filterParams.count;
294
+ this.filterParams.first = first;
470
295
  this.fetch();
471
296
  }
472
297
  /**
473
298
  * Get facets
474
- * @param searchParams : the current search params to use to gather facets or null to use current snapshot
475
299
  */
476
- displayFacets(searchParams = null) {
477
- if (!this.$clipper.loggedIn)
300
+ fetchFacets() {
301
+ if (!this.clipperService.loggedIn)
478
302
  return;
479
- if (searchParams) {
480
- this.facetsSearch.busy = true;
481
- this.$clipper.referencesFacets(searchParams)
482
- .subscribe({
483
- next: (r) => {
484
- if (r.success) {
485
- this.facetsSearch.update(r.value.facets, null);
486
- if (this.facetsSearch.hasFacets &&
487
- !this.facetsClosed &&
488
- this.mq !== 'xs')
489
- this.facetsOpen();
490
- else
491
- this.facetsClose();
492
- this.snapshot.facets = this.facetsSearch;
493
- }
494
- this.resetScrollPosition();
495
- },
496
- complete: () => {
497
- this.facetsSearch.busy = false;
303
+ this.facets.busy.set(true);
304
+ this.clipperService.referencesFacets(this.filterParams)
305
+ .subscribe({
306
+ next: (r) => {
307
+ if (r.success) {
308
+ this.prepareResults(null, r.value.facets);
309
+ this.handleFilterPaneVisibility();
498
310
  }
499
- });
500
- }
501
- else if (this.snapshot.facets) {
502
- this.facetsSearch.restoreFrom(this.snapshot.facets);
503
- if (this.facetsSearch.hasFacets && !this.facetsClosed && this.mq !== 'xs')
504
- this.facetsOpen();
505
- else
506
- this.facetsClose();
311
+ this.resetScrollPosition();
312
+ },
313
+ complete: () => {
314
+ this.facets.busy.set(false);
315
+ }
316
+ });
317
+ }
318
+ /**
319
+ * Try to restore stored facets
320
+ */
321
+ restoreFacets() {
322
+ if (this.snapshot.facets) {
323
+ this.facets.restore(this.snapshot.facets);
324
+ this.handleFilterPaneVisibility();
507
325
  }
508
326
  }
509
327
  /**
510
328
  * Close current dialog and return the id to navigate to
511
- * @param id : the document id
329
+ * @param documentId : the document id
512
330
  */
513
- open(id) {
514
- this.dialogRef.close({ id: id });
331
+ open(documentId) {
332
+ this.dialogRef.close({ id: documentId });
515
333
  }
516
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperReferencesComponent, deps: [{ token: i1.DialogService }, { token: i2.ClipperService }, { token: i3.ScreenService }, { token: i4.MediaObserver }, { token: i5.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
517
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: ClipperReferencesComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "facetsSidenav", first: true, predicate: ["facetsSidenav"], descendants: true }, { propertyName: "facetsSearch", first: true, predicate: ["facetsSearch"], descendants: true }, { propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }, { propertyName: "contextMenu", first: true, predicate: ["contextMenuTrigger"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxFill style=\"padding: 0 0 0 15px;\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n @if (snapshot.searchParams.mode == 1) {\r\n <mat-checkbox color=\"primary\" name=\"excludeTextReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note</mat-checkbox>\r\n }\r\n @if (snapshot.searchParams.mode == 2) {\r\n <mat-checkbox color=\"primary\" name=\"excludeNotesReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\" color=\"primary\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Nascondi\"\r\n (click)=\"facetsClose(true)\" color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"references_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px;\">\r\n <div class=\"item-greyed-1\" style='text-align: center'>\r\n <p>Nessun elemento da visualizzare.</p>\r\n <p>Il filtro applicato non consente la selezione di alcun risulato.</p>\r\n </div>\r\n </div>\r\n }\r\n @if (snapshot.total) {\r\n <div>\r\n @for (item of snapshot.items; track item) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div style=\"padding-left: 15px; padding-top:24px;\">\r\n <div class=\"item-accent\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"0px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\" fxLayoutAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (!item.isJuris && item.model != 9 && (item.model != 11 || snapshot.searchParams.mode == 2) &&\r\n item.modelName && item.modelName.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">\r\n {{item.modelName}}</div>\r\n }\r\n @if (!item.isJuris && item.model == 22) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">ARS\r\n BLOG</div>\r\n }\r\n @if (item.author && item.origin === 'LR') {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">{{item.author}}</div>\r\n }\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n <a (click)=\"open(item.documentId)\"\r\n [attr.aria-label]=\"'Apri documento ' + (item.title1 ? item.title1: item.title2)\">{{item.title1\r\n ? item.title1 : item.title2}}</a>\r\n @if (item.part > 0) {\r\n <span class=\"item-badge\">PARTE {{item.part}}</span>\r\n }\r\n\r\n </div>\r\n @if (item.title1 && item.title2) {\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n {{item.title2}}\r\n </div>\r\n }\r\n @if (item.originDescription ) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-2\">\r\n {{item.originDescription}}\r\n </div>\r\n }\r\n @if (item.anchors.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <div class=\"item-line-block\">\r\n <div class=\"item-line-block-title\">DETTAGLIO</div>\r\n <div>\r\n @for (a of item.anchors; track a) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a class=\"link\" style='line-height: 18px; margin-right: 8px'\r\n (click)=\"open(a.documentId + '#' + a.uri)\" [matTooltip]=\"a.title\">{{a.text}} @if\r\n (a.veryRelevant) {\r\n <sup>\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px' color=\"primary\"\r\n matTooltip=\"Molto rilevante\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span style='line-height: 18px; margin-right: 8px '>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @if (item.validityState > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <span\r\n style=\"background-color: red; color: white; padding: 2px 4px; border-radius: 3px; border: 1px solid red\">\r\n {{item.validityDescription}}\r\n </span>\r\n </div>\r\n }\r\n\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot.total\"\r\n [pageSize]=\"25\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i6.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i6.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i6.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i6.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.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: MatBadgeModule }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: ClipperDocumentMenuComponent, selector: "clipper-document-menu", inputs: ["selectionSource", "parent", "item", "isReference", "isReadable", "isSelectable", "isDeadline", "isLawInForce", "isLaw"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i14.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i14.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i15.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i15.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i15.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i16.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ClipperSearchFacetsComponent, selector: "clipper-search-facets", inputs: ["busy"], outputs: ["changed"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i17.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] }); }
334
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperReferencesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
335
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: ClipperReferencesComponent, isStandalone: true, selector: "ng-component", host: { attributes: { "Bind": SystemUtils.generateUUID() } }, viewQueries: [{ propertyName: "filterPane", first: true, predicate: ["filterPane"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\" class=\"dialog-close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill style=\"padding: 0 10px 0 24px;\">\r\n <div fxFlex=\"*\">\r\n @if (snapshot.searchParams.documentSnapshotMode == 1) {\r\n <mat-slide-toggle name=\"excludeTextReferences\" [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note\r\n </mat-slide-toggle>\r\n } @else if (snapshot.searchParams.documentSnapshotMode == 2) {\r\n <mat-slide-toggle name=\"excludeNotesReferences\" [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-slide-toggle>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (snapshot && snapshot.facets?.hasFacets && filterPane && (!filterPane.opened || filterPaneClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"toggleFilterPane()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content id=\"clipper-references-scrollable\">\r\n <mat-drawer-container [hasBackdrop]=\"filterPaneHasBackdrop\">\r\n <mat-drawer #filterPane position=\"end\" class=\"drawer-small\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"40px\" style=\"margin:0 4px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlexAlign=\"center\" class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-hidden\">\r\n <clipper-search-facets #facets></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" id=\"clipper-references-scroller\">\r\n @if (!snapshot.total) {\r\n <div>\r\n <p class=\"message\"><i>Nessun elemento da visualizzare.</i></p>\r\n </div>\r\n } @else {\r\n <div>\r\n @for (item of snapshot.items; track item; let i = $index) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div class=\"items-group-title\">\r\n <div [ngClass]=\"{'spaced': i > 0}\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"6px\" fxLayoutAlign=\"start center\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"center\">\r\n @if (screenService.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"item-content\">\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end center\" fxFill>\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot?.total ?? 0\"\r\n [pageSize]=\"filterParams.count ?? 15\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #191c1b;--ars-color-text-low: #e0e2e5;--ars-color-divider: #757d87;--ars-drawer-background-color: #eff1ef;--ars-drawer-background-color-low: #e0e3e1;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.center{text-align:center}.wide{min-width:100%!important;max-width:100%;width:100%}.fill{min-width:100%!important;max-width:100%;width:100%;min-height:100%!important;max-height:100%;height:100%}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.smaller{font-size:smaller}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.accent{color:var(--ars-accent)!important}.primary{color:var(--ars-primary)!important}.secondary{color:var(--ars-secondary)!important}.error{color:var(--ars-error)!important}.warning{color:var(--ars-warning)!important}.drawer-content{padding-top:10px}.drawer,.drawer-small{min-width:420px!important;max-width:420px!important;padding:20px 5px 5px;background-color:var(--ars-drawer-background-color)!important}.drawer .title,.drawer-small .title{font-size:1.2em;font-weight:600;padding-left:10px;min-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawer .fade-in,.drawer-small .fade-in{animation:fadein .5s linear}@keyframes fadein{0%{opacity:0}to{opacity:1}}.drawer .content,.drawer-small .content{padding:10px 0}.drawer .fixed,.drawer-small .fixed{padding:0 4px}.drawer .accordion-panel,.drawer-small .accordion-panel{background-color:transparent}.drawer .accordion-header,.drawer-small .accordion-header{padding-left:15px;padding-right:20px;border-radius:var(--mat-expansion-container-shape)}.drawer .mat-expansion-panel-body,.drawer-small .mat-expansion-panel-body{padding-bottom:20px!important}.drawer-small{min-width:360px!important;max-width:360px!important}.drawer-small .title{min-width:150px}.drawer-small .content{padding:20px 0 10px}@media screen and (min-width: 0px) and (max-width: 359px){.drawer{min-width:360px!important;max-width:360px!important}.drawer .title{min-width:150px}}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #e0e2e5;--ars-color-text-low: #191c1b;--ars-color-divider: #757d87;--ars-drawer-background-color: #323534;--ars-drawer-background-color-low: #424444;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.expired,.unread{color:var(--ars-error, #ff5449)!important}.expiring{color:var(--ars-warning, #FFC107)!important}.error-bg,.expired-bg,.unread-bg{background-color:var(--ars-error, #ff5449)}.expiring-bg{background-color:var(--ars-warning, #FFC107)}.popular-bg{background-color:#388e3c}.very-popular-bg{background-color:#4caf50}.item-selected{background-color:var(--ars-item-selected-background-color, #ced1d2);border-radius:0!important}.item-unread{font-weight:bolder}.items-group-title{color:var(--ars-accent, #7894ae);font-size:large;font-weight:700;padding-left:25px;padding-bottom:10px;padding-top:10px}.items-group-title .spaced,.items-footer{padding-top:10px}.item{border-radius:12px;padding:10px 0;min-height:60px!important;margin-bottom:2px}.item .item-content .info-1{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent, #7894ae)}.item .item-content .info-2{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent-low, #456179)}.item .item-content .title{font-size:small}.item .item-content .details{margin-top:4px;font-size:x-small;font-weight:700;color:var(--ars-accent-low, #456179);text-transform:uppercase;border-left:4px solid var(--ars-accent-low, #456179);padding-left:10px}.item .item-content .details .links{text-transform:none;text-decoration:none}.item .item-content .details .links a,.item .item-content .details .links span,.item .item-content .details .links div{margin-right:8px;font-weight:600;color:var(--ars-color-text, #191c1b)}.item .item-content .details .links a{cursor:pointer!important;color:var(--ars-link, #03A9F4);font-weight:600}.item .item-content a.link{color:var(--ars-link, #03A9F4);cursor:pointer!important}.item:hover{background-color:var(--ars-item-hover-background-color, #eaecef)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%);mask-image:linear-gradient(to right,black 85%,transparent 100%)}.tile:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.tile{cursor:pointer;padding:10px 13px;margin-bottom:2px}.tile .body{padding:4px 6px}.tile .image-mark{border-top:6px solid transparent;margin:0 8px}.tile .image-mark-unread{border-top-color:var(--ars-error, #ff5449);margin:0 8px}.tile .image{height:180px;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.tile .image .img{object-fit:cover;width:100%;height:100%}.tile .image .info-1{position:absolute;left:0;bottom:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-color-text, #191c1b);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .info-2{position:absolute;right:0;top:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-accent, #7894ae);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .check{position:absolute;left:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .image .check-selected{background-color:var(--ars-primary-hi, #12c0ae)}.tile .image .read{position:absolute;right:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .badge,.tile .badge-red{margin-left:10px;padding:1px 4px;border-radius:3px;font-size:x-small;font-weight:700;text-align:center;background-color:var(--ars-accent, #7894ae);text-transform:uppercase;white-space:nowrap;color:var(--ars-color-text-low, #e0e2e5)}.tile .badge-red{background-color:var(--ars-error, #ff5449);color:var(--ars-color-text-low, #e0e2e5)}.tile .date{padding:8px 0 6px;font-weight:700;text-transform:uppercase}.tile .date .date-day{color:var(--ars-accent, #7894ae)}.tile .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.tile .time{font-size:small;font-weight:700}.tile .title{text-decoration:none;font-size:small;min-height:72px;overflow:hidden}.busy-backdrop{background-color:#00000052!important}.legend-container{display:flex;flex-direction:row;align-items:center;font-size:x-small;text-transform:uppercase;font-weight:500;margin-left:10px}.legend-container .legend{display:inline-block;height:8px;width:8px;margin-right:4px}.legend-container .next{margin-left:8px}.special-date,.special-date-expired{border:2px var(--ars-accent, #7894ae) solid!important;border-radius:100%!important}.special-date-expired{border:2px var(--ars-error, #ff5449) solid!important}.message{color:var(--ars-color-secondary, #4a635f);padding:20px;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i1.DefaultFlexAlignDirective, selector: " [fxFlexAlign], [fxFlexAlign.xs], [fxFlexAlign.sm], [fxFlexAlign.md], [fxFlexAlign.lg], [fxFlexAlign.xl], [fxFlexAlign.lt-sm], [fxFlexAlign.lt-md], [fxFlexAlign.lt-lg], [fxFlexAlign.lt-xl], [fxFlexAlign.gt-xs], [fxFlexAlign.gt-sm], [fxFlexAlign.gt-md], [fxFlexAlign.gt-lg]", inputs: ["fxFlexAlign", "fxFlexAlign.xs", "fxFlexAlign.sm", "fxFlexAlign.md", "fxFlexAlign.lg", "fxFlexAlign.xl", "fxFlexAlign.lt-sm", "fxFlexAlign.lt-md", "fxFlexAlign.lt-lg", "fxFlexAlign.lt-xl", "fxFlexAlign.gt-xs", "fxFlexAlign.gt-sm", "fxFlexAlign.gt-md", "fxFlexAlign.gt-lg"] }, { kind: "directive", type: i1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i8.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i8.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: MatBadgeModule }, { kind: "directive", type: i9.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i10.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i11.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i12.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i12.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: ClipperDocumentMenuComponent, selector: "clipper-document-menu", inputs: ["parent", "selectionSource", "useSelections", "item", "isReference", "isReadable", "isDeadline", "isLawInForce", "isLaw"] }, { kind: "component", type: ClipperSearchFacetsComponent, selector: "clipper-search-facets", outputs: ["changed"] }, { kind: "component", type: ClipperSearchResultItemComponent, selector: "clipper-search-result-item", inputs: ["parent", "item"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
518
336
  }
519
337
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ClipperReferencesComponent, decorators: [{
520
338
  type: Component,
521
- args: [{ host: { 'Bind': SystemUtils.generateUUID() }, standalone: true, imports: [
339
+ args: [{ host: { 'Bind': SystemUtils.generateUUID() }, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
522
340
  FlexModule,
523
341
  MatDialogTitle,
524
342
  MatButtonModule,
525
343
  MatTooltipModule,
526
344
  MatIconModule,
527
345
  MatCheckboxModule,
346
+ MatSlideToggleModule,
528
347
  FormsModule,
529
348
  MatMenuModule,
530
349
  MatBadgeModule,
531
- ClipperDocumentMenuComponent,
350
+ MatPaginatorModule,
532
351
  MatDialogContent,
533
- NgStyle,
534
352
  ExtendedModule,
535
353
  MatSidenavModule,
536
354
  MatProgressBarModule,
355
+ ClipperDocumentMenuComponent,
537
356
  ClipperSearchFacetsComponent,
538
- NgClass,
539
- MatPaginatorModule,
540
- ], template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Chiudi\"\r\n aria-label=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxFill style=\"padding: 0 0 0 15px;\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">\r\n @if (snapshot.searchParams.mode == 1) {\r\n <mat-checkbox color=\"primary\" name=\"excludeTextReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note</mat-checkbox>\r\n }\r\n @if (snapshot.searchParams.mode == 2) {\r\n <mat-checkbox color=\"primary\" name=\"excludeNotesReferences\"\r\n [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\" (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\" color=\"primary\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (facetsSearch && facetsSearch.hasFacets && facetsSidenav && (!facetsSidenav.opened || facetsClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button color=\"primary\" matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"facetsOpen()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content style=\"padding:0 0 0 15px\" [ngStyle]=\"{'min-height.px': contentHeight}\">\r\n <mat-sidenav-container [ngStyle]=\"{'height.px': contentHeight}\">\r\n <mat-sidenav #facetsSidenav position=\"end\" autoFocus=\"false\" opened=\"false\" mode=\"{{facetsMode}}\"\r\n class=\"sidenav sidenav-facets\">\r\n @if (facetsSearch.busy) {\r\n <div class=\"sidenav-overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div style=\"height:5px\">\r\n @if (facetsSearch.busy) {\r\n <mat-progress-bar class=\"sidenav-loader\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"64px\">\r\n <div fxLayout=\"row\" fxFill class=\"sidenav-title-container\">\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" fxLayoutAlign=\"start\">\r\n <span class=\"sidenav-title\">Affina ricerca</span>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Nascondi\"\r\n (click)=\"facetsClose(true)\" color=\"primary\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" style=\"overflow: hidden;\">\r\n <clipper-search-facets #facetsSearch></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content>\r\n <div [ngStyle]=\"{'height.px': contentHeight }\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"100\" id=\"references_container\" style=\"overflow: auto\">\r\n <div style=\"overflow:hidden\">\r\n @if (!snapshot.total) {\r\n <div style=\"padding:32px;\">\r\n <div class=\"item-greyed-1\" style='text-align: center'>\r\n <p>Nessun elemento da visualizzare.</p>\r\n <p>Il filtro applicato non consente la selezione di alcun risulato.</p>\r\n </div>\r\n </div>\r\n }\r\n @if (snapshot.total) {\r\n <div>\r\n @for (item of snapshot.items; track item) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div style=\"padding-left: 15px; padding-top:24px;\">\r\n <div class=\"item-accent\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"0px\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxFlexAlign=\"center\" fxLayoutAlign=\"center\">\r\n @if ($screen.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\r\n @if (!item.isJuris && item.model != 9 && (item.model != 11 || snapshot.searchParams.mode == 2) &&\r\n item.modelName && item.modelName.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">\r\n {{item.modelName}}</div>\r\n }\r\n @if (!item.isJuris && item.model == 22) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">ARS\r\n BLOG</div>\r\n }\r\n @if (item.author && item.origin === 'LR') {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-1 uppercase\">{{item.author}}</div>\r\n }\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n <a (click)=\"open(item.documentId)\"\r\n [attr.aria-label]=\"'Apri documento ' + (item.title1 ? item.title1: item.title2)\">{{item.title1\r\n ? item.title1 : item.title2}}</a>\r\n @if (item.part > 0) {\r\n <span class=\"item-badge\">PARTE {{item.part}}</span>\r\n }\r\n\r\n </div>\r\n @if (item.title1 && item.title2) {\r\n <div class=\"item-line item-line-2 item-line-read\">\r\n {{item.title2}}\r\n </div>\r\n }\r\n @if (item.originDescription ) {\r\n <div class=\"item-line item-line-3 item-line-read item-greyed-2\">\r\n {{item.originDescription}}\r\n </div>\r\n }\r\n @if (item.anchors.length > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <div class=\"item-line-block\">\r\n <div class=\"item-line-block-title\">DETTAGLIO</div>\r\n <div>\r\n @for (a of item.anchors; track a) {\r\n <span>\r\n @if (a.uri && a.text) {\r\n <a class=\"link\" style='line-height: 18px; margin-right: 8px'\r\n (click)=\"open(a.documentId + '#' + a.uri)\" [matTooltip]=\"a.title\">{{a.text}} @if\r\n (a.veryRelevant) {\r\n <sup>\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px' color=\"primary\"\r\n matTooltip=\"Molto rilevante\">thumb_up_alt</mat-icon>\r\n </sup>\r\n }</a>\r\n }\r\n @if (!a.uri && a.text) {\r\n <span style='line-height: 18px; margin-right: 8px '>{{a.text}}</span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @if (item.validityState > 0) {\r\n <div class=\"item-line item-line-3 item-line-read\">\r\n <span\r\n style=\"background-color: red; color: white; padding: 2px 4px; border-radius: 3px; border: 1px solid red\">\r\n {{item.validityDescription}}\r\n </span>\r\n </div>\r\n }\r\n\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (snapshot.total > 0) {\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot.total\"\r\n [pageSize]=\"25\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.item{min-height:50px!important;border-bottom:1px dotted #eee!important;line-height:18px}.item:hover{background-color:#fff8e1}.item-cell{padding:5px 0}.item-line{padding-top:1px;padding-bottom:1px}.item-line .command a{text-decoration:none;color:#2a91e0;font-weight:500;cursor:pointer!important}.item-line .command a:hover{opacity:.7}.item-line>a{color:#2a91e0!important;opacity:1!important;cursor:pointer}.item-line>a:hover{opacity:.7!important}.item-line-1{font-weight:500;font-size:1em;color:#000}.item-line-2{font-size:.9em;color:#000}.item-line-3{font-size:.8em;color:#000}.item-line-4{font-size:.7em;color:#000}.item-line-block-title{font-size:.8em;font-weight:500}.item-line-block{margin-top:4px;margin-bottom:4px;margin-left:10px;padding-left:10px;border-left:2px solid #009688}.item-line-read{font-weight:400!important}.item-line-read .command,.item-line-read a{color:#2a91e0;cursor:pointer!important;opacity:1!important}.item-line-read .command:hover,.item-line-read a:hover{opacity:.7!important}.item-line-red-badge{background-color:red;color:#fff;padding:2px 4px;border-radius:3px;border:1px solid red}.items-group-title{line-height:24px;padding:20px 10px 10px 20px;font-weight:500;font-size:19.2px}.items-footer{padding-top:10px}.sidenav-title-container{min-height:64px!important;padding-left:15px;margin-bottom:4px}.sidenav-title{color:#009688;font-weight:500;font-size:19.2px}.item-greyed-1{color:#607d8b}.item-greyed-2{color:#90a4ae}.item-accent{color:#0d7066}.item-primary{color:#009688}.item-badge{margin-left:10px;margin-bottom:5px;padding:0 4px;height:12px;line-height:12px;border-radius:3px;font-size:x-small;font-weight:500;text-align:center;background-color:orange;color:#000}\n"] }]
541
- }], ctorParameters: () => [{ type: i1.DialogService }, { type: i2.ClipperService }, { type: i3.ScreenService }, { type: i4.MediaObserver }, { type: i5.MatDialogRef }, { type: undefined, decorators: [{
542
- type: Inject,
543
- args: [MAT_DIALOG_DATA]
544
- }] }], propDecorators: { facetsSidenav: [{
545
- type: ViewChild,
546
- args: ['facetsSidenav']
547
- }], facetsSearch: [{
548
- type: ViewChild,
549
- args: ['facetsSearch']
550
- }], paginator: [{
551
- type: ViewChild,
552
- args: ['paginator']
553
- }], contextMenu: [{
357
+ ClipperSearchResultItemComponent
358
+ ], template: "<div id=\"clipper-references-fixed\">\r\n <div id=\"clipper-references-header\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap='10px' fxFill>\r\n <div fxFlex=\"*\">\r\n <h2 mat-dialog-title>{{title}} </h2>\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\" class=\"dialog-close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill style=\"padding: 0 10px 0 24px;\">\r\n <div fxFlex=\"*\">\r\n @if (snapshot.searchParams.documentSnapshotMode == 1) {\r\n <mat-slide-toggle name=\"excludeTextReferences\" [(ngModel)]=\"snapshot.searchParams.excludeTextReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citati nelle note\r\n </mat-slide-toggle>\r\n } @else if (snapshot.searchParams.documentSnapshotMode == 2) {\r\n <mat-slide-toggle name=\"excludeNotesReferences\" [(ngModel)]=\"snapshot.searchParams.excludeNotesReferences\"\r\n (change)=\"fetch(true)\">\r\n Mostra solo se citano nel testo il documento\r\n </mat-slide-toggle>\r\n }\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (selection.hasValue()) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Azioni da eseguire sugli elementi selezionati\"\r\n [attr.aria-label]=\"'Menu opzioni per elementi selezionati'\" [matMenuTriggerFor]=\"menuSelections\"\r\n [disabled]=\"!snapshot.total\">\r\n <mat-icon aria-hidden=\"false\" [matBadge]=\"selection.all.length\"\r\n matBadgeColor=\"accent\">playlist_add_check</mat-icon>\r\n <mat-icon class=\"icon-menu-drop-down\">expand_more</mat-icon>\r\n </button>\r\n }\r\n <mat-menu #menuSelections=\"matMenu\">\r\n <clipper-document-menu [parent]=\"this\" [selectionSource]=\"selection\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </mat-menu>\r\n @if (snapshot && snapshot.facets?.hasFacets && filterPane && (!filterPane.opened || filterPaneClosed)) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Affina ricerca\" aria-label=\"'Affina ricerca'\"\r\n (click)=\"toggleFilterPane()\">\r\n <mat-icon>menu_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n<div mat-dialog-content id=\"clipper-references-scrollable\">\r\n <mat-drawer-container [hasBackdrop]=\"filterPaneHasBackdrop\">\r\n <mat-drawer #filterPane position=\"end\" class=\"drawer-small\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"40px\" style=\"margin:0 4px\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlexAlign=\"center\" class=\"title\">Affina ricerca</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button fxFlexAlign=\"center\" mat-icon-button (click)=\"toggleFilterPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"scroll-hidden\">\r\n <clipper-search-facets #facets></clipper-search-facets>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\" id=\"clipper-references-scroller\">\r\n @if (!snapshot.total) {\r\n <div>\r\n <p class=\"message\"><i>Nessun elemento da visualizzare.</i></p>\r\n </div>\r\n } @else {\r\n <div>\r\n @for (item of snapshot.items; track item; let i = $index) {\r\n <div (contextmenu)=\"onContextMenu($event, item)\" (mouseenter)=\"item.isOver = true\"\r\n (mouseleave)=\"item.isOver = false\">\r\n @if (item.group) {\r\n <div class=\"items-group-title\">\r\n <div [ngClass]=\"{'spaced': i > 0}\">{{item.group}}</div>\r\n </div>\r\n }\r\n <div fxLayout=\"row\" fxLayoutGap=\"6px\" fxLayoutAlign=\"start center\" fxFill class=\"item\"\r\n [ngClass]=\"{'item-selected': selection.isSelected(item.documentId) }\">\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"center\">\r\n @if (screenService.isTouchable || item.isOver || selection.isSelected(item.documentId)) {\r\n <mat-checkbox (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(item, item.documentId) : null\"\r\n [checked]=\"selection.isSelected(item.documentId)\">\r\n </mat-checkbox>\r\n }\r\n </div>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"item-content\">\r\n <clipper-search-result-item [item]=\"item\" [parent]=\"this\"></clipper-search-result-item>\r\n </div>\r\n <div fxFlex=\"48px\" fxLayoutAlign=\"end\">\r\n @if (item.isOver || item.isMenuOpen || selection.isSelected(item.documentId)) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Menu\"\r\n [attr.aria-label]=\"'Menu opzioni'\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\" (click)=\"item.isMenuOpen = true\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n <div #contextMenuTrigger=\"matMenuTrigger\" style=\"position: fixed\" [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\" [matMenuTriggerFor]=\"contextMenu\"\r\n [matMenuTriggerData]=\"{item: item}\">\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <mat-menu #contextMenu=\"matMenu\" (closed)=\"updateMenuButtonsVisibility()\">\r\n <ng-template matMenuContent let-item=\"item\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"item\" [isReadable]=\"false\" [isReference]=\"true\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n </div>\r\n }\r\n </div>\r\n <!-- footer -->\r\n @if ((snapshot?.total ?? 0) > 0) {\r\n <div class=\"items-footer\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"end center\" fxFill>\r\n <mat-paginator #paginator class=\"paginator\" [hidePageSize]=\"true\" [length]=\"snapshot?.total ?? 0\"\r\n [pageSize]=\"filterParams.count ?? 15\" [showFirstLastButtons]=\"true\" (page)=\"fetchMore($event)\">\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </mat-drawer-container>\r\n</div>", styles: [":root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #7894ae;--ars-color-accent-low: #456179;--ars-color-primary: #00a293;--ars-color-primary-low: #006a60;--ars-color-primary-hi: #12c0ae;--ars-color-secondary: #4a635f;--ars-color-secondary-low: #27403c;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #388E3C;--ars-color-ok-low: #29692c;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #191c1b;--ars-color-text-low: #e0e2e5;--ars-color-divider: #757d87;--ars-drawer-background-color: #eff1ef;--ars-drawer-background-color-low: #e0e3e1;--ars-item-hover-background-color: #eaecef;--ars-item-selected-background-color: #ced1d2;--ars-item-opaque-background-color: rgba(255, 255, 255, .75);--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-close{margin-right:10px;margin-top:10px}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.center{text-align:center}.wide{min-width:100%!important;max-width:100%;width:100%}.fill{min-width:100%!important;max-width:100%;width:100%;min-height:100%!important;max-height:100%;height:100%}.scroll-auto{overflow:auto}.scroll-hidden{overflow:hidden}b{font-weight:700}.large{font-size:large!important}.smaller{font-size:smaller}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.accent{color:var(--ars-accent)!important}.primary{color:var(--ars-primary)!important}.secondary{color:var(--ars-secondary)!important}.error{color:var(--ars-error)!important}.warning{color:var(--ars-warning)!important}.drawer-content{padding-top:10px}.drawer,.drawer-small{min-width:420px!important;max-width:420px!important;padding:20px 5px 5px;background-color:var(--ars-drawer-background-color)!important}.drawer .title,.drawer-small .title{font-size:1.2em;font-weight:600;padding-left:10px;min-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawer .fade-in,.drawer-small .fade-in{animation:fadein .5s linear}@keyframes fadein{0%{opacity:0}to{opacity:1}}.drawer .content,.drawer-small .content{padding:10px 0}.drawer .fixed,.drawer-small .fixed{padding:0 4px}.drawer .accordion-panel,.drawer-small .accordion-panel{background-color:transparent}.drawer .accordion-header,.drawer-small .accordion-header{padding-left:15px;padding-right:20px;border-radius:var(--mat-expansion-container-shape)}.drawer .mat-expansion-panel-body,.drawer-small .mat-expansion-panel-body{padding-bottom:20px!important}.drawer-small{min-width:360px!important;max-width:360px!important}.drawer-small .title{min-width:150px}.drawer-small .content{padding:20px 0 10px}@media screen and (min-width: 0px) and (max-width: 359px){.drawer{min-width:360px!important;max-width:360px!important}.drawer .title{min-width:150px}}@media (prefers-color-scheme: dark){:root{--ars-color-link: #03A9F4;--ars-color-link-low: #0288D1;--ars-color-accent: #adcae6;--ars-color-accent-low: #5e7a93;--ars-color-primary: #53dbc9;--ars-color-primary-low: #008679;--ars-color-primary-hi: #74f8e5;--ars-color-secondary: #b1ccc6;--ars-color-secondary-low: #627c77;--ars-color-error: #ff5449;--ars-color-error-low: #a80710;--ars-color-ok: #4CAF50;--ars-color-ok-low: #3f8f41;--ars-color-warning: #FFC107;--ars-color-warning-low: #FFA000;--ars-color-text: #e0e2e5;--ars-color-text-low: #191c1b;--ars-color-divider: #757d87;--ars-drawer-background-color: #323534;--ars-drawer-background-color-low: #424444;--ars-item-hover-background-color: #262a29;--ars-item-selected-background-color: #3f4342;--ars-item-opaque-background-color: rgba(0, 0, 0, .65);--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}.expired,.unread{color:var(--ars-error, #ff5449)!important}.expiring{color:var(--ars-warning, #FFC107)!important}.error-bg,.expired-bg,.unread-bg{background-color:var(--ars-error, #ff5449)}.expiring-bg{background-color:var(--ars-warning, #FFC107)}.popular-bg{background-color:#388e3c}.very-popular-bg{background-color:#4caf50}.item-selected{background-color:var(--ars-item-selected-background-color, #ced1d2);border-radius:0!important}.item-unread{font-weight:bolder}.items-group-title{color:var(--ars-accent, #7894ae);font-size:large;font-weight:700;padding-left:25px;padding-bottom:10px;padding-top:10px}.items-group-title .spaced,.items-footer{padding-top:10px}.item{border-radius:12px;padding:10px 0;min-height:60px!important;margin-bottom:2px}.item .item-content .info-1{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent, #7894ae)}.item .item-content .info-2{font-size:x-small;font-weight:700;text-transform:uppercase;color:var(--ars-accent-low, #456179)}.item .item-content .title{font-size:small}.item .item-content .details{margin-top:4px;font-size:x-small;font-weight:700;color:var(--ars-accent-low, #456179);text-transform:uppercase;border-left:4px solid var(--ars-accent-low, #456179);padding-left:10px}.item .item-content .details .links{text-transform:none;text-decoration:none}.item .item-content .details .links a,.item .item-content .details .links span,.item .item-content .details .links div{margin-right:8px;font-weight:600;color:var(--ars-color-text, #191c1b)}.item .item-content .details .links a{cursor:pointer!important;color:var(--ars-link, #03A9F4);font-weight:600}.item .item-content a.link{color:var(--ars-link, #03A9F4);cursor:pointer!important}.item:hover{background-color:var(--ars-item-hover-background-color, #eaecef)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%);mask-image:linear-gradient(to right,black 85%,transparent 100%)}.tile:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.tile{cursor:pointer;padding:10px 13px;margin-bottom:2px}.tile .body{padding:4px 6px}.tile .image-mark{border-top:6px solid transparent;margin:0 8px}.tile .image-mark-unread{border-top-color:var(--ars-error, #ff5449);margin:0 8px}.tile .image{height:180px;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.tile .image .img{object-fit:cover;width:100%;height:100%}.tile .image .info-1{position:absolute;left:0;bottom:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-color-text, #191c1b);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .info-2{position:absolute;right:0;top:0;padding:4px 8px;background-color:var(--ars-item-opaque-background-color, rgba(255, 255, 255, .75));color:var(--ars-accent, #7894ae);font-size:small;font-weight:700;text-transform:uppercase}.tile .image .check{position:absolute;left:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .image .check-selected{background-color:var(--ars-primary-hi, #12c0ae)}.tile .image .read{position:absolute;right:0;top:0;height:42px;width:42px;background-color:var(--ars-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.tile .badge,.tile .badge-red{margin-left:10px;padding:1px 4px;border-radius:3px;font-size:x-small;font-weight:700;text-align:center;background-color:var(--ars-accent, #7894ae);text-transform:uppercase;white-space:nowrap;color:var(--ars-color-text-low, #e0e2e5)}.tile .badge-red{background-color:var(--ars-error, #ff5449);color:var(--ars-color-text-low, #e0e2e5)}.tile .date{padding:8px 0 6px;font-weight:700;text-transform:uppercase}.tile .date .date-day{color:var(--ars-accent, #7894ae)}.tile .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.tile .time{font-size:small;font-weight:700}.tile .title{text-decoration:none;font-size:small;min-height:72px;overflow:hidden}.busy-backdrop{background-color:#00000052!important}.legend-container{display:flex;flex-direction:row;align-items:center;font-size:x-small;text-transform:uppercase;font-weight:500;margin-left:10px}.legend-container .legend{display:inline-block;height:8px;width:8px;margin-right:4px}.legend-container .next{margin-left:8px}.special-date,.special-date-expired{border:2px var(--ars-accent, #7894ae) solid!important;border-radius:100%!important}.special-date-expired{border:2px var(--ars-error, #ff5449) solid!important}.message{color:var(--ars-color-secondary, #4a635f);padding:20px;text-align:center}\n"] }]
359
+ }], propDecorators: { filterPane: [{
554
360
  type: ViewChild,
555
- args: ['contextMenuTrigger']
361
+ args: ['filterPane']
556
362
  }] } });
557
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvY2xpcHBlci51aS91aS9yZWZlcmVuY2VzL3JlZmVyZW5jZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvcmVmZXJlbmNlcy9yZWZlcmVuY2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFnQixlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0csT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBaUIsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQ0wsa0JBQWtCLEVBR25CLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXhGLE9B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LENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO3dCQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDN0UsQ0FBQzt5QkFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVc7d0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDM0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7d0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDL0QsSUFBSSxJ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LDRCQUE0Qjt3QkFDNUIsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixvQkFBb0I7d0JBQ3BCLDRCQUE0Qjt3QkFFNUIsT0FBTzt3QkFDUCxrQkFBa0I7cUJBQ3JCOzswQkE0QkEsTUFBTTsyQkFBQyxlQUFlO3lDQXhCRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0MsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNELFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDVyxXQUFXO3NCQUEzQyxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lZGlhQ2hhbmdlLCBNZWRpYU9ic2VydmVyIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1RpdGxlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIsIE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBEYXRlRm9ybWF0LCBTY3JlZW5TZXJ2aWNlLCBTZWxlY3RhYmxlTW9kZWwsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIHN0YXJ0T2ZUb2RheSwgc3ViRGF5cyB9IGZyb20gJ2RhdGUtZm5zJ1xyXG5pbXBvcnQgeyBDbGlwcGVyRG9jdW1lbnRCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vZG9jdW1lbnQvYmFzZS9kb2N1bWVudC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ2xpcHBlckRlZmluaXRpb25zLFxyXG4gIENsaXBwZXJTZXJ2aWNlLFxyXG4gIERvY3VtZW50UmVmZXJlbmNlU25hcHNob3RcclxufSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NsaXBwZXIuY29tbW9uJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXRTaWRlbmF2LCBNYXRTaWRlbmF2TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XHJcbmltcG9ydCB7IENsaXBwZXJTZWFyY2hGYWNldHNDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2gtZmFjZXRzL3NlYXJjaC1mYWNldHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWknO1xyXG5pbXBvcnQgc2F2ZUFzIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XHJcbmltcG9ydCB7IEV4dGVuZGVkTW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2V4dGVuZGVkJztcclxuaW1wb3J0IHsgQ2xpcHBlckRvY3VtZW50TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2RvY3VtZW50L2RvY3VtZW50LW1lbnUvZG9jdW1lbnQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCYWRnZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JhZGdlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyAgTmdTdHlsZSwgIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gJ0BuZ2JyYWNrZXQvbmd4LWxheW91dC9mbGV4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgaG9zdDogeyAnQmluZCc6IFN5c3RlbVV0aWxzLmdlbmVyYXRlVVVJRCgpIH0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVmZXJlbmNlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9yZWZlcmVuY2VzLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIEZsZXhNb2R1bGUsXHJcbiAgICAgICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcclxuICAgICAgICBcclxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgICAgICBGb3Jtc01vZHVsZSxcclxuICAgICAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgICAgIE1hdEJhZGdlTW9kdWxlLFxyXG4gICAgICAgIENsaXBwZXJEb2N1bWVudE1lbnVDb21wb25lbnQsXHJcbiAgICAgICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgICAgICBOZ1N0eWxlLFxyXG4gICAgICAgIEV4dGVuZGVkTW9kdWxlLFxyXG4gICAgICAgIE1hdFNpZGVuYXZNb2R1bGUsXHJcbiAgICAgICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXHJcbiAgICAgICAgQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudCxcclxuICAgICAgICBcclxuICAgICAgICBOZ0NsYXNzLFxyXG4gICAgICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudCBleHRlbmRzIENsaXBwZXJEb2N1bWVudEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmYWNldHNTaWRlbmF2JykgZmFjZXRzU2lkZW5hdiA6IE1hdFNpZGVuYXY7XHJcbiAgQFZpZXdDaGlsZCgnZmFjZXRzU2VhcmNoJykgZmFjZXRzU2VhcmNoIDogQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdwYWdpbmF0b3InKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XHJcbiAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnVUcmlnZ2VyJykgY29udGV4dE1lbnUhOiBNYXRNZW51VHJpZ2dlcjtcclxuXHJcbiAgcHJpdmF0ZSBfX2QkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgdGl0bGU6IHN0cmluZyA9IG51bGw7XHJcbiAgc2VsZWN0aW9uOiBTZWxlY3RhYmxlTW9kZWw8YW55LCBzdHJpbmc+ID0gbmV3IFNlbGVjdGFibGVNb2RlbCh0cnVlLCAnZG9jdW1lbnRJZCcpO1xyXG4gIHNuYXBzaG90OiBEb2N1bWVudFJlZmVyZW5jZVNuYXBzaG90ID0gbnVsbDtcclxuICBmYWNldHNNb2RlOiBzdHJpbmcgPSAnc2lkZSc7XHJcbiAgZmFjZXRzQ2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29udGVudEhlaWdodDogbnVtYmVyID0gbnVsbDtcclxuICBjb250ZXh0TWVudVBvc2l0aW9uID0geyB4OiAnMHB4JywgeTogJzBweCcgfTtcclxuICBtcTogc3RyaW5nID0gbnVsbDtcclxuICBhbmNob3I6IHN0cmluZyA9IG51bGw7XHJcbiAgaXRlbTogYW55ID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgJGRpYWxvZzogRGlhbG9nU2VydmljZSxcclxuICAgIHB1YmxpYyAkY2xpcHBlcjogQ2xpcHBlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgJHNjcmVlbjogU2NyZWVuU2VydmljZSxcclxuICAgIHByaXZhdGUgbWVkaWE6IE1lZGlhT2JzZXJ2ZXIsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBfZGF0YTogYW55XHJcbiAgKSB7XHJcbiAgICBzdXBlcigkZGlhbG9nLCAkY2xpcHBlcik7XHJcblxyXG4gICAgLy8gQ2hvb3NlIHRoZSB0aXRsZVxyXG4gICAgc3dpdGNoIChfZGF0YS5tb2RlKSB7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX1JFRkVSRU5DRVNfSU46XHJcbiAgICAgICAgdGhpcy50aXRsZSA9ICdEb2N1bWVudGkgcmljaGlhbWF0aSBuZWxsZSBub3RlIG8gbmVsIHRlc3RvJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fUkVGRVJFTkNFU19PVVQ6XHJcbiAgICAgICAgdGhpcy50aXRsZSA9ICdEb2N1bWVudGkgY2hlIHJpY2hpYW1hbm8gcXVlbGxvIGluIHZpc2lvbmUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX0lOOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnTW9kaWZpY2hlIHN1Yml0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX0NIQU5HRVNfT1VUOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnTW9kaWZpY2hlIGFwcG9ydGF0ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ2xpcHBlckRlZmluaXRpb25zLlNNX0pVUklTOlxyXG4gICAgICAgIHRoaXMudGl0bGUgPSAnR2l1cmlzcHJ1ZGVuemEgYXNzb2NpYXRhJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChfZGF0YS5hbmNob3JUaXRsZSkgdGhpcy50aXRsZSArPSAnIC0gJyArIF9kYXRhLmFuY2hvclRpdGxlO1xyXG5cclxuICAgIHRoaXMuYW5jaG9yID0gX2RhdGEuYW5jaG9yO1xyXG5cclxuICAgIC8vIFVzZSBzZXJ2aWNlIHNuYXBzaG90XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gJGNsaXBwZXIucmVmZXJlbmNlc1NuYXBzaG90O1xyXG4gICAgaWYgKCF0aGlzLnNuYXBzaG90KVxyXG4gICAgICB0aGlzLnNuYXBzaG90ID0ge1xyXG4gICAgICAgIHNlYXJjaFBhcmFtczoge30sXHJcbiAgICAgIH07XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGUgIT09IF9kYXRhLm1vZGUgfHxcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZG9jdW1lbnRJZCAhPT0gX2RhdGEuaWQgfHxcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuYW5jaG9yICE9PSBfZGF0YS5hbmNob3JcclxuICAgICkge1xyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcyA9IHtcclxuICAgICAgICBtb2RlOiBfZGF0YS5tb2RlLFxyXG4gICAgICAgIG1vZGVsOiBfZGF0YS5tb2RlbCxcclxuICAgICAgICBhbmNob3I6IF9kYXRhLmFuY2hvcixcclxuICAgICAgICBkb2N1bWVudElkOiBfZGF0YS5pZCxcclxuICAgICAgICB1c2VNb2RpZmllckluZm86IF9kYXRhLm1vZGUgPT09IENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX09VVCxcclxuICAgICAgICByZXR1cm5Nb2RpZmllckluZm86IF9kYXRhLm1vZGUgIT09IENsaXBwZXJEZWZpbml0aW9ucy5TTV9DSEFOR0VTX09VVCxcclxuICAgICAgICBmaXJzdDogMCxcclxuICAgICAgICBjb3VudDogMjUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBTdG9yZSBzbmFwc2hvdFxyXG4gICAgICAkY2xpcHBlci5yZWZlcmVuY2VzU25hcHNob3QgPSB0aGlzLnNuYXBzaG90O1xyXG5cclxuICAgICAgLy8gTmV3IHNlYXJjaFxyXG4gICAgICB0aGlzLmZldGNoKHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gRGlzcGxheSBjdXJyZW50IHNuYXBzaG90IGZhY2V0cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICB0aGlzLmRpc3BsYXlGYWNldHMoKTtcclxuICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgICB9LCAyNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBSZWFjdCB0byBtZWRpYSBxdWVyeSBjaGFuZ2VzXHJcbiAgICB0aGlzLm1lZGlhXHJcbiAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX2QkKSlcclxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlczogTWVkaWFDaGFuZ2VbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMubXEgPSBjaGFuZ2VzWzBdLm1xQWxpYXM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVGYWNldHNWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gd2luZG93IHNpemUgY2hhbmdlXHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX19kJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5hZGp1c3RWaWV3KCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIFJlYWN0IHRvIHNpZGVuYXYgc3RhdGUgY2hhbmdlXHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NpZGVuYXYpXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2Lm9wZW5lZENoYW5nZVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb25maWd1cmUgZmFjZXQgc2VhY2ggY29tcG9uZW50XHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaCkge1xyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5mcm9tRGF0ZSA9IHRoaXMuZmFjZXRzU2VhcmNoLmZyb21EYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy50b0RhdGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50b0RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnllYXIgPSB0aGlzLmZhY2V0c1NlYXJjaC5mcm9tRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5jaGFuZ2VkSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMueWVhciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmZyb21EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMudG9EYXRlID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5zZWN0b3IgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFNlY3RvcilcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuc2VjdG9yID0gdGhpcy5mYWNldHNTZWFyY2guc2VjdG9yO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLnR5cGUgfHwgdGhpcy5mYWNldHNTZWFyY2guY2hhbmdlZFR5cGUpXHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnR5cGUgPSB0aGlzLmZhY2V0c1NlYXJjaC50eXBlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmFjZXRzU2VhcmNoLmF1dGhvciB8fCB0aGlzLmZhY2V0c1NlYXJjaC5jaGFuZ2VkQXV0aG9yKVxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5hdXRob3IgPSB0aGlzLmZhY2V0c1NlYXJjaC5hdXRob3I7XHJcbiAgICAgICAgICBpZiAodGhpcy5mYWNldHNTZWFyY2gucmVhc29uIHx8IHRoaXMuZmFjZXRzU2VhcmNoLmNoYW5nZWRSZWFzb24pXHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLnJlYXNvbiA9IHRoaXMuZmFjZXRzU2VhcmNoLnJlYXNvbjtcclxuICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmFuY2hvciA9IHRoaXMuZmFjZXRzU2VhcmNoLmFuY2hvclxyXG4gICAgICAgICAgICA/IHRoaXMuZmFjZXRzU2VhcmNoLmFuY2hvclxyXG4gICAgICAgICAgICA6IHRoaXMuYW5jaG9yO1xyXG4gICAgICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5fX2QkLm5leHQoKTtcclxuICAgIHRoaXMuX19kJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25Db250ZXh0TWVudShldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudVBvc2l0aW9uLnggPSBldmVudC5jbGllbnRYICsgJ3B4JztcclxuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbi55ID0gZXZlbnQuY2xpZW50WSArICdweCc7XHJcbiAgICB0aGlzLmNvbnRleHRNZW51Lm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH07XHJcbiAgICB0aGlzLmNvbnRleHRNZW51Lm9wZW5NZW51KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBkaWFsb2dcclxuICAgKi9cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuc2F2ZVNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBzY3JvbGwgcG9zaXRpb25cclxuICAgKi9cclxuICBzYXZlU2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICB0aGlzLiRjbGlwcGVyLnNjcm9sbGFibGUuc2F2ZVBvc2l0aW9uKFxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5kb2N1bWVudElkLFxyXG4gICAgICAnI3JlZmVyZW5jZXNfY29udGFpbmVyJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVmZXJlbmNlc19jb250YWluZXInKS5zY3JvbGxUbygwLCAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCkge1xyXG4gICAgdGhpcy4kY2xpcHBlci5zY3JvbGxhYmxlLnRyeVJlc3RvcmVQb3NpdGlvbihcclxuICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZG9jdW1lbnRJZCxcclxuICAgICAgJyNyZWZlcmVuY2VzX2NvbnRhaW5lcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbWVudSBidXR0b25zIHZpc2liaWxpdHkgd2hlbiB0aGUgbWVudSBpcyBjbG9zZWRcclxuICAgKi9cclxuICB1cGRhdGVNZW51QnV0dG9uc1Zpc2liaWxpdHkoKSB7XHJcbiAgICB0aGlzLnNuYXBzaG90Lml0ZW1zLmZvckVhY2goKG46IGFueSkgPT4ge1xyXG4gICAgICBuLmlzTWVudU9wZW4gPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRqdXN0IHZpZXdcclxuICAgKi9cclxuICBhZGp1c3RWaWV3KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB2aWV3XHJcbiAgICovXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIC8vIFVwZGF0ZSByb3V0ZXIgaGVpZ2h0XHJcbiAgICBsZXQgYSA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgIGxldCBiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaXBwZXItcmVmZXJlbmNlcy1maXhlZCcpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCFhIHx8ICFiIHx8IGEgPT09IDApIHRoaXMuYWRqdXN0VmlldygpO1xyXG4gICAgICBsZXQgaGIgPSBiLmNsaWVudEhlaWdodDtcclxuICAgICAgaWYgKGhiID09PSAwKSB0aGlzLmFkanVzdFZpZXcoKTtcclxuICAgICAgdGhpcy5jb250ZW50SGVpZ2h0ID0gYSAtIChoYiArIDEyKTtcclxuICAgIH0gY2F0Y2ggeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgc2lkZW5hdiB2aXNpYmlsaXR5XHJcbiAgICogQHBhcmFtIG1xIDogdGhlIGN1cnJlbnQgbWVkaWEgcXVlcnlcclxuICAgKi9cclxuICB1cGRhdGVGYWNldHNWaXNpYmlsaXR5KCkge1xyXG4gICAgaWYgKHRoaXMubXEgPT09ICd4cycpIHtcclxuICAgICAgdGhpcy5mYWNldHNNb2RlID0gJ292ZXInO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2ggJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYgJiZcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYub3BlbmVkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmFjZXRzTW9kZSA9ICdzaWRlJztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guaGFzRmFjZXRzICYmXHJcbiAgICAgICAgdGhpcy5mYWNldHNTaWRlbmF2ICYmXHJcbiAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkXHJcbiAgICAgIClcclxuICAgICAgICB0aGlzLmZhY2V0c1NpZGVuYXYudG9nZ2xlKHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBmYWNldHNTaWRlbmF2IHNpZGViYXJcclxuICAgKi9cclxuICBmYWNldHNPcGVuKCkge1xyXG4gICAgdGhpcy5mYWNldHNDbG9zZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBmYWNldHMgc2lkZWJhclxyXG4gICAqIEBwYXJhbSBjbG9zZWRNYW51YWxseSA6IHR1cmUgaWYgZmFjZXRzIGhhcyBiZWVuIGNsb3NlZCBtYW51YWxseSBieSBjbGlja2luZyB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZmFjZXRzQ2xvc2UoY2xvc2VkTWFudWFsbHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMubXEgIT09ICd4cycpIHRoaXMuZmFjZXRzQ2xvc2VkID0gY2xvc2VkTWFudWFsbHk7XHJcbiAgICB0aGlzLmZhY2V0c1NpZGVuYXYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBhIGRvY3VtZW50IGluIHBkZiBmb3JtYXRcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBkb2N1bWVudCB0byBleHBvcnRcclxuICAgKi9cclxuICBleHBvcnRQZGYoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuJGNsaXBwZXIubG9nZ2VkSW4pIHJldHVybjtcclxuICAgIGlmICghaXRlbSB8fCBpdGVtLm1vZGVsID09PSAxMSkgcmV0dXJuO1xyXG4gICAgdGhpcy4kZGlhbG9nXHJcbiAgICAgIC5jb25maXJtKFwiQ29uZmVybWkgbCdlc3BvcnRhemlvbmU/XCIsICdBdHRlbnppb25lIScpXHJcbiAgICAgIC5jb21wb25lbnRJbnN0YW5jZS5jaG9vc2VuXHJcbiAgICAgIC5zdWJzY3JpYmUoKHI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyLnJlc3VsdCA9PT0gJ29rJykge1xyXG4gICAgICAgICAgdGhpcy4kZGlhbG9nLmJ1c3koJ0VzcG9ydGF6aW9uZSBpbiBjb3Jzby4uLicpO1xyXG4gICAgICAgICAgdGhpcy4kY2xpcHBlclxyXG4gICAgICAgICAgICAuZXhwb3J0UGRmKGl0ZW0uZG9jdW1lbnRJZClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKHIyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHNhdmVBcyhcclxuICAgICAgICAgICAgICAgICAgcjIsXHJcbiAgICAgICAgICAgICAgICAgIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxIDogaXRlbS5kb2N1bWVudElkKSArICcucGRmJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRkaWFsb2cuY2xlYXJCdXN5KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBkb2N1bWVudCBsaW5rcyBieSBlbWFpbFxyXG4gICAqIEBwYXJhbSBpdGVtIDogdGhlIGl0ZW0gdG8gYWRkXHJcbiAgICovXHJcbiAgc2VuZFRvKGl0ZW06IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2VuZEl0ZW1zVG8oaXRlbSA/IFtpdGVtXSA6IHRoaXMuc2VsZWN0aW9uLmFsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtIGEgc2VhcmNoXHJcbiAgICogQHBhcmFtIG5ld1NlYXJjaDogdHJ1ZSBpZiBpcyBhIG5ldyBzZWFyY2hcclxuICAgKi9cclxuICBmZXRjaChuZXdTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCF0aGlzLiRjbGlwcGVyLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICBpZiAobmV3U2VhcmNoKSB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5maXJzdCA9IDA7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy51c2VNb2RpZmllckluZm8gPVxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fQ0hBTkdFU19PVVQ7XHJcbiAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5yZXR1cm5Nb2RpZmllckluZm8gPVxyXG4gICAgICB0aGlzLnNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlICE9PSBDbGlwcGVyRGVmaW5pdGlvbnMuU01fQ0hBTkdFU19PVVQ7XHJcbiAgICB0aGlzLiRkaWFsb2cuYnVzeSgnUmljZXJjYSBpbiBjb3Jzby4uLicpO1xyXG4gICAgdGhpcy4kY2xpcHBlci5yZWZlcmVuY2VzKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHRoaXMuJGRpYWxvZy5lcnJvcihyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gc3RhcnRPZlRvZGF5KCk7XHJcbiAgICAgICAgICAgIGxldCBncm91cCA9ICcnOyAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LnRvdGFsID0gci52YWx1ZT8udG90YWwgPz8gMDtcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcyA9IHIudmFsdWU/Lml0ZW1zID8/IFtdOyAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBuLm1vZGVsID09PSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0NBREVOWkEgfHxcclxuICAgICAgICAgICAgICAgIG4ubW9kZWwgPT09IENsaXBwZXJEZWZpbml0aW9ucy5ETV9TRUdOQUxBWklPTkVcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAobi5tb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICBjYXNlIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0FERU5aQTpcclxuICAgICAgICAgICAgICAgICAgICBuLm9yaWdpbkRlc2NyaXB0aW9uID0gJ1NjYWRlbnphJztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgY2FzZSBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fU0VHTkFMQVpJT05FOlxyXG4gICAgICAgICAgICAgICAgICAgIG4ub3JpZ2luRGVzY3JpcHRpb24gPSAnU2VnbmFsYXppb25lJztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nSW5mbykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBuLmV4cGlyaW5nSW5mby5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSBuLmRlc2NyaXB0aW9uID0gcGFydHNbMl07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5leHBpcmluZ0RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgbi5kYXRlID0gc3RhcnRPZkRheShuZXcgRGF0ZShuLmV4cGlyaW5nRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKG4uZGF0ZSwgMTUpKVxyXG4gICAgICAgICAgICAgICAgICBuLmlzRXhwaXJpbmcgPSB0b2RheSA8PSBuLmRhdGUgJiYgdG9kYXkgPj0gZDtcclxuICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBuLmRhdGUgPCB0b2RheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBkID0gc3RhcnRPZkRheShzdWJEYXlzKHN0YXJ0T2ZUb2RheSgpLCA3KSlcclxuICAgICAgICAgICAgICAgICAgbi5pc05ldyA9IG4uZGF0ZSA+IGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobi5hbmNob3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JUeXBlOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLnR5cGUgPT09IDIwKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSAhPT0gYW5jaG9yVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGEudHlwZSA+PSAzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goeyB0ZXh0OiBhLnR5cGVEZXNjcmlwdGlvbiB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclR5cGUgPSBhLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY29yZSA9IGEuc2NvcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gNykgc2NvcmUgLT0gNztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29yZSA+IDUpIHNjb3JlIC09IDU7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2NvcmUgPiAzKSBzY29yZSAtPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBhLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGEuZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHVyaTogYS51cmksXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZXJ5UmVsZXZhbnQ6IHNjb3JlID4gMC42LFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgbi5hbmNob3JzID0gYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLnZhbGlkaXR5U3RhdGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9ICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSc7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKG4udmFsaWRVbnRpbERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmluZ0RhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4udmFsaWRVbnRpbERhdGUpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmdEYXRlIDwgdG9kYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG4udmFsaWRpdHlEZXNjcmlwdGlvbiA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbCBkb2N1bWVudG8gbm9uIMOoIHBpw7kgdmlnZW50ZSBkYWwgJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVV0aWxzLmZvcm1hdERhdGUoZXhwaXJpbmdEYXRlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICcuJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi52YWxpZGl0eURlc2NyaXB0aW9uID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lsIGRvY3VtZW50byBub24gc2Fyw6AgcGnDuSB2aWdlbnRlIGRhbCAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShleHBpcmluZ0RhdGUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbi5pc0V4cGlyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChuLmV4cGlyaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBuLmRhdGUgPSBzdGFydE9mRGF5KG5ldyBEYXRlKG4uZXhwaXJpbmdEYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgIG4uaXNFeHBpcmVkID0gbi5kYXRlIDwgdG9kYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCB5ZWFyID0gU3lzdGVtVXRpbHMuZm9ybWF0RGF0ZShuLmRhdGUsIERhdGVGb3JtYXQuTG9uZ01vbnRoQW5kWWVhcikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICBpZiAoZ3JvdXAgIT09IHllYXIpIHtcclxuICAgICAgICAgICAgICAgIG4uZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB5ZWFyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAobi50YXhvbm9teSkge1xyXG4gICAgICAgICAgICAgICAgbi50YXhvbm9teU5vZGVzID0gbi50YXhvbm9teS5zcGxpdCgnXFxyXFxuJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLm1vZGVsID09PVxyXG4gICAgICAgICAgICAgICAgICBDbGlwcGVyRGVmaW5pdGlvbnMuRE1fR1VJREEgfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5ETV9HVUlEQV9OT1JNQVRJVkEgfHxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgIENsaXBwZXJEZWZpbml0aW9ucy5ETV9TQ0hFREFfQURFTVBJTUVOVElcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4udGF4b25vbXlOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gbi50YXhvbm9teU5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwID0gbm9kZS5pbmRleE9mKCc+Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgIT09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgICAgbi50YXhvbm9teU5vZGVzW2ldID0gbm9kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHAgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFw+L2dpLCAnID4gJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gSGFuZGxlIGZhY2V0c1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoKVxyXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZhY2V0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmFjZXRzKHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC5yZXNldCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2lkZW5hdi5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobmV3U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLiRkaWFsb2cuY2xlYXJCdXN5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBuZXcgcGFnZSByZXN1bHRcclxuICAgKiBAcGFyYW0gZSA6IHRoZSBNYXRQYWdpbmF0b3IgUGFnZUV2ZW50IGRhdGFcclxuICAgKi9cclxuICBmZXRjaE1vcmUoZTogYW55KSB7XHJcbiAgICBsZXQgZmlyc3QgPSBlLnBhZ2VJbmRleCAqIHRoaXMuc25hcHNob3Quc2VhcmNoUGFyYW1zLmNvdW50O1xyXG4gICAgdGhpcy5zbmFwc2hvdC5zZWFyY2hQYXJhbXMuZmlyc3QgPSBmaXJzdDtcclxuICAgIHRoaXMuZmV0Y2goKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmYWNldHNcclxuICAgKiBAcGFyYW0gc2VhcmNoUGFyYW1zIDogdGhlIGN1cnJlbnQgc2VhcmNoIHBhcmFtcyB0byB1c2UgdG8gZ2F0aGVyIGZhY2V0cyBvciBudWxsIHRvIHVzZSBjdXJyZW50IHNuYXBzaG90XHJcbiAgICovXHJcbiAgZGlzcGxheUZhY2V0cyhzZWFyY2hQYXJhbXM6IGFueSA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy4kY2xpcHBlci5sb2dnZWRJbikgcmV0dXJuO1xyXG4gICAgaWYgKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICB0aGlzLmZhY2V0c1NlYXJjaC5idXN5ID0gdHJ1ZTtcclxuICAgICAgdGhpcy4kY2xpcHBlci5yZWZlcmVuY2VzRmFjZXRzKHNlYXJjaFBhcmFtcylcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZhY2V0c1NlYXJjaC51cGRhdGUoci52YWx1ZS5mYWNldHMsIG51bGwpO1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzU2VhcmNoLmhhc0ZhY2V0cyAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuZmFjZXRzQ2xvc2VkICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1xICE9PSAneHMnXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mYWNldHNPcGVuKCk7XHJcbiAgICAgICAgICAgICAgZWxzZSB0aGlzLmZhY2V0c0Nsb3NlKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdC5mYWNldHMgPSB0aGlzLmZhY2V0c1NlYXJjaDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mYWNldHNTZWFyY2guYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cykge1xyXG4gICAgICB0aGlzLmZhY2V0c1NlYXJjaC5yZXN0b3JlRnJvbSh0aGlzLnNuYXBzaG90LmZhY2V0cyk7XHJcbiAgICAgIGlmICh0aGlzLmZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgIXRoaXMuZmFjZXRzQ2xvc2VkICYmIHRoaXMubXEgIT09ICd4cycpXHJcbiAgICAgICAgdGhpcy5mYWNldHNPcGVuKCk7XHJcbiAgICAgIGVsc2UgdGhpcy5mYWNldHNDbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgY3VycmVudCBkaWFsb2cgYW5kIHJldHVybiB0aGUgaWQgdG8gbmF2aWdhdGUgdG9cclxuICAgKiBAcGFyYW0gaWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBvcGVuKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHsgaWQ6IGlkIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiY2xpcHBlci1yZWZlcmVuY2VzLWZpeGVkXCI+XHJcbiAgPGRpdiBpZD1cImNsaXBwZXItcmVmZXJlbmNlcy1oZWFkZXJcIj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD0nMTBweCcgZnhGaWxsPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7dGl0bGV9fSA8L2gyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgbWF0VG9vbHRpcD1cIkNoaXVkaVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2hpdWRpXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4RmlsbCBzdHlsZT1cInBhZGRpbmc6IDAgMCAwIDE1cHg7XCI+XHJcbiAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09IDEpIHtcclxuICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiBuYW1lPVwiZXhjbHVkZVRleHRSZWZlcmVuY2VzXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5leGNsdWRlVGV4dFJlZmVyZW5jZXNcIiAoY2hhbmdlKT1cImZldGNoKHRydWUpXCI+XHJcbiAgICAgICAgTW9zdHJhIHNvbG8gc2UgY2l0YXRpIG5lbGxlIG5vdGU8L21hdC1jaGVja2JveD5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5tb2RlID09IDIpIHtcclxuICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiBuYW1lPVwiZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMuZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiIChjaGFuZ2UpPVwiZmV0Y2godHJ1ZSlcIj5cclxuICAgICAgICBNb3N0cmEgc29sbyBzZSBjaXRhbm8gbmVsIHRlc3RvIGlsIGRvY3VtZW50b1xyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIkF6aW9uaSBkYSBlc2VndWlyZSBzdWdsaSBlbGVtZW50aSBzZWxlemlvbmF0aVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBvcHppb25pIHBlciBlbGVtZW50aSBzZWxlemlvbmF0aSdcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVNlbGVjdGlvbnNcIiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIFttYXRCYWRnZV09XCJzZWxlY3Rpb24uYWxsLmxlbmd0aFwiXHJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCI+cGxheWxpc3RfYWRkX2NoZWNrPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxjbGlwcGVyLWRvY3VtZW50LW1lbnUgW3BhcmVudF09XCJ0aGlzXCIgW3NlbGVjdGlvblNvdXJjZV09XCJzZWxlY3Rpb25cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIEBpZiAoZmFjZXRzU2VhcmNoICYmIGZhY2V0c1NlYXJjaC5oYXNGYWNldHMgJiYgZmFjZXRzU2lkZW5hdiAmJiAoIWZhY2V0c1NpZGVuYXYub3BlbmVkIHx8IGZhY2V0c0Nsb3NlZCkpIHtcclxuICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBtYXRUb29sdGlwPVwiQWZmaW5hIHJpY2VyY2FcIiBhcmlhLWxhYmVsPVwiJ0FmZmluYSByaWNlcmNhJ1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmFjZXRzT3BlbigpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+bWVudV9vcGVuPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgc3R5bGU9XCJwYWRkaW5nOjAgMCAwIDE1cHhcIiBbbmdTdHlsZV09XCJ7J21pbi1oZWlnaHQucHgnOiBjb250ZW50SGVpZ2h0fVwiPlxyXG4gIDxtYXQtc2lkZW5hdi1jb250YWluZXIgW25nU3R5bGVdPVwieydoZWlnaHQucHgnOiBjb250ZW50SGVpZ2h0fVwiPlxyXG4gICAgPG1hdC1zaWRlbmF2ICNmYWNldHNTaWRlbmF2IHBvc2l0aW9uPVwiZW5kXCIgYXV0b0ZvY3VzPVwiZmFsc2VcIiBvcGVuZWQ9XCJmYWxzZVwiIG1vZGU9XCJ7e2ZhY2V0c01vZGV9fVwiXHJcbiAgICAgIGNsYXNzPVwic2lkZW5hdiBzaWRlbmF2LWZhY2V0c1wiPlxyXG4gICAgICBAaWYgKGZhY2V0c1NlYXJjaC5idXN5KSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6NXB4XCI+XHJcbiAgICAgICAgICBAaWYgKGZhY2V0c1NlYXJjaC5idXN5KSB7XHJcbiAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBjbGFzcz1cInNpZGVuYXYtbG9hZGVyXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCI2NHB4XCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGaWxsIGNsYXNzPVwic2lkZW5hdi10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBmeExheW91dEFsaWduPVwic3RhcnRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpZGVuYXYtdGl0bGVcIj5BZmZpbmEgcmljZXJjYTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmFjZXRzQ2xvc2UodHJ1ZSlcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiPlxyXG4gICAgICAgICAgPGNsaXBwZXItc2VhcmNoLWZhY2V0cyAjZmFjZXRzU2VhcmNoPjwvY2xpcHBlci1zZWFyY2gtZmFjZXRzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXNpZGVuYXY+XHJcbiAgICA8bWF0LXNpZGVuYXYtY29udGVudD5cclxuICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6IGNvbnRlbnRIZWlnaHQgfVwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGw+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjEwMFwiIGlkPVwicmVmZXJlbmNlc19jb250YWluZXJcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW5cIj5cclxuICAgICAgICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOjMycHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1ncmV5ZWQtMVwiIHN0eWxlPSd0ZXh0LWFsaWduOiBjZW50ZXInPlxyXG4gICAgICAgICAgICAgICAgICA8cD5OZXNzdW4gZWxlbWVudG8gZGEgdmlzdWFsaXp6YXJlLjwvcD5cclxuICAgICAgICAgICAgICAgICAgPHA+SWwgZmlsdHJvIGFwcGxpY2F0byBub24gY29uc2VudGUgbGEgc2VsZXppb25lIGRpIGFsY3VuIHJpc3VsYXRvLjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKHNuYXBzaG90LnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc25hcHNob3QuaXRlbXM7IHRyYWNrIGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgKGNvbnRleHRtZW51KT1cIm9uQ29udGV4dE1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyKT1cIml0ZW0uaXNPdmVyID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIml0ZW0uaXNPdmVyID0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDE1cHg7IHBhZGRpbmctdG9wOjI0cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tYWNjZW50XCI+e3tpdGVtLmdyb3VwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMHB4XCIgZnhGaWxsIGNsYXNzPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpdGVtLXNlbGVjdGVkJzogc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRzY3JlZW4uaXNUb3VjaGFibGUgfHwgaXRlbS5pc092ZXIgfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKGl0ZW0sIGl0ZW0uZG9jdW1lbnRJZCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIxMDBcIiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghaXRlbS5pc0p1cmlzICYmIGl0ZW0ubW9kZWwgIT0gOSAmJiAoaXRlbS5tb2RlbCAhPSAxMSB8fCBzbmFwc2hvdC5zZWFyY2hQYXJhbXMubW9kZSA9PSAyKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5tb2RlbE5hbWUgJiYgaXRlbS5tb2RlbE5hbWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZCBpdGVtLWdyZXllZC0xIHVwcGVyY2FzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubW9kZWxOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWl0ZW0uaXNKdXJpcyAmJiBpdGVtLm1vZGVsID09IDIyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0zIGl0ZW0tbGluZS1yZWFkIGl0ZW0tZ3JleWVkLTEgdXBwZXJjYXNlXCI+QVJTXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJMT0c8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5hdXRob3IgJiYgaXRlbS5vcmlnaW4gPT09ICdMUicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxpbmUgaXRlbS1saW5lLTMgaXRlbS1saW5lLXJlYWQgaXRlbS1ncmV5ZWQtMSB1cHBlcmNhc2VcIj57e2l0ZW0uYXV0aG9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxpbmUgaXRlbS1saW5lLTIgaXRlbS1saW5lLXJlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW4oaXRlbS5kb2N1bWVudElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQXByaSBkb2N1bWVudG8gJyArIChpdGVtLnRpdGxlMSA/IGl0ZW0udGl0bGUxOiBpdGVtLnRpdGxlMilcIj57e2l0ZW0udGl0bGUxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnRpdGxlMSA6IGl0ZW0udGl0bGUyfX08L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5wYXJ0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tYmFkZ2VcIj5QQVJURSB7e2l0ZW0ucGFydH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGl0bGUxICYmIGl0ZW0udGl0bGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0yIGl0ZW0tbGluZS1yZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS50aXRsZTJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0ub3JpZ2luRGVzY3JpcHRpb24gKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lIGl0ZW0tbGluZS0zIGl0ZW0tbGluZS1yZWFkIGl0ZW0tZ3JleWVkLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLm9yaWdpbkRlc2NyaXB0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmFuY2hvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1saW5lLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZS1ibG9jay10aXRsZVwiPkRFVFRBR0xJTzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChhIG9mIGl0ZW0uYW5jaG9yczsgdHJhY2sgYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoYS51cmkgJiYgYS50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGlua1wiIHN0eWxlPSdsaW5lLWhlaWdodDogMThweDsgbWFyZ2luLXJpZ2h0OiA4cHgnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4oYS5kb2N1bWVudElkICsgJyMnICsgYS51cmkpXCIgW21hdFRvb2x0aXBdPVwiYS50aXRsZVwiPnt7YS50ZXh0fX0gQGlmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEudmVyeVJlbGV2YW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT0nZm9udC1zaXplOngtc21hbGw7IGhlaWdodDogMTBweDsgd2lkdGg6MTBweCcgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vbHRvIHJpbGV2YW50ZVwiPnRodW1iX3VwX2FsdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFhLnVyaSAmJiBhLnRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9J2xpbmUtaGVpZ2h0OiAxOHB4OyBtYXJnaW4tcmlnaHQ6IDhweCAnPnt7YS50ZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS52YWxpZGl0eVN0YXRlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGluZSBpdGVtLWxpbmUtMyBpdGVtLWxpbmUtcmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmVkOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDJweCA0cHg7IGJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyOiAxcHggc29saWQgcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnZhbGlkaXR5RGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI0OHB4XCIgZnhMYXlvdXRBbGlnbj1cImVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmlzT3ZlciB8fCBpdGVtLmlzTWVudU9wZW4gfHwgc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIk1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidNZW51IG9wemlvbmknXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7aXRlbTogaXRlbX1cIiAoY2xpY2spPVwiaXRlbS5pc01lbnVPcGVuID0gdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPGRpdiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZFwiIFtzdHlsZS5sZWZ0XT1cImNvbnRleHRNZW51UG9zaXRpb24ueFwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3BdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7aXRlbTogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG1hdC1tZW51ICNjb250ZXh0TWVudT1cIm1hdE1lbnVcIiAoY2xvc2VkKT1cInVwZGF0ZU1lbnVCdXR0b25zVmlzaWJpbGl0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudCBsZXQtaXRlbT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2xpcHBlci1kb2N1bWVudC1tZW51IFtwYXJlbnRdPVwidGhpc1wiIFtpdGVtXT1cIml0ZW1cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgQGlmIChzbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIiBbbGVuZ3RoXT1cInNuYXBzaG90LnRvdGFsXCJcclxuICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjI1XCIgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIiAocGFnZSk9XCJmZXRjaE1vcmUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXNpZGVuYXYtY29udGVudD5cclxuICA8L21hdC1zaWRlbmF2LWNvbnRhaW5lcj5cclxuPC9kaXY+Il19
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvY2xpcHBlci51aS91aS9yZWZlcmVuY2VzL3JlZmVyZW5jZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL2NsaXBwZXIudWkvdWkvcmVmZXJlbmNlcy9yZWZlcmVuY2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBYSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFn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cEIsNEJBQTRCO3dCQUM1Qiw0QkFBNEI7d0JBQzVCLGdDQUFnQztxQkFFakM7OEJBSXdCLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFrcG9pbnRzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBNYXREcmF3ZXIsIE1hdFNpZGVuYXZNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcclxuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7XHJcbiAgQ2xpcHBlckRvY3VtZW50SW5mbyxcclxuICBDbGlwcGVyRG9jdW1lbnRTbmFwc2hvdE1vZGUsIENsaXBwZXJTZWFyY2hGYWNldHNTbmFwc2hvdFxyXG59IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY2xpcHBlci5jb21tb24nO1xyXG5pbXBvcnQgeyBTZWxlY3RhYmxlTW9kZWwsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgRXh0ZW5kZWRNb2R1bGUgfSBmcm9tICdAbmdicmFja2V0L25neC1sYXlvdXQvZXh0ZW5kZWQnO1xyXG5pbXBvcnQgeyBGbGV4TW9kdWxlIH0gZnJvbSAnQG5nYnJhY2tldC9uZ3gtbGF5b3V0L2ZsZXgnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENsaXBwZXJEb2N1bWVudE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9kb2N1bWVudC1tZW51L2RvY3VtZW50LW1lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1mYWNldHMvc2VhcmNoLWZhY2V0cy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoUmVzdWx0TWFuYWdlciB9IGZyb20gJy4uL3NlYXJjaC1yZXN1bHQtbWFuYWdlci9zZWFyY2gtcmVzdWx0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBDbGlwcGVyU2VhcmNoUmVzdWx0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1yZXN1bHQtaXRlbS9zZWFyY2gtcmVzdWx0LWl0ZW0uY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2xpcHBlclJlZmVyZW5jZXNEaWFsb2dEYXRhIHtcclxuICBtb2RlPzogQ2xpcHBlckRvY3VtZW50U25hcHNob3RNb2RlIHwgbnVsbDtcclxuICBhbmNob3I/OiBzdHJpbmcgfCBudWxsO1xyXG4gIGFuY2hvclRpdGxlPzogc3RyaW5nIHwgbnVsbDtcclxuICBpZDogc3RyaW5nO1xyXG4gIG1vZGVsOiBudW1iZXI7XHJcblxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBob3N0OiB7ICdCaW5kJzogU3lzdGVtVXRpbHMuZ2VuZXJhdGVVVUlEKCkgfSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVmZXJlbmNlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcmVmZXJlbmNlcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRmxleE1vZHVsZSxcclxuICAgIE1hdERpYWxvZ1RpdGxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdFNsaWRlVG9nZ2xlTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRNZW51TW9kdWxlLFxyXG4gICAgTWF0QmFkZ2VNb2R1bGUsXHJcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXHJcbiAgICBNYXREaWFsb2dDb250ZW50LFxyXG4gICAgRXh0ZW5kZWRNb2R1bGUsXHJcbiAgICBNYXRTaWRlbmF2TW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXHJcbiAgICBDbGlwcGVyRG9jdW1lbnRNZW51Q29tcG9uZW50LFxyXG4gICAgQ2xpcHBlclNlYXJjaEZhY2V0c0NvbXBvbmVudCwgICAgXHJcbiAgICBDbGlwcGVyU2VhcmNoUmVzdWx0SXRlbUNvbXBvbmVudFxyXG4gICAgXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENsaXBwZXJSZWZlcmVuY2VzQ29tcG9uZW50IGV4dGVuZHMgQ2xpcHBlclNlYXJjaFJlc3VsdE1hbmFnZXJcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBAVmlld0NoaWxkKCdmaWx0ZXJQYW5lJykgZmlsdGVyUGFuZSE6IE1hdERyYXdlcjtcclxuXHJcbiAgcHJpdmF0ZSBoZWlnaHQ6IG51bWJlciA9IC0xO1xyXG4gIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0KE1hdERpYWxvZ1JlZjxDbGlwcGVyUmVmZXJlbmNlc0NvbXBvbmVudD4pO1xyXG4gIHByb3RlY3RlZCBkaWFsb2dEYXRhOiBDbGlwcGVyUmVmZXJlbmNlc0RpYWxvZ0RhdGEgPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKSA/PyB7IG1vZGU6IENsaXBwZXJEb2N1bWVudFNuYXBzaG90TW9kZS5SZWZlcmVuY2VzSW4gfTtcclxuICBwcm90ZWN0ZWQgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBpdGVtOiBDbGlwcGVyRG9jdW1lbnRJbmZvIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEpIHtcclxuICAgICAgc3dpdGNoICh0aGlzLmRpYWxvZ0RhdGEubW9kZSkge1xyXG4gICAgICAgIGNhc2UgQ2xpcHBlckRvY3VtZW50U25hcHNob3RNb2RlLlJlZmVyZW5jZXNJbjpcclxuICAgICAgICAgIHRoaXMudGl0bGUgPSBcIkRvY3VtZW50aSByaWNoaWFtYXRpIG5lbGxlIG5vdGUgbyBuZWwgdGVzdG9cIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ2xpcHBlckRvY3VtZW50U25hcHNob3RNb2RlLlJlZmVyZW5jZXNPdXQ6XHJcbiAgICAgICAgICB0aGlzLnRpdGxlID0gXCJEb2N1bWVudGkgY2hlIHJpY2hpYW1hbm8gcXVlbGxvIGluIHZpc2lvbmVcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ2xpcHBlckRvY3VtZW50U25hcHNob3RNb2RlLkNoYW5nZXNJbjpcclxuICAgICAgICAgIHRoaXMudGl0bGUgPSBcIk1vZGlmaWNoZSBzdWJpdGVcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ2xpcHBlckRvY3VtZW50U25hcHNob3RNb2RlLkNoYW5nZXNPdXQ6XHJcbiAgICAgICAgICB0aGlzLnRpdGxlID0gXCJNb2RpZmljaGUgYXBwb3J0YXRlXCI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENsaXBwZXJEb2N1bWVudFNuYXBzaG90TW9kZS5KdXJpczpcclxuICAgICAgICAgIHRoaXMudGl0bGUgPSBcIkdpdXJpc3BydWRlbnphIGFzc29jaWF0YVwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5hbmNob3JUaXRsZSkge1xyXG4gICAgICAgIHRoaXMudGl0bGUgKz0gXCIgLSBcIiArIHRoaXMuZGlhbG9nRGF0YS5hbmNob3JUaXRsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVXNlIHNlcnZpY2Ugc25hcHNob3RcclxuICAgICAgdGhpcy5zbmFwc2hvdCA9IHRoaXMuY2xpcHBlclNlcnZpY2UucmVmZXJlbmNlc1NuYXBzaG90ID8/IHsgc2VhcmNoUGFyYW1zOiB7fSwgaW50ZXJ2YWw6IFwiLTFcIiB9O1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZG9jdW1lbnRTbmFwc2hvdE1vZGUgIT09IHRoaXMuZGlhbG9nRGF0YS5tb2RlIHx8XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZG9jdW1lbnRJZCAhPT0gdGhpcy5kaWFsb2dEYXRhLmlkIHx8XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuYW5jaG9yICE9PSB0aGlzLmRpYWxvZ0RhdGEuYW5jaG9yXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zID0ge1xyXG4gICAgICAgICAgZG9jdW1lbnRTbmFwc2hvdE1vZGU6IHRoaXMuZGlhbG9nRGF0YS5tb2RlLFxyXG4gICAgICAgICAgbW9kZWw6IHRoaXMuZGlhbG9nRGF0YS5tb2RlbCxcclxuICAgICAgICAgIGFuY2hvcjogdGhpcy5kaWFsb2dEYXRhLmFuY2hvcixcclxuICAgICAgICAgIGRvY3VtZW50SWQ6IHRoaXMuZGlhbG9nRGF0YS5pZCxcclxuICAgICAgICAgIHVzZU1vZGlmaWVySW5mbzogdGhpcy5kaWFsb2dEYXRhLm1vZGUgPT09IENsaXBwZXJEb2N1bWVudFNuYXBzaG90TW9kZS5DaGFuZ2VzT3V0LFxyXG4gICAgICAgICAgcmV0dXJuTW9kaWZpZXJJbmZvOiB0aGlzLmRpYWxvZ0RhdGEubW9kZSAhPT0gQ2xpcHBlckRvY3VtZW50U25hcHNob3RNb2RlLkNoYW5nZXNPdXQsXHJcbiAgICAgICAgICBmaXJzdDogMCxcclxuICAgICAgICAgIGNvdW50OiAxNSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2xpcHBlclNlcnZpY2UucmVmZXJlbmNlc1NuYXBzaG90ID0gdGhpcy5zbmFwc2hvdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWxpemUgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3RhYmxlTW9kZWw8YW55LCBzdHJpbmc+KHRydWUsICdkb2N1bWVudElkJyk7XHJcblxyXG4gICAgLy8gT2JzZXJ2ZSBsYXlvdXQgY2hhbmdlc1xyXG4gICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXJcclxuICAgICAgLm9ic2VydmUoW1xyXG4gICAgICAgIEJyZWFrcG9pbnRzLlhTbWFsbCxcclxuICAgICAgICBCcmVha3BvaW50cy5TbWFsbCxcclxuICAgICAgICBCcmVha3BvaW50cy5NZWRpdW0sXHJcbiAgICAgICAgQnJlYWtwb2ludHMuTGFyZ2UsXHJcbiAgICAgICAgQnJlYWtwb2ludHMuWExhcmdlLFxyXG4gICAgICBdKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIE9iamVjdC5rZXlzKHJlc3VsdC5icmVha3BvaW50cykpIHtcclxuICAgICAgICAgIGlmIChyZXN1bHQuYnJlYWtwb2ludHNbcXVlcnldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyUGFuZVZpc2liaWxpdHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAvLyBSZWFjdCB0byB3aW5kb3cgc2l6ZSBjaGFuZ2VcclxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSksIGRlYm91bmNlVGltZSg1MDApKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZS5uZXh0KCk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gSGFuZGxlIGZpbHRlciBwYW5lIFxyXG4gICAgICB0aGlzLmhhbmRsZUZpbHRlclBhbmVWaXNpYmlsaXR5KCk7XHJcbiAgICAgIC8vIEhhbmRsZSBmYWNldHNcclxuICAgICAgaWYgKHRoaXMuZmFjZXRzKSB7XHJcbiAgICAgICAgdGhpcy5mYWNldHMuY2hhbmdlZFxyXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IENsaXBwZXJTZWFyY2hGYWNldHNTbmFwc2hvdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cyA9IHZhbHVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy5mcm9tRGF0ZSA9IHRoaXMuc25hcHNob3QuZmFjZXRzLmZyb21EYXRlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLnRvRGF0ZSA9IHRoaXMuc25hcHNob3QuZmFjZXRzLnRvRGF0ZTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy55ZWFyID0gdGhpcy5zbmFwc2hvdC5mYWNldHMuZnJvbURhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNuYXBzaG90LmZhY2V0cy5jaGFuZ2VkSW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy55ZWFyID0gbnVsbDtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy5mcm9tRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMudG9EYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yIHx8IHRoaXMuc25hcHNob3QuZmFjZXRzLmNoYW5nZWRTZWN0b3IpXHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuc2VjdG9yID0gdGhpcy5zbmFwc2hvdC5mYWNldHMuc2VjdG9yO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC5mYWNldHMudHlwZSB8fCB0aGlzLnNuYXBzaG90LmZhY2V0cy5jaGFuZ2VkVHlwZSlcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclBhcmFtcy50eXBlID0gdGhpcy5zbmFwc2hvdC5mYWNldHMudHlwZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc25hcHNob3QuZmFjZXRzLmF1dGhvciB8fCB0aGlzLnNuYXBzaG90LmZhY2V0cy5jaGFuZ2VkQXV0aG9yKVxyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyUGFyYW1zLmF1dGhvciA9IHRoaXMuc25hcHNob3QuZmFjZXRzLmF1dGhvcjtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaCh0cnVlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICAgIGlmICh0aGlzLnNuYXBzaG90LmludGVydmFsID09PSBcIi0xXCIpIHtcclxuICAgICAgdGhpcy5zbmFwc2hvdC5pbnRlcnZhbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuZmV0Y2godHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBEaXNwbGF5IGN1cnJlbnQgc25hcHNob3QgZmFjZXRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICB0aGlzLnJlc3RvcmVGYWNldHMoKTtcclxuICAgICAgdGhpcy5yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2l6ZSBcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2l6ZSgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGlwcGVyLXJlZmVyZW5jZXMtc2Nyb2xsYWJsZScpO1xyXG4gICAgICBpZiAoZWxlbSkge1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZGlhbG9nU2VydmljZS5nZXRDdXJyZW50RGlhbG9nU2Nyb2xsYWJsZUhlaWdodChcclxuICAgICAgICAgIFsnY2xpcHBlci1yZWZlcmVuY2VzLWZpeGVkJ10sXHJcbiAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChoZWlnaHQgIT0gdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCdzdHlsZScsICdoZWlnaHQ6JyArIGhlaWdodCArICdweCAhaW1wb3J0YW50O21heC1oZWlnaHQ6JyArIGhlaWdodCArICdweCAhaW1wb3J0YW50Jyk7XHJcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogU2hvdyBoaWRlIGZpbHRlciBwYW5lIG1hbnVhbGx5XHJcbiAqL1xyXG4gIHByb3RlY3RlZCB0b2dnbGVGaWx0ZXJQYW5lKCkge1xyXG4gICAgdGhpcy5maWx0ZXJQYW5lQ2xvc2VkID0gIXRoaXMuZmlsdGVyUGFuZUNsb3NlZDtcclxuICAgIHRoaXMuZmlsdGVyUGFuZT8udG9nZ2xlKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBmaWx0ZXIgcGFuZSB2aXNpYmlsaXR5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVGaWx0ZXJQYW5lVmlzaWJpbGl0eSgpIHtcclxuICAgIGlmICh0aGlzLmZpbHRlclBhbmUpIHtcclxuICAgICAgaWYgKHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLmlzTWF0Y2hlZChCcmVha3BvaW50cy5YU21hbGwpIHx8XHJcbiAgICAgICAgdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIuaXNNYXRjaGVkKEJyZWFrcG9pbnRzLlNtYWxsKSB8fFxyXG4gICAgICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLmlzTWF0Y2hlZChCcmVha3BvaW50cy5NZWRpdW0pKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyUGFuZS5vcGVuZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUGFuZS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpbHRlclBhbmUubW9kZSA9ICdvdmVyJztcclxuICAgICAgICB0aGlzLmZpbHRlclBhbmUuZGlzYWJsZUNsb3NlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQYW5lSGFzQmFja2Ryb3AgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJQYW5lLm9wZW5lZCAmJiAhdGhpcy5maWx0ZXJQYW5lQ2xvc2VkKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclBhbmUub3BlbigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJQYW5lLm9wZW5lZCAmJiB0aGlzLmZpbHRlclBhbmVDbG9zZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyUGFuZS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpbHRlclBhbmUubW9kZSA9ICdzaWRlJztcclxuICAgICAgICB0aGlzLmZpbHRlclBhbmUuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZpbHRlclBhbmVIYXNCYWNrZHJvcCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgZGlhbG9nXHJcbiAgICovXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLnNhdmVTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhdmUgc2Nyb2xsIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgc2F2ZVNjcm9sbFBvc2l0aW9uKCkge1xyXG4gICAgdGhpcy5jbGlwcGVyU2VydmljZS5zY3JvbGxhYmxlLnNhdmVQb3NpdGlvbihcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZG9jdW1lbnRJZCxcclxuICAgICAgJyNyZWZlcmVuY2VzX2NvbnRhaW5lcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBzY3JvbGwgcG9zaXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2xpcHBlci1yZWZlcmVuY2VzLXNjcm9sbGVyJykuc2Nyb2xsVG8oMCwgMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXN0b3JlIHNjcm9sbCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCkge1xyXG4gICAgdGhpcy5jbGlwcGVyU2VydmljZS5zY3JvbGxhYmxlLnRyeVJlc3RvcmVQb3NpdGlvbihcclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZG9jdW1lbnRJZCxcclxuICAgICAgJyNjbGlwcGVyLXJlZmVyZW5jZXMtc2Nyb2xsZXInXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgZG9jdW1lbnQgbGlua3MgYnkgZW1haWxcclxuICAgKiBAcGFyYW0gaXRlbSA6IHRoZSBpdGVtIHRvIGFkZFxyXG4gICAqL1xyXG4gIHNlbmRUbyhpdGVtOiBhbnkgPSBudWxsKSB7XHJcbiAgICB0aGlzLnNlbmRJdGVtc1RvKGl0ZW0gPyBbaXRlbV0gOiB0aGlzLnNlbGVjdGlvbi5hbGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBhIHNlYXJjaFxyXG4gICAqIEBwYXJhbSBuZXdTZWFyY2g6IHRydWUgaWYgaXMgYSBuZXcgc2VhcmNoXHJcbiAgICovXHJcbiAgZmV0Y2gobmV3U2VhcmNoOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGlmICghdGhpcy5jbGlwcGVyU2VydmljZS5sb2dnZWRJbikgcmV0dXJuO1xyXG4gICAgaWYgKG5ld1NlYXJjaCkgdGhpcy5maWx0ZXJQYXJhbXMuZmlyc3QgPSAwO1xyXG4gICAgdGhpcy5maWx0ZXJQYXJhbXMudXNlTW9kaWZpZXJJbmZvID1cclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZG9jdW1lbnRTbmFwc2hvdE1vZGUgPT09IENsaXBwZXJEb2N1bWVudFNuYXBzaG90TW9kZS5DaGFuZ2VzT3V0O1xyXG4gICAgdGhpcy5maWx0ZXJQYXJhbXMucmV0dXJuTW9kaWZpZXJJbmZvID1cclxuICAgICAgdGhpcy5maWx0ZXJQYXJhbXMuZG9jdW1lbnRTbmFwc2hvdE1vZGUgIT09IENsaXBwZXJEb2N1bWVudFNuYXBzaG90TW9kZS5DaGFuZ2VzT3V0O1xyXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmJ1c3koJ1JpY2VyY2EgaW4gY29yc28uLi4nKTtcclxuICAgIHRoaXMuY2xpcHBlclNlcnZpY2UucmVmZXJlbmNlcyh0aGlzLmZpbHRlclBhcmFtcylcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHIpID0+IHtcclxuICAgICAgICAgIGlmICghci5zdWNjZXNzKSB0aGlzLmRpYWxvZ1NlcnZpY2UuZXJyb3Ioci5tZXNzYWdlKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVSZXN1bHRzKHIudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gSGFuZGxlIGZhY2V0c1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbmFwc2hvdC50b3RhbCA+IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90LmZhY2V0cy5oYXNUb29NYW55UmVzdWx0cyA9IHRoaXMuc25hcHNob3QudG90YWwgPj0gMTAwMDtcclxuICAgICAgICAgICAgICBpZiAobmV3U2VhcmNoKVxyXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZhY2V0c1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEZhY2V0cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmFjZXRzLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJQYW5lLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChuZXdTZWFyY2gpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGxQb3NpdGlvbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jbGVhckJ1c3koKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5ldyBwYWdlIHJlc3VsdFxyXG4gICAqIEBwYXJhbSBlIDogdGhlIE1hdFBhZ2luYXRvciBQYWdlRXZlbnQgZGF0YVxyXG4gICAqL1xyXG4gIGZldGNoTW9yZShlOiBhbnkpIHtcclxuICAgIGxldCBmaXJzdCA9IGUucGFnZUluZGV4ICogdGhpcy5maWx0ZXJQYXJhbXMuY291bnQ7XHJcbiAgICB0aGlzLmZpbHRlclBhcmFtcy5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5mZXRjaCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGZhY2V0c1xyXG4gICAqL1xyXG4gIGZldGNoRmFjZXRzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNsaXBwZXJTZXJ2aWNlLmxvZ2dlZEluKSByZXR1cm47XHJcbiAgICB0aGlzLmZhY2V0cy5idXN5LnNldCh0cnVlKTtcclxuICAgIHRoaXMuY2xpcHBlclNlcnZpY2UucmVmZXJlbmNlc0ZhY2V0cyh0aGlzLmZpbHRlclBhcmFtcylcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHIpID0+IHtcclxuICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlUmVzdWx0cyhudWxsLCByLnZhbHVlLmZhY2V0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyUGFuZVZpc2liaWxpdHkoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsUG9zaXRpb24oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZhY2V0cy5idXN5LnNldChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBUcnkgdG8gcmVzdG9yZSBzdG9yZWQgZmFjZXRzXHJcbiAqL1xyXG4gIHJlc3RvcmVGYWNldHMoKSB7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdC5mYWNldHMpIHtcclxuICAgICAgdGhpcy5mYWNldHMucmVzdG9yZSh0aGlzLnNuYXBzaG90LmZhY2V0cyk7XHJcbiAgICAgIHRoaXMuaGFuZGxlRmlsdGVyUGFuZVZpc2liaWxpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIGN1cnJlbnQgZGlhbG9nIGFuZCByZXR1cm4gdGhlIGlkIHRvIG5hdmlnYXRlIHRvXHJcbiAgICogQHBhcmFtIGRvY3VtZW50SWQgOiB0aGUgZG9jdW1lbnQgaWRcclxuICAgKi9cclxuICBvcGVuKGRvY3VtZW50SWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBpZDogZG9jdW1lbnRJZCB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBpZD1cImNsaXBwZXItcmVmZXJlbmNlcy1maXhlZFwiPlxyXG4gIDxkaXYgaWQ9XCJjbGlwcGVyLXJlZmVyZW5jZXMtaGVhZGVyXCI+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGZ4TGF5b3V0R2FwPScxMHB4JyBmeEZpbGw+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiPlxyXG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7dGl0bGV9fSA8L2gyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cInN0YXJ0XCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQ2hpdWRpXCIgYXJpYS1sYWJlbD1cIkNoaXVkaVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiIGNsYXNzPVwiZGlhbG9nLWNsb3NlXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgZnhGaWxsIHN0eWxlPVwicGFkZGluZzogMCAxMHB4IDAgMjRweDtcIj5cclxuICAgIDxkaXYgZnhGbGV4PVwiKlwiPlxyXG4gICAgICBAaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5kb2N1bWVudFNuYXBzaG90TW9kZSA9PSAxKSB7XHJcbiAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIG5hbWU9XCJleGNsdWRlVGV4dFJlZmVyZW5jZXNcIiBbKG5nTW9kZWwpXT1cInNuYXBzaG90LnNlYXJjaFBhcmFtcy5leGNsdWRlVGV4dFJlZmVyZW5jZXNcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiZmV0Y2godHJ1ZSlcIj5cclxuICAgICAgICBNb3N0cmEgc29sbyBzZSBjaXRhdGkgbmVsbGUgbm90ZVxyXG4gICAgICA8L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgIH0gQGVsc2UgaWYgKHNuYXBzaG90LnNlYXJjaFBhcmFtcy5kb2N1bWVudFNuYXBzaG90TW9kZSA9PSAyKSB7XHJcbiAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIG5hbWU9XCJleGNsdWRlTm90ZXNSZWZlcmVuY2VzXCIgWyhuZ01vZGVsKV09XCJzbmFwc2hvdC5zZWFyY2hQYXJhbXMuZXhjbHVkZU5vdGVzUmVmZXJlbmNlc1wiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJmZXRjaCh0cnVlKVwiPlxyXG4gICAgICAgIE1vc3RyYSBzb2xvIHNlIGNpdGFubyBuZWwgdGVzdG8gaWwgZG9jdW1lbnRvXHJcbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgQGlmIChzZWxlY3Rpb24uaGFzVmFsdWUoKSkge1xyXG4gICAgICA8YnV0dG9uIGZ4RmxleEFsaWduPVwiY2VudGVyXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1idXR0b24gbWF0VG9vbHRpcD1cIkF6aW9uaSBkYSBlc2VndWlyZSBzdWdsaSBlbGVtZW50aSBzZWxlemlvbmF0aVwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBvcHppb25pIHBlciBlbGVtZW50aSBzZWxlemlvbmF0aSdcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVNlbGVjdGlvbnNcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhc25hcHNob3QudG90YWxcIj5cclxuICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIFttYXRCYWRnZV09XCJzZWxlY3Rpb24uYWxsLmxlbmd0aFwiXHJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCI+cGxheWxpc3RfYWRkX2NoZWNrPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLW1lbnUtZHJvcC1kb3duXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgICA8bWF0LW1lbnUgI21lbnVTZWxlY3Rpb25zPVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxjbGlwcGVyLWRvY3VtZW50LW1lbnUgW3BhcmVudF09XCJ0aGlzXCIgW3NlbGVjdGlvblNvdXJjZV09XCJzZWxlY3Rpb25cIiBbaXNSZWFkYWJsZV09XCJmYWxzZVwiIFtpc1JlZmVyZW5jZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgPC9jbGlwcGVyLWRvY3VtZW50LW1lbnU+XHJcbiAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIEBpZiAoc25hcHNob3QgJiYgc25hcHNob3QuZmFjZXRzPy5oYXNGYWNldHMgJiYgZmlsdGVyUGFuZSAmJiAoIWZpbHRlclBhbmUub3BlbmVkIHx8IGZpbHRlclBhbmVDbG9zZWQpKSB7XHJcbiAgICAgIDxkaXYgZnhGbGV4QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gIG1hdFRvb2x0aXA9XCJBZmZpbmEgcmljZXJjYVwiIGFyaWEtbGFiZWw9XCInQWZmaW5hIHJpY2VyY2EnXCJcclxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJQYW5lKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5tZW51X29wZW48L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudCBpZD1cImNsaXBwZXItcmVmZXJlbmNlcy1zY3JvbGxhYmxlXCI+XHJcbiAgPG1hdC1kcmF3ZXItY29udGFpbmVyIFtoYXNCYWNrZHJvcF09XCJmaWx0ZXJQYW5lSGFzQmFja2Ryb3BcIj5cclxuICAgIDxtYXQtZHJhd2VyICNmaWx0ZXJQYW5lIHBvc2l0aW9uPVwiZW5kXCIgY2xhc3M9XCJkcmF3ZXItc21hbGxcIj5cclxuICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgICAgICA8ZGl2IGZ4RmxleD1cIjQwcHhcIiBzdHlsZT1cIm1hcmdpbjowIDRweFwiPlxyXG4gICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiMTBweFwiIGZ4RmlsbD5cclxuICAgICAgICAgICAgPGRpdiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIGNsYXNzPVwidGl0bGVcIj5BZmZpbmEgcmljZXJjYTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGZ4RmxleD1cIipcIiBmeExheW91dEFsaWduPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBmeEZsZXhBbGlnbj1cImNlbnRlclwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyUGFuZSgpXCJcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJOYXNjb25kaVwiPjxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgY2xhc3M9XCJzY3JvbGwtaGlkZGVuXCI+XHJcbiAgICAgICAgICA8Y2xpcHBlci1zZWFyY2gtZmFjZXRzICNmYWNldHM+PC9jbGlwcGVyLXNlYXJjaC1mYWNldHM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtZHJhd2VyPlxyXG4gICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4RmlsbD5cclxuICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgaWQ9XCJjbGlwcGVyLXJlZmVyZW5jZXMtc2Nyb2xsZXJcIj5cclxuICAgICAgICBAaWYgKCFzbmFwc2hvdC50b3RhbCkge1xyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1lc3NhZ2VcIj48aT5OZXNzdW4gZWxlbWVudG8gZGEgdmlzdWFsaXp6YXJlLjwvaT48L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc25hcHNob3QuaXRlbXM7IHRyYWNrIGl0ZW07IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IChjb250ZXh0bWVudSk9XCJvbkNvbnRleHRNZW51KCRldmVudCwgaXRlbSlcIiAobW91c2VlbnRlcik9XCJpdGVtLmlzT3ZlciA9IHRydWVcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpdGVtLmlzT3ZlciA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIEBpZiAoaXRlbS5ncm91cCkge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbXMtZ3JvdXAtdGl0bGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnc3BhY2VkJzogaSA+IDB9XCI+e3tpdGVtLmdyb3VwfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0R2FwPVwiNnB4XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGZ4RmlsbCBjbGFzcz1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXRlbS1zZWxlY3RlZCc6IHNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0uZG9jdW1lbnRJZCkgfVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNDhweFwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIEBpZiAoc2NyZWVuU2VydmljZS5pc1RvdWNoYWJsZSB8fCBpdGVtLmlzT3ZlciB8fCBzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtLmRvY3VtZW50SWQpKSB7XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94ICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKGl0ZW0sIGl0ZW0uZG9jdW1lbnRJZCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbS5kb2N1bWVudElkKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhGbGV4QWxpZ249XCJjZW50ZXJcIiBjbGFzcz1cIml0ZW0tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGNsaXBwZXItc2VhcmNoLXJlc3VsdC1pdGVtIFtpdGVtXT1cIml0ZW1cIiBbcGFyZW50XT1cInRoaXNcIj48L2NsaXBwZXItc2VhcmNoLXJlc3VsdC1pdGVtPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNDhweFwiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIj5cclxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pc092ZXIgfHwgaXRlbS5pc01lbnVPcGVuIHx8IHNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0uZG9jdW1lbnRJZCkpIHtcclxuICAgICAgICAgICAgICAgIDxidXR0b24gZnhGbGV4QWxpZ249XCJjZW50ZXJcIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNZW51XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTWVudSBvcHppb25pJ1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCIgKGNsaWNrKT1cIml0ZW0uaXNNZW51T3BlbiA9IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICNjb250ZXh0TWVudVRyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiIHN0eWxlPVwicG9zaXRpb246IGZpeGVkXCIgW3N0eWxlLmxlZnRdPVwiY29udGV4dE1lbnVQb3NpdGlvbi54XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS50b3BdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwie2l0ZW06IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8bWF0LW1lbnUgI2NvbnRleHRNZW51PVwibWF0TWVudVwiIChjbG9zZWQpPVwidXBkYXRlTWVudUJ1dHRvbnNWaXNpYmlsaXR5KClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgIDxjbGlwcGVyLWRvY3VtZW50LW1lbnUgW3BhcmVudF09XCJ0aGlzXCIgW2l0ZW1dPVwiaXRlbVwiIFtpc1JlYWRhYmxlXT1cImZhbHNlXCIgW2lzUmVmZXJlbmNlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICA8L2NsaXBwZXItZG9jdW1lbnQtbWVudT5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBmb290ZXIgLS0+XHJcbiAgICAgIEBpZiAoKHNuYXBzaG90Py50b3RhbCA/PyAwKSA+IDApIHtcclxuICAgICAgPGRpdiBjbGFzcz1cIml0ZW1zLWZvb3RlclwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiIGZ4RmlsbD5cclxuICAgICAgICAgIDxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgY2xhc3M9XCJwYWdpbmF0b3JcIiBbaGlkZVBhZ2VTaXplXT1cInRydWVcIiBbbGVuZ3RoXT1cInNuYXBzaG90Py50b3RhbCA/PyAwXCJcclxuICAgICAgICAgICAgW3BhZ2VTaXplXT1cImZpbHRlclBhcmFtcy5jb3VudCA/PyAxNVwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCIgKHBhZ2UpPVwiZmV0Y2hNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgIDwvbWF0LXBhZ2luYXRvcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LWRyYXdlci1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==