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.
- package/assets/scss/material-theme.scss +3 -3
- package/assets/scss/mixins.scss +1 -1
- package/assets/scss/variables-root.scss +2 -0
- package/assets/scss/variables-scss.scss +3 -4
- package/assets/scss/variables.scss +1 -1
- package/fesm2022/ngx-edu-sharing-ui.mjs +376 -319
- package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/list-items/list-widget.d.ts +1 -1
- package/lib/mds-viewer/mds-editor-instance-service.abstract.d.ts +14 -0
- package/lib/mds-viewer/widget/mds-widget.component.d.ts +6 -4
- package/package.json +8 -9
- package/esm2022/lib/actionbar/actionbar.component.mjs +0 -206
- package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +0 -170
- package/esm2022/lib/directives/border-box-observer.directive.mjs +0 -71
- package/esm2022/lib/directives/check-text-overflow.directive.mjs +0 -71
- package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +0 -14
- package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +0 -79
- package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +0 -49
- package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +0 -105
- package/esm2022/lib/directives/focus-state.directive.mjs +0 -44
- package/esm2022/lib/directives/icon.directive.mjs +0 -184
- package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -85
- package/esm2022/lib/dropdown/dropdown.component.mjs +0 -83
- package/esm2022/lib/edu-sharing-ui-configuration.mjs +0 -48
- package/esm2022/lib/edu-sharing-ui.module.mjs +0 -82
- package/esm2022/lib/index.mjs +0 -96
- package/esm2022/lib/list-items/available-widgets.mjs +0 -27
- package/esm2022/lib/list-items/format-duration.pipe.mjs +0 -20
- package/esm2022/lib/list-items/list-base/list-base.component.mjs +0 -46
- package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +0 -29
- package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +0 -56
- package/esm2022/lib/list-items/list-items.module.mjs +0 -50
- package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +0 -41
- package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +0 -47
- package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +0 -24
- package/esm2022/lib/list-items/list-text/list-text.component.mjs +0 -106
- package/esm2022/lib/list-items/list-widget.mjs +0 -49
- package/esm2022/lib/list-items/node-row/node-row.component.mjs +0 -24
- package/esm2022/lib/list-items/node-source.pipe.mjs +0 -49
- package/esm2022/lib/mds/mds-helper.service.mjs +0 -167
- package/esm2022/lib/mds/mds.module.mjs +0 -16
- package/esm2022/lib/mds-viewer/mds-viewer.component.mjs +0 -170
- package/esm2022/lib/mds-viewer/mds-viewer.service.mjs +0 -18
- package/esm2022/lib/mds-viewer/replace-element-with-div.mjs +0 -47
- package/esm2022/lib/mds-viewer/view-instance.service.mjs +0 -27
- package/esm2022/lib/mds-viewer/widget/mds-widget.component.mjs +0 -379
- package/esm2022/lib/node-entries/combined-data-source.mjs +0 -41
- package/esm2022/lib/node-entries/custom-templates-data-source.mjs +0 -7
- package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +0 -21
- package/esm2022/lib/node-entries/entries-model.mjs +0 -24
- package/esm2022/lib/node-entries/items-cap.mjs +0 -47
- package/esm2022/lib/node-entries/list-item-label.pipe.mjs +0 -37
- package/esm2022/lib/node-entries/node-cache.mjs +0 -73
- package/esm2022/lib/node-entries/node-data-source-remote.mjs +0 -4
- package/esm2022/lib/node-entries/node-data-source.mjs +0 -117
- package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +0 -117
- package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +0 -329
- package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +0 -44
- package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +0 -27
- package/esm2022/lib/node-entries/node-entries-global.service.mjs +0 -71
- package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +0 -42
- package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +0 -294
- package/esm2022/lib/node-entries/node-entries-templates.service.mjs +0 -11
- package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +0 -369
- package/esm2022/lib/node-entries/node-entries.component.mjs +0 -132
- package/esm2022/lib/node-entries/node-entries.module.mjs +0 -161
- package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +0 -125
- package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +0 -48
- package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +0 -36
- package/esm2022/lib/node-entries/option-button/option-button.component.mjs +0 -75
- package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +0 -53
- package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +0 -41
- package/esm2022/lib/node-url/node-url.component.mjs +0 -132
- package/esm2022/lib/pipes/file-size.pipe.mjs +0 -32
- package/esm2022/lib/pipes/format-date.pipe.mjs +0 -38
- package/esm2022/lib/pipes/mds-duration.pipe.mjs +0 -25
- package/esm2022/lib/pipes/node-icon.pipe.mjs +0 -18
- package/esm2022/lib/pipes/node-image-size.pipe.mjs +0 -24
- package/esm2022/lib/pipes/node-image.pipe.mjs +0 -55
- package/esm2022/lib/pipes/node-license.pipe.mjs +0 -24
- package/esm2022/lib/pipes/node-person-name.pipe.mjs +0 -50
- package/esm2022/lib/pipes/node-title.pipe.mjs +0 -35
- package/esm2022/lib/pipes/option-tooltip.pipe.mjs +0 -33
- package/esm2022/lib/pipes/property-slug.pipe.mjs +0 -16
- package/esm2022/lib/pipes/replace-chars.pipe.mjs +0 -29
- package/esm2022/lib/pipes/vcard-name.pipe.mjs +0 -25
- package/esm2022/lib/services/abstract/app.service.mjs +0 -3
- package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +0 -10
- package/esm2022/lib/services/abstract/options-helper.service.mjs +0 -3
- package/esm2022/lib/services/abstract/toast.service.mjs +0 -3
- package/esm2022/lib/services/accessibility.service.mjs +0 -73
- package/esm2022/lib/services/app-container.service.mjs +0 -69
- package/esm2022/lib/services/local-events.service.mjs +0 -43
- package/esm2022/lib/services/node-entries.service.mjs +0 -201
- package/esm2022/lib/services/node-helper.service.mjs +0 -330
- package/esm2022/lib/services/nodes-drag-drop.service.mjs +0 -155
- package/esm2022/lib/services/options-helper-data.service.mjs +0 -142
- package/esm2022/lib/services/render-helper.service.mjs +0 -114
- package/esm2022/lib/services/repo-url.service.mjs +0 -50
- package/esm2022/lib/services/search-helper.service.mjs +0 -52
- package/esm2022/lib/services/temporary-storage.service.mjs +0 -48
- package/esm2022/lib/services/ui.service.mjs +0 -327
- package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +0 -50
- package/esm2022/lib/spinner/spinner.component.mjs +0 -19
- package/esm2022/lib/spinner-small/spinner-small.component.mjs +0 -18
- package/esm2022/lib/translations/fallback-translation-handler.mjs +0 -6
- package/esm2022/lib/translations/translation-loader.mjs +0 -219
- package/esm2022/lib/translations/translation-source.mjs +0 -11
- package/esm2022/lib/translations/translations.module.mjs +0 -82
- package/esm2022/lib/translations/translations.service.mjs +0 -238
- package/esm2022/lib/types/accessibillity.mjs +0 -19
- package/esm2022/lib/types/api-models.mjs +0 -2
- package/esm2022/lib/types/drag-drop.mjs +0 -2
- package/esm2022/lib/types/injection-tokens.mjs +0 -31
- package/esm2022/lib/types/keyboard-shortcuts.mjs +0 -11
- package/esm2022/lib/types/list-item.mjs +0 -41
- package/esm2022/lib/types/option-item.mjs +0 -192
- package/esm2022/lib/types/workflow.mjs +0 -25
- package/esm2022/lib/util/DateHelper.mjs +0 -200
- package/esm2022/lib/util/VCard.mjs +0 -278
- package/esm2022/lib/util/color-helper.mjs +0 -124
- package/esm2022/lib/util/duration-helper.mjs +0 -102
- package/esm2022/lib/util/functions.mjs +0 -13
- package/esm2022/lib/util/helper.mjs +0 -64
- package/esm2022/lib/util/isNumeric.mjs +0 -11
- package/esm2022/lib/util/rest-helper.mjs +0 -42
- package/esm2022/lib/util/ui-animation.mjs +0 -146
- package/esm2022/lib/util/ui-constants.mjs +0 -21
- package/esm2022/ngx-edu-sharing-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { SelectionModel } from '@angular/cdk/collections';
|
|
2
|
-
import { Injectable, signal } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject } from 'rxjs';
|
|
4
|
-
import { NodeDataSourceRemote } from '../node-entries/node-data-source-remote';
|
|
5
|
-
import { delay, map } from 'rxjs/operators';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "./ui.service";
|
|
8
|
-
import * as i2 from "./abstract/toast.service";
|
|
9
|
-
import * as i3 from "../node-entries/node-entries-global.service";
|
|
10
|
-
/**
|
|
11
|
-
Custom selection model which adds the click source of the selection.
|
|
12
|
-
USED IN EXTENSIONS!
|
|
13
|
-
*/
|
|
14
|
-
export class CustomSelectionModel extends SelectionModel {
|
|
15
|
-
constructor() {
|
|
16
|
-
super(...arguments);
|
|
17
|
-
/**
|
|
18
|
-
* used in extensions
|
|
19
|
-
*/
|
|
20
|
-
this.changedClickSource = this.changed.pipe(delay(0), map((c) => {
|
|
21
|
-
return { ...c, clickSource: this._clickSource };
|
|
22
|
-
}));
|
|
23
|
-
}
|
|
24
|
-
deselect(...values) {
|
|
25
|
-
this._clickSource = null;
|
|
26
|
-
super.deselect(...values);
|
|
27
|
-
}
|
|
28
|
-
toggle(value) {
|
|
29
|
-
this._clickSource = null;
|
|
30
|
-
super.toggle(value);
|
|
31
|
-
}
|
|
32
|
-
clear() {
|
|
33
|
-
this._clickSource = null;
|
|
34
|
-
super.clear();
|
|
35
|
-
}
|
|
36
|
-
select(...values) {
|
|
37
|
-
this._clickSource = null;
|
|
38
|
-
super.select(...values);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* used in extensions
|
|
42
|
-
* @param value
|
|
43
|
-
*/
|
|
44
|
-
set clickSource(value) {
|
|
45
|
-
this._clickSource = value;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export class NodeEntriesService {
|
|
49
|
-
get dataSource() {
|
|
50
|
-
return this.dataSource$.value;
|
|
51
|
-
}
|
|
52
|
-
set dataSource(value) {
|
|
53
|
-
this.dataSource$.next(value);
|
|
54
|
-
}
|
|
55
|
-
get paginationStrategy() {
|
|
56
|
-
return this.entriesGlobal.getPaginationStrategy(this.scope);
|
|
57
|
-
}
|
|
58
|
-
get columns() {
|
|
59
|
-
return this.columnsSubject.value?.columns;
|
|
60
|
-
}
|
|
61
|
-
set columns(columns) {
|
|
62
|
-
this.columnsSubject.next({ columns, fromUser: true });
|
|
63
|
-
}
|
|
64
|
-
get options() {
|
|
65
|
-
return this.options$.value;
|
|
66
|
-
}
|
|
67
|
-
set options(options) {
|
|
68
|
-
this.options$.next(options);
|
|
69
|
-
}
|
|
70
|
-
set globalOptions(globalOptions) {
|
|
71
|
-
this.globalOptionsSubject.next(globalOptions);
|
|
72
|
-
}
|
|
73
|
-
get sort() {
|
|
74
|
-
return this.sortSubject.value;
|
|
75
|
-
}
|
|
76
|
-
set sort(value) {
|
|
77
|
-
this.sortSubject.next(value);
|
|
78
|
-
}
|
|
79
|
-
get gridConfig() {
|
|
80
|
-
return this.gridConfig$.value;
|
|
81
|
-
}
|
|
82
|
-
set gridConfig(value) {
|
|
83
|
-
this.gridConfig$.next(value);
|
|
84
|
-
}
|
|
85
|
-
constructor(uiService, toast, entriesGlobal) {
|
|
86
|
-
this.uiService = uiService;
|
|
87
|
-
this.toast = toast;
|
|
88
|
-
this.entriesGlobal = entriesGlobal;
|
|
89
|
-
this.dataSource$ = new BehaviorSubject(null);
|
|
90
|
-
/**
|
|
91
|
-
* Subject that reflects the current columns configuration.
|
|
92
|
-
*
|
|
93
|
-
* Updated when loading configuration and through user interaction.
|
|
94
|
-
*/
|
|
95
|
-
this.columnsSubject = new BehaviorSubject(null);
|
|
96
|
-
this.selection = new CustomSelectionModel(true, []);
|
|
97
|
-
this.options$ = new BehaviorSubject(null);
|
|
98
|
-
this.globalOptionsSubject = new BehaviorSubject([]);
|
|
99
|
-
this.sortSubject = new BehaviorSubject(void 0);
|
|
100
|
-
this.gridConfig$ = new BehaviorSubject(null);
|
|
101
|
-
this.scrollGradientColor = signal('fff');
|
|
102
|
-
}
|
|
103
|
-
onClicked({ event, ...data }) {
|
|
104
|
-
if (event.ctrlKey || event.metaKey) {
|
|
105
|
-
this.selection.toggle(data.element);
|
|
106
|
-
}
|
|
107
|
-
else if (event.shiftKey) {
|
|
108
|
-
this.expandSelectionTo(data.element);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
this.clickItem.emit(data);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
onCheckboxChanged(node, checked) {
|
|
115
|
-
if (this.uiService.shiftKeyPressed) {
|
|
116
|
-
this.expandSelectionTo(node);
|
|
117
|
-
}
|
|
118
|
-
if (checked !== this.selection.isSelected(node)) {
|
|
119
|
-
this.selection.toggle(node);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
toggleSelectAll() {
|
|
123
|
-
if (this.isAllSelected()) {
|
|
124
|
-
this.selection.clear();
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
this.selectAll();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
loadMore(source) {
|
|
131
|
-
if (this.paginationStrategy !== 'infinite-scroll') {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
if (source === 'scroll' && this.disableInfiniteScroll) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
// TODO: focus next item when triggered via button.
|
|
138
|
-
if (this.dataSource instanceof NodeDataSourceRemote) {
|
|
139
|
-
return this.dataSource.loadMore();
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
if (this.dataSource.hasMore()) {
|
|
143
|
-
this.fetchData.emit({
|
|
144
|
-
offset: this.dataSource.getData().length,
|
|
145
|
-
reset: false,
|
|
146
|
-
});
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
selectAll() {
|
|
155
|
-
this.selection.select(...this.dataSource.getData());
|
|
156
|
-
}
|
|
157
|
-
isAllSelected() {
|
|
158
|
-
return this.dataSource.getData().every((node) => this.selection.isSelected(node));
|
|
159
|
-
}
|
|
160
|
-
expandSelectionTo(node) {
|
|
161
|
-
const nodeIndex = this.dataSource.getData().indexOf(node);
|
|
162
|
-
const selectionIndexes = this.selection.selected
|
|
163
|
-
.map((node) => this.dataSource.getData().indexOf(node))
|
|
164
|
-
.filter((index) => index >= 0);
|
|
165
|
-
if (Math.min(...selectionIndexes) < nodeIndex) {
|
|
166
|
-
for (let i = Math.min(...selectionIndexes) + 1; i <= nodeIndex; i++) {
|
|
167
|
-
this.selection.select(this.dataSource.getData()[i]);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else if (Math.max(...selectionIndexes) > nodeIndex) {
|
|
171
|
-
for (let i = nodeIndex; i < Math.max(...selectionIndexes); i++) {
|
|
172
|
-
this.selection.select(this.dataSource.getData()[i]);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
openDropdown(dropdown, node, onDone = null) {
|
|
177
|
-
if (!this.selection.selected.includes(node)) {
|
|
178
|
-
this.selection.clear();
|
|
179
|
-
this.selection.select(node);
|
|
180
|
-
}
|
|
181
|
-
// Wait for the menu to reflect changed options.
|
|
182
|
-
setTimeout(() => {
|
|
183
|
-
dropdown.callbackObjects = this.selection.selected;
|
|
184
|
-
dropdown.ngOnChanges();
|
|
185
|
-
if (dropdown.canShowDropdown()) {
|
|
186
|
-
if (onDone) {
|
|
187
|
-
onDone();
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
this.toast.toast('NO_AVAILABLE_OPTIONS');
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesService, deps: [{ token: i1.UIService }, { token: i2.Toast }, { token: i3.NodeEntriesGlobalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
196
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesService }); }
|
|
197
|
-
}
|
|
198
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesService, decorators: [{
|
|
199
|
-
type: Injectable
|
|
200
|
-
}], ctorParameters: () => [{ type: i1.UIService }, { type: i2.Toast }, { type: i3.NodeEntriesGlobalService }] });
|
|
201
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL3NlcnZpY2VzL25vZGUtZW50cmllcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUF3QnZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSTVDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxvQkFBd0IsU0FBUSxjQUFpQjtJQUE5RDs7UUFFSTs7V0FFRztRQUNNLHVCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUMzQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDTixPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBNEJOLENBQUM7SUEzQkcsUUFBUSxDQUFDLEdBQUcsTUFBVztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFRO1FBQ1gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FB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QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsZ0RBQWdEO1FBQ2hELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixRQUFRLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBNkIsQ0FBQztZQUN4RSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkIsSUFBSSxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDVCxNQUFNLEVBQUUsQ0FBQztnQkFDYixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0F2S1Esa0JBQWtCO21IQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHtcbiAgICBDbGlja1NvdXJjZSxcbiAgICBGZXRjaEV2ZW50LFxuICAgIEdyaWRDb25maWcsXG4gICAgSW50ZXJhY3Rpb25UeXBlLFxuICAgIExpc3REcmFnR3JvcENvbmZpZyxcbiAgICBMaXN0RXZlbnRJbnRlcmZhY2UsXG4gICAgTGlzdE9wdGlvbnMsXG4gICAgTGlzdFNvcnRDb25maWcsXG4gICAgTm9kZUNsaWNrRXZlbnQsXG4gICAgTm9kZUVudHJpZXNEYXRhVHlwZSxcbiAgICBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLFxufSBmcm9tICcuLi9ub2RlLWVudHJpZXMvZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBOb2RlRGF0YVNvdXJjZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy9ub2RlLWRhdGEtc291cmNlJztcbmltcG9ydCB7XG4gICAgTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgIFBhZ2luYXRpb25TdHJhdGVneSxcbn0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5cbmltcG9ydCB7IE9wdGlvbkl0ZW0sIFNjb3BlIH0gZnJvbSAnLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi91aS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlUmVtb3RlIH0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzL25vZGUtZGF0YS1zb3VyY2UtcmVtb3RlJztcbmltcG9ydCB7IGRlbGF5LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gJy4vYWJzdHJhY3QvdG9hc3Quc2VydmljZSc7XG5cbi8qKlxuIEN1c3RvbSBzZWxlY3Rpb24gbW9kZWwgd2hpY2ggYWRkcyB0aGUgY2xpY2sgc291cmNlIG9mIHRoZSBzZWxlY3Rpb24uXG4gVVNFRCBJTiBFWFRFTlNJT05TIVxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tU2VsZWN0aW9uTW9kZWw8VD4gZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbDxUPiB7XG4gICAgcHJpdmF0ZSBfY2xpY2tTb3VyY2U6IENsaWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIHVzZWQgaW4gZXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGNoYW5nZWRDbGlja1NvdXJjZSA9IHRoaXMuY2hhbmdlZC5waXBlKFxuICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgbWFwKChjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5jLCBjbGlja1NvdXJjZTogdGhpcy5fY2xpY2tTb3VyY2UgfTtcbiAgICAgICAgfSksXG4gICAgKTtcbiAgICBkZXNlbGVjdCguLi52YWx1ZXM6IFRbXSkge1xuICAgICAgICB0aGlzLl9jbGlja1NvdXJjZSA9IG51bGw7XG4gICAgICAgIHN1cGVyLmRlc2VsZWN0KC4uLnZhbHVlcyk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKHZhbHVlOiBUKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrU291cmNlID0gbnVsbDtcbiAgICAgICAgc3VwZXIudG9nZ2xlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tTb3VyY2UgPSBudWxsO1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgIH1cblxuICAgIHNlbGVjdCguLi52YWx1ZXM6IFRbXSkge1xuICAgICAgICB0aGlzLl9jbGlja1NvdXJjZSA9IG51bGw7XG4gICAgICAgIHN1cGVyLnNlbGVjdCguLi52YWx1ZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHVzZWQgaW4gZXh0ZW5zaW9uc1xuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIHNldCBjbGlja1NvdXJjZSh2YWx1ZTogQ2xpY2tTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tTb3VyY2UgPSB2YWx1ZTtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOb2RlRW50cmllc1NlcnZpY2U8VCBleHRlbmRzIE5vZGVFbnRyaWVzRGF0YVR5cGU+IHtcbiAgICBsaXN0OiBMaXN0RXZlbnRJbnRlcmZhY2U8VD47XG4gICAgcmVhZG9ubHkgZGF0YVNvdXJjZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5vZGVEYXRhU291cmNlPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgLyoqXG4gICAgICogc2NvcGUgdGhlIGN1cnJlbnQgbGlzdCBpcyBpbiwgZS5nLiB3b3Jrc3BhY2VcbiAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIGFkZGl0aW9uYWwgY29uZmlnIGluamVjdGlvbiBiYXNlZCBvbiB0aGUgc2NvcGVcbiAgICAgKi9cbiAgICBzY29wZTogU2NvcGU7XG4gICAgZ2V0IGRhdGFTb3VyY2UoKTogTm9kZURhdGFTb3VyY2U8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlJC52YWx1ZTtcbiAgICB9XG4gICAgc2V0IGRhdGFTb3VyY2UodmFsdWU6IE5vZGVEYXRhU291cmNlPFQ+KSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBwYWdpbmF0aW9uU3RyYXRlZ3koKTogUGFnaW5hdGlvblN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllc0dsb2JhbC5nZXRQYWdpbmF0aW9uU3RyYXRlZ3kodGhpcy5zY29wZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1YmplY3QgdGhhdCByZWZsZWN0cyB0aGUgY3VycmVudCBjb2x1bW5zIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBVcGRhdGVkIHdoZW4gbG9hZGluZyBjb25maWd1cmF0aW9uIGFuZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICovXG4gICAgY29sdW1uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgY29sdW1uczogTGlzdEl0ZW1bXTsgZnJvbVVzZXI6IGJvb2xlYW4gfT4obnVsbCk7XG4gICAgZ2V0IGNvbHVtbnMoKTogTGlzdEl0ZW1bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNTdWJqZWN0LnZhbHVlPy5jb2x1bW5zO1xuICAgIH1cbiAgICBzZXQgY29sdW1ucyhjb2x1bW5zOiBMaXN0SXRlbVtdKSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh7IGNvbHVtbnMsIGZyb21Vc2VyOiB0cnVlIH0pO1xuICAgIH1cbiAgICBjb25maWd1cmVDb2x1bW5zOiBib29sZWFuO1xuICAgIGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuICAgIHNlbGVjdGlvbiA9IG5ldyBDdXN0b21TZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XG4gICAgZWxlbWVudEludGVyYWN0aW9uVHlwZTogSW50ZXJhY3Rpb25UeXBlO1xuICAgIG9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0T3B0aW9ucz4obnVsbCk7XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMkLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgb3B0aW9ucyhvcHRpb25zOiBMaXN0T3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMkLm5leHQob3B0aW9ucyk7XG4gICAgfVxuICAgIGNoZWNrYm94OiBib29sZWFuO1xuICAgIGdsb2JhbE9wdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPcHRpb25JdGVtW10+KFtdKTtcbiAgICBzZXQgZ2xvYmFsT3B0aW9ucyhnbG9iYWxPcHRpb25zOiBPcHRpb25JdGVtW10pIHtcbiAgICAgICAgdGhpcy5nbG9iYWxPcHRpb25zU3ViamVjdC5uZXh0KGdsb2JhbE9wdGlvbnMpO1xuICAgIH1cbiAgICBzb3J0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlzdFNvcnRDb25maWc+KHZvaWQgMCk7XG4gICAgZ2V0IHNvcnQoKTogTGlzdFNvcnRDb25maWcge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0U3ViamVjdC52YWx1ZTtcbiAgICB9XG4gICAgc2V0IHNvcnQodmFsdWU6IExpc3RTb3J0Q29uZmlnKSB7XG4gICAgICAgIHRoaXMuc29ydFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIHNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxMaXN0U29ydENvbmZpZz47XG4gICAgZHJhZ0Ryb3A6IExpc3REcmFnR3JvcENvbmZpZzxUPjtcbiAgICBjbGlja0l0ZW06IEV2ZW50RW1pdHRlcjxOb2RlQ2xpY2tFdmVudDxUPj47XG4gICAgZGJsQ2xpY2tJdGVtOiBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+O1xuICAgIGZldGNoRGF0YTogRXZlbnRFbWl0dGVyPEZldGNoRXZlbnQ+O1xuICAgIHJlYWRvbmx5IGdyaWRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHcmlkQ29uZmlnIHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGdyaWRDb25maWcoKTogR3JpZENvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRDb25maWckLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgZ3JpZENvbmZpZyh2YWx1ZTogR3JpZENvbmZpZykge1xuICAgICAgICB0aGlzLmdyaWRDb25maWckLm5leHQodmFsdWUpO1xuICAgIH1cbiAgICBwcmltYXJ5SW5zdGFuY2U6IGJvb2xlYW47XG4gICAgc2luZ2xlQ2xpY2tIaW50OiAnZHluYW1pYycgfCAnc3RhdGljJztcbiAgICBkaXNhYmxlSW5maW5pdGVTY3JvbGw6IGJvb2xlYW47XG4gICAgc2Nyb2xsR3JhZGllbnRDb2xvcjogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnZmZmJyk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB1aVNlcnZpY2U6IFVJU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0b2FzdDogVG9hc3QsXG4gICAgICAgIHByaXZhdGUgZW50cmllc0dsb2JhbDogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICkge31cblxuICAgIG9uQ2xpY2tlZCh7IGV2ZW50LCAuLi5kYXRhIH06IE5vZGVDbGlja0V2ZW50PFQ+ICYgeyBldmVudDogTW91c2VFdmVudCB9KSB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShkYXRhLmVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFNlbGVjdGlvblRvKGRhdGEuZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsaWNrSXRlbS5lbWl0KGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGVja2JveENoYW5nZWQobm9kZTogVCwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy51aVNlcnZpY2Uuc2hpZnRLZXlQcmVzc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFNlbGVjdGlvblRvKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRNb3JlKHNvdXJjZTogJ2J1dHRvbicgfCAnc2Nyb2xsJyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0aW9uU3RyYXRlZ3kgIT09ICdpbmZpbml0ZS1zY3JvbGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJ3Njcm9sbCcgJiYgdGhpcy5kaXNhYmxlSW5maW5pdGVTY3JvbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBmb2N1cyBuZXh0IGl0ZW0gd2hlbiB0cmlnZ2VyZWQgdmlhIGJ1dHRvbi5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIE5vZGVEYXRhU291cmNlUmVtb3RlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZGF0YVNvdXJjZSBhcyBOb2RlRGF0YVNvdXJjZVJlbW90ZSkubG9hZE1vcmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuaGFzTW9yZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaERhdGEuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHJlc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLmV2ZXJ5KChub2RlKSA9PiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZFNlbGVjdGlvblRvKG5vZGU6IFQpIHtcbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5pbmRleE9mKG5vZGUpO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JbmRleGVzID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRcbiAgICAgICAgICAgIC5tYXAoKG5vZGUpID0+IHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuaW5kZXhPZihub2RlKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCA+PSAwKTtcbiAgICAgICAgaWYgKE1hdGgubWluKC4uLnNlbGVjdGlvbkluZGV4ZXMpIDwgbm9kZUluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4oLi4uc2VsZWN0aW9uSW5kZXhlcykgKyAxOyBpIDw9IG5vZGVJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKClbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKE1hdGgubWF4KC4uLnNlbGVjdGlvbkluZGV4ZXMpID4gbm9kZUluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbm9kZUluZGV4OyBpIDwgTWF0aC5tYXgoLi4uc2VsZWN0aW9uSW5kZXhlcyk7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCh0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5Ecm9wZG93bihkcm9wZG93bjogRHJvcGRvd25Db21wb25lbnQsIG5vZGU6IFQsIG9uRG9uZTogKCkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgbWVudSB0byByZWZsZWN0IGNoYW5nZWQgb3B0aW9ucy5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkcm9wZG93bi5jYWxsYmFja09iamVjdHMgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCBhcyB1bmtub3duIGFzIE5vZGVbXTtcbiAgICAgICAgICAgIGRyb3Bkb3duLm5nT25DaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uY2FuU2hvd0Ryb3Bkb3duKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25Eb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC50b2FzdCgnTk9fQVZBSUxBQkxFX09QVElPTlMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { RestConstants, } from 'ngx-edu-sharing-api';
|
|
3
|
-
import * as Workflow from '../types/workflow';
|
|
4
|
-
import { UIConstants } from '../util/ui-constants';
|
|
5
|
-
import { ASSETS_BASE_PATH } from '../types/injection-tokens';
|
|
6
|
-
import { of } from 'rxjs';
|
|
7
|
-
import { NodesRightMode } from '../types/option-item';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@ngx-translate/core";
|
|
10
|
-
import * as i2 from "ngx-edu-sharing-api";
|
|
11
|
-
import * as i3 from "./repo-url.service";
|
|
12
|
-
export class NodeHelperService {
|
|
13
|
-
constructor(translate, apiHelpersService, networkService, configService, repoUrlService, assetsBasePath) {
|
|
14
|
-
this.translate = translate;
|
|
15
|
-
this.apiHelpersService = apiHelpersService;
|
|
16
|
-
this.networkService = networkService;
|
|
17
|
-
this.configService = configService;
|
|
18
|
-
this.repoUrlService = repoUrlService;
|
|
19
|
-
this.assetsBasePath = assetsBasePath;
|
|
20
|
-
this.LICENSE_URLS = {
|
|
21
|
-
CC_BY_ABOUT: 'https://creativecommons.org/licenses/list.{{language}}',
|
|
22
|
-
CC_BY: 'https://creativecommons.org/licenses/by/{{version}}/{{locale}}deed.{{language}}',
|
|
23
|
-
CC_BY_ND: 'https://creativecommons.org/licenses/by-nd/{{version}}/{{locale}}deed.{{language}}',
|
|
24
|
-
CC_BY_SA: 'https://creativecommons.org/licenses/by-sa/{{version}}/{{locale}}deed.{{language}}',
|
|
25
|
-
CC_BY_NC: 'https://creativecommons.org/licenses/by-nc/{{version}}/{{locale}}deed.{{language}}',
|
|
26
|
-
CC_BY_NC_ND: 'https://creativecommons.org/licenses/by-nc-nd/{{version}}/{{locale}}deed.{{language}}',
|
|
27
|
-
CC_BY_NC_SA: 'https://creativecommons.org/licenses/by-nc-sa/{{version}}/{{locale}}deed.{{language}}',
|
|
28
|
-
CC_0: 'https://creativecommons.org/publicdomain/zero/1.0/legalcode.{{language}}',
|
|
29
|
-
PDM: 'https://creativecommons.org/public-domain/pdm/',
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
getCollectionScopeInfo(node) {
|
|
33
|
-
const scope = node.collection ? node.collection.scope : null;
|
|
34
|
-
let icon = 'help';
|
|
35
|
-
let scopeName = 'UNKNOWN';
|
|
36
|
-
if (scope === RestConstants.COLLECTIONSCOPE_MY) {
|
|
37
|
-
icon = 'lock';
|
|
38
|
-
scopeName = 'MY';
|
|
39
|
-
}
|
|
40
|
-
if (scope === RestConstants.COLLECTIONSCOPE_ORGA ||
|
|
41
|
-
scope === RestConstants.COLLECTIONSCOPE_CUSTOM) {
|
|
42
|
-
icon = 'group';
|
|
43
|
-
scopeName = 'SHARED';
|
|
44
|
-
}
|
|
45
|
-
if (scope === RestConstants.COLLECTIONSCOPE_ALL ||
|
|
46
|
-
scope === RestConstants.COLLECTIONSCOPE_CUSTOM_PUBLIC) {
|
|
47
|
-
icon = 'language';
|
|
48
|
-
scopeName = 'PUBLIC';
|
|
49
|
-
}
|
|
50
|
-
if (node.collection?.type === RestConstants.COLLECTIONTYPE_EDITORIAL) {
|
|
51
|
-
icon = 'star';
|
|
52
|
-
scopeName = 'TYPE_EDITORIAL';
|
|
53
|
-
}
|
|
54
|
-
if (node.collection?.type === RestConstants.COLLECTIONTYPE_MEDIA_CENTER) {
|
|
55
|
-
icon = 'business';
|
|
56
|
-
scopeName = 'TYPE_MEDIA_CENTER';
|
|
57
|
-
}
|
|
58
|
-
return { icon, scopeName };
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Return the license icon of a node
|
|
62
|
-
*/
|
|
63
|
-
async getLicenseIcon(node) {
|
|
64
|
-
// prefer manual mapping instead of backend data to support custom states from local edits
|
|
65
|
-
const license = node.properties?.[RestConstants.CCM_PROP_LICENSE]?.[0];
|
|
66
|
-
if (license) {
|
|
67
|
-
return this.getLicenseIconByString(license);
|
|
68
|
-
}
|
|
69
|
-
return node.license ? this.repoUrlService.getRepoUrl(node.license.icon, node) : null;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Get a license icon by using the property value string
|
|
73
|
-
*/
|
|
74
|
-
getLicenseIconByString(string, useNoneAsFallback = true) {
|
|
75
|
-
let icon = string.replace(/_/g, '-').toLowerCase();
|
|
76
|
-
if (icon == '')
|
|
77
|
-
icon = 'none';
|
|
78
|
-
const LICENSE_ICONS = [
|
|
79
|
-
'cc-0',
|
|
80
|
-
'cc-by-nc',
|
|
81
|
-
'cc-by-nc-nd',
|
|
82
|
-
'cc-by-nc-sa',
|
|
83
|
-
'cc-by-nd',
|
|
84
|
-
'cc-by-sa',
|
|
85
|
-
'cc-by',
|
|
86
|
-
'copyright-free',
|
|
87
|
-
'copyright-license',
|
|
88
|
-
'custom',
|
|
89
|
-
'edu-nc-nd-noDo',
|
|
90
|
-
'edu-nc-nd',
|
|
91
|
-
'edu-p-nr-nd-noDo',
|
|
92
|
-
'edu-p-nr-nd',
|
|
93
|
-
'none',
|
|
94
|
-
'pdm',
|
|
95
|
-
'schulfunk',
|
|
96
|
-
'unterrichts-und-lehrmedien',
|
|
97
|
-
];
|
|
98
|
-
if (LICENSE_ICONS.indexOf(icon) == -1 && !useNoneAsFallback)
|
|
99
|
-
return null; // icon='none';
|
|
100
|
-
if (icon == 'none' && !useNoneAsFallback)
|
|
101
|
-
return null;
|
|
102
|
-
const result = this.apiHelpersService.getServerUrl() + '/../ccimages/licenses/' + icon + '.svg';
|
|
103
|
-
return result;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Return a translated name of a license name for a node
|
|
107
|
-
* @param node
|
|
108
|
-
* @param translate
|
|
109
|
-
* @returns {string|any|string|any|string|any|string|any|string|any|string}
|
|
110
|
-
*/
|
|
111
|
-
getLicenseName(node) {
|
|
112
|
-
let prop = node.properties[RestConstants.CCM_PROP_LICENSE]?.[0];
|
|
113
|
-
if (!prop)
|
|
114
|
-
prop = '';
|
|
115
|
-
return this.getLicenseNameByString(prop);
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Return a translated name for a license string
|
|
119
|
-
* @param string
|
|
120
|
-
* @param translate
|
|
121
|
-
* @returns {any}
|
|
122
|
-
*/
|
|
123
|
-
getLicenseNameByString(name) {
|
|
124
|
-
if (name == '') {
|
|
125
|
-
name = 'NONE';
|
|
126
|
-
}
|
|
127
|
-
return this.translate.instant('LICENSE.NAMES.' + name);
|
|
128
|
-
// return name.replace(/_/g,"-");
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* return the License URL (e.g. for CC_BY licenses) for a license string and version
|
|
132
|
-
* @param licenseProperty
|
|
133
|
-
* @param licenseVersion
|
|
134
|
-
* @param licenseLocale
|
|
135
|
-
*/
|
|
136
|
-
getLicenseUrlByString(licenseProperty, licenseVersion, licenseLocale) {
|
|
137
|
-
const isV4 = licenseVersion === '4.0';
|
|
138
|
-
const locale = isV4 || !licenseLocale ? '' : licenseLocale.toLowerCase() + '/';
|
|
139
|
-
const url = this.LICENSE_URLS[licenseProperty];
|
|
140
|
-
if (!url) {
|
|
141
|
-
return of(null);
|
|
142
|
-
}
|
|
143
|
-
return of(url
|
|
144
|
-
.replace('{{version}}', licenseVersion)
|
|
145
|
-
.replace('{{locale}}', locale)
|
|
146
|
-
.replace('{{language}}', this.translate.currentLang || 'en'));
|
|
147
|
-
}
|
|
148
|
-
getWorkflowStatusById(id) {
|
|
149
|
-
const workflows = this.getWorkflows();
|
|
150
|
-
return workflows.filter((w) => w.id === id)?.[0];
|
|
151
|
-
}
|
|
152
|
-
getWorkflowStatus(node, useFromConfig = false) {
|
|
153
|
-
let value = node.properties[RestConstants.CCM_PROP_WF_STATUS]?.[0];
|
|
154
|
-
if (!value) {
|
|
155
|
-
return this.getDefaultWorkflowStatus(useFromConfig);
|
|
156
|
-
}
|
|
157
|
-
return {
|
|
158
|
-
current: this.getWorkflowStatusById(value),
|
|
159
|
-
initial: this.getWorkflowStatusById(value),
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
getDefaultWorkflowStatus(useFromConfig = false) {
|
|
163
|
-
const result = {
|
|
164
|
-
current: null,
|
|
165
|
-
initial: null,
|
|
166
|
-
};
|
|
167
|
-
result.initial = this.getWorkflows()[0];
|
|
168
|
-
let defaultStatus = null;
|
|
169
|
-
if (useFromConfig) {
|
|
170
|
-
defaultStatus = this.configService.instant('workflow.defaultStatus');
|
|
171
|
-
}
|
|
172
|
-
if (defaultStatus) {
|
|
173
|
-
result.current = this.getWorkflows().find((w) => w.id === defaultStatus);
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
result.current = result.initial;
|
|
177
|
-
}
|
|
178
|
-
return result;
|
|
179
|
-
}
|
|
180
|
-
getWorkflows() {
|
|
181
|
-
return this.configService.instant('workflow.workflows', [
|
|
182
|
-
Workflow.WORKFLOW_STATUS_UNCHECKED,
|
|
183
|
-
Workflow.WORKFLOW_STATUS_TO_CHECK,
|
|
184
|
-
Workflow.WORKFLOW_STATUS_HASFLAWS,
|
|
185
|
-
Workflow.WORKFLOW_STATUS_CHECKED,
|
|
186
|
-
]);
|
|
187
|
-
}
|
|
188
|
-
copyDataToNode(target, source) {
|
|
189
|
-
target.properties = source.properties;
|
|
190
|
-
target.name = source.name;
|
|
191
|
-
target.title = source.title;
|
|
192
|
-
target.iconURL = source.iconURL;
|
|
193
|
-
target.preview = source.preview;
|
|
194
|
-
target.authorityName = source.authorityName;
|
|
195
|
-
target.profile = source.profile;
|
|
196
|
-
target.status = source.status;
|
|
197
|
-
}
|
|
198
|
-
isNodeCollection(node) {
|
|
199
|
-
return node.aspects?.includes(RestConstants.CCM_ASPECT_COLLECTION) || !!node.collection;
|
|
200
|
-
}
|
|
201
|
-
getSourceIconPath(src) {
|
|
202
|
-
return (this.assetsBasePath ?? '') + 'assets/images/sources/' + src.toLowerCase() + '.png';
|
|
203
|
-
}
|
|
204
|
-
getNodeLink(mode, node) {
|
|
205
|
-
if (!node?.ref) {
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
let data = null;
|
|
209
|
-
if (this.isNodeCollection(node)) {
|
|
210
|
-
const scope = node.collection?.scope;
|
|
211
|
-
const type = node.collection?.type;
|
|
212
|
-
const queryParams = {
|
|
213
|
-
id: node.ref.id,
|
|
214
|
-
};
|
|
215
|
-
if (type === RestConstants.COLLECTIONTYPE_EDITORIAL) {
|
|
216
|
-
queryParams.scope = RestConstants.COLLECTIONSCOPE_TYPE_EDITORIAL;
|
|
217
|
-
}
|
|
218
|
-
else if (type === RestConstants.COLLECTIONTYPE_MEDIA_CENTER) {
|
|
219
|
-
queryParams.scope = RestConstants.COLLECTIONSCOPE_TYPE_MEDIA_CENTER;
|
|
220
|
-
}
|
|
221
|
-
else if (scope === RestConstants.COLLECTIONSCOPE_CUSTOM_PUBLIC) {
|
|
222
|
-
queryParams.scope = RestConstants.COLLECTIONSCOPE_ALL;
|
|
223
|
-
}
|
|
224
|
-
data = {
|
|
225
|
-
routerLink: UIConstants.ROUTER_PREFIX + 'collections',
|
|
226
|
-
queryParams,
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
if (node.isDirectory) {
|
|
231
|
-
let path;
|
|
232
|
-
if (node.properties?.[RestConstants.CCM_PROP_EDUSCOPENAME]?.[0] ===
|
|
233
|
-
RestConstants.SAFE_SCOPE) {
|
|
234
|
-
path = UIConstants.ROUTER_PREFIX + 'workspace/safe';
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
path = UIConstants.ROUTER_PREFIX + 'workspace';
|
|
238
|
-
}
|
|
239
|
-
data = {
|
|
240
|
-
routerLink: path,
|
|
241
|
-
queryParams: { id: node.ref.id },
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
else if (node.ref) {
|
|
245
|
-
const fromHome = this.networkService.isFromHomeRepository(node);
|
|
246
|
-
data = {
|
|
247
|
-
routerLink: UIConstants.ROUTER_PREFIX + 'render/' + node.ref.id,
|
|
248
|
-
queryParams: {
|
|
249
|
-
repository: fromHome ? null : node.ref.repo,
|
|
250
|
-
proposal: node.proposal?.ref.id,
|
|
251
|
-
proposalCollection: node.proposalCollection?.ref.id,
|
|
252
|
-
},
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
if (data === null) {
|
|
257
|
-
return '';
|
|
258
|
-
}
|
|
259
|
-
if (mode === 'routerLink') {
|
|
260
|
-
return '/' + data.routerLink;
|
|
261
|
-
}
|
|
262
|
-
// enforce clearing of parameters which should only be consumed once
|
|
263
|
-
data.queryParams.redirectFromSSO = null;
|
|
264
|
-
return data.queryParams;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Returns true if this node is a copy of another node, just used as a publish target.
|
|
268
|
-
*/
|
|
269
|
-
isNodePublishedCopy(o) {
|
|
270
|
-
return !!o.properties?.[RestConstants.CCM_PROP_PUBLISHED_ORIGINAL]?.[0];
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* returns true if this is a revoked node
|
|
274
|
-
* (published copy that has been revoked)
|
|
275
|
-
*/
|
|
276
|
-
isNodeRevoked(node) {
|
|
277
|
-
return node?.aspects?.includes(RestConstants.CCM_ASPECT_REVOKED);
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* returns true if all nodes have the requested right
|
|
281
|
-
* mode (only works for collection refs):
|
|
282
|
-
* Local: check only rights of the node itself
|
|
283
|
-
* Effective: check only rights of the original node this refers to (collection ref). If it is not a collection ref, fallback to local
|
|
284
|
-
*/
|
|
285
|
-
getNodesRight(nodes, right, mode = NodesRightMode.Local) {
|
|
286
|
-
if (nodes == null)
|
|
287
|
-
return true;
|
|
288
|
-
for (const node of nodes) {
|
|
289
|
-
let currentMode = mode;
|
|
290
|
-
// if no access effective present and not a collection ref. use the local data
|
|
291
|
-
if (!node.aspects?.includes(RestConstants.CCM_ASPECT_IO_REFERENCE) &&
|
|
292
|
-
!node.accessEffective?.length) {
|
|
293
|
-
currentMode = NodesRightMode.Local;
|
|
294
|
-
}
|
|
295
|
-
if (currentMode === NodesRightMode.Effective) {
|
|
296
|
-
if (!node.aspects?.includes(RestConstants.CCM_ASPECT_IO_REFERENCE)) {
|
|
297
|
-
if (node.accessEffective && node.accessEffective.indexOf(right) !== -1) {
|
|
298
|
-
continue;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
if (node.accessEffective && node.accessEffective.indexOf(right) !== -1) {
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
if (RestConstants.IMPLICIT_COLLECTION_PERMISSIONS.indexOf(right) === -1) {
|
|
305
|
-
// permission not matched on original -> implicit permissions from collection may apply
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
// check regular node rights
|
|
310
|
-
if (!node.access || node.access.indexOf(right) === -1) {
|
|
311
|
-
return false;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return true;
|
|
315
|
-
}
|
|
316
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeHelperService, deps: [{ token: i1.TranslateService }, { token: i2.ApiHelpersService }, { token: i2.NetworkService }, { token: i2.ConfigService }, { token: i3.RepoUrlService }, { token: ASSETS_BASE_PATH, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
317
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeHelperService, providedIn: 'root' }); }
|
|
318
|
-
}
|
|
319
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeHelperService, decorators: [{
|
|
320
|
-
type: Injectable,
|
|
321
|
-
args: [{
|
|
322
|
-
providedIn: 'root',
|
|
323
|
-
}]
|
|
324
|
-
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.ApiHelpersService }, { type: i2.NetworkService }, { type: i2.ConfigService }, { type: i3.RepoUrlService }, { type: undefined, decorators: [{
|
|
325
|
-
type: Optional
|
|
326
|
-
}, {
|
|
327
|
-
type: Inject,
|
|
328
|
-
args: [ASSETS_BASE_PATH]
|
|
329
|
-
}] }] });
|
|
330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1oZWxwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvc2VydmljZXMvbm9kZS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQU1ILGFBQWEsR0FFaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7QUFLdEQsTUFBTSxPQUFPLGlCQUFpQjtJQWlCMUIsWUFDYyxTQUEyQixFQUMzQixpQkFBb0MsRUFDcEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsY0FBOEIsRUFDTSxjQUFzQjtRQUwxRCxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDTSxtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQXRCL0QsaUJBQVksR0FBRztZQUNwQixXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLEtBQUssRUFBRSxpRkFBaUY7WUFDeEYsUUFBUSxFQUNKLG9GQUFvRjtZQUN4RixRQUFRLEVBQ0osb0ZBQW9GO1lBQ3hGLFFBQVEsRUFDSixvRkFBb0Y7WUFD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LENBQUMsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7K0dBalVRLGlCQUFpQiw0S0F1QkYsZ0JBQWdCO21IQXZCL0IsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBd0JRLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBcGlIZWxwZXJzU2VydmljZSxcbiAgICBDb25maWdTZXJ2aWNlLFxuICAgIE5ldHdvcmtTZXJ2aWNlLFxuICAgIE5vZGUsXG4gICAgUHJvcG9zYWxOb2RlLFxuICAgIFJlc3RDb25zdGFudHMsXG4gICAgVXNlcixcbn0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgKiBhcyBXb3JrZmxvdyBmcm9tICcuLi90eXBlcy93b3JrZmxvdyc7XG5pbXBvcnQgeyBSZXBvVXJsU2VydmljZSB9IGZyb20gJy4vcmVwby11cmwuc2VydmljZSc7XG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVUlDb25zdGFudHMgfSBmcm9tICcuLi91dGlsL3VpLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBBU1NFVFNfQkFTRV9QQVRIIH0gZnJvbSAnLi4vdHlwZXMvaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm9kZXNSaWdodE1vZGUgfSBmcm9tICcuLi90eXBlcy9vcHRpb24taXRlbSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVIZWxwZXJTZXJ2aWNlIHtcbiAgICByZWFkb25seSBMSUNFTlNFX1VSTFMgPSB7XG4gICAgICAgIENDX0JZX0FCT1VUOiAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2xpc3Que3tsYW5ndWFnZX19JyxcbiAgICAgICAgQ0NfQlk6ICdodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkve3t2ZXJzaW9ufX0ve3tsb2NhbGV9fWRlZWQue3tsYW5ndWFnZX19JyxcbiAgICAgICAgQ0NfQllfTkQ6XG4gICAgICAgICAgICAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5kL3t7dmVyc2lvbn19L3t7bG9jYWxlfX1kZWVkLnt7bGFuZ3VhZ2V9fScsXG4gICAgICAgIENDX0JZX1NBOlxuICAgICAgICAgICAgJ2h0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS97e3ZlcnNpb259fS97e2xvY2FsZX19ZGVlZC57e2xhbmd1YWdlfX0nLFxuICAgICAgICBDQ19CWV9OQzpcbiAgICAgICAgICAgICdodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMve3t2ZXJzaW9ufX0ve3tsb2NhbGV9fWRlZWQue3tsYW5ndWFnZX19JyxcbiAgICAgICAgQ0NfQllfTkNfTkQ6XG4gICAgICAgICAgICAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLW5kL3t7dmVyc2lvbn19L3t7bG9jYWxlfX1kZWVkLnt7bGFuZ3VhZ2V9fScsXG4gICAgICAgIENDX0JZX05DX1NBOlxuICAgICAgICAgICAgJ2h0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy1zYS97e3ZlcnNpb259fS97e2xvY2FsZX19ZGVlZC57e2xhbmd1YWdlfX0nLFxuICAgICAgICBDQ18wOiAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC9sZWdhbGNvZGUue3tsYW5ndWFnZX19JyxcbiAgICAgICAgUERNOiAnaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpYy1kb21haW4vcGRtLycsXG4gICAgfSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXBpSGVscGVyc1NlcnZpY2U6IEFwaUhlbHBlcnNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHJlcG9VcmxTZXJ2aWNlOiBSZXBvVXJsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBU1NFVFNfQkFTRV9QQVRIKSBwcml2YXRlIGFzc2V0c0Jhc2VQYXRoOiBzdHJpbmcsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldENvbGxlY3Rpb25TY29wZUluZm8obm9kZTogTm9kZSk6IHsgaWNvbjogc3RyaW5nOyBzY29wZU5hbWU6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBub2RlLmNvbGxlY3Rpb24gPyBub2RlLmNvbGxlY3Rpb24uc2NvcGUgOiBudWxsO1xuICAgICAgICBsZXQgaWNvbiA9ICdoZWxwJztcbiAgICAgICAgbGV0IHNjb3BlTmFtZSA9ICdVTktOT1dOJztcbiAgICAgICAgaWYgKHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9NWSkge1xuICAgICAgICAgICAgaWNvbiA9ICdsb2NrJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdNWSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX09SR0EgfHxcbiAgICAgICAgICAgIHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9DVVNUT01cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpY29uID0gJ2dyb3VwJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdTSEFSRUQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9BTEwgfHxcbiAgICAgICAgICAgIHNjb3BlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9DVVNUT01fUFVCTElDXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWNvbiA9ICdsYW5ndWFnZSc7XG4gICAgICAgICAgICBzY29wZU5hbWUgPSAnUFVCTElDJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jb2xsZWN0aW9uPy50eXBlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05UWVBFX0VESVRPUklBTCkge1xuICAgICAgICAgICAgaWNvbiA9ICdzdGFyJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdUWVBFX0VESVRPUklBTCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sbGVjdGlvbj8udHlwZSA9PT0gUmVzdENvbnN0YW50cy5DT0xMRUNUSU9OVFlQRV9NRURJQV9DRU5URVIpIHtcbiAgICAgICAgICAgIGljb24gPSAnYnVzaW5lc3MnO1xuICAgICAgICAgICAgc2NvcGVOYW1lID0gJ1RZUEVfTUVESUFfQ0VOVEVSJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBpY29uLCBzY29wZU5hbWUgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBsaWNlbnNlIGljb24gb2YgYSBub2RlXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TGljZW5zZUljb24obm9kZTogTm9kZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIHByZWZlciBtYW51YWwgbWFwcGluZyBpbnN0ZWFkIG9mIGJhY2tlbmQgZGF0YSB0byBzdXBwb3J0IGN1c3RvbSBzdGF0ZXMgZnJvbSBsb2NhbCBlZGl0c1xuICAgICAgICBjb25zdCBsaWNlbnNlID0gbm9kZS5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9MSUNFTlNFXT8uWzBdO1xuICAgICAgICBpZiAobGljZW5zZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGljZW5zZUljb25CeVN0cmluZyhsaWNlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5saWNlbnNlID8gdGhpcy5yZXBvVXJsU2VydmljZS5nZXRSZXBvVXJsKG5vZGUubGljZW5zZS5pY29uLCBub2RlKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGljZW5zZSBpY29uIGJ5IHVzaW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZSBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGljZW5zZUljb25CeVN0cmluZyhzdHJpbmc6IFN0cmluZywgdXNlTm9uZUFzRmFsbGJhY2sgPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGljb24gPSBzdHJpbmcucmVwbGFjZSgvXy9nLCAnLScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChpY29uID09ICcnKSBpY29uID0gJ25vbmUnO1xuXG4gICAgICAgIGNvbnN0IExJQ0VOU0VfSUNPTlMgPSBbXG4gICAgICAgICAgICAnY2MtMCcsXG4gICAgICAgICAgICAnY2MtYnktbmMnLFxuICAgICAgICAgICAgJ2NjLWJ5LW5jLW5kJyxcbiAgICAgICAgICAgICdjYy1ieS1uYy1zYScsXG4gICAgICAgICAgICAnY2MtYnktbmQnLFxuICAgICAgICAgICAgJ2NjLWJ5LXNhJyxcbiAgICAgICAgICAgICdjYy1ieScsXG4gICAgICAgICAgICAnY29weXJpZ2h0LWZyZWUnLFxuICAgICAgICAgICAgJ2NvcHlyaWdodC1saWNlbnNlJyxcbiAgICAgICAgICAgICdjdXN0b20nLFxuICAgICAgICAgICAgJ2VkdS1uYy1uZC1ub0RvJyxcbiAgICAgICAgICAgICdlZHUtbmMtbmQnLFxuICAgICAgICAgICAgJ2VkdS1wLW5yLW5kLW5vRG8nLFxuICAgICAgICAgICAgJ2VkdS1wLW5yLW5kJyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgICAgICdwZG0nLFxuICAgICAgICAgICAgJ3NjaHVsZnVuaycsXG4gICAgICAgICAgICAndW50ZXJyaWNodHMtdW5kLWxlaHJtZWRpZW4nLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoTElDRU5TRV9JQ09OUy5pbmRleE9mKGljb24pID09IC0xICYmICF1c2VOb25lQXNGYWxsYmFjaykgcmV0dXJuIG51bGw7IC8vIGljb249J25vbmUnO1xuICAgICAgICBpZiAoaWNvbiA9PSAnbm9uZScgJiYgIXVzZU5vbmVBc0ZhbGxiYWNrKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgIHRoaXMuYXBpSGVscGVyc1NlcnZpY2UuZ2V0U2VydmVyVXJsKCkgKyAnLy4uL2NjaW1hZ2VzL2xpY2Vuc2VzLycgKyBpY29uICsgJy5zdmcnO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB0cmFuc2xhdGVkIG5hbWUgb2YgYSBsaWNlbnNlIG5hbWUgZm9yIGEgbm9kZVxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICogQHBhcmFtIHRyYW5zbGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8YW55fHN0cmluZ3xhbnl8c3RyaW5nfGFueXxzdHJpbmd8YW55fHN0cmluZ3xhbnl8c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWNlbnNlTmFtZShub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCBwcm9wID0gbm9kZS5wcm9wZXJ0aWVzW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfTElDRU5TRV0/LlswXTtcbiAgICAgICAgaWYgKCFwcm9wKSBwcm9wID0gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpY2Vuc2VOYW1lQnlTdHJpbmcocHJvcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdHJhbnNsYXRlZCBuYW1lIGZvciBhIGxpY2Vuc2Ugc3RyaW5nXG4gICAgICogQHBhcmFtIHN0cmluZ1xuICAgICAqIEBwYXJhbSB0cmFuc2xhdGVcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWNlbnNlTmFtZUJ5U3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PSAnJykge1xuICAgICAgICAgICAgbmFtZSA9ICdOT05FJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTElDRU5TRS5OQU1FUy4nICsgbmFtZSk7XG4gICAgICAgIC8vIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZyxcIi1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBMaWNlbnNlIFVSTCAoZS5nLiBmb3IgQ0NfQlkgbGljZW5zZXMpIGZvciBhIGxpY2Vuc2Ugc3RyaW5nIGFuZCB2ZXJzaW9uXG4gICAgICogQHBhcmFtIGxpY2Vuc2VQcm9wZXJ0eVxuICAgICAqIEBwYXJhbSBsaWNlbnNlVmVyc2lvblxuICAgICAqIEBwYXJhbSBsaWNlbnNlTG9jYWxlXG4gICAgICovXG4gICAgcHVibGljIGdldExpY2Vuc2VVcmxCeVN0cmluZyhcbiAgICAgICAgbGljZW5zZVByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGxpY2Vuc2VWZXJzaW9uOiBzdHJpbmcsXG4gICAgICAgIGxpY2Vuc2VMb2NhbGU6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgaXNWNCA9IGxpY2Vuc2VWZXJzaW9uID09PSAnNC4wJztcbiAgICAgICAgY29uc3QgbG9jYWxlID0gaXNWNCB8fCAhbGljZW5zZUxvY2FsZSA/ICcnIDogbGljZW5zZUxvY2FsZS50b0xvd2VyQ2FzZSgpICsgJy8nO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLkxJQ0VOU0VfVVJMU1tsaWNlbnNlUHJvcGVydHldO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihcbiAgICAgICAgICAgIHVybFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7e3ZlcnNpb259fScsIGxpY2Vuc2VWZXJzaW9uKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7e2xvY2FsZX19JywgbG9jYWxlKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCd7e2xhbmd1YWdlfX0nLCB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyB8fCAnZW4nKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V29ya2Zsb3dTdGF0dXNCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dzID0gdGhpcy5nZXRXb3JrZmxvd3MoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93cy5maWx0ZXIoKHcpID0+IHcuaWQgPT09IGlkKT8uWzBdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0V29ya2Zsb3dTdGF0dXMobm9kZTogTm9kZSwgdXNlRnJvbUNvbmZpZyA9IGZhbHNlKTogV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uU3RhdHVzIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbm9kZS5wcm9wZXJ0aWVzW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfV0ZfU1RBVFVTXT8uWzBdO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0V29ya2Zsb3dTdGF0dXModXNlRnJvbUNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHRoaXMuZ2V0V29ya2Zsb3dTdGF0dXNCeUlkKHZhbHVlKSxcbiAgICAgICAgICAgIGluaXRpYWw6IHRoaXMuZ2V0V29ya2Zsb3dTdGF0dXNCeUlkKHZhbHVlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFdvcmtmbG93U3RhdHVzKHVzZUZyb21Db25maWcgPSBmYWxzZSk6IFdvcmtmbG93LldvcmtmbG93RGVmaW5pdGlvblN0YXR1cyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IG51bGwgYXMgV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uLFxuICAgICAgICAgICAgaW5pdGlhbDogbnVsbCBhcyBXb3JrZmxvdy5Xb3JrZmxvd0RlZmluaXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdC5pbml0aWFsID0gdGhpcy5nZXRXb3JrZmxvd3MoKVswXTtcbiAgICAgICAgbGV0IGRlZmF1bHRTdGF0dXM6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGlmICh1c2VGcm9tQ29uZmlnKSB7XG4gICAgICAgICAgICBkZWZhdWx0U3RhdHVzID0gdGhpcy5jb25maWdTZXJ2aWNlLmluc3RhbnQoJ3dvcmtmbG93LmRlZmF1bHRTdGF0dXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFN0YXR1cykge1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnQgPSB0aGlzLmdldFdvcmtmbG93cygpLmZpbmQoKHcpID0+IHcuaWQgPT09IGRlZmF1bHRTdGF0dXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmN1cnJlbnQgPSByZXN1bHQuaW5pdGlhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXRXb3JrZmxvd3MoKTogV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdTZXJ2aWNlLmluc3RhbnQoJ3dvcmtmbG93LndvcmtmbG93cycsIFtcbiAgICAgICAgICAgIFdvcmtmbG93LldPUktGTE9XX1NUQVRVU19VTkNIRUNLRUQsXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfVE9fQ0hFQ0ssXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfSEFTRkxBV1MsXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfQ0hFQ0tFRCxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNvcHlEYXRhVG9Ob2RlPFQgZXh0ZW5kcyBOb2RlIHwgVXNlcj4odGFyZ2V0OiBULCBzb3VyY2U6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnByb3BlcnRpZXMgPSBzb3VyY2UucHJvcGVydGllcztcbiAgICAgICAgKHRhcmdldCBhcyBOb2RlKS5uYW1lID0gKHNvdXJjZSBhcyBOb2RlKS5uYW1lO1xuICAgICAgICAodGFyZ2V0IGFzIE5vZGUpLnRpdGxlID0gKHNvdXJjZSBhcyBOb2RlKS50aXRsZTtcbiAgICAgICAgKHRhcmdldCBhcyBOb2RlKS5pY29uVVJMID0gKHNvdXJjZSBhcyBOb2RlKS5pY29uVVJMO1xuICAgICAgICAodGFyZ2V0IGFzIE5vZGUpLnByZXZpZXcgPSAoc291cmNlIGFzIE5vZGUpLnByZXZpZXc7XG4gICAgICAgICh0YXJnZXQgYXMgVXNlcikuYXV0aG9yaXR5TmFtZSA9IChzb3VyY2UgYXMgVXNlcikuYXV0aG9yaXR5TmFtZTtcbiAgICAgICAgKHRhcmdldCBhcyBVc2VyKS5wcm9maWxlID0gKHNvdXJjZSBhcyBVc2VyKS5wcm9maWxlO1xuICAgICAgICAodGFyZ2V0IGFzIFVzZXIpLnN0YXR1cyA9IChzb3VyY2UgYXMgVXNlcikuc3RhdHVzO1xuICAgIH1cbiAgICBpc05vZGVDb2xsZWN0aW9uKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuYXNwZWN0cz8uaW5jbHVkZXMoUmVzdENvbnN0YW50cy5DQ01fQVNQRUNUX0NPTExFQ1RJT04pIHx8ICEhbm9kZS5jb2xsZWN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0U291cmNlSWNvblBhdGgoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFzc2V0c0Jhc2VQYXRoID8/ICcnKSArICdhc3NldHMvaW1hZ2VzL3NvdXJjZXMvJyArIHNyYy50b0xvd2VyQ2FzZSgpICsgJy5wbmcnO1xuICAgIH1cblxuICAgIGdldE5vZGVMaW5rKG1vZGU6ICdyb3V0ZXJMaW5rJyB8ICdxdWVyeVBhcmFtcycsIG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlPy5yZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRhOiB7IHJvdXRlckxpbms6IHN0cmluZzsgcXVlcnlQYXJhbXM6IFBhcmFtcyB9ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNOb2RlQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBub2RlLmNvbGxlY3Rpb24/LnNjb3BlO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IG5vZGUuY29sbGVjdGlvbj8udHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IG5vZGUucmVmLmlkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05UWVBFX0VESVRPUklBTCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnNjb3BlID0gUmVzdENvbnN0YW50cy5DT0xMRUNUSU9OU0NPUEVfVFlQRV9FRElUT1JJQUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlRZUEVfTUVESUFfQ0VOVEVSKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuc2NvcGUgPSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05TQ09QRV9UWVBFX01FRElBX0NFTlRFUjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0NVU1RPTV9QVUJMSUMpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5zY29wZSA9IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0FMTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgcm91dGVyTGluazogVUlDb25zdGFudHMuUk9VVEVSX1BSRUZJWCArICdjb2xsZWN0aW9ucycsXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGF0aDtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUucHJvcGVydGllcz8uW1Jlc3RDb25zdGFudHMuQ0NNX1BST1BfRURVU0NPUEVOQU1FXT8uWzBdID09PVxuICAgICAgICAgICAgICAgICAgICBSZXN0Q29uc3RhbnRzLlNBRkVfU0NPUEVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFVJQ29uc3RhbnRzLlJPVVRFUl9QUkVGSVggKyAnd29ya3NwYWNlL3NhZmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBVSUNvbnN0YW50cy5ST1VURVJfUFJFRklYICsgJ3dvcmtzcGFjZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms6IHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlkOiBub2RlLnJlZi5pZCB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUucmVmKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUhvbWUgPSB0aGlzLm5ldHdvcmtTZXJ2aWNlLmlzRnJvbUhvbWVSZXBvc2l0b3J5KG5vZGUpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms6IFVJQ29uc3RhbnRzLlJPVVRFUl9QUkVGSVggKyAncmVuZGVyLycgKyBub2RlLnJlZi5pZCxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnk6IGZyb21Ib21lID8gbnVsbCA6IG5vZGUucmVmLnJlcG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbDogKG5vZGUgYXMgUHJvcG9zYWxOb2RlKS5wcm9wb3NhbD8ucmVmLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWxDb2xsZWN0aW9uOiAobm9kZSBhcyBQcm9wb3NhbE5vZGUpLnByb3Bvc2FsQ29sbGVjdGlvbj8ucmVmLmlkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZSA9PT0gJ3JvdXRlckxpbmsnKSB7XG4gICAgICAgICAgICByZXR1cm4gJy8nICsgZGF0YS5yb3V0ZXJMaW5rO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuZm9yY2UgY2xlYXJpbmcgb2YgcGFyYW1ldGVycyB3aGljaCBzaG91bGQgb25seSBiZSBjb25zdW1lZCBvbmNlXG4gICAgICAgIGRhdGEucXVlcnlQYXJhbXMucmVkaXJlY3RGcm9tU1NPID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGRhdGEucXVlcnlQYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhIGNvcHkgb2YgYW5vdGhlciBub2RlLCBqdXN0IHVzZWQgYXMgYSBwdWJsaXNoIHRhcmdldC5cbiAgICAgKi9cbiAgICBpc05vZGVQdWJsaXNoZWRDb3B5KG86IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhby5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9QVUJMSVNIRURfT1JJR0lOQUxdPy5bMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSByZXZva2VkIG5vZGVcbiAgICAgKiAocHVibGlzaGVkIGNvcHkgdGhhdCBoYXMgYmVlbiByZXZva2VkKVxuICAgICAqL1xuICAgIGlzTm9kZVJldm9rZWQobm9kZTogTm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZT8uYXNwZWN0cz8uaW5jbHVkZXMoUmVzdENvbnN0YW50cy5DQ01fQVNQRUNUX1JFVk9LRUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRydWUgaWYgYWxsIG5vZGVzIGhhdmUgdGhlIHJlcXVlc3RlZCByaWdodFxuICAgICAqIG1vZGUgKG9ubHkgd29ya3MgZm9yIGNvbGxlY3Rpb24gcmVmcyk6XG4gICAgICogICBMb2NhbDogY2hlY2sgb25seSByaWdodHMgb2YgdGhlIG5vZGUgaXRzZWxmXG4gICAgICogICBFZmZlY3RpdmU6IGNoZWNrIG9ubHkgcmlnaHRzIG9mIHRoZSBvcmlnaW5hbCBub2RlIHRoaXMgcmVmZXJzIHRvIChjb2xsZWN0aW9uIHJlZikuIElmIGl0IGlzIG5vdCBhIGNvbGxlY3Rpb24gcmVmLCBmYWxsYmFjayB0byBsb2NhbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb2Rlc1JpZ2h0KG5vZGVzOiBOb2RlW10sIHJpZ2h0OiBzdHJpbmcsIG1vZGUgPSBOb2Rlc1JpZ2h0TW9kZS5Mb2NhbCkge1xuICAgICAgICBpZiAobm9kZXMgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRNb2RlID0gbW9kZTtcbiAgICAgICAgICAgIC8vIGlmIG5vIGFjY2VzcyBlZmZlY3RpdmUgcHJlc2VudCBhbmQgbm90IGEgY29sbGVjdGlvbiByZWYuIHVzZSB0aGUgbG9jYWwgZGF0YVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFub2RlLmFzcGVjdHM/LmluY2x1ZGVzKFJlc3RDb25zdGFudHMuQ0NNX0FTUEVDVF9JT19SRUZFUkVOQ0UpICYmXG4gICAgICAgICAgICAgICAgIW5vZGUuYWNjZXNzRWZmZWN0aXZlPy5sZW5ndGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRNb2RlID0gTm9kZXNSaWdodE1vZGUuTG9jYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGUgPT09IE5vZGVzUmlnaHRNb2RlLkVmZmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGlmICghbm9kZS5hc3BlY3RzPy5pbmNsdWRlcyhSZXN0Q29uc3RhbnRzLkNDTV9BU1BFQ1RfSU9fUkVGRVJFTkNFKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hY2Nlc3NFZmZlY3RpdmUgJiYgbm9kZS5hY2Nlc3NFZmZlY3RpdmUuaW5kZXhPZihyaWdodCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5hY2Nlc3NFZmZlY3RpdmUgJiYgbm9kZS5hY2Nlc3NFZmZlY3RpdmUuaW5kZXhPZihyaWdodCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoUmVzdENvbnN0YW50cy5JTVBMSUNJVF9DT0xMRUNUSU9OX1BFUk1JU1NJT05TLmluZGV4T2YocmlnaHQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9uIG5vdCBtYXRjaGVkIG9uIG9yaWdpbmFsIC0+IGltcGxpY2l0IHBlcm1pc3Npb25zIGZyb20gY29sbGVjdGlvbiBtYXkgYXBwbHlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIHJlZ3VsYXIgbm9kZSByaWdodHNcbiAgICAgICAgICAgIGlmICghbm9kZS5hY2Nlc3MgfHwgbm9kZS5hY2Nlc3MuaW5kZXhPZihyaWdodCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiJdfQ==
|