ngx-edu-sharing-ui 10.0.20 → 10.0.22

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 (131) hide show
  1. package/assets/scss/material-theme.scss +3 -3
  2. package/assets/scss/mixins.scss +1 -1
  3. package/assets/scss/variables-root.scss +2 -0
  4. package/assets/scss/variables-scss.scss +3 -4
  5. package/assets/scss/variables.scss +1 -1
  6. package/fesm2022/ngx-edu-sharing-ui.mjs +376 -319
  7. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
  8. package/lib/index.d.ts +1 -0
  9. package/lib/list-items/list-widget.d.ts +1 -1
  10. package/lib/mds-viewer/mds-editor-instance-service.abstract.d.ts +14 -0
  11. package/lib/mds-viewer/widget/mds-widget.component.d.ts +6 -4
  12. package/package.json +8 -9
  13. package/esm2022/lib/actionbar/actionbar.component.mjs +0 -206
  14. package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +0 -170
  15. package/esm2022/lib/directives/border-box-observer.directive.mjs +0 -71
  16. package/esm2022/lib/directives/check-text-overflow.directive.mjs +0 -71
  17. package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +0 -14
  18. package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +0 -79
  19. package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +0 -49
  20. package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +0 -105
  21. package/esm2022/lib/directives/focus-state.directive.mjs +0 -44
  22. package/esm2022/lib/directives/icon.directive.mjs +0 -184
  23. package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -85
  24. package/esm2022/lib/dropdown/dropdown.component.mjs +0 -83
  25. package/esm2022/lib/edu-sharing-ui-configuration.mjs +0 -48
  26. package/esm2022/lib/edu-sharing-ui.module.mjs +0 -82
  27. package/esm2022/lib/index.mjs +0 -96
  28. package/esm2022/lib/list-items/available-widgets.mjs +0 -27
  29. package/esm2022/lib/list-items/format-duration.pipe.mjs +0 -20
  30. package/esm2022/lib/list-items/list-base/list-base.component.mjs +0 -46
  31. package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +0 -29
  32. package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +0 -56
  33. package/esm2022/lib/list-items/list-items.module.mjs +0 -50
  34. package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +0 -41
  35. package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +0 -47
  36. package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +0 -24
  37. package/esm2022/lib/list-items/list-text/list-text.component.mjs +0 -106
  38. package/esm2022/lib/list-items/list-widget.mjs +0 -49
  39. package/esm2022/lib/list-items/node-row/node-row.component.mjs +0 -24
  40. package/esm2022/lib/list-items/node-source.pipe.mjs +0 -49
  41. package/esm2022/lib/mds/mds-helper.service.mjs +0 -167
  42. package/esm2022/lib/mds/mds.module.mjs +0 -16
  43. package/esm2022/lib/mds-viewer/mds-viewer.component.mjs +0 -170
  44. package/esm2022/lib/mds-viewer/mds-viewer.service.mjs +0 -18
  45. package/esm2022/lib/mds-viewer/replace-element-with-div.mjs +0 -47
  46. package/esm2022/lib/mds-viewer/view-instance.service.mjs +0 -27
  47. package/esm2022/lib/mds-viewer/widget/mds-widget.component.mjs +0 -379
  48. package/esm2022/lib/node-entries/combined-data-source.mjs +0 -41
  49. package/esm2022/lib/node-entries/custom-templates-data-source.mjs +0 -7
  50. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +0 -21
  51. package/esm2022/lib/node-entries/entries-model.mjs +0 -24
  52. package/esm2022/lib/node-entries/items-cap.mjs +0 -47
  53. package/esm2022/lib/node-entries/list-item-label.pipe.mjs +0 -37
  54. package/esm2022/lib/node-entries/node-cache.mjs +0 -73
  55. package/esm2022/lib/node-entries/node-data-source-remote.mjs +0 -4
  56. package/esm2022/lib/node-entries/node-data-source.mjs +0 -117
  57. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +0 -117
  58. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +0 -329
  59. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +0 -44
  60. package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +0 -27
  61. package/esm2022/lib/node-entries/node-entries-global.service.mjs +0 -71
  62. package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +0 -42
  63. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +0 -294
  64. package/esm2022/lib/node-entries/node-entries-templates.service.mjs +0 -11
  65. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +0 -369
  66. package/esm2022/lib/node-entries/node-entries.component.mjs +0 -132
  67. package/esm2022/lib/node-entries/node-entries.module.mjs +0 -161
  68. package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +0 -125
  69. package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +0 -48
  70. package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +0 -36
  71. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +0 -75
  72. package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +0 -53
  73. package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +0 -41
  74. package/esm2022/lib/node-url/node-url.component.mjs +0 -132
  75. package/esm2022/lib/pipes/file-size.pipe.mjs +0 -32
  76. package/esm2022/lib/pipes/format-date.pipe.mjs +0 -38
  77. package/esm2022/lib/pipes/mds-duration.pipe.mjs +0 -25
  78. package/esm2022/lib/pipes/node-icon.pipe.mjs +0 -18
  79. package/esm2022/lib/pipes/node-image-size.pipe.mjs +0 -24
  80. package/esm2022/lib/pipes/node-image.pipe.mjs +0 -55
  81. package/esm2022/lib/pipes/node-license.pipe.mjs +0 -24
  82. package/esm2022/lib/pipes/node-person-name.pipe.mjs +0 -50
  83. package/esm2022/lib/pipes/node-title.pipe.mjs +0 -35
  84. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +0 -33
  85. package/esm2022/lib/pipes/property-slug.pipe.mjs +0 -16
  86. package/esm2022/lib/pipes/replace-chars.pipe.mjs +0 -29
  87. package/esm2022/lib/pipes/vcard-name.pipe.mjs +0 -25
  88. package/esm2022/lib/services/abstract/app.service.mjs +0 -3
  89. package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +0 -10
  90. package/esm2022/lib/services/abstract/options-helper.service.mjs +0 -3
  91. package/esm2022/lib/services/abstract/toast.service.mjs +0 -3
  92. package/esm2022/lib/services/accessibility.service.mjs +0 -73
  93. package/esm2022/lib/services/app-container.service.mjs +0 -69
  94. package/esm2022/lib/services/local-events.service.mjs +0 -43
  95. package/esm2022/lib/services/node-entries.service.mjs +0 -201
  96. package/esm2022/lib/services/node-helper.service.mjs +0 -330
  97. package/esm2022/lib/services/nodes-drag-drop.service.mjs +0 -155
  98. package/esm2022/lib/services/options-helper-data.service.mjs +0 -142
  99. package/esm2022/lib/services/render-helper.service.mjs +0 -114
  100. package/esm2022/lib/services/repo-url.service.mjs +0 -50
  101. package/esm2022/lib/services/search-helper.service.mjs +0 -52
  102. package/esm2022/lib/services/temporary-storage.service.mjs +0 -48
  103. package/esm2022/lib/services/ui.service.mjs +0 -327
  104. package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +0 -50
  105. package/esm2022/lib/spinner/spinner.component.mjs +0 -19
  106. package/esm2022/lib/spinner-small/spinner-small.component.mjs +0 -18
  107. package/esm2022/lib/translations/fallback-translation-handler.mjs +0 -6
  108. package/esm2022/lib/translations/translation-loader.mjs +0 -219
  109. package/esm2022/lib/translations/translation-source.mjs +0 -11
  110. package/esm2022/lib/translations/translations.module.mjs +0 -82
  111. package/esm2022/lib/translations/translations.service.mjs +0 -238
  112. package/esm2022/lib/types/accessibillity.mjs +0 -19
  113. package/esm2022/lib/types/api-models.mjs +0 -2
  114. package/esm2022/lib/types/drag-drop.mjs +0 -2
  115. package/esm2022/lib/types/injection-tokens.mjs +0 -31
  116. package/esm2022/lib/types/keyboard-shortcuts.mjs +0 -11
  117. package/esm2022/lib/types/list-item.mjs +0 -41
  118. package/esm2022/lib/types/option-item.mjs +0 -192
  119. package/esm2022/lib/types/workflow.mjs +0 -25
  120. package/esm2022/lib/util/DateHelper.mjs +0 -200
  121. package/esm2022/lib/util/VCard.mjs +0 -278
  122. package/esm2022/lib/util/color-helper.mjs +0 -124
  123. package/esm2022/lib/util/duration-helper.mjs +0 -102
  124. package/esm2022/lib/util/functions.mjs +0 -13
  125. package/esm2022/lib/util/helper.mjs +0 -64
  126. package/esm2022/lib/util/isNumeric.mjs +0 -11
  127. package/esm2022/lib/util/rest-helper.mjs +0 -42
  128. package/esm2022/lib/util/ui-animation.mjs +0 -146
  129. package/esm2022/lib/util/ui-constants.mjs +0 -21
  130. package/esm2022/ngx-edu-sharing-ui.mjs +0 -5
  131. package/esm2022/public-api.mjs +0 -2
@@ -1,369 +0,0 @@
1
- import { Component, ContentChild, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { interval, Subject } from 'rxjs';
3
- import { NodeEntriesTemplatesService } from './node-entries-templates.service';
4
- import { InteractionType, NodeEntriesDisplayType, } from './entries-model';
5
- import { NodeDataSource } from './node-data-source';
6
- import { Helper } from '../util/helper';
7
- import { NodeEntriesService } from '../services/node-entries.service';
8
- import { TemporaryStorageService } from '../services/temporary-storage.service';
9
- import { OptionsHelperDataService } from '../services/options-helper-data.service';
10
- import { switchMap, take, takeUntil } from 'rxjs/operators';
11
- import { filter } from 'rxjs/operators';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../services/temporary-storage.service";
14
- import * as i2 from "../services/node-entries.service";
15
- import * as i3 from "ngx-edu-sharing-api";
16
- import * as i4 from "../services/options-helper-data.service";
17
- import * as i5 from "../services/node-helper.service";
18
- import * as i6 from "../services/ui.service";
19
- import * as i7 from "./node-entries-templates.service";
20
- import * as i8 from "@angular/common";
21
- import * as i9 from "./node-entries.component";
22
- export class NodeEntriesWrapperComponent {
23
- constructor(viewContainerRef, temporaryStorageService, ngZone, entriesService, nodeService, optionsHelper, nodeHelperService, uiService,
24
- // @TODO
25
- // private mainNav: MainNavService,
26
- templatesService, changeDetectorRef, elementRef) {
27
- this.viewContainerRef = viewContainerRef;
28
- this.temporaryStorageService = temporaryStorageService;
29
- this.ngZone = ngZone;
30
- this.entriesService = entriesService;
31
- this.nodeService = nodeService;
32
- this.optionsHelper = optionsHelper;
33
- this.nodeHelperService = nodeHelperService;
34
- this.uiService = uiService;
35
- this.templatesService = templatesService;
36
- this.changeDetectorRef = changeDetectorRef;
37
- this.elementRef = elementRef;
38
- this.checkbox = true;
39
- /**
40
- * emits when the user re-configures the columns
41
- * should be used in order to save the new configuration
42
- */
43
- this.columnsChange = new EventEmitter();
44
- this.displayType = NodeEntriesDisplayType.Grid;
45
- this.displayTypeChange = new EventEmitter();
46
- this.elementInteractionType = InteractionType.DefaultActionLink;
47
- /**
48
- * This color defines the base color of gradients visually limiting a grid in scroll direction.
49
- * Defaults to white.
50
- */
51
- this.scrollGradientColor = '#fff';
52
- /**
53
- * UI hints for whether a single click will cause a dynamic action.
54
- *
55
- * This does not configure the actual behavior but only UI hints to the user. Hints include
56
- * hover effects and a changed cursor.
57
- *
58
- * - When choosing 'static', the `clickItem` event should trigger some stationary action like
59
- * selecting the element or displaying information in a complementary page area. The
60
- * `dblClickItem` event can be used for a more disruptive action.
61
- * - When choosing 'dynamic', the `clickItem` event should trigger a major action like
62
- * navigating to a new page or closing a dialog.
63
- */
64
- // TODO: Consider controlling the ui hints and the actual behavior with a single option.
65
- this.singleClickHint = 'dynamic';
66
- /**
67
- * Do not load more data on scroll.
68
- */
69
- this.disableInfiniteScroll = false;
70
- this.fetchData = new EventEmitter();
71
- this.clickItem = new EventEmitter();
72
- this.dblClickItem = new EventEmitter();
73
- this.sortChange = new EventEmitter();
74
- this.destroyed = new Subject();
75
- // regulary re-bind template since it might have updated without ngChanges trigger
76
- /*
77
- ngZone.runOutsideAngular(() =>
78
- setInterval(() => this.componentRef.instance.emptyRef = this.emptyRef)
79
- );
80
- */
81
- this.virtualNodesAdded = this.optionsHelper.virtualNodesAdded;
82
- this.displayTypeChanged = this.optionsHelper.displayTypeChanged;
83
- this.entriesService.selection.changed.subscribe(() => {
84
- if (this.optionsHelper.getData()) {
85
- this.optionsHelper.getData().selectedObjects =
86
- this.entriesService.selection.selected;
87
- this.optionsHelper.getData().activeObjects = this.entriesService.selection.selected;
88
- }
89
- else {
90
- console.warn('optionsHelper is not initalized correctly; data is empty');
91
- }
92
- void this.optionsHelper.refreshComponents();
93
- });
94
- }
95
- ngOnInit() {
96
- if (this.primaryInstance) {
97
- this.optionsHelper.registerGlobalKeyboardShortcuts();
98
- }
99
- this.entriesService.columnsSubject
100
- .pipe(takeUntil(this.destroyed), filter((c) => c?.fromUser))
101
- .subscribe((c) => this.columnsChange.emit(c.columns));
102
- }
103
- ngOnChanges(changes = {}) {
104
- if (!this.componentRef) {
105
- this.init();
106
- }
107
- this.entriesService.list = this;
108
- this.entriesService.dataSource = this.dataSource;
109
- this.entriesService.scope = this.scope;
110
- if (changes.columns) {
111
- this.entriesService.columnsSubject.next({
112
- columns: this.columns,
113
- fromUser: false,
114
- });
115
- }
116
- this.entriesService.configureColumns = this.configureColumns;
117
- this.entriesService.checkbox = this.checkbox;
118
- this.entriesService.displayType = this.displayType;
119
- this.entriesService.elementInteractionType = this.elementInteractionType;
120
- this.entriesService.gridConfig = this.gridConfig;
121
- this.entriesService.options = this.options;
122
- this.entriesService.globalOptions = this.globalOptions;
123
- this.entriesService.sort = this.sort;
124
- this.entriesService.sortChange = this.sortChange;
125
- this.entriesService.dragDrop = this.dragDrop;
126
- this.entriesService.clickItem = this.clickItem;
127
- this.entriesService.dblClickItem = this.dblClickItem;
128
- this.entriesService.fetchData = this.fetchData;
129
- this.entriesService.primaryInstance = this.primaryInstance;
130
- this.entriesService.singleClickHint = this.singleClickHint;
131
- this.entriesService.disableInfiniteScroll = this.disableInfiniteScroll;
132
- this.entriesService.scrollGradientColor.set(this.scrollGradientColor);
133
- if (changes['initConfig']) {
134
- void this.initOptionsGenerator(this.initConfig);
135
- }
136
- if (this.componentRef) {
137
- this.componentRef.instance.changeDetectorRef?.detectChanges();
138
- }
139
- // This might need wrapping with `setTimeout`.
140
- this.updateTemplates();
141
- }
142
- ngOnDestroy() {
143
- this.destroyed.next();
144
- this.destroyed.complete();
145
- }
146
- /**
147
- * Replaces this wrapper with the configured custom-node-list component.
148
- */
149
- init() {
150
- this.customNodeListComponent = this.temporaryStorageService.get(TemporaryStorageService.CUSTOM_NODE_ENTRIES_COMPONENT, null);
151
- if (this.customNodeListComponent == null) {
152
- return;
153
- }
154
- this.componentRef = this.uiService.injectAngularComponent(this.viewContainerRef, this.customNodeListComponent, this.elementRef.nativeElement,
155
- // Input bindings are initialized in `ngOnChanges`.
156
- this.getOutputBindings());
157
- }
158
- /**
159
- * Creates a simple map of the output bindings defined in this component.
160
- */
161
- getOutputBindings() {
162
- const outputBindings = {};
163
- for (const key of Object.keys(this)) {
164
- const value = this[key];
165
- if (value instanceof EventEmitter) {
166
- outputBindings[key] = value;
167
- }
168
- }
169
- return outputBindings;
170
- }
171
- getDisplayType() {
172
- return this.displayType;
173
- }
174
- onDisplayTypeChange() {
175
- return this.displayTypeChange.asObservable();
176
- }
177
- setDisplayType(displayType) {
178
- this.displayType = displayType;
179
- this.entriesService.displayType = displayType;
180
- this.ngOnChanges();
181
- this.displayTypeChange.emit(displayType);
182
- }
183
- updateNodes(nodes) {
184
- if (!nodes) {
185
- return;
186
- }
187
- this.dataSource.getData().forEach((d) => {
188
- let hits = nodes.filter((n) => n?.ref
189
- ? n?.ref.id === d?.ref.id
190
- : n?.authorityName ===
191
- d?.authorityName);
192
- if (hits.length === 0) {
193
- // handle if the original has changed (for collection refs)
194
- hits = nodes.filter((n) => n?.ref &&
195
- n?.ref?.id === d?.originalId);
196
- }
197
- if (hits.length === 1) {
198
- this.nodeHelperService.copyDataToNode(d, hits[0]);
199
- }
200
- });
201
- // trigger rebuild
202
- if (this.dataSource instanceof NodeDataSource) {
203
- this.dataSource.refresh();
204
- }
205
- const oldSelection = this.entriesService.selection.selected;
206
- this.entriesService.selection.clear();
207
- this.entriesService.selection.select(...oldSelection.map((o) => this.dataSource.getData().filter((d) => Helper.objectEquals(o, d))?.[0]));
208
- this.changeDetectorRef.detectChanges();
209
- }
210
- showReorderColumnsDialog() { }
211
- addVirtualNodes(virtual) {
212
- virtual = virtual.map((o) => {
213
- o.virtual = true;
214
- return o;
215
- });
216
- virtual.forEach((v) => {
217
- const contains = this.dataSource
218
- .getData()
219
- .some((d) => d.ref
220
- ? d.ref?.id === v.ref?.id
221
- : d.authorityName === v.authorityName);
222
- if (contains) {
223
- if (v.override !== false) {
224
- this.updateNodes([v]);
225
- }
226
- }
227
- else {
228
- this.dataSource.appendData([v], 'before');
229
- }
230
- if (v.observe) {
231
- interval(2000)
232
- .pipe(take(10), takeUntil(this.destroyed), switchMap(() => this.nodeService.getNode(v.ref.id, {
233
- repository: v.ref.repo,
234
- })))
235
- .subscribe((node) => {
236
- node.virtual = true;
237
- this.updateNodes([node]);
238
- });
239
- }
240
- });
241
- this.entriesService.selection.clear();
242
- this.entriesService.selection.select(...virtual);
243
- this.virtualNodesAdded.emit(virtual);
244
- this.changeDetectorRef.detectChanges();
245
- }
246
- setOptions(options) {
247
- this.options = options;
248
- this.ngOnChanges();
249
- }
250
- selectAll() {
251
- this.entriesService.selection.select(...this.entriesService.dataSource.getData());
252
- }
253
- getSelection() {
254
- return this.entriesService.selection;
255
- }
256
- async initOptionsGenerator(config) {
257
- await this.optionsHelper.initComponents(config.actionbar, this);
258
- this.optionsHelper.setData({
259
- scope: this.entriesService.scope,
260
- activeObjects: this.entriesService.selection.selected,
261
- selectedObjects: this.entriesService.selection.selected,
262
- allObjects: this.dataSource.getData(),
263
- parent: config.parent,
264
- customOptions: config.customOptions,
265
- });
266
- void this.optionsHelper.refreshComponents();
267
- }
268
- ngAfterViewInit() {
269
- // Prevent changed-after-checked error
270
- void Promise.resolve().then(() => this.updateTemplates());
271
- }
272
- updateTemplates() {
273
- this.templatesService.title = this.titleRef;
274
- this.templatesService.empty = this.emptyRef;
275
- this.templatesService.actionArea = this.actionAreaRef;
276
- this.templatesService.overlay = this.overlayRef;
277
- }
278
- /**
279
- * reset the pagination to the first page
280
- * hint: this will do nothing in case the paginationStrategy !== Pagination
281
- */
282
- resetPagination() {
283
- this.nodeEntriesComponentRef?.paginator?.firstPage();
284
- }
285
- deleteNodes(objects) {
286
- this.dataSource.removeData(objects);
287
- this.getSelection().clear();
288
- }
289
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesWrapperComponent, deps: [{ token: i0.ViewContainerRef }, { token: i1.TemporaryStorageService }, { token: i0.NgZone }, { token: i2.NodeEntriesService }, { token: i3.NodeService }, { token: i4.OptionsHelperDataService }, { token: i5.NodeHelperService }, { token: i6.UIService }, { token: i7.NodeEntriesTemplatesService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
290
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: NodeEntriesWrapperComponent, selector: "es-node-entries-wrapper", inputs: { dataSource: "dataSource", scope: "scope", columns: "columns", configureColumns: "configureColumns", checkbox: "checkbox", globalOptions: "globalOptions", displayType: "displayType", elementInteractionType: "elementInteractionType", sort: "sort", dragDrop: "dragDrop", gridConfig: "gridConfig", scrollGradientColor: "scrollGradientColor", initConfig: "initConfig", primaryInstance: "primaryInstance", singleClickHint: "singleClickHint", disableInfiniteScroll: "disableInfiniteScroll" }, outputs: { columnsChange: "columnsChange", displayTypeChange: "displayTypeChange", fetchData: "fetchData", clickItem: "clickItem", dblClickItem: "dblClickItem", sortChange: "sortChange", virtualNodesAdded: "virtualNodesAdded", displayTypeChanged: "displayTypeChanged" }, providers: [NodeEntriesService, OptionsHelperDataService, NodeEntriesTemplatesService], queries: [{ propertyName: "titleRef", first: true, predicate: ["title"], descendants: true }, { propertyName: "emptyRef", first: true, predicate: ["empty"], descendants: true }, { propertyName: "actionAreaRef", first: true, predicate: ["actionArea"], descendants: true }, { propertyName: "overlayRef", first: true, predicate: ["overlay"], descendants: true }], viewQueries: [{ propertyName: "nodeEntriesComponentRef", first: true, predicate: ["nodeEntriesComponent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<es-node-entries
291
- #nodeEntriesComponent
292
- *ngIf="!customNodeListComponent"
293
- ></es-node-entries>`, isInline: true, dependencies: [{ kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.NodeEntriesComponent, selector: "es-node-entries" }] }); }
294
- }
295
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesWrapperComponent, decorators: [{
296
- type: Component,
297
- args: [{
298
- selector: 'es-node-entries-wrapper',
299
- template: `<es-node-entries
300
- #nodeEntriesComponent
301
- *ngIf="!customNodeListComponent"
302
- ></es-node-entries>`,
303
- providers: [NodeEntriesService, OptionsHelperDataService, NodeEntriesTemplatesService],
304
- }]
305
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i1.TemporaryStorageService }, { type: i0.NgZone }, { type: i2.NodeEntriesService }, { type: i3.NodeService }, { type: i4.OptionsHelperDataService }, { type: i5.NodeHelperService }, { type: i6.UIService }, { type: i7.NodeEntriesTemplatesService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { titleRef: [{
306
- type: ContentChild,
307
- args: ['title']
308
- }], emptyRef: [{
309
- type: ContentChild,
310
- args: ['empty']
311
- }], actionAreaRef: [{
312
- type: ContentChild,
313
- args: ['actionArea']
314
- }], overlayRef: [{
315
- type: ContentChild,
316
- args: ['overlay']
317
- }], nodeEntriesComponentRef: [{
318
- type: ViewChild,
319
- args: ['nodeEntriesComponent']
320
- }], dataSource: [{
321
- type: Input
322
- }], scope: [{
323
- type: Input
324
- }], columns: [{
325
- type: Input
326
- }], configureColumns: [{
327
- type: Input
328
- }], checkbox: [{
329
- type: Input
330
- }], columnsChange: [{
331
- type: Output
332
- }], globalOptions: [{
333
- type: Input
334
- }], displayType: [{
335
- type: Input
336
- }], displayTypeChange: [{
337
- type: Output
338
- }], elementInteractionType: [{
339
- type: Input
340
- }], sort: [{
341
- type: Input
342
- }], dragDrop: [{
343
- type: Input
344
- }], gridConfig: [{
345
- type: Input
346
- }], scrollGradientColor: [{
347
- type: Input
348
- }], initConfig: [{
349
- type: Input
350
- }], primaryInstance: [{
351
- type: Input
352
- }], singleClickHint: [{
353
- type: Input
354
- }], disableInfiniteScroll: [{
355
- type: Input
356
- }], fetchData: [{
357
- type: Output
358
- }], clickItem: [{
359
- type: Output
360
- }], dblClickItem: [{
361
- type: Output
362
- }], sortChange: [{
363
- type: Output
364
- }], virtualNodesAdded: [{
365
- type: Output
366
- }], displayTypeChanged: [{
367
- type: Output
368
- }] } });
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXdyYXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXdyYXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBS0wsTUFBTSxFQUlOLFNBQVMsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRSxPQUFPLEVBR0gsZUFBZSxFQVFmLHNCQUFzQixHQUN6QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSTVGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBU2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBc0MsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBVTVFLE1BQU0sT0FBTywyQkFBMkI7SUF5RnBDLFlBQ1ksZ0JBQWtDLEVBQ2xDLHVCQUFnRCxFQUNoRCxNQUFjLEVBQ2QsY0FBcUMsRUFDckMsV0FBd0IsRUFDekIsYUFBdUMsRUFDdEMsaUJBQW9DLEVB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QkFBQyxTQUFTO2dCQUNZLHVCQUF1QjtzQkFBekQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBQ3hCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFLSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0Usc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBVUcsZUFBZTtzQkFBdkIsS0FBSztnQkFjRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudFJlZixcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2UsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVHlwZSxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi9ub2RlLWVudHJpZXMtdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNDb21wb25lbnQgfSBmcm9tICcuL25vZGUtZW50cmllcy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBGZXRjaEV2ZW50LFxuICAgIEdyaWRDb25maWcsXG4gICAgSW50ZXJhY3Rpb25UeXBlLFxuICAgIExpc3REcmFnR3JvcENvbmZpZyxcbiAgICBMaXN0RXZlbnRJbnRlcmZhY2UsXG4gICAgTGlzdE9wdGlvbnMsXG4gICAgTGlzdE9wdGlvbnNDb25maWcsXG4gICAgTGlzdFNvcnRDb25maWcsXG4gICAgTm9kZUNsaWNrRXZlbnQsXG4gICAgTm9kZUVudHJpZXNEYXRhVHlwZSxcbiAgICBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLFxufSBmcm9tICcuL2VudHJpZXMtbW9kZWwnO1xuaW1wb3J0IHsgTm9kZURhdGFTb3VyY2UgfSBmcm9tICcuL25vZGUtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vdXRpbC9oZWxwZXInO1xuaW1wb3J0IHsgQ3VzdG9tU2VsZWN0aW9uTW9kZWwsIE5vZGVFbnRyaWVzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25vZGUtZW50cmllcy5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbkl0ZW0sIFNjb3BlIH0gZnJvbSAnLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgTm9kZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ub2RlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnLi4vdHlwZXMvbGlzdC1pdGVtJztcbmltcG9ydCB7IFRlbXBvcmFyeVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdGVtcG9yYXJ5LXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIENvbGxlY3Rpb25SZWZlcmVuY2UsXG4gICAgR2VuZXJpY0F1dGhvcml0eSxcbiAgICBOb2RlLFxuICAgIE5vZGVTZXJ2aWNlLFxuICAgIFVzZXIsXG59IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgVmlydHVhbE5vZGUgfSBmcm9tICcuLi90eXBlcy9hcGktbW9kZWxzJztcbmltcG9ydCB7IE9wdGlvbnNIZWxwZXJEYXRhU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29wdGlvbnMtaGVscGVyLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2VzLW5vZGUtZW50cmllcy13cmFwcGVyJyxcbiAgICB0ZW1wbGF0ZTogYDxlcy1ub2RlLWVudHJpZXNcbiAgICAgICAgI25vZGVFbnRyaWVzQ29tcG9uZW50XG4gICAgICAgICpuZ0lmPVwiIWN1c3RvbU5vZGVMaXN0Q29tcG9uZW50XCJcbiAgICA+PC9lcy1ub2RlLWVudHJpZXM+YCxcbiAgICBwcm92aWRlcnM6IFtOb2RlRW50cmllc1NlcnZpY2UsIE9wdGlvbnNIZWxwZXJEYXRhU2VydmljZSwgTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUVudHJpZXNXcmFwcGVyQ29tcG9uZW50PFQgZXh0ZW5kcyBOb2RlRW50cmllc0RhdGFUeXBlPlxuICAgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgTGlzdEV2ZW50SW50ZXJmYWNlPFQ+XG57XG4gICAgLyoqXG4gICAgICogdGl0bGUgKGFib3ZlKSB0aGUgdGFibGUvZ3JpZFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ3RpdGxlJykgdGl0bGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgLyoqXG4gICAgICogZGF0YSBzaG93biB3aGVuIGRhdGEgc291cmNlIGlzIGVtcHR5XG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZCgnZW1wdHknKSBlbXB0eVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAvKipcbiAgICAgKiBjdXN0b20gYXJlYSBmb3IgYWN0aW9ucyBvbmx5IGZvciBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlNtYWxsR3JpZCAocGVyIGNhcmQgYXQgdGhlIGJvdHRvbSlcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKCdhY3Rpb25BcmVhJykgYWN0aW9uQXJlYVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAvKipcbiAgICAgKiBjdXN0b20gYXJlYSBmb3IgYW4gb3ZlcmxheSBcImFib3ZlXCIgZWFjaCBjYXJkIChpLmUuIHRvIHNob3cgZGlzYWJsZWQgaW5mb3MpLCBvbmx5IGZvciBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlNtYWxsR3JpZCAmIG9kZUVudHJpZXNEaXNwbGF5VHlwZS5HcmlkXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZCgnb3ZlcmxheScpIG92ZXJsYXlSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQFZpZXdDaGlsZCgnbm9kZUVudHJpZXNDb21wb25lbnQnKSBub2RlRW50cmllc0NvbXBvbmVudFJlZjogTm9kZUVudHJpZXNDb21wb25lbnQ8VD47XG4gICAgQElucHV0KCkgZGF0YVNvdXJjZTogTm9kZURhdGFTb3VyY2U8VD47XG4gICAgQElucHV0KCkgc2NvcGU6IFNjb3BlO1xuICAgIEBJbnB1dCgpIGNvbHVtbnM6IExpc3RJdGVtW107XG4gICAgQElucHV0KCkgY29uZmlndXJlQ29sdW1uczogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjaGVja2JveCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogZW1pdHMgd2hlbiB0aGUgdXNlciByZS1jb25maWd1cmVzIHRoZSBjb2x1bW5zXG4gICAgICogc2hvdWxkIGJlIHVzZWQgaW4gb3JkZXIgdG8gc2F2ZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgY29sdW1uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1bXT4oKTtcbiAgICBASW5wdXQoKSBnbG9iYWxPcHRpb25zOiBPcHRpb25JdGVtW107XG4gICAgQElucHV0KCkgZGlzcGxheVR5cGUgPSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLkdyaWQ7XG4gICAgQE91dHB1dCgpIGRpc3BsYXlUeXBlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlRW50cmllc0Rpc3BsYXlUeXBlPigpO1xuICAgIEBJbnB1dCgpIGVsZW1lbnRJbnRlcmFjdGlvblR5cGUgPSBJbnRlcmFjdGlvblR5cGUuRGVmYXVsdEFjdGlvbkxpbms7XG4gICAgQElucHV0KCkgc29ydDogTGlzdFNvcnRDb25maWc7XG4gICAgQElucHV0KCkgZHJhZ0Ryb3A6IExpc3REcmFnR3JvcENvbmZpZzxUPjtcbiAgICBASW5wdXQoKSBncmlkQ29uZmlnOiBHcmlkQ29uZmlnO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb2xvciBkZWZpbmVzIHRoZSBiYXNlIGNvbG9yIG9mIGdyYWRpZW50cyB2aXN1YWxseSBsaW1pdGluZyBhIGdyaWQgaW4gc2Nyb2xsIGRpcmVjdGlvbi5cbiAgICAgKiBEZWZhdWx0cyB0byB3aGl0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzY3JvbGxHcmFkaWVudENvbG9yOiBzdHJpbmcgPSAnI2ZmZic7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGNhbiBiZSBzZXQgaW5zdGVhZCBvZiBjYWxsaW5nIGluaXRPcHRpb25zR2VuZXJhdG9yKClcbiAgICAgKi9cbiAgICBASW5wdXQoKSBpbml0Q29uZmlnOiBMaXN0T3B0aW9uc0NvbmZpZztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgbm9kZS1lbnRyaWVzIGluc3RhbmNlIHJlcHJlc2VudHMgdGhlIHBhZ2UncyBtYWluIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBPbmx5IHNldCB0byB0cnVlIGZvciBvbmUgaW5zdGFuY2UgcGVyIHBhZ2UuXG4gICAgICpcbiAgICAgKiBJZiB0cnVlLCB0aGlzIGluc3RhbmNlIHdpbGxcbiAgICAgKiAtIGhhbmRsZSBwYWdlLXdpZGUga2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICogLSB0YWtlIGNvbnRyb2wgb2YgdGhlIGBwYWdlYCBhbmQgYHBhZ2VTaXplYCBxdWVyeSBwYXJhbWV0ZXJzIGZvciBwYWdpbmF0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgcHJpbWFyeUluc3RhbmNlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFVJIGhpbnRzIGZvciB3aGV0aGVyIGEgc2luZ2xlIGNsaWNrIHdpbGwgY2F1c2UgYSBkeW5hbWljIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgZG9lcyBub3QgY29uZmlndXJlIHRoZSBhY3R1YWwgYmVoYXZpb3IgYnV0IG9ubHkgVUkgaGludHMgdG8gdGhlIHVzZXIuIEhpbnRzIGluY2x1ZGVcbiAgICAgKiBob3ZlciBlZmZlY3RzIGFuZCBhIGNoYW5nZWQgY3Vyc29yLlxuICAgICAqXG4gICAgICogLSBXaGVuIGNob29zaW5nICdzdGF0aWMnLCB0aGUgYGNsaWNrSXRlbWAgZXZlbnQgc2hvdWxkIHRyaWdnZXIgc29tZSBzdGF0aW9uYXJ5IGFjdGlvbiBsaWtlXG4gICAgICogICBzZWxlY3RpbmcgdGhlIGVsZW1lbnQgb3IgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBpbiBhIGNvbXBsZW1lbnRhcnkgcGFnZSBhcmVhLiBUaGVcbiAgICAgKiAgIGBkYmxDbGlja0l0ZW1gIGV2ZW50IGNhbiBiZSB1c2VkIGZvciBhIG1vcmUgZGlzcnVwdGl2ZSBhY3Rpb24uXG4gICAgICogLSBXaGVuIGNob29zaW5nICdkeW5hbWljJywgdGhlIGBjbGlja0l0ZW1gIGV2ZW50IHNob3VsZCB0cmlnZ2VyIGEgbWFqb3IgYWN0aW9uIGxpa2VcbiAgICAgKiAgIG5hdmlnYXRpbmcgdG8gYSBuZXcgcGFnZSBvciBjbG9zaW5nIGEgZGlhbG9nLlxuICAgICAqL1xuICAgIC8vIFRPRE86IENvbnNpZGVyIGNvbnRyb2xsaW5nIHRoZSB1aSBoaW50cyBhbmQgdGhlIGFjdHVhbCBiZWhhdmlvciB3aXRoIGEgc2luZ2xlIG9wdGlvbi5cbiAgICBASW5wdXQoKSBzaW5nbGVDbGlja0hpbnQ6ICdkeW5hbWljJyB8ICdzdGF0aWMnID0gJ2R5bmFtaWMnO1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBsb2FkIG1vcmUgZGF0YSBvbiBzY3JvbGwuXG4gICAgICovXG4gICAgQElucHV0KCkgZGlzYWJsZUluZmluaXRlU2Nyb2xsID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KCkgZmV0Y2hEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxGZXRjaEV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSBjbGlja0l0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVDbGlja0V2ZW50PFQ+PigpO1xuICAgIEBPdXRwdXQoKSBkYmxDbGlja0l0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVDbGlja0V2ZW50PFQ+PigpO1xuICAgIEBPdXRwdXQoKSBzb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0U29ydENvbmZpZz4oKTtcbiAgICBAT3V0cHV0KCkgdmlydHVhbE5vZGVzQWRkZWQ7XG4gICAgQE91dHB1dCgpIGRpc3BsYXlUeXBlQ2hhbmdlZDtcblxuICAgIGN1c3RvbU5vZGVMaXN0Q29tcG9uZW50OiBUeXBlPE5vZGVFbnRyaWVzQ29tcG9uZW50PFQ+PjtcbiAgICBwcml2YXRlIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE5vZGVFbnRyaWVzQ29tcG9uZW50PFQ+PjtcbiAgICBwcml2YXRlIG9wdGlvbnM6IExpc3RPcHRpb25zO1xuICAgIHByaXZhdGUgZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgdGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2U6IFRlbXBvcmFyeVN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIGVudHJpZXNTZXJ2aWNlOiBOb2RlRW50cmllc1NlcnZpY2U8VD4sXG4gICAgICAgIHByaXZhdGUgbm9kZVNlcnZpY2U6IE5vZGVTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgb3B0aW9uc0hlbHBlcjogT3B0aW9uc0hlbHBlckRhdGFTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5vZGVIZWxwZXJTZXJ2aWNlOiBOb2RlSGVscGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB1aVNlcnZpY2U6IFVJU2VydmljZSxcbiAgICAgICAgLy8gQFRPRE9cbiAgICAgICAgLy8gcHJpdmF0ZSBtYWluTmF2OiBNYWluTmF2U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZXNTZXJ2aWNlOiBOb2RlRW50cmllc1RlbXBsYXRlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgKSB7XG4gICAgICAgIC8vIHJlZ3VsYXJ5IHJlLWJpbmQgdGVtcGxhdGUgc2luY2UgaXQgbWlnaHQgaGF2ZSB1cGRhdGVkIHdpdGhvdXQgbmdDaGFuZ2VzIHRyaWdnZXJcbiAgICAgICAgLypcbiAgICAgICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbXB0eVJlZiA9IHRoaXMuZW1wdHlSZWYpXG4gICAgICAgICk7XG4gICAgICAgICovXG4gICAgICAgIHRoaXMudmlydHVhbE5vZGVzQWRkZWQgPSB0aGlzLm9wdGlvbnNIZWxwZXIudmlydHVhbE5vZGVzQWRkZWQ7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGVDaGFuZ2VkID0gdGhpcy5vcHRpb25zSGVscGVyLmRpc3BsYXlUeXBlQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc0hlbHBlci5nZXREYXRhKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNIZWxwZXIuZ2V0RGF0YSgpLnNlbGVjdGVkT2JqZWN0cyA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0hlbHBlci5nZXREYXRhKCkuYWN0aXZlT2JqZWN0cyA9IHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ29wdGlvbnNIZWxwZXIgaXMgbm90IGluaXRhbGl6ZWQgY29ycmVjdGx5OyBkYXRhIGlzIGVtcHR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2b2lkIHRoaXMub3B0aW9uc0hlbHBlci5yZWZyZXNoQ29tcG9uZW50cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNIZWxwZXIucmVnaXN0ZXJHbG9iYWxLZXlib2FyZFNob3J0Y3V0cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuY29sdW1uc1N1YmplY3RcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKChjKSA9PiBjPy5mcm9tVXNlciksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjKSA9PiB0aGlzLmNvbHVtbnNDaGFuZ2UuZW1pdChjLmNvbHVtbnMpKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5saXN0ID0gdGhpcztcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlID0gdGhpcy5kYXRhU291cmNlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNjb3BlID0gdGhpcy5zY29wZTtcbiAgICAgICAgaWYgKGNoYW5nZXMuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5jb2x1bW5zU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgZnJvbVVzZXI6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5jb25maWd1cmVDb2x1bW5zID0gdGhpcy5jb25maWd1cmVDb2x1bW5zO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmNoZWNrYm94ID0gdGhpcy5jaGVja2JveDtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kaXNwbGF5VHlwZSA9IHRoaXMuZGlzcGxheVR5cGU7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSA9IHRoaXMuZWxlbWVudEludGVyYWN0aW9uVHlwZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5ncmlkQ29uZmlnID0gdGhpcy5ncmlkQ29uZmlnO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZ2xvYmFsT3B0aW9ucyA9IHRoaXMuZ2xvYmFsT3B0aW9ucztcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnRDaGFuZ2UgPSB0aGlzLnNvcnRDaGFuZ2U7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3AgPSB0aGlzLmRyYWdEcm9wO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmNsaWNrSXRlbSA9IHRoaXMuY2xpY2tJdGVtO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRibENsaWNrSXRlbSA9IHRoaXMuZGJsQ2xpY2tJdGVtO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmZldGNoRGF0YSA9IHRoaXMuZmV0Y2hEYXRhO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnByaW1hcnlJbnN0YW5jZSA9IHRoaXMucHJpbWFyeUluc3RhbmNlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNpbmdsZUNsaWNrSGludCA9IHRoaXMuc2luZ2xlQ2xpY2tIaW50O1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRpc2FibGVJbmZpbml0ZVNjcm9sbCA9IHRoaXMuZGlzYWJsZUluZmluaXRlU2Nyb2xsO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNjcm9sbEdyYWRpZW50Q29sb3Iuc2V0KHRoaXMuc2Nyb2xsR3JhZGllbnRDb2xvcik7XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2luaXRDb25maWcnXSkge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmluaXRPcHRpb25zR2VuZXJhdG9yKHRoaXMuaW5pdENvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZj8uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgbmVlZCB3cmFwcGluZyB3aXRoIGBzZXRUaW1lb3V0YC5cbiAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoaXMgd3JhcHBlciB3aXRoIHRoZSBjb25maWd1cmVkIGN1c3RvbS1ub2RlLWxpc3QgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCA9IHRoaXMudGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgVGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UuQ1VTVE9NX05PREVfRU5UUklFU19DT01QT05FTlQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnVpU2VydmljZS5pbmplY3RBbmd1bGFyQ29tcG9uZW50KFxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgLy8gSW5wdXQgYmluZGluZ3MgYXJlIGluaXRpYWxpemVkIGluIGBuZ09uQ2hhbmdlc2AuXG4gICAgICAgICAgICB0aGlzLmdldE91dHB1dEJpbmRpbmdzKCksXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgbWFwIG9mIHRoZSBvdXRwdXQgYmluZGluZ3MgZGVmaW5lZCBpbiB0aGlzIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE91dHB1dEJpbmRpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogRXZlbnRFbWl0dGVyPGFueT4gfSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJpbmRpbmdzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgIG91dHB1dEJpbmRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0QmluZGluZ3M7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVR5cGUoKTogTm9kZUVudHJpZXNEaXNwbGF5VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlUeXBlO1xuICAgIH1cblxuICAgIG9uRGlzcGxheVR5cGVDaGFuZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlUeXBlQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHNldERpc3BsYXlUeXBlKGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGUgPSBkaXNwbGF5VHlwZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kaXNwbGF5VHlwZSA9IGRpc3BsYXlUeXBlO1xuICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGVDaGFuZ2UuZW1pdChkaXNwbGF5VHlwZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlTm9kZXMobm9kZXM6IHZvaWQgfCBUW10pIHtcbiAgICAgICAgaWYgKCFub2Rlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhpdHMgPSAobm9kZXMgYXMgVFtdKS5maWx0ZXIoKG4pID0+XG4gICAgICAgICAgICAgICAgKG4gYXMgTm9kZSk/LnJlZlxuICAgICAgICAgICAgICAgICAgICA/IChuIGFzIE5vZGUpPy5yZWYuaWQgPT09IChkIGFzIE5vZGUpPy5yZWYuaWRcbiAgICAgICAgICAgICAgICAgICAgOiAobiBhcyBHZW5lcmljQXV0aG9yaXR5KT8uYXV0aG9yaXR5TmFtZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAoZCBhcyBHZW5lcmljQXV0aG9yaXR5KT8uYXV0aG9yaXR5TmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaGl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaWYgdGhlIG9yaWdpbmFsIGhhcyBjaGFuZ2VkIChmb3IgY29sbGVjdGlvbiByZWZzKVxuICAgICAgICAgICAgICAgIGhpdHMgPSAobm9kZXMgYXMgVFtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChuKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKG4gYXMgTm9kZSk/LnJlZiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKG4gYXMgTm9kZSk/LnJlZj8uaWQgPT09IChkIGFzIHVua25vd24gYXMgQ29sbGVjdGlvblJlZmVyZW5jZSk/Lm9yaWdpbmFsSWQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZUhlbHBlclNlcnZpY2UuY29weURhdGFUb05vZGUoZCBhcyBOb2RlLCBoaXRzWzBdIGFzIE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gdHJpZ2dlciByZWJ1aWxkXG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBOb2RlRGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgKHRoaXMuZGF0YVNvdXJjZSBhcyBOb2RlRGF0YVNvdXJjZTxUPikucmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZFNlbGVjdGlvbiA9IHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3QoXG4gICAgICAgICAgICAuLi5vbGRTZWxlY3Rpb24ubWFwKFxuICAgICAgICAgICAgICAgIChvKSA9PiB0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLmZpbHRlcigoZCkgPT4gSGVscGVyLm9iamVjdEVxdWFscyhvLCBkKSk/LlswXSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHNob3dSZW9yZGVyQ29sdW1uc0RpYWxvZygpOiB2b2lkIHt9XG5cbiAgICBhZGRWaXJ0dWFsTm9kZXModmlydHVhbDogVFtdKTogdm9pZCB7XG4gICAgICAgIHZpcnR1YWwgPSB2aXJ0dWFsLm1hcCgobykgPT4ge1xuICAgICAgICAgICAgKG8gYXMgVmlydHVhbE5vZGUpLnZpcnR1YWwgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH0pO1xuICAgICAgICB2aXJ0dWFsLmZvckVhY2goKHY6IFQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5kYXRhU291cmNlXG4gICAgICAgICAgICAgICAgLmdldERhdGEoKVxuICAgICAgICAgICAgICAgIC5zb21lKChkKSA9PlxuICAgICAgICAgICAgICAgICAgICAoZCBhcyBOb2RlKS5yZWZcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGQgYXMgTm9kZSkucmVmPy5pZCA9PT0gKHYgYXMgTm9kZSkucmVmPy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoZCBhcyBVc2VyKS5hdXRob3JpdHlOYW1lID09PSAodiBhcyBVc2VyKS5hdXRob3JpdHlOYW1lLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHYgYXMgVmlydHVhbE5vZGUpLm92ZXJyaWRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVzKFt2XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYXBwZW5kRGF0YShbdl0sICdiZWZvcmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodiBhcyBWaXJ0dWFsTm9kZSkub2JzZXJ2ZSkge1xuICAgICAgICAgICAgICAgIGludGVydmFsKDIwMDApXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VydmljZS5nZXROb2RlKCh2IGFzIFZpcnR1YWxOb2RlKS5yZWYuaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeTogKHYgYXMgVmlydHVhbE5vZGUpLnJlZi5yZXBvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAobm9kZSBhcyBWaXJ0dWFsTm9kZSkudmlydHVhbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVzKFtub2RlIGFzIFRdKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3QoLi4udmlydHVhbCk7XG4gICAgICAgIHRoaXMudmlydHVhbE5vZGVzQWRkZWQuZW1pdCh2aXJ0dWFsIGFzIE5vZGVbXSk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHNldE9wdGlvbnMob3B0aW9uczogTGlzdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKCkpO1xuICAgIH1cbiAgICBnZXRTZWxlY3Rpb24oKTogQ3VzdG9tU2VsZWN0aW9uTW9kZWw8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb247XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdE9wdGlvbnNHZW5lcmF0b3IoY29uZmlnOiBMaXN0T3B0aW9uc0NvbmZpZykge1xuICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnNIZWxwZXIuaW5pdENvbXBvbmVudHMoY29uZmlnLmFjdGlvbmJhciwgdGhpcyk7XG4gICAgICAgIHRoaXMub3B0aW9uc0hlbHBlci5zZXREYXRhKHtcbiAgICAgICAgICAgIHNjb3BlOiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNjb3BlLFxuICAgICAgICAgICAgYWN0aXZlT2JqZWN0czogdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQsXG4gICAgICAgICAgICBzZWxlY3RlZE9iamVjdHM6IHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLFxuICAgICAgICAgICAgYWxsT2JqZWN0czogdGhpcy5kYXRhU291cmNlLmdldERhdGEoKSxcbiAgICAgICAgICAgIHBhcmVudDogY29uZmlnLnBhcmVudCxcbiAgICAgICAgICAgIGN1c3RvbU9wdGlvbnM6IGNvbmZpZy5jdXN0b21PcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgICAgdm9pZCB0aGlzLm9wdGlvbnNIZWxwZXIucmVmcmVzaENvbXBvbmVudHMoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFByZXZlbnQgY2hhbmdlZC1hZnRlci1jaGVja2VkIGVycm9yXG4gICAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0ZVRlbXBsYXRlcygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRlbXBsYXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLnRpdGxlID0gdGhpcy50aXRsZVJlZjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmVtcHR5ID0gdGhpcy5lbXB0eVJlZjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmFjdGlvbkFyZWEgPSB0aGlzLmFjdGlvbkFyZWFSZWY7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS5vdmVybGF5ID0gdGhpcy5vdmVybGF5UmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlc2V0IHRoZSBwYWdpbmF0aW9uIHRvIHRoZSBmaXJzdCBwYWdlXG4gICAgICogaGludDogdGhpcyB3aWxsIGRvIG5vdGhpbmcgaW4gY2FzZSB0aGUgcGFnaW5hdGlvblN0cmF0ZWd5ICE9PSBQYWdpbmF0aW9uXG4gICAgICovXG4gICAgcmVzZXRQYWdpbmF0aW9uKCkge1xuICAgICAgICB0aGlzLm5vZGVFbnRyaWVzQ29tcG9uZW50UmVmPy5wYWdpbmF0b3I/LmZpcnN0UGFnZSgpO1xuICAgIH1cblxuICAgIGRlbGV0ZU5vZGVzKG9iamVjdHM6IFRbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucmVtb3ZlRGF0YShvYmplY3RzKTtcbiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb24oKS5jbGVhcigpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,132 +0,0 @@
1
- import { Component, Optional, ViewChild, } from '@angular/core';
2
- import { MatPaginator } from '@angular/material/paginator';
3
- import { Subject } from 'rxjs';
4
- import { first, takeUntil } from 'rxjs/operators';
5
- import { NodeEntriesDisplayType } from './entries-model';
6
- import { NodeDataSourceRemote } from './node-data-source-remote';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "./node-entries-global.service";
9
- import * as i2 from "../services/node-entries.service";
10
- import * as i3 from "./node-entries-templates.service";
11
- import * as i4 from "../services/abstract/keyboard-shortcuts.service";
12
- import * as i5 from "@angular/router";
13
- import * as i6 from "@ngx-translate/core";
14
- import * as i7 from "@angular/common";
15
- import * as i8 from "@angular/material/paginator";
16
- import * as i9 from "./node-entries-card-grid/node-entries-card-grid.component";
17
- import * as i10 from "./node-entries-table/node-entries-table.component";
18
- export class NodeEntriesComponent {
19
- constructor(changeDetectorRef, entriesGlobalService, entriesService, templatesService, globalKeyboardShortcuts, route, translate) {
20
- this.changeDetectorRef = changeDetectorRef;
21
- this.entriesGlobalService = entriesGlobalService;
22
- this.entriesService = entriesService;
23
- this.templatesService = templatesService;
24
- this.globalKeyboardShortcuts = globalKeyboardShortcuts;
25
- this.route = route;
26
- this.translate = translate;
27
- this.NodeEntriesDisplayType = NodeEntriesDisplayType;
28
- this.destroyed = new Subject();
29
- this.updateKeyboardShortcuts = new Subject();
30
- }
31
- ngOnInit() {
32
- if (this.entriesService.primaryInstance) {
33
- this.registerGlobalKeyboardShortcuts();
34
- }
35
- if (this.entriesService.dataSource instanceof NodeDataSourceRemote) {
36
- // We don't require `sort` to be defined, but if it is set but not yet ready (`null`),
37
- // we wait for its value before initializing the data source, so the first request is
38
- // sent with the correct sort configuration. That is why we explicitly do not drop
39
- // `undefined` with the `first` operator below.
40
- this.entriesService.sortSubject
41
- .pipe(first((sort) => sort !== null))
42
- .subscribe(() => this.initRemoteDataSource(this.entriesService.dataSource));
43
- }
44
- }
45
- ngAfterViewInit() {
46
- if (this.paginator) {
47
- void this.initPaginator(this.paginator);
48
- this.changeDetectorRef.detectChanges();
49
- }
50
- }
51
- ngOnDestroy() {
52
- this.destroyed.next();
53
- this.destroyed.complete();
54
- }
55
- registerGlobalKeyboardShortcuts() {
56
- this.globalKeyboardShortcuts.register([
57
- {
58
- modifiers: ['Ctrl/Cmd'],
59
- keyCode: 'KeyA',
60
- ignoreWhen: (event) =>
61
- // SmallGrid doesn't support selection
62
- this.entriesService.displayType === NodeEntriesDisplayType.SmallGrid,
63
- callback: () => this.entriesService.toggleSelectAll(),
64
- },
65
- ], { until: this.destroyed });
66
- }
67
- initRemoteDataSource(dataSource) {
68
- const pageSize = this.entriesGlobalService.getPaginatorSizeOptions(this.entriesService.scope)[0];
69
- dataSource.init({
70
- paginationConfig: {
71
- defaultPageSize: pageSize,
72
- strategy: this.entriesService.paginationStrategy,
73
- },
74
- defaultSort: this.entriesService.sort,
75
- });
76
- if (this.entriesService.primaryInstance) {
77
- // Automatic query-params handling is only supported by node-data-source-remote.
78
- dataSource.registerQueryParameters(this.route);
79
- }
80
- }
81
- async initPaginator(paginator) {
82
- paginator._intl.itemsPerPageLabel = await this.translate
83
- .get('PAGINATOR.itemsPerPageLabel')
84
- .toPromise();
85
- paginator._intl.nextPageLabel = await this.translate
86
- .get('PAGINATOR.nextPageLabel')
87
- .toPromise();
88
- paginator._intl.previousPageLabel = await this.translate
89
- .get('PAGINATOR.previousPageLabel')
90
- .toPromise();
91
- paginator._intl.getRangeLabel = (page, pageSize, length) => this.translate.instant('PAGINATOR.getRangeLabel', {
92
- page: page + 1,
93
- pageSize,
94
- length,
95
- pageCount: Math.ceil(length / pageSize),
96
- });
97
- // Connect data source.
98
- this.entriesService.dataSource$.pipe(takeUntil(this.destroyed)).subscribe((dataSource) => {
99
- if (dataSource instanceof NodeDataSourceRemote) {
100
- dataSource.paginator = paginator;
101
- }
102
- else {
103
- paginator.length = dataSource?.getTotal();
104
- dataSource
105
- ?.connectPagination()
106
- .pipe(takeUntil(this.destroyed))
107
- .subscribe(() => {
108
- paginator.length = dataSource.getTotal();
109
- });
110
- }
111
- });
112
- }
113
- openPage(page) {
114
- this.entriesService.fetchData.emit({
115
- offset: page.pageIndex * page.pageSize,
116
- amount: page.pageSize,
117
- reset: true,
118
- });
119
- }
120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NodeEntriesGlobalService }, { token: i2.NodeEntriesService }, { token: i3.NodeEntriesTemplatesService }, { token: i4.KeyboardShortcutsService, optional: true }, { token: i5.ActivatedRoute }, { token: i6.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: NodeEntriesComponent, selector: "es-node-entries", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "<div class=\"top-matter\">\n <div class=\"title\">\n <ng-container *ngTemplateOutlet=\"templatesService.title\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"templatesService.entriesTopMatter\"></ng-container>\n</div>\n<ng-container *ngIf=\"entriesService.dataSource\">\n <ng-container *ngIf=\"entriesService.displayType === NodeEntriesDisplayType.Table\">\n <es-node-entries-table></es-node-entries-table>\n </ng-container>\n <ng-container\n *ngIf=\"\n entriesService.displayType === NodeEntriesDisplayType.SmallGrid ||\n entriesService.displayType === NodeEntriesDisplayType.Grid\n \"\n >\n <es-node-entries-card-grid [displayType]=\"entriesService.displayType\">\n </es-node-entries-card-grid>\n </ng-container>\n <ng-container *ngIf=\"entriesService.dataSource.isEmpty() && !entriesService.dataSource.isLoading\">\n <ng-container *ngTemplateOutlet=\"templatesService.empty\"></ng-container>\n </ng-container>\n</ng-container>\n<mat-paginator\n #paginator\n [pageSizeOptions]=\"entriesGlobalService.getPaginatorSizeOptions(entriesService.scope)\"\n *ngIf=\"entriesService.paginationStrategy === 'paginator'\"\n [class.display-none]=\"\n (entriesService.dataSource.isLoading && entriesService.dataSource.isLoading !== 'page') ||\n entriesService.dataSource.isEmpty()\n \"\n (page)=\"openPage($event)\"\n></mat-paginator>\n", styles: [".top-matter{display:flex;align-items:center;flex-wrap:wrap;gap:12px 10px;position:relative;z-index:1}.top-matter .title{display:flex;flex-grow:1}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i9.NodeEntriesCardGridComponent, selector: "es-node-entries-card-grid", inputs: ["displayType"] }, { kind: "component", type: i10.NodeEntriesTableComponent, selector: "es-node-entries-table" }] }); }
122
- }
123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesComponent, decorators: [{
124
- type: Component,
125
- args: [{ selector: 'es-node-entries', template: "<div class=\"top-matter\">\n <div class=\"title\">\n <ng-container *ngTemplateOutlet=\"templatesService.title\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"templatesService.entriesTopMatter\"></ng-container>\n</div>\n<ng-container *ngIf=\"entriesService.dataSource\">\n <ng-container *ngIf=\"entriesService.displayType === NodeEntriesDisplayType.Table\">\n <es-node-entries-table></es-node-entries-table>\n </ng-container>\n <ng-container\n *ngIf=\"\n entriesService.displayType === NodeEntriesDisplayType.SmallGrid ||\n entriesService.displayType === NodeEntriesDisplayType.Grid\n \"\n >\n <es-node-entries-card-grid [displayType]=\"entriesService.displayType\">\n </es-node-entries-card-grid>\n </ng-container>\n <ng-container *ngIf=\"entriesService.dataSource.isEmpty() && !entriesService.dataSource.isLoading\">\n <ng-container *ngTemplateOutlet=\"templatesService.empty\"></ng-container>\n </ng-container>\n</ng-container>\n<mat-paginator\n #paginator\n [pageSizeOptions]=\"entriesGlobalService.getPaginatorSizeOptions(entriesService.scope)\"\n *ngIf=\"entriesService.paginationStrategy === 'paginator'\"\n [class.display-none]=\"\n (entriesService.dataSource.isLoading && entriesService.dataSource.isLoading !== 'page') ||\n entriesService.dataSource.isEmpty()\n \"\n (page)=\"openPage($event)\"\n></mat-paginator>\n", styles: [".top-matter{display:flex;align-items:center;flex-wrap:wrap;gap:12px 10px;position:relative;z-index:1}.top-matter .title{display:flex;flex-grow:1}\n"] }]
126
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.NodeEntriesGlobalService }, { type: i2.NodeEntriesService }, { type: i3.NodeEntriesTemplatesService }, { type: i4.KeyboardShortcutsService, decorators: [{
127
- type: Optional
128
- }] }, { type: i5.ActivatedRoute }, { type: i6.TranslateService }], propDecorators: { paginator: [{
129
- type: ViewChild,
130
- args: [MatPaginator]
131
- }] } });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL25vZGUtZW50cmllcy9ub2RlLWVudHJpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFHVCxRQUFRLEVBQ1IsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUd0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUF1QixzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7QUFPakUsTUFBTSxPQUFPLG9CQUFvQjtJQVU3QixZQUNXLGlCQUFvQyxFQUNwQyxvQkFBOEMsRUFDOUMsY0FBcUMsRUFDckMsZ0JBQTZDLEVBQ2hDLHVCQUFpRCxFQUM3RCxLQUFxQixFQUNyQixTQUEyQjtRQU41QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBMEI7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNkI7UUFDaEMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUEwQjtRQUM3RCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFr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UUFBUSxDQUFDLElBQWU7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ3RDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNyQixLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztJQUNQLENBQUM7K0dBM0hRLG9CQUFvQjttR0FBcEIsb0JBQW9CLGtHQUtsQixZQUFZLGdEQy9CM0IsazNDQWlDQTs7NEZEUGEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNJLGlCQUFpQjs7MEJBbUJ0QixRQUFRO3FHQVZZLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNEYXRhVHlwZSwgTm9kZUVudHJpZXNEaXNwbGF5VHlwZSB9IGZyb20gJy4vZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UgfSBmcm9tICcuL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1RlbXBsYXRlc1NlcnZpY2UgfSBmcm9tICcuL25vZGUtZW50cmllcy10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlib2FyZFNob3J0Y3V0c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hYnN0cmFjdC9rZXlib2FyZC1zaG9ydGN1dHMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlRGF0YVNvdXJjZVJlbW90ZSB9IGZyb20gJy4vbm9kZS1kYXRhLXNvdXJjZS1yZW1vdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2VzLW5vZGUtZW50cmllcycsXG4gICAgdGVtcGxhdGVVcmw6ICdub2RlLWVudHJpZXMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydub2RlLWVudHJpZXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUVudHJpZXNDb21wb25lbnQ8VCBleHRlbmRzIE5vZGVFbnRyaWVzRGF0YVR5cGU+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICAgIHJlYWRvbmx5IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUgPSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuXG4gICAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlS2V5Ym9hcmRTaG9ydGN1dHMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBlbnRyaWVzR2xvYmFsU2VydmljZTogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZW50cmllc1NlcnZpY2U6IE5vZGVFbnRyaWVzU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIHRlbXBsYXRlc1NlcnZpY2U6IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBnbG9iYWxLZXlib2FyZFNob3J0Y3V0czogS2V5Ym9hcmRTaG9ydGN1dHNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVudHJpZXNTZXJ2aWNlLnByaW1hcnlJbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3Rlckdsb2JhbEtleWJvYXJkU2hvcnRjdXRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIE5vZGVEYXRhU291cmNlUmVtb3RlKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCByZXF1aXJlIGBzb3J0YCB0byBiZSBkZWZpbmVkLCBidXQgaWYgaXQgaXMgc2V0IGJ1dCBub3QgeWV0IHJlYWR5IChgbnVsbGApLFxuICAgICAgICAgICAgLy8gd2Ugd2FpdCBmb3IgaXRzIHZhbHVlIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlIGRhdGEgc291cmNlLCBzbyB0aGUgZmlyc3QgcmVxdWVzdCBpc1xuICAgICAgICAgICAgLy8gc2VudCB3aXRoIHRoZSBjb3JyZWN0IHNvcnQgY29uZmlndXJhdGlvbi4gVGhhdCBpcyB3aHkgd2UgZXhwbGljaXRseSBkbyBub3QgZHJvcFxuICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGAgd2l0aCB0aGUgYGZpcnN0YCBvcGVyYXRvciBiZWxvdy5cbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydFN1YmplY3RcbiAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgoc29ydCkgPT4gc29ydCAhPT0gbnVsbCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRSZW1vdGVEYXRhU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlIGFzIE5vZGVEYXRhU291cmNlUmVtb3RlPFQ+LFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdm9pZCB0aGlzLmluaXRQYWdpbmF0b3IodGhpcy5wYWdpbmF0b3IpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJHbG9iYWxLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxLZXlib2FyZFNob3J0Y3V0cy5yZWdpc3RlcihcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczogWydDdHJsL0NtZCddLFxuICAgICAgICAgICAgICAgICAgICBrZXlDb2RlOiAnS2V5QScsXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZVdoZW46IChldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNtYWxsR3JpZCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRpc3BsYXlUeXBlID09PSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlNtYWxsR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMuZW50cmllc1NlcnZpY2UudG9nZ2xlU2VsZWN0QWxsKCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IHVudGlsOiB0aGlzLmRlc3Ryb3llZCB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFJlbW90ZURhdGFTb3VyY2UoZGF0YVNvdXJjZTogTm9kZURhdGFTb3VyY2VSZW1vdGU8VD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLmVudHJpZXNHbG9iYWxTZXJ2aWNlLmdldFBhZ2luYXRvclNpemVPcHRpb25zKFxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zY29wZSxcbiAgICAgICAgKVswXTtcbiAgICAgICAgZGF0YVNvdXJjZS5pbml0KHtcbiAgICAgICAgICAgIHBhZ2luYXRpb25Db25maWc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0UGFnZVNpemU6IHBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiB0aGlzLmVudHJpZXNTZXJ2aWNlLnBhZ2luYXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0U29ydDogdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuZW50cmllc1NlcnZpY2UucHJpbWFyeUluc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBBdXRvbWF0aWMgcXVlcnktcGFyYW1zIGhhbmRsaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IG5vZGUtZGF0YS1zb3VyY2UtcmVtb3RlLlxuICAgICAgICAgICAgZGF0YVNvdXJjZS5yZWdpc3RlclF1ZXJ5UGFyYW1ldGVycyh0aGlzLnJvdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdFBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xuICAgICAgICBwYWdpbmF0b3IuX2ludGwuaXRlbXNQZXJQYWdlTGFiZWwgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVxuICAgICAgICAgICAgLmdldCgnUEFHSU5BVE9SLml0ZW1zUGVyUGFnZUxhYmVsJylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgICAgcGFnaW5hdG9yLl9pbnRsLm5leHRQYWdlTGFiZWwgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVxuICAgICAgICAgICAgLmdldCgnUEFHSU5BVE9SLm5leHRQYWdlTGFiZWwnKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgICAgICBwYWdpbmF0b3IuX2ludGwucHJldmlvdXNQYWdlTGFiZWwgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVxuICAgICAgICAgICAgLmdldCgnUEFHSU5BVE9SLnByZXZpb3VzUGFnZUxhYmVsJylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgICAgcGFnaW5hdG9yLl9pbnRsLmdldFJhbmdlTGFiZWwgPSAocGFnZSwgcGFnZVNpemUsIGxlbmd0aCkgPT5cbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ1BBR0lOQVRPUi5nZXRSYW5nZUxhYmVsJywge1xuICAgICAgICAgICAgICAgIHBhZ2U6IHBhZ2UgKyAxLFxuICAgICAgICAgICAgICAgIHBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgICAgICAgICBwYWdlQ291bnQ6IE1hdGguY2VpbChsZW5ndGggLyBwYWdlU2l6ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29ubmVjdCBkYXRhIHNvdXJjZS5cbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoZGF0YVNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBOb2RlRGF0YVNvdXJjZVJlbW90ZSkge1xuICAgICAgICAgICAgICAgIChkYXRhU291cmNlIGFzIE5vZGVEYXRhU291cmNlUmVtb3RlKS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhZ2luYXRvci5sZW5ndGggPSBkYXRhU291cmNlPy5nZXRUb3RhbCgpO1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgPy5jb25uZWN0UGFnaW5hdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnaW5hdG9yLmxlbmd0aCA9IGRhdGFTb3VyY2UuZ2V0VG90YWwoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9wZW5QYWdlKHBhZ2U6IFBhZ2VFdmVudCkge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmZldGNoRGF0YS5lbWl0KHtcbiAgICAgICAgICAgIG9mZnNldDogcGFnZS5wYWdlSW5kZXggKiBwYWdlLnBhZ2VTaXplLFxuICAgICAgICAgICAgYW1vdW50OiBwYWdlLnBhZ2VTaXplLFxuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0b3AtbWF0dGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXNTZXJ2aWNlLnRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVzU2VydmljZS5lbnRyaWVzVG9wTWF0dGVyXCI+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5kYXRhU291cmNlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5kaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5UYWJsZVwiPlxuICAgIDxlcy1ub2RlLWVudHJpZXMtdGFibGU+PC9lcy1ub2RlLWVudHJpZXMtdGFibGU+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJcbiAgICAgIGVudHJpZXNTZXJ2aWNlLmRpc3BsYXlUeXBlID09PSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlNtYWxsR3JpZCB8fFxuICAgICAgZW50cmllc1NlcnZpY2UuZGlzcGxheVR5cGUgPT09IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUuR3JpZFxuICAgIFwiXG4gID5cbiAgICA8ZXMtbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZCBbZGlzcGxheVR5cGVdPVwiZW50cmllc1NlcnZpY2UuZGlzcGxheVR5cGVcIj5cbiAgICA8L2VzLW5vZGUtZW50cmllcy1jYXJkLWdyaWQ+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0VtcHR5KCkgJiYgIWVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlc1NlcnZpY2UuZW1wdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxtYXQtcGFnaW5hdG9yXG4gICNwYWdpbmF0b3JcbiAgW3BhZ2VTaXplT3B0aW9uc109XCJlbnRyaWVzR2xvYmFsU2VydmljZS5nZXRQYWdpbmF0b3JTaXplT3B0aW9ucyhlbnRyaWVzU2VydmljZS5zY29wZSlcIlxuICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLnBhZ2luYXRpb25TdHJhdGVneSA9PT0gJ3BhZ2luYXRvcidcIlxuICBbY2xhc3MuZGlzcGxheS1ub25lXT1cIlxuICAgIChlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZyAmJiBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZyAhPT0gJ3BhZ2UnKSB8fFxuICAgIGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNFbXB0eSgpXG4gIFwiXG4gIChwYWdlKT1cIm9wZW5QYWdlKCRldmVudClcIlxuPjwvbWF0LXBhZ2luYXRvcj5cbiJdfQ==