@yuuvis/app-drive 0.7.3
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/README.md +47 -0
- package/esm2022/extensions/index.mjs +2 -0
- package/esm2022/extensions/lib/extensions.module.mjs +35 -0
- package/esm2022/extensions/lib/extensions.service.mjs +44 -0
- package/esm2022/extensions/lib/object-config.defaults.mjs +19 -0
- package/esm2022/extensions/yuuvis-app-drive-extensions.mjs +5 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/lib/actions/copy-link/copy-link.action.mjs +40 -0
- package/esm2022/lib/actions/index.mjs +7 -0
- package/esm2022/lib/actions/manage-versions/manage-versions.action.mjs +33 -0
- package/esm2022/lib/actions/manage-versions/manage-versions.component.mjs +105 -0
- package/esm2022/lib/actions/paste/paste.action.mjs +41 -0
- package/esm2022/lib/actions/rename/rename.action.mjs +31 -0
- package/esm2022/lib/actions/rename/rename.component.mjs +42 -0
- package/esm2022/lib/actions/rename/rename.validator.mjs +23 -0
- package/esm2022/lib/actions/updateContent/update.content.action.mjs +52 -0
- package/esm2022/lib/components/add-button/add-button-overlay/add-button-overlay.component.mjs +109 -0
- package/esm2022/lib/components/add-button/add-button.component.mjs +39 -0
- package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +74 -0
- package/esm2022/lib/components/folder-tree/folder-tree.component.mjs +89 -0
- package/esm2022/lib/components/index.mjs +10 -0
- package/esm2022/lib/components/object-name/object-name.component.mjs +60 -0
- package/esm2022/lib/components/overlay/create-folder/create-folder.component.mjs +48 -0
- package/esm2022/lib/components/paste-from-clipboard/paste-from-clipboard.component.mjs +28 -0
- package/esm2022/lib/components/ribbon/ribbon.component.mjs +102 -0
- package/esm2022/lib/components/search-filter/date-range-picker/date-range-picker.component.mjs +38 -0
- package/esm2022/lib/components/search-filter/search-filter.component.mjs +429 -0
- package/esm2022/lib/components/sort/sort.component.mjs +156 -0
- package/esm2022/lib/components/versions-list/tile/tile.component.mjs +60 -0
- package/esm2022/lib/components/versions-list/versions-list.component.mjs +94 -0
- package/esm2022/lib/container/drive/drive.component.mjs +116 -0
- package/esm2022/lib/drive.icons.mjs +16 -0
- package/esm2022/lib/drive.schema.mjs +49 -0
- package/esm2022/lib/lib.routes.mjs +17 -0
- package/esm2022/lib/pages/files/files.component.mjs +377 -0
- package/esm2022/lib/pages/object/object.component.mjs +200 -0
- package/esm2022/lib/services/drive/drive.interface.mjs +14 -0
- package/esm2022/lib/services/drive/drive.service.mjs +437 -0
- package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.mjs +158 -0
- package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.mjs +2 -0
- package/esm2022/lib/services/drive/versions/versions.mapping.mjs +42 -0
- package/esm2022/lib/services/index.mjs +5 -0
- package/esm2022/lib/services/providers/drive.providers.mjs +10 -0
- package/esm2022/lib/services/resolver/files.resolver.mjs +12 -0
- package/esm2022/lib/services/resolver/index.mjs +3 -0
- package/esm2022/lib/services/resolver/versions.route.resolver.mjs +10 -0
- package/esm2022/lib/services/stored-query/stored-query.data.mjs +25 -0
- package/esm2022/lib/services/stored-query/stored-query.interface.mjs +2 -0
- package/esm2022/lib/services/stored-query/stored-query.service.mjs +41 -0
- package/esm2022/lib/services/tokens/breadcrumb-max-depth.token.mjs +3 -0
- package/esm2022/lib/services/tokens/index.mjs +2 -0
- package/esm2022/yuuvis-app-drive.mjs +5 -0
- package/extensions/README.md +3 -0
- package/extensions/index.d.ts +1 -0
- package/extensions/lib/extensions.module.d.ts +6 -0
- package/extensions/lib/extensions.service.d.ts +7 -0
- package/extensions/lib/object-config.defaults.d.ts +2 -0
- package/fesm2022/yuuvis-app-drive-extensions.mjs +99 -0
- package/fesm2022/yuuvis-app-drive-extensions.mjs.map +1 -0
- package/fesm2022/yuuvis-app-drive.mjs +2945 -0
- package/fesm2022/yuuvis-app-drive.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/actions/copy-link/copy-link.action.d.ts +18 -0
- package/lib/actions/index.d.ts +6 -0
- package/lib/actions/manage-versions/manage-versions.action.d.ts +17 -0
- package/lib/actions/manage-versions/manage-versions.component.d.ts +32 -0
- package/lib/actions/paste/paste.action.d.ts +17 -0
- package/lib/actions/rename/rename.action.d.ts +17 -0
- package/lib/actions/rename/rename.component.d.ts +12 -0
- package/lib/actions/rename/rename.validator.d.ts +5 -0
- package/lib/actions/updateContent/update.content.action.d.ts +18 -0
- package/lib/components/add-button/add-button-overlay/add-button-overlay.component.d.ts +26 -0
- package/lib/components/add-button/add-button.component.d.ts +12 -0
- package/lib/components/breadcrumb/breadcrumb.component.d.ts +25 -0
- package/lib/components/folder-tree/folder-tree.component.d.ts +13 -0
- package/lib/components/index.d.ts +8 -0
- package/lib/components/object-name/object-name.component.d.ts +21 -0
- package/lib/components/overlay/create-folder/create-folder.component.d.ts +12 -0
- package/lib/components/paste-from-clipboard/paste-from-clipboard.component.d.ts +13 -0
- package/lib/components/ribbon/ribbon.component.d.ts +24 -0
- package/lib/components/search-filter/date-range-picker/date-range-picker.component.d.ts +13 -0
- package/lib/components/search-filter/search-filter.component.d.ts +23 -0
- package/lib/components/sort/sort.component.d.ts +31 -0
- package/lib/components/versions-list/tile/tile.component.d.ts +14 -0
- package/lib/components/versions-list/versions-list.component.d.ts +17 -0
- package/lib/container/drive/drive.component.d.ts +36 -0
- package/lib/drive.icons.d.ts +15 -0
- package/lib/drive.schema.d.ts +23 -0
- package/lib/lib.routes.d.ts +2 -0
- package/lib/pages/files/files.component.d.ts +101 -0
- package/lib/pages/object/object.component.d.ts +35 -0
- package/lib/services/drive/drive.interface.d.ts +62 -0
- package/lib/services/drive/drive.service.d.ts +64 -0
- package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.d.ts +31 -0
- package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.d.ts +8 -0
- package/lib/services/drive/versions/versions.mapping.d.ts +2 -0
- package/lib/services/index.d.ts +4 -0
- package/lib/services/providers/drive.providers.d.ts +7 -0
- package/lib/services/resolver/files.resolver.d.ts +2 -0
- package/lib/services/resolver/index.d.ts +2 -0
- package/lib/services/resolver/versions.route.resolver.d.ts +2 -0
- package/lib/services/stored-query/stored-query.data.d.ts +5 -0
- package/lib/services/stored-query/stored-query.interface.d.ts +5 -0
- package/lib/services/stored-query/stored-query.service.d.ts +10 -0
- package/lib/services/tokens/breadcrumb-max-depth.token.d.ts +2 -0
- package/lib/services/tokens/index.d.ts +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { NavigationStart, Router } from '@angular/router';
|
|
4
|
+
import { patchState, signalState } from '@ngrx/signals';
|
|
5
|
+
import { BackendService, BaseObjectTypeField, ClipboardService, ContentStreamField, DmsService, EventService, SearchService, SystemType, YuvEventType } from '@yuuvis/client-core';
|
|
6
|
+
import { ActionsService, BASE_ACTION } from '@yuuvis/client-framework/actions';
|
|
7
|
+
import { YvcOverlayService } from '@yuuvis/components/overlay';
|
|
8
|
+
import { Subject, catchError, filter, forkJoin, map, of, switchMap, tap } from 'rxjs';
|
|
9
|
+
import { ACTION_CONTEXT, APP_ID, APP_SCHEMA, FS_PROPERTIES, FS_SOTS } from '../../drive.schema';
|
|
10
|
+
import { DRIVE_APP_BREADCRUMB_MAX_DEPTH } from '../tokens';
|
|
11
|
+
import { DRIVE_ACTION_MODE, DRIVE_EVENT, DRIVE_ROOT_FOLDER_ID } from './drive.interface';
|
|
12
|
+
import { ResolveNameConflictsComponent } from './resolve-name-conflicts/resolve-name-conflicts.component';
|
|
13
|
+
import { mapSearchResult } from './versions/versions.mapping';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
export class DriveService {
|
|
16
|
+
#actionsService;
|
|
17
|
+
#eventService;
|
|
18
|
+
#router;
|
|
19
|
+
#dmsService;
|
|
20
|
+
#searchService;
|
|
21
|
+
#overlay;
|
|
22
|
+
#backend;
|
|
23
|
+
#clipboardService;
|
|
24
|
+
#eventSource;
|
|
25
|
+
#defaultSort;
|
|
26
|
+
constructor() {
|
|
27
|
+
this.#actionsService = inject(ActionsService);
|
|
28
|
+
this.#eventService = inject(EventService);
|
|
29
|
+
this.#router = inject(Router);
|
|
30
|
+
this.#dmsService = inject(DmsService);
|
|
31
|
+
this.#searchService = inject(SearchService);
|
|
32
|
+
this.#overlay = inject(YvcOverlayService);
|
|
33
|
+
this.#backend = inject(BackendService);
|
|
34
|
+
this.#clipboardService = inject(ClipboardService);
|
|
35
|
+
this.MAX_DEPTH = inject(DRIVE_APP_BREADCRUMB_MAX_DEPTH);
|
|
36
|
+
this.breadcrumbCache = new Map();
|
|
37
|
+
this.#eventSource = new Subject();
|
|
38
|
+
this.events$ = this.#eventSource.asObservable();
|
|
39
|
+
this.#defaultSort = {
|
|
40
|
+
property: FS_PROPERTIES.name,
|
|
41
|
+
order: 'asc'
|
|
42
|
+
};
|
|
43
|
+
this.initialState = {
|
|
44
|
+
currentFolder: null,
|
|
45
|
+
query: null,
|
|
46
|
+
queryTitle: null,
|
|
47
|
+
selection: [],
|
|
48
|
+
actions: [],
|
|
49
|
+
busy: false,
|
|
50
|
+
sort: this.#defaultSort,
|
|
51
|
+
breadcrumb: {
|
|
52
|
+
loading: false,
|
|
53
|
+
partial: false,
|
|
54
|
+
items: [],
|
|
55
|
+
folder: null
|
|
56
|
+
},
|
|
57
|
+
versions: {
|
|
58
|
+
versionsList: [],
|
|
59
|
+
selectedVersion: null
|
|
60
|
+
},
|
|
61
|
+
selectedDmsObject: null
|
|
62
|
+
};
|
|
63
|
+
this.state$ = signalState(this.initialState);
|
|
64
|
+
this.breadcrumbFolderPreview = this.state$.breadcrumb.folder;
|
|
65
|
+
this._busyTaskCount = 0;
|
|
66
|
+
this._defaultRibbonActions = [];
|
|
67
|
+
this.#router.events
|
|
68
|
+
.pipe(takeUntilDestroyed(), filter((e) => this.state$.selection().length > 0 && e instanceof NavigationStart))
|
|
69
|
+
// clear selection on route chnages
|
|
70
|
+
.subscribe({ next: () => this.setSelection([]) });
|
|
71
|
+
this.#eventService.on(YuvEventType.DMS_OBJECT_UPDATED).subscribe((e) => {
|
|
72
|
+
// check if current selection contains the updated object
|
|
73
|
+
const dmsObject = e.data;
|
|
74
|
+
const selection = this.state$.selection();
|
|
75
|
+
const matchIdx = selection.findIndex((o) => o.id === dmsObject.id);
|
|
76
|
+
if (matchIdx !== -1) {
|
|
77
|
+
// update the object in the selection
|
|
78
|
+
selection[matchIdx] = dmsObject;
|
|
79
|
+
patchState(this.state$, { selection: [...selection] });
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
this.#eventService
|
|
83
|
+
.on(YuvEventType.DMS_OBJECT_DELETED, YuvEventType.DMS_OBJECT_CREATED, YuvEventType.DMS_OBJECTS_MOVED)
|
|
84
|
+
.subscribe(() => this.emitEvent(DRIVE_EVENT.refresh));
|
|
85
|
+
}
|
|
86
|
+
#mapedCurrentFolder() {
|
|
87
|
+
return this.state$.currentFolder() === DRIVE_ROOT_FOLDER_ID ? null : this.state$.currentFolder();
|
|
88
|
+
}
|
|
89
|
+
emitEvent(evt) {
|
|
90
|
+
this.#eventSource.next(evt);
|
|
91
|
+
}
|
|
92
|
+
setBusy(busy) {
|
|
93
|
+
if (busy)
|
|
94
|
+
this._busyTaskCount++;
|
|
95
|
+
else if (this._busyTaskCount > 0)
|
|
96
|
+
this._busyTaskCount--;
|
|
97
|
+
patchState(this.state$, { busy: this._busyTaskCount !== 0 });
|
|
98
|
+
}
|
|
99
|
+
setSelection(o) {
|
|
100
|
+
patchState(this.state$, { selection: o });
|
|
101
|
+
this._getActions();
|
|
102
|
+
}
|
|
103
|
+
updateQuery(query, queryTitle = null) {
|
|
104
|
+
patchState(this.state$, {
|
|
105
|
+
query: this.applyFolderListSearchConditions(query),
|
|
106
|
+
queryTitle: queryTitle
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
setSort(property, order) {
|
|
110
|
+
const stateQuery = this.state$.query();
|
|
111
|
+
if (stateQuery) {
|
|
112
|
+
const clonedQueryState = structuredClone(stateQuery);
|
|
113
|
+
// TODO: remove if folders should stay on top
|
|
114
|
+
clonedQueryState.sort = [];
|
|
115
|
+
const sort = property ? { property, order } : { ...this.#defaultSort, order };
|
|
116
|
+
patchState(this.state$, { query: clonedQueryState, sort });
|
|
117
|
+
this.applyFolderListSearchConditions(clonedQueryState, !property);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
updateCurrentFolder(currentFolderID) {
|
|
121
|
+
patchState(this.state$, { currentFolder: currentFolderID || null });
|
|
122
|
+
}
|
|
123
|
+
#copyToFolder(objects, folderId, options, validateNames = true) {
|
|
124
|
+
return validateNames
|
|
125
|
+
? this.validateNames(objects.filter((o) => o.sots.includes(FS_SOTS.object)).map((f) => f.data[FS_PROPERTIES.name]), folderId).pipe(switchMap((res) => {
|
|
126
|
+
if (res.existingFileNames?.length || res.invalidFileNames?.length) {
|
|
127
|
+
this.#resolveNameConflicts({
|
|
128
|
+
existingFileNames: res.existingFileNames,
|
|
129
|
+
invalidFileNames: res.invalidFileNames,
|
|
130
|
+
mode: 'copy',
|
|
131
|
+
items: objects
|
|
132
|
+
});
|
|
133
|
+
return of([]);
|
|
134
|
+
}
|
|
135
|
+
else
|
|
136
|
+
return this.#dmsService.copyDmsObjects(folderId, objects, options);
|
|
137
|
+
}))
|
|
138
|
+
: this.#dmsService.copyDmsObjects(folderId, objects, options);
|
|
139
|
+
}
|
|
140
|
+
#moveToFolder(objects, folderId, options, validateNames = true) {
|
|
141
|
+
return validateNames
|
|
142
|
+
? this.validateNames(objects.filter((o) => o.sots.includes(FS_SOTS.object)).map((f) => f.data[FS_PROPERTIES.name]), folderId).pipe(switchMap((res) => {
|
|
143
|
+
if (res.existingFileNames?.length || res.invalidFileNames?.length) {
|
|
144
|
+
console.log('VALIDATION: ', { res });
|
|
145
|
+
this.#resolveNameConflicts({
|
|
146
|
+
existingFileNames: res.existingFileNames,
|
|
147
|
+
invalidFileNames: res.invalidFileNames,
|
|
148
|
+
mode: 'move',
|
|
149
|
+
items: objects
|
|
150
|
+
});
|
|
151
|
+
return of([]);
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
return this.#dmsService.moveDmsObjects(folderId, objects, options);
|
|
155
|
+
}))
|
|
156
|
+
: this.#dmsService.moveDmsObjects(folderId, objects, options);
|
|
157
|
+
}
|
|
158
|
+
copyToCurrentFolder(objects, validateNames = true) {
|
|
159
|
+
const options = { waitForSearchConsistency: true };
|
|
160
|
+
return this.#copyToFolder(objects, this.#mapedCurrentFolder(), options, validateNames);
|
|
161
|
+
}
|
|
162
|
+
moveToCurrentFolder(objects, validateNames = true) {
|
|
163
|
+
const options = { waitForSearchConsistency: true };
|
|
164
|
+
return this.#moveToFolder(objects, this.#mapedCurrentFolder(), options, validateNames);
|
|
165
|
+
}
|
|
166
|
+
#resolveNameConflicts(payload) {
|
|
167
|
+
this.#overlay.open(ResolveNameConflictsComponent, payload, {
|
|
168
|
+
maxWidth: '400px'
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
pasteFromClipboard(destinationObject) {
|
|
172
|
+
const cd = this.#clipboardService.getClipboardData(APP_ID);
|
|
173
|
+
const destination = destinationObject?.isFolder ? destinationObject.id : this.#mapedCurrentFolder();
|
|
174
|
+
return (cd && cd.objects && cd.objects.length > 0
|
|
175
|
+
? cd?.mode === DRIVE_ACTION_MODE.CUT
|
|
176
|
+
? this.#moveToFolder(cd.objects || [], destination, { waitForSearchConsistency: true }, true)
|
|
177
|
+
: cd?.mode === DRIVE_ACTION_MODE.COPY
|
|
178
|
+
? this.#copyToFolder(cd.objects || [], destination, { waitForSearchConsistency: true }, true)
|
|
179
|
+
: of(null)
|
|
180
|
+
: of(null)).pipe(tap((res) => {
|
|
181
|
+
res && this.emitEvent(DRIVE_EVENT.refresh);
|
|
182
|
+
this.#clipboardService.clear();
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
checkNamesAndUpload(files, data) {
|
|
186
|
+
return this.validateNames(files.map((f) => f.name), this.#mapedCurrentFolder()).pipe(switchMap((res) => {
|
|
187
|
+
if (res.existingFileNames?.length || res.invalidFileNames?.length) {
|
|
188
|
+
const resPayload = {
|
|
189
|
+
existingFileNames: res.existingFileNames,
|
|
190
|
+
invalidFileNames: res.invalidFileNames,
|
|
191
|
+
mode: 'upload',
|
|
192
|
+
items: files,
|
|
193
|
+
data
|
|
194
|
+
};
|
|
195
|
+
this.#overlay.open(ResolveNameConflictsComponent, resPayload);
|
|
196
|
+
return of([]);
|
|
197
|
+
}
|
|
198
|
+
else
|
|
199
|
+
return this.upload(files, data);
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
uploadContent(objectId, file) {
|
|
203
|
+
return this.#dmsService.uploadContent(objectId, file);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Uploads files to the current folder
|
|
207
|
+
* @param files files to be uploaded
|
|
208
|
+
* @param data additional data to be applied to the object
|
|
209
|
+
*/
|
|
210
|
+
upload(files, data) {
|
|
211
|
+
return forkJoin(files.map((file) => {
|
|
212
|
+
const uploadData = data || {};
|
|
213
|
+
// apply filesystem SOT
|
|
214
|
+
const sots = uploadData[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
|
|
215
|
+
uploadData[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, FS_SOTS.object];
|
|
216
|
+
// setup the name to be the filename
|
|
217
|
+
uploadData[FS_PROPERTIES.name] = file.name;
|
|
218
|
+
const cf = this.#mapedCurrentFolder();
|
|
219
|
+
if (cf && cf !== DRIVE_ROOT_FOLDER_ID)
|
|
220
|
+
uploadData[BaseObjectTypeField.PARENT_ID] = cf;
|
|
221
|
+
return this.#dmsService.createDmsObject(SystemType.DOCUMENT, uploadData, [file], file.name).pipe(map((res) => ({ id: res[0] })), catchError((e) => of({ error: this.#mapCreateError(e) })));
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
createFolder(name) {
|
|
225
|
+
const parentID = this.#mapedCurrentFolder();
|
|
226
|
+
const data = {};
|
|
227
|
+
data[FS_PROPERTIES.name] = name;
|
|
228
|
+
// apply filesystem SOT
|
|
229
|
+
data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [FS_SOTS.object];
|
|
230
|
+
if (parentID && parentID !== DRIVE_ROOT_FOLDER_ID)
|
|
231
|
+
data[BaseObjectTypeField.PARENT_ID] = parentID;
|
|
232
|
+
return this.#dmsService.createDmsObject(APP_SCHEMA.types.folder.objectType || '', data, []).pipe(map((res) => ({ id: res[0] })), catchError((e) => of({ error: this.#mapCreateError(e) })));
|
|
233
|
+
}
|
|
234
|
+
#mapCreateError(e) {
|
|
235
|
+
let error = 'default';
|
|
236
|
+
const ec = e.error.serviceErrorCode;
|
|
237
|
+
if (ec === 99999) {
|
|
238
|
+
const iec = e.error.innerError?.serviceErrorCode;
|
|
239
|
+
if (iec === 11000)
|
|
240
|
+
error = 'nameExists';
|
|
241
|
+
}
|
|
242
|
+
return error;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Checks for existing names and invalid characters
|
|
246
|
+
* @param name The name to be checked
|
|
247
|
+
* @param parentId The parent folder (will be 'root' if not provided)
|
|
248
|
+
* @returns already existing names
|
|
249
|
+
*/
|
|
250
|
+
validateNames(names, parentId) {
|
|
251
|
+
console.log({ names, parentId });
|
|
252
|
+
if (parentId === DRIVE_ROOT_FOLDER_ID)
|
|
253
|
+
parentId = undefined;
|
|
254
|
+
const dvp = {
|
|
255
|
+
app: 'osdrive',
|
|
256
|
+
fileNames: names,
|
|
257
|
+
targetFolderId: parentId || undefined
|
|
258
|
+
};
|
|
259
|
+
return this.#backend.post('/dms/objects/validate', dvp).pipe(catchError((res) => of(res.error)));
|
|
260
|
+
}
|
|
261
|
+
getDefaultRibbonActions() {
|
|
262
|
+
if (!this._defaultRibbonActions.length) {
|
|
263
|
+
//[BASE_ACTION.download, BASE_ACTION.delete, 'app.drive.action.rename', BASE_ACTION.copy, BASE_ACTION.cut]
|
|
264
|
+
Object.values({ ...BASE_ACTION, rename: 'app.drive.action.rename' }).forEach((id) => {
|
|
265
|
+
const a = this.#actionsService.getActionById(id, ACTION_CONTEXT);
|
|
266
|
+
if (a)
|
|
267
|
+
this._defaultRibbonActions.push(a);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return this._defaultRibbonActions;
|
|
271
|
+
}
|
|
272
|
+
_getActions() {
|
|
273
|
+
this.setBusy(true);
|
|
274
|
+
this.#actionsService
|
|
275
|
+
.getActions(this.state$.selection(), {
|
|
276
|
+
context: ACTION_CONTEXT
|
|
277
|
+
})
|
|
278
|
+
.subscribe((actions) => {
|
|
279
|
+
patchState(this.state$, { actions });
|
|
280
|
+
})
|
|
281
|
+
.add(() => this.setBusy(false));
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Apply search conditions regarding folder listings
|
|
285
|
+
* @param q
|
|
286
|
+
*/
|
|
287
|
+
applyFolderListSearchConditions(q, addBaseTypeId = true) {
|
|
288
|
+
// folders first
|
|
289
|
+
if (!q.sort)
|
|
290
|
+
q.sort = [];
|
|
291
|
+
addBaseTypeId &&
|
|
292
|
+
q.sort.push({
|
|
293
|
+
field: BaseObjectTypeField.BASE_TYPE_ID,
|
|
294
|
+
order: 'desc'
|
|
295
|
+
});
|
|
296
|
+
q = this.applyBasicSearchConditions(q);
|
|
297
|
+
return q;
|
|
298
|
+
}
|
|
299
|
+
applyBasicSearchConditions(q) {
|
|
300
|
+
q.fields = [
|
|
301
|
+
BaseObjectTypeField.OBJECT_ID,
|
|
302
|
+
BaseObjectTypeField.MODIFICATION_DATE,
|
|
303
|
+
BaseObjectTypeField.MODIFIED_BY,
|
|
304
|
+
ContentStreamField.FILENAME,
|
|
305
|
+
ContentStreamField.MIME_TYPE,
|
|
306
|
+
ContentStreamField.ID,
|
|
307
|
+
ContentStreamField.LENGTH
|
|
308
|
+
];
|
|
309
|
+
if (!q.types || !q.types.includes(FS_SOTS.object))
|
|
310
|
+
q.types = [...(q.types || []), FS_SOTS.object];
|
|
311
|
+
// q.sortOptions.push(new SortOption(BaseObjectTypeField.BASE_TYPE_ID, 'desc'));
|
|
312
|
+
const sort = this.state$.sort() || this.#defaultSort;
|
|
313
|
+
if (!q.sort)
|
|
314
|
+
q.sort = [];
|
|
315
|
+
q.sort.push({
|
|
316
|
+
field: sort.property,
|
|
317
|
+
order: sort.order
|
|
318
|
+
});
|
|
319
|
+
q.includePermissions = true;
|
|
320
|
+
// new SortOption(sort.property, sort.order));
|
|
321
|
+
return q;
|
|
322
|
+
}
|
|
323
|
+
resolveFilesState(id) {
|
|
324
|
+
return this.getFolderHierarchy(id);
|
|
325
|
+
}
|
|
326
|
+
getFolderHierarchy(folderId) {
|
|
327
|
+
patchState(this.state$, {
|
|
328
|
+
breadcrumb: {
|
|
329
|
+
...this.initialState.breadcrumb,
|
|
330
|
+
loading: true
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
return folderId === DRIVE_ROOT_FOLDER_ID
|
|
334
|
+
? of([])
|
|
335
|
+
: this.#fetchFolder(folderId, 0, this.MAX_DEPTH).pipe(tap((res) => {
|
|
336
|
+
let items = [];
|
|
337
|
+
if (res.items.length > 0) {
|
|
338
|
+
items = [...items, ...res.items];
|
|
339
|
+
}
|
|
340
|
+
patchState(this.state$, {
|
|
341
|
+
breadcrumb: {
|
|
342
|
+
...this.initialState.breadcrumb,
|
|
343
|
+
partial: res.partial,
|
|
344
|
+
loading: false,
|
|
345
|
+
items
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
}), map((res) => res.items));
|
|
349
|
+
}
|
|
350
|
+
#fetchFolder(folderId, depth, maxDepth) {
|
|
351
|
+
if (depth >= maxDepth)
|
|
352
|
+
return of({ partial: true, items: [] });
|
|
353
|
+
const cachedFolder = this.breadcrumbCache.get(folderId);
|
|
354
|
+
if (cachedFolder) {
|
|
355
|
+
return cachedFolder.parentId
|
|
356
|
+
? this.#fetchFolder(cachedFolder.parentId, depth + 1, maxDepth).pipe(map((parentFolders) => ({
|
|
357
|
+
partial: parentFolders.partial,
|
|
358
|
+
items: [...parentFolders.items, { name: cachedFolder.name, id: cachedFolder.id }]
|
|
359
|
+
})))
|
|
360
|
+
: of({
|
|
361
|
+
partial: false,
|
|
362
|
+
items: [{ name: cachedFolder.name, id: cachedFolder.id }]
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return this.#dmsService.getDmsObject(folderId).pipe(map((folder) => {
|
|
366
|
+
const currentFolder = {
|
|
367
|
+
name: folder.data[FS_PROPERTIES.name],
|
|
368
|
+
id: folder.data[BaseObjectTypeField.OBJECT_ID],
|
|
369
|
+
parentId: folder.parentId
|
|
370
|
+
};
|
|
371
|
+
// this.breadcrumbCache.set(folder.id, currentFolder);
|
|
372
|
+
return currentFolder;
|
|
373
|
+
}), switchMap((folder) => {
|
|
374
|
+
if (!folder.parentId) {
|
|
375
|
+
return of({
|
|
376
|
+
partial: false,
|
|
377
|
+
items: [{ name: folder.name, id: folder.id }]
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
return this.#fetchFolder(folder.parentId, depth + 1, maxDepth).pipe(map((parentFolders) => ({
|
|
381
|
+
partial: parentFolders.partial,
|
|
382
|
+
items: [...parentFolders.items, { name: folder.name, id: folder.id }]
|
|
383
|
+
})));
|
|
384
|
+
}));
|
|
385
|
+
}
|
|
386
|
+
getVersions(id) {
|
|
387
|
+
patchState(this.state$, { busy: true });
|
|
388
|
+
return this.#dmsService.getDmsObjectVersions(id).pipe(tap((versions) => {
|
|
389
|
+
patchState(this.state$, {
|
|
390
|
+
busy: false,
|
|
391
|
+
versions: {
|
|
392
|
+
versionsList: mapSearchResult(versions),
|
|
393
|
+
selectedVersion: this.state$.versions().selectedVersion
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}));
|
|
397
|
+
}
|
|
398
|
+
getSelectedDmsObject(id) {
|
|
399
|
+
return this.#dmsService.getDmsObject(id).pipe(tap((dmsObject) => patchState(this.state$, {
|
|
400
|
+
selectedDmsObject: dmsObject,
|
|
401
|
+
versions: {
|
|
402
|
+
versionsList: this.state$.versions.versionsList(),
|
|
403
|
+
selectedVersion: [dmsObject]
|
|
404
|
+
}
|
|
405
|
+
})));
|
|
406
|
+
}
|
|
407
|
+
setSelectedVersion(version) {
|
|
408
|
+
this.setBusy(true);
|
|
409
|
+
return this.#dmsService.getDmsObjectVersion(version.dmsObject.id, version.dmsObject.version).pipe(tap((res) => patchState(this.state$, {
|
|
410
|
+
versions: {
|
|
411
|
+
versionsList: this.state$.versions.versionsList(),
|
|
412
|
+
selectedVersion: [res]
|
|
413
|
+
}
|
|
414
|
+
})), tap(() => this.setBusy(false)));
|
|
415
|
+
}
|
|
416
|
+
setNewVersion(version) {
|
|
417
|
+
patchState(this.state$, { busy: true });
|
|
418
|
+
const selectedVersion = this.state$.versions.selectedVersion();
|
|
419
|
+
if (selectedVersion) {
|
|
420
|
+
const versionNumber = version ?? selectedVersion[0].version;
|
|
421
|
+
return this.#dmsService.restoreDmsObject(selectedVersion[0].id, versionNumber).pipe(switchMap((object) => this.getVersions(object.id)));
|
|
422
|
+
}
|
|
423
|
+
return of(null);
|
|
424
|
+
}
|
|
425
|
+
clearVersions() {
|
|
426
|
+
patchState(this.state$, { versions: this.initialState.versions });
|
|
427
|
+
}
|
|
428
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DriveService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
429
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DriveService, providedIn: 'root' }); }
|
|
430
|
+
}
|
|
431
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DriveService, decorators: [{
|
|
432
|
+
type: Injectable,
|
|
433
|
+
args: [{
|
|
434
|
+
providedIn: 'root'
|
|
435
|
+
}]
|
|
436
|
+
}], ctorParameters: () => [] });
|
|
437
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBwcy9kcml2ZS9zcmMvbGliL3NlcnZpY2VzL2RyaXZlL2RyaXZlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLFVBQVUsRUFDVixZQUFZLEVBRVosYUFBYSxFQUNiLFVBQVUsRUFFVixZQUFZLEVBQ2IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQVUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNELE9BQU8sRUFJTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLG9CQUFvQixFQUlyQixNQUFNLG1CQUFt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Q3BFLENBQUM7K0dBOWVVLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IHBhdGNoU3RhdGUsIHNpZ25hbFN0YXRlIH0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5pbXBvcnQge1xuICBCYWNrZW5kU2VydmljZSxcbiAgQmFzZU9iamVjdFR5cGVGaWVsZCxcbiAgQ2xpcGJvYXJkU2VydmljZSxcbiAgQ29udGVudFN0cmVhbUZpZWxkLFxuICBEbXNPYmplY3QsXG4gIERtc1NlcnZpY2UsXG4gIEV2ZW50U2VydmljZSxcbiAgU2VhcmNoUXVlcnksXG4gIFNlYXJjaFNlcnZpY2UsXG4gIFN5c3RlbVR5cGUsXG4gIFl1dkV2ZW50LFxuICBZdXZFdmVudFR5cGVcbn0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBBY3Rpb24sIEFjdGlvbnNTZXJ2aWNlLCBCQVNFX0FDVElPTiB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9hY3Rpb25zJztcbmltcG9ydCB7IFl2Y092ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL292ZXJsYXknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgZmlsdGVyLCBmb3JrSm9pbiwgbWFwLCBvZiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFDVElPTl9DT05URVhULCBBUFBfSUQsIEFQUF9TQ0hFTUEsIEZTX1BST1BFUlRJRVMsIEZTX1NPVFMgfSBmcm9tICcuLi8uLi9kcml2ZS5zY2hlbWEnO1xuaW1wb3J0IHsgRFJJVkVfQVBQX0JSRUFEQ1JVTUJfTUFYX0RFUFRIIH0gZnJvbSAnLi4vdG9rZW5zJztcbmltcG9ydCB7XG4gIEJyZWFkQ3J1bWIsXG4gIENyZWF0ZUVycm9yLFxuICBDcmVhdGVSZXN1bHQsXG4gIERSSVZFX0FDVElPTl9NT0RFLFxuICBEUklWRV9FVkVOVCxcbiAgRFJJVkVfUk9PVF9GT0xERVJfSUQsXG4gIERyaXZlU3RhdGUsXG4gIERyaXZlVmFsaWRhdGVQYXlsb2FkLFxuICBEcml2ZVZhbGlkYXRlUmVzcG9uc2Vcbn0gZnJvbSAnLi9kcml2ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVzb2x2ZU5hbWVDb25mbGljdHNDb21wb25lbnQgfSBmcm9tICcuL3Jlc29sdmUtbmFtZS1jb25mbGljdHMvcmVzb2x2ZS1uYW1lLWNvbmZsaWN0cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVzb2x2ZU5hbWVDb25mbGljdHNQYXlsb2FkIH0gZnJvbSAnLi9yZXNvbHZlLW5hbWUtY29uZmxpY3RzL3Jlc29sdmUtbmFtZS1jb25mbGljdHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IG1hcFNlYXJjaFJlc3VsdCB9IGZyb20gJy4vdmVyc2lvbnMvdmVyc2lvbnMubWFwcGluZyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERyaXZlU2VydmljZSB7XG4gIHJlYWRvbmx5ICNhY3Rpb25zU2VydmljZSA9IGluamVjdChBY3Rpb25zU2VydmljZSk7XG4gIHJlYWRvbmx5ICNldmVudFNlcnZpY2UgPSBpbmplY3QoRXZlbnRTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICByZWFkb25seSAjZG1zU2VydmljZSA9IGluamVjdChEbXNTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3NlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gIHJlYWRvbmx5ICNvdmVybGF5ID0gaW5qZWN0KFl2Y092ZXJsYXlTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2JhY2tlbmQgPSBpbmplY3QoQmFja2VuZFNlcnZpY2UpO1xuICByZWFkb25seSAjY2xpcGJvYXJkU2VydmljZSA9IGluamVjdChDbGlwYm9hcmRTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9ERVBUSDogbnVtYmVyID0gaW5qZWN0KERSSVZFX0FQUF9CUkVBRENSVU1CX01BWF9ERVBUSCk7XG4gIHByaXZhdGUgYnJlYWRjcnVtYkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nOyBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCB9PigpO1xuXG4gICNldmVudFNvdXJjZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXZlbnRzJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy4jZXZlbnRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcmVhZG9ubHkgI2RlZmF1bHRTb3J0OiB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcmRlcjogJ2FzYycgfCAnZGVzYyc7XG4gIH0gPSB7XG4gICAgcHJvcGVydHk6IEZTX1BST1BFUlRJRVMubmFtZSxcbiAgICBvcmRlcjogJ2FzYydcbiAgfTtcblxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IERyaXZlU3RhdGUgPSB7XG4gICAgY3VycmVudEZvbGRlcjogbnVsbCxcbiAgICBxdWVyeTogbnVsbCxcbiAgICBxdWVyeVRpdGxlOiBudWxsLFxuICAgIHNlbGVjdGlvbjogW10sXG4gICAgYWN0aW9uczogW10sXG4gICAgYnVzeTogZmFsc2UsXG4gICAgc29ydDogdGhpcy4jZGVmYXVsdFNvcnQsXG4gICAgYnJlYWRjcnVtYjoge1xuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIGZvbGRlcjogbnVsbFxuICAgIH0sXG4gICAgdmVyc2lvbnM6IHtcbiAgICAgIHZlcnNpb25zTGlzdDogW10sXG4gICAgICBzZWxlY3RlZFZlcnNpb246IG51bGxcbiAgICB9LFxuICAgIHNlbGVjdGVkRG1zT2JqZWN0OiBudWxsXG4gIH07XG5cbiAgcmVhZG9ubHkgc3RhdGUkID0gc2lnbmFsU3RhdGU8RHJpdmVTdGF0ZT4odGhpcy5pbml0aWFsU3RhdGUpO1xuICByZWFkb25seSBicmVhZGNydW1iRm9sZGVyUHJldmlldyA9IHRoaXMuc3RhdGUkLmJyZWFkY3J1bWIuZm9sZGVyO1xuICBwcml2YXRlIF9idXN5VGFza0NvdW50ID0gMDtcbiAgcHJpdmF0ZSBfZGVmYXVsdFJpYmJvbkFjdGlvbnM6IEFjdGlvbltdID0gW107XG4gIGxhc3RSb3V0ZVVSTD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNyb3V0ZXIuZXZlbnRzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIGZpbHRlcigoZSkgPT4gdGhpcy5zdGF0ZSQuc2VsZWN0aW9uKCkubGVuZ3RoID4gMCAmJiBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KVxuICAgICAgKVxuICAgICAgLy8gY2xlYXIgc2VsZWN0aW9uIG9uIHJvdXRlIGNobmFnZXNcbiAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAoKSA9PiB0aGlzLnNldFNlbGVjdGlvbihbXSkgfSk7XG5cbiAgICB0aGlzLiNldmVudFNlcnZpY2Uub24oWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCkuc3Vic2NyaWJlKChlOiBZdXZFdmVudCkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgY3VycmVudCBzZWxlY3Rpb24gY29udGFpbnMgdGhlIHVwZGF0ZWQgb2JqZWN0XG4gICAgICBjb25zdCBkbXNPYmplY3QgPSBlLmRhdGEgYXMgRG1zT2JqZWN0O1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zdGF0ZSQuc2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCBtYXRjaElkeCA9IHNlbGVjdGlvbi5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGRtc09iamVjdC5pZCk7XG4gICAgICBpZiAobWF0Y2hJZHggIT09IC0xKSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgb2JqZWN0IGluIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgc2VsZWN0aW9uW21hdGNoSWR4XSA9IGRtc09iamVjdDtcbiAgICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBzZWxlY3Rpb246IFsuLi5zZWxlY3Rpb25dIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy4jZXZlbnRTZXJ2aWNlXG4gICAgICAub24oWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfREVMRVRFRCwgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfQ1JFQVRFRCwgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RTX01PVkVEKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmVtaXRFdmVudChEUklWRV9FVkVOVC5yZWZyZXNoKSk7XG4gIH1cblxuICAjbWFwZWRDdXJyZW50Rm9sZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlJC5jdXJyZW50Rm9sZGVyKCkgPT09IERSSVZFX1JPT1RfRk9MREVSX0lEID8gbnVsbCA6IHRoaXMuc3RhdGUkLmN1cnJlbnRGb2xkZXIoKTtcbiAgfVxuXG4gIGVtaXRFdmVudChldnQ6IHN0cmluZykge1xuICAgIHRoaXMuI2V2ZW50U291cmNlLm5leHQoZXZ0KTtcbiAgfVxuXG4gIHNldEJ1c3koYnVzeTogYm9vbGVhbikge1xuICAgIGlmIChidXN5KSB0aGlzLl9idXN5VGFza0NvdW50Kys7XG4gICAgZWxzZSBpZiAodGhpcy5fYnVzeVRhc2tDb3VudCA+IDApIHRoaXMuX2J1c3lUYXNrQ291bnQtLTtcbiAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7IGJ1c3k6IHRoaXMuX2J1c3lUYXNrQ291bnQgIT09IDAgfSk7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24obzogRG1zT2JqZWN0W10pIHtcbiAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7IHNlbGVjdGlvbjogbyB9KTtcbiAgICB0aGlzLl9nZXRBY3Rpb25zKCk7XG4gIH1cblxuICB1cGRhdGVRdWVyeShxdWVyeTogU2VhcmNoUXVlcnksIHF1ZXJ5VGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwge1xuICAgICAgcXVlcnk6IHRoaXMuYXBwbHlGb2xkZXJMaXN0U2VhcmNoQ29uZGl0aW9ucyhxdWVyeSksXG4gICAgICBxdWVyeVRpdGxlOiBxdWVyeVRpdGxlXG4gICAgfSk7XG4gIH1cblxuICBzZXRTb3J0KHByb3BlcnR5OiBzdHJpbmcsIG9yZGVyOiAnYXNjJyB8ICdkZXNjJykge1xuICAgIGNvbnN0IHN0YXRlUXVlcnkgPSB0aGlzLnN0YXRlJC5xdWVyeSgpO1xuICAgIGlmIChzdGF0ZVF1ZXJ5KSB7XG4gICAgICBjb25zdCBjbG9uZWRRdWVyeVN0YXRlID0gc3RydWN0dXJlZENsb25lKHN0YXRlUXVlcnkpO1xuXG4gICAgICAvLyBUT0RPOiByZW1vdmUgaWYgZm9sZGVycyBzaG91bGQgc3RheSBvbiB0b3BcbiAgICAgIGNsb25lZFF1ZXJ5U3RhdGUuc29ydCA9IFtdO1xuXG4gICAgICBjb25zdCBzb3J0ID0gcHJvcGVydHkgPyB7IHByb3BlcnR5LCBvcmRlciB9IDogeyAuLi50aGlzLiNkZWZhdWx0U29ydCwgb3JkZXIgfTtcblxuICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBxdWVyeTogY2xvbmVkUXVlcnlTdGF0ZSwgc29ydCB9KTtcbiAgICAgIHRoaXMuYXBwbHlGb2xkZXJMaXN0U2VhcmNoQ29uZGl0aW9ucyhjbG9uZWRRdWVyeVN0YXRlLCAhcHJvcGVydHkpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUN1cnJlbnRGb2xkZXIoY3VycmVudEZvbGRlcklEOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBjdXJyZW50Rm9sZGVyOiBjdXJyZW50Rm9sZGVySUQgfHwgbnVsbCB9KTtcbiAgfVxuXG4gICNjb3B5VG9Gb2xkZXIob2JqZWN0czogRG1zT2JqZWN0W10sIGZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zOiB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogYm9vbGVhbiB9LCB2YWxpZGF0ZU5hbWVzID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlTmFtZXNcbiAgICAgID8gdGhpcy52YWxpZGF0ZU5hbWVzKFxuICAgICAgICAgIG9iamVjdHMuZmlsdGVyKChvKSA9PiBvLnNvdHMuaW5jbHVkZXMoRlNfU09UUy5vYmplY3QpKS5tYXAoKGYpID0+IGYuZGF0YVtGU19QUk9QRVJUSUVTLm5hbWVdIGFzIHN0cmluZyksXG4gICAgICAgICAgZm9sZGVySWRcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzOiBEcml2ZVZhbGlkYXRlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuZXhpc3RpbmdGaWxlTmFtZXM/Lmxlbmd0aCB8fCByZXMuaW52YWxpZEZpbGVOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuI3Jlc29sdmVOYW1lQ29uZmxpY3RzKHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpbGVOYW1lczogcmVzLmV4aXN0aW5nRmlsZU5hbWVzLFxuICAgICAgICAgICAgICAgIGludmFsaWRGaWxlTmFtZXM6IHJlcy5pbnZhbGlkRmlsZU5hbWVzLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdjb3B5JyxcbiAgICAgICAgICAgICAgICBpdGVtczogb2JqZWN0c1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gdGhpcy4jZG1zU2VydmljZS5jb3B5RG1zT2JqZWN0cyhmb2xkZXJJZCwgb2JqZWN0cywgb3B0aW9ucyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLiNkbXNTZXJ2aWNlLmNvcHlEbXNPYmplY3RzKGZvbGRlcklkLCBvYmplY3RzLCBvcHRpb25zKTtcbiAgfVxuXG4gICNtb3ZlVG9Gb2xkZXIob2JqZWN0czogRG1zT2JqZWN0W10sIGZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zOiB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogYm9vbGVhbiB9LCB2YWxpZGF0ZU5hbWVzID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlTmFtZXNcbiAgICAgID8gdGhpcy52YWxpZGF0ZU5hbWVzKFxuICAgICAgICAgIG9iamVjdHMuZmlsdGVyKChvKSA9PiBvLnNvdHMuaW5jbHVkZXMoRlNfU09UUy5vYmplY3QpKS5tYXAoKGYpID0+IGYuZGF0YVtGU19QUk9QRVJUSUVTLm5hbWVdIGFzIHN0cmluZyksXG4gICAgICAgICAgZm9sZGVySWRcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzOiBEcml2ZVZhbGlkYXRlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuZXhpc3RpbmdGaWxlTmFtZXM/Lmxlbmd0aCB8fCByZXMuaW52YWxpZEZpbGVOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWQUxJREFUSU9OOiAnLCB7IHJlcyB9KTtcbiAgICAgICAgICAgICAgdGhpcy4jcmVzb2x2ZU5hbWVDb25mbGljdHMoe1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nRmlsZU5hbWVzOiByZXMuZXhpc3RpbmdGaWxlTmFtZXMsXG4gICAgICAgICAgICAgICAgaW52YWxpZEZpbGVOYW1lczogcmVzLmludmFsaWRGaWxlTmFtZXMsXG4gICAgICAgICAgICAgICAgbW9kZTogJ21vdmUnLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBvYmplY3RzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgfSBlbHNlIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLm1vdmVEbXNPYmplY3RzKGZvbGRlcklkLCBvYmplY3RzLCBvcHRpb25zKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICA6IHRoaXMuI2Rtc1NlcnZpY2UubW92ZURtc09iamVjdHMoZm9sZGVySWQsIG9iamVjdHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29weVRvQ3VycmVudEZvbGRlcihvYmplY3RzOiBEbXNPYmplY3RbXSwgdmFsaWRhdGVOYW1lcyA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9O1xuICAgIHJldHVybiB0aGlzLiNjb3B5VG9Gb2xkZXIob2JqZWN0cywgdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKCksIG9wdGlvbnMsIHZhbGlkYXRlTmFtZXMpO1xuICB9XG5cbiAgbW92ZVRvQ3VycmVudEZvbGRlcihvYmplY3RzOiBEbXNPYmplY3RbXSwgdmFsaWRhdGVOYW1lcyA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9O1xuICAgIHJldHVybiB0aGlzLiNtb3ZlVG9Gb2xkZXIob2JqZWN0cywgdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKCksIG9wdGlvbnMsIHZhbGlkYXRlTmFtZXMpO1xuICB9XG5cbiAgI3Jlc29sdmVOYW1lQ29uZmxpY3RzKHBheWxvYWQ6IFJlc29sdmVOYW1lQ29uZmxpY3RzUGF5bG9hZCkge1xuICAgIHRoaXMuI292ZXJsYXkub3BlbihSZXNvbHZlTmFtZUNvbmZsaWN0c0NvbXBvbmVudCwgcGF5bG9hZCwge1xuICAgICAgbWF4V2lkdGg6ICc0MDBweCdcbiAgICB9KTtcbiAgfVxuXG4gIHBhc3RlRnJvbUNsaXBib2FyZChkZXN0aW5hdGlvbk9iamVjdD86IERtc09iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgY2QgPSB0aGlzLiNjbGlwYm9hcmRTZXJ2aWNlLmdldENsaXBib2FyZERhdGEoQVBQX0lEKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uT2JqZWN0Py5pc0ZvbGRlciA/IGRlc3RpbmF0aW9uT2JqZWN0LmlkIDogdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGNkICYmIGNkLm9iamVjdHMgJiYgY2Qub2JqZWN0cy5sZW5ndGggPiAwXG4gICAgICAgID8gY2Q/Lm1vZGUgPT09IERSSVZFX0FDVElPTl9NT0RFLkNVVFxuICAgICAgICAgID8gdGhpcy4jbW92ZVRvRm9sZGVyKGNkLm9iamVjdHMgfHwgW10sIGRlc3RpbmF0aW9uLCB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9LCB0cnVlKVxuICAgICAgICAgIDogY2Q/Lm1vZGUgPT09IERSSVZFX0FDVElPTl9NT0RFLkNPUFlcbiAgICAgICAgICAgID8gdGhpcy4jY29weVRvRm9sZGVyKGNkLm9iamVjdHMgfHwgW10sIGRlc3RpbmF0aW9uLCB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9LCB0cnVlKVxuICAgICAgICAgICAgOiBvZihudWxsKVxuICAgICAgICA6IG9mKG51bGwpXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChyZXMpID0+IHtcbiAgICAgICAgcmVzICYmIHRoaXMuZW1pdEV2ZW50KERSSVZFX0VWRU5ULnJlZnJlc2gpO1xuICAgICAgICB0aGlzLiNjbGlwYm9hcmRTZXJ2aWNlLmNsZWFyKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjaGVja05hbWVzQW5kVXBsb2FkKGZpbGVzOiBGaWxlW10sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IE9ic2VydmFibGU8Q3JlYXRlUmVzdWx0W10+IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZU5hbWVzKFxuICAgICAgZmlsZXMubWFwKChmKSA9PiBmLm5hbWUpLFxuICAgICAgdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKClcbiAgICApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogRHJpdmVWYWxpZGF0ZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXMuZXhpc3RpbmdGaWxlTmFtZXM/Lmxlbmd0aCB8fCByZXMuaW52YWxpZEZpbGVOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVzUGF5bG9hZDogUmVzb2x2ZU5hbWVDb25mbGljdHNQYXlsb2FkID0ge1xuICAgICAgICAgICAgZXhpc3RpbmdGaWxlTmFtZXM6IHJlcy5leGlzdGluZ0ZpbGVOYW1lcyxcbiAgICAgICAgICAgIGludmFsaWRGaWxlTmFtZXM6IHJlcy5pbnZhbGlkRmlsZU5hbWVzLFxuICAgICAgICAgICAgbW9kZTogJ3VwbG9hZCcsXG4gICAgICAgICAgICBpdGVtczogZmlsZXMsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLiNvdmVybGF5Lm9wZW4oUmVzb2x2ZU5hbWVDb25mbGljdHNDb21wb25lbnQsIHJlc1BheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gdGhpcy51cGxvYWQoZmlsZXMsIGRhdGEpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBsb2FkQ29udGVudChvYmplY3RJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxDcmVhdGVSZXN1bHRbXT4ge1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwbG9hZENvbnRlbnQob2JqZWN0SWQsIGZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgZmlsZXMgdG8gdGhlIGN1cnJlbnQgZm9sZGVyXG4gICAqIEBwYXJhbSBmaWxlcyBmaWxlcyB0byBiZSB1cGxvYWRlZFxuICAgKiBAcGFyYW0gZGF0YSBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgYXBwbGllZCB0byB0aGUgb2JqZWN0XG4gICAqL1xuICB1cGxvYWQoZmlsZXM6IEZpbGVbXSwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogT2JzZXJ2YWJsZTxDcmVhdGVSZXN1bHRbXT4ge1xuICAgIHJldHVybiBmb3JrSm9pbihcbiAgICAgIGZpbGVzLm1hcCgoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGxvYWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZGF0YSB8fCB7fTtcbiAgICAgICAgLy8gYXBwbHkgZmlsZXN5c3RlbSBTT1RcbiAgICAgICAgY29uc3Qgc290cyA9IHVwbG9hZERhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSB8fCBbXTtcbiAgICAgICAgdXBsb2FkRGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdID0gWy4uLnNvdHMsIEZTX1NPVFMub2JqZWN0XTtcbiAgICAgICAgLy8gc2V0dXAgdGhlIG5hbWUgdG8gYmUgdGhlIGZpbGVuYW1lXG4gICAgICAgIHVwbG9hZERhdGFbRlNfUFJPUEVSVElFUy5uYW1lXSA9IGZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgY2YgPSB0aGlzLiNtYXBlZEN1cnJlbnRGb2xkZXIoKTtcbiAgICAgICAgaWYgKGNmICYmIGNmICE9PSBEUklWRV9ST09UX0ZPTERFUl9JRCkgdXBsb2FkRGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRF0gPSBjZjtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UuY3JlYXRlRG1zT2JqZWN0KFN5c3RlbVR5cGUuRE9DVU1FTlQsIHVwbG9hZERhdGEsIFtmaWxlXSwgZmlsZS5uYW1lKS5waXBlKFxuICAgICAgICAgIG1hcCgocmVzKSA9PiAoeyBpZDogcmVzWzBdIH0pKSxcbiAgICAgICAgICBjYXRjaEVycm9yKChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gb2YoeyBlcnJvcjogdGhpcy4jbWFwQ3JlYXRlRXJyb3IoZSkgfSkpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjcmVhdGVGb2xkZXIobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDcmVhdGVSZXN1bHQ+IHtcbiAgICBjb25zdCBwYXJlbnRJRCA9IHRoaXMuI21hcGVkQ3VycmVudEZvbGRlcigpO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBkYXRhW0ZTX1BST1BFUlRJRVMubmFtZV0gPSBuYW1lO1xuICAgIC8vIGFwcGx5IGZpbGVzeXN0ZW0gU09UXG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdID0gW0ZTX1NPVFMub2JqZWN0XTtcbiAgICBpZiAocGFyZW50SUQgJiYgcGFyZW50SUQgIT09IERSSVZFX1JPT1RfRk9MREVSX0lEKSBkYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX0lEXSA9IHBhcmVudElEO1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLmNyZWF0ZURtc09iamVjdChBUFBfU0NIRU1BLnR5cGVzLmZvbGRlci5vYmplY3RUeXBlIHx8ICcnLCBkYXRhLCBbXSkucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiAoeyBpZDogcmVzWzBdIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiBvZih7IGVycm9yOiB0aGlzLiNtYXBDcmVhdGVFcnJvcihlKSB9KSlcbiAgICApO1xuICB9XG5cbiAgI21hcENyZWF0ZUVycm9yKGU6IEh0dHBFcnJvclJlc3BvbnNlKTogQ3JlYXRlRXJyb3Ige1xuICAgIGxldCBlcnJvcjogQ3JlYXRlRXJyb3IgPSAnZGVmYXVsdCc7XG4gICAgY29uc3QgZWMgPSBlLmVycm9yLnNlcnZpY2VFcnJvckNvZGU7XG4gICAgaWYgKGVjID09PSA5OTk5OSkge1xuICAgICAgY29uc3QgaWVjID0gZS5lcnJvci5pbm5lckVycm9yPy5zZXJ2aWNlRXJyb3JDb2RlO1xuICAgICAgaWYgKGllYyA9PT0gMTEwMDApIGVycm9yID0gJ25hbWVFeGlzdHMnO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGZvciBleGlzdGluZyBuYW1lcyBhbmQgaW52YWxpZCBjaGFyYWN0ZXJzXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGNoZWNrZWRcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBwYXJlbnQgZm9sZGVyICh3aWxsIGJlICdyb290JyBpZiBub3QgcHJvdmlkZWQpXG4gICAqIEByZXR1cm5zIGFscmVhZHkgZXhpc3RpbmcgbmFtZXNcbiAgICovXG4gIHZhbGlkYXRlTmFtZXMobmFtZXM6IHN0cmluZ1tdLCBwYXJlbnRJZD86IHN0cmluZyB8IG51bGwpOiBPYnNlcnZhYmxlPERyaXZlVmFsaWRhdGVSZXNwb25zZT4ge1xuICAgIGNvbnNvbGUubG9nKHsgbmFtZXMsIHBhcmVudElkIH0pO1xuXG4gICAgaWYgKHBhcmVudElkID09PSBEUklWRV9ST09UX0ZPTERFUl9JRCkgcGFyZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZHZwOiBEcml2ZVZhbGlkYXRlUGF5bG9hZCA9IHtcbiAgICAgIGFwcDogJ29zZHJpdmUnLFxuICAgICAgZmlsZU5hbWVzOiBuYW1lcyxcbiAgICAgIHRhcmdldEZvbGRlcklkOiBwYXJlbnRJZCB8fCB1bmRlZmluZWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBvc3QoJy9kbXMvb2JqZWN0cy92YWxpZGF0ZScsIGR2cCkucGlwZShjYXRjaEVycm9yKChyZXM6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiBvZihyZXMuZXJyb3IpKSk7XG4gIH1cblxuICBnZXREZWZhdWx0UmliYm9uQWN0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX2RlZmF1bHRSaWJib25BY3Rpb25zLmxlbmd0aCkge1xuICAgICAgLy9bQkFTRV9BQ1RJT04uZG93bmxvYWQsIEJBU0VfQUNUSU9OLmRlbGV0ZSwgJ2FwcC5kcml2ZS5hY3Rpb24ucmVuYW1lJywgQkFTRV9BQ1RJT04uY29weSwgQkFTRV9BQ1RJT04uY3V0XVxuICAgICAgT2JqZWN0LnZhbHVlcyh7IC4uLkJBU0VfQUNUSU9OLCByZW5hbWU6ICdhcHAuZHJpdmUuYWN0aW9uLnJlbmFtZScgfSkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuI2FjdGlvbnNTZXJ2aWNlLmdldEFjdGlvbkJ5SWQoaWQsIEFDVElPTl9DT05URVhUKTtcbiAgICAgICAgaWYgKGEpIHRoaXMuX2RlZmF1bHRSaWJib25BY3Rpb25zLnB1c2goYSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRSaWJib25BY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QWN0aW9ucygpIHtcbiAgICB0aGlzLnNldEJ1c3kodHJ1ZSk7XG4gICAgdGhpcy4jYWN0aW9uc1NlcnZpY2VcbiAgICAgIC5nZXRBY3Rpb25zKHRoaXMuc3RhdGUkLnNlbGVjdGlvbigpLCB7XG4gICAgICAgIGNvbnRleHQ6IEFDVElPTl9DT05URVhUXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSgoYWN0aW9uczogQWN0aW9uW10pID0+IHtcbiAgICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBhY3Rpb25zIH0pO1xuICAgICAgfSlcbiAgICAgIC5hZGQoKCkgPT4gdGhpcy5zZXRCdXN5KGZhbHNlKSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgc2VhcmNoIGNvbmRpdGlvbnMgcmVnYXJkaW5nIGZvbGRlciBsaXN0aW5nc1xuICAgKiBAcGFyYW0gcVxuICAgKi9cbiAgYXBwbHlGb2xkZXJMaXN0U2VhcmNoQ29uZGl0aW9ucyhxOiBTZWFyY2hRdWVyeSwgYWRkQmFzZVR5cGVJZCA9IHRydWUpOiBTZWFyY2hRdWVyeSB7XG4gICAgLy8gZm9sZGVycyBmaXJzdFxuICAgIGlmICghcS5zb3J0KSBxLnNvcnQgPSBbXTtcbiAgICBhZGRCYXNlVHlwZUlkICYmXG4gICAgICBxLnNvcnQucHVzaCh7XG4gICAgICAgIGZpZWxkOiBCYXNlT2JqZWN0VHlwZUZpZWxkLkJBU0VfVFlQRV9JRCxcbiAgICAgICAgb3JkZXI6ICdkZXNjJ1xuICAgICAgfSk7XG4gICAgcSA9IHRoaXMuYXBwbHlCYXNpY1NlYXJjaENvbmRpdGlvbnMocSk7XG5cbiAgICByZXR1cm4gcTtcbiAgfVxuXG4gIGFwcGx5QmFzaWNTZWFyY2hDb25kaXRpb25zKHE6IFNlYXJjaFF1ZXJ5KTogU2VhcmNoUXVlcnkge1xuICAgIHEuZmllbGRzID0gW1xuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSUQsXG4gICAgICBCYXNlT2JqZWN0VHlwZUZpZWxkLk1PRElGSUNBVElPTl9EQVRFLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5NT0RJRklFRF9CWSxcbiAgICAgIENvbnRlbnRTdHJlYW1GaWVsZC5GSUxFTkFNRSxcbiAgICAgIENvbnRlbnRTdHJlYW1GaWVsZC5NSU1FX1RZUEUsXG4gICAgICBDb250ZW50U3RyZWFtRmllbGQuSUQsXG4gICAgICBDb250ZW50U3RyZWFtRmllbGQuTEVOR1RIXG4gICAgXTtcbiAgICBpZiAoIXEudHlwZXMgfHwgIXEudHlwZXMuaW5jbHVkZXMoRlNfU09UUy5vYmplY3QpKSBxLnR5cGVzID0gWy4uLihxLnR5cGVzIHx8IFtdKSwgRlNfU09UUy5vYmplY3RdO1xuICAgIC8vIHEuc29ydE9wdGlvbnMucHVzaChuZXcgU29ydE9wdGlvbihCYXNlT2JqZWN0VHlwZUZpZWxkLkJBU0VfVFlQRV9JRCwgJ2Rlc2MnKSk7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMuc3RhdGUkLnNvcnQoKSB8fCB0aGlzLiNkZWZhdWx0U29ydDtcbiAgICBpZiAoIXEuc29ydCkgcS5zb3J0ID0gW107XG4gICAgcS5zb3J0LnB1c2goe1xuICAgICAgZmllbGQ6IHNvcnQucHJvcGVydHksXG4gICAgICBvcmRlcjogc29ydC5vcmRlclxuICAgIH0pO1xuICAgIHEuaW5jbHVkZVBlcm1pc3Npb25zID0gdHJ1ZTtcbiAgICAvLyBuZXcgU29ydE9wdGlvbihzb3J0LnByb3BlcnR5LCBzb3J0Lm9yZGVyKSk7XG4gICAgcmV0dXJuIHE7XG4gIH1cblxuICByZXNvbHZlRmlsZXNTdGF0ZShpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9sZGVySGllcmFyY2h5KGlkKTtcbiAgfVxuXG4gIGdldEZvbGRlckhpZXJhcmNoeShmb2xkZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxCcmVhZENydW1iW10+IHtcbiAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7XG4gICAgICBicmVhZGNydW1iOiB7XG4gICAgICAgIC4uLnRoaXMuaW5pdGlhbFN0YXRlLmJyZWFkY3J1bWIsXG4gICAgICAgIGxvYWRpbmc6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmb2xkZXJJZCA9PT0gRFJJVkVfUk9PVF9GT0xERVJfSURcbiAgICAgID8gb2YoW10pXG4gICAgICA6IHRoaXMuI2ZldGNoRm9sZGVyKGZvbGRlcklkLCAwLCB0aGlzLk1BWF9ERVBUSCkucGlwZShcbiAgICAgICAgICB0YXAoKHJlczogeyBwYXJ0aWFsOiBib29sZWFuOyBpdGVtczogQnJlYWRDcnVtYltdIH0pID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtczogQnJlYWRDcnVtYltdID0gW107XG4gICAgICAgICAgICBpZiAocmVzLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaXRlbXMgPSBbLi4uaXRlbXMsIC4uLnJlcy5pdGVtc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhdGNoU3RhdGUodGhpcy5zdGF0ZSQsIHtcbiAgICAgICAgICAgICAgYnJlYWRjcnVtYjoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbFN0YXRlLmJyZWFkY3J1bWIsXG4gICAgICAgICAgICAgICAgcGFydGlhbDogcmVzLnBhcnRpYWwsXG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKChyZXMpID0+IHJlcy5pdGVtcylcbiAgICAgICAgKTtcbiAgfVxuXG4gICNmZXRjaEZvbGRlcihcbiAgICBmb2xkZXJJZDogc3RyaW5nLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICAgbWF4RGVwdGg6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPHtcbiAgICBwYXJ0aWFsOiBib29sZWFuO1xuICAgIGl0ZW1zOiBCcmVhZENydW1iW107XG4gIH0+IHtcbiAgICBpZiAoZGVwdGggPj0gbWF4RGVwdGgpIHJldHVybiBvZih7IHBhcnRpYWw6IHRydWUsIGl0ZW1zOiBbXSB9KTtcbiAgICBjb25zdCBjYWNoZWRGb2xkZXIgPSB0aGlzLmJyZWFkY3J1bWJDYWNoZS5nZXQoZm9sZGVySWQpO1xuICAgIGlmIChjYWNoZWRGb2xkZXIpIHtcbiAgICAgIHJldHVybiBjYWNoZWRGb2xkZXIucGFyZW50SWRcbiAgICAgICAgPyB0aGlzLiNmZXRjaEZvbGRlcihjYWNoZWRGb2xkZXIucGFyZW50SWQsIGRlcHRoICsgMSwgbWF4RGVwdGgpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHBhcmVudEZvbGRlcnMpID0+ICh7XG4gICAgICAgICAgICAgIHBhcnRpYWw6IHBhcmVudEZvbGRlcnMucGFydGlhbCxcbiAgICAgICAgICAgICAgaXRlbXM6IFsuLi5wYXJlbnRGb2xkZXJzLml0ZW1zLCB7IG5hbWU6IGNhY2hlZEZvbGRlci5uYW1lLCBpZDogY2FjaGVkRm9sZGVyLmlkIH1dXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApXG4gICAgICAgIDogb2Yoe1xuICAgICAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgICAgICBpdGVtczogW3sgbmFtZTogY2FjaGVkRm9sZGVyLm5hbWUsIGlkOiBjYWNoZWRGb2xkZXIuaWQgfV1cbiAgICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UuZ2V0RG1zT2JqZWN0KGZvbGRlcklkKS5waXBlKFxuICAgICAgbWFwKChmb2xkZXIpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudEZvbGRlciA9IHtcbiAgICAgICAgICBuYW1lOiBmb2xkZXIuZGF0YVtGU19QUk9QRVJUSUVTLm5hbWVdIGFzIHN0cmluZyxcbiAgICAgICAgICBpZDogZm9sZGVyLmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSURdIGFzIHN0cmluZyxcbiAgICAgICAgICBwYXJlbnRJZDogZm9sZGVyLnBhcmVudElkXG4gICAgICAgIH07XG4gICAgICAgIC8vIHRoaXMuYnJlYWRjcnVtYkNhY2hlLnNldChmb2xkZXIuaWQsIGN1cnJlbnRGb2xkZXIpO1xuICAgICAgICByZXR1cm4gY3VycmVudEZvbGRlcjtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKChmb2xkZXIpID0+IHtcbiAgICAgICAgaWYgKCFmb2xkZXIucGFyZW50SWQpIHtcbiAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgICAgICBpdGVtczogW3sgbmFtZTogZm9sZGVyLm5hbWUsIGlkOiBmb2xkZXIuaWQgfV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNmZXRjaEZvbGRlcihmb2xkZXIucGFyZW50SWQsIGRlcHRoICsgMSwgbWF4RGVwdGgpLnBpcGUoXG4gICAgICAgICAgbWFwKChwYXJlbnRGb2xkZXJzKSA9PiAoe1xuICAgICAgICAgICAgcGFydGlhbDogcGFyZW50Rm9sZGVycy5wYXJ0aWFsLFxuICAgICAgICAgICAgaXRlbXM6IFsuLi5wYXJlbnRGb2xkZXJzLml0ZW1zLCB7IG5hbWU6IGZvbGRlci5uYW1lLCBpZDogZm9sZGVyLmlkIH1dXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRWZXJzaW9ucyhpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxEbXNPYmplY3RbXT4ge1xuICAgIHBhdGNoU3RhdGUodGhpcy5zdGF0ZSQsIHsgYnVzeTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdGhpcy4jZG1zU2VydmljZS5nZXREbXNPYmplY3RWZXJzaW9ucyhpZCkucGlwZShcbiAgICAgIHRhcCgodmVyc2lvbnMpID0+IHtcbiAgICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwge1xuICAgICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgICAgICB2ZXJzaW9uc0xpc3Q6IG1hcFNlYXJjaFJlc3VsdCh2ZXJzaW9ucyksXG4gICAgICAgICAgICBzZWxlY3RlZFZlcnNpb246IHRoaXMuc3RhdGUkLnZlcnNpb25zKCkuc2VsZWN0ZWRWZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkRG1zT2JqZWN0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLmdldERtc09iamVjdChpZCkucGlwZShcbiAgICAgIHRhcCgoZG1zT2JqZWN0KSA9PlxuICAgICAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7XG4gICAgICAgICAgc2VsZWN0ZWREbXNPYmplY3Q6IGRtc09iamVjdCxcbiAgICAgICAgICB2ZXJzaW9uczoge1xuICAgICAgICAgICAgdmVyc2lvbnNMaXN0OiB0aGlzLnN0YXRlJC52ZXJzaW9ucy52ZXJzaW9uc0xpc3QoKSxcbiAgICAgICAgICAgIHNlbGVjdGVkVmVyc2lvbjogW2Rtc09iamVjdF1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkVmVyc2lvbih2ZXJzaW9uOiBhbnkpIHtcbiAgICB0aGlzLnNldEJ1c3kodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UuZ2V0RG1zT2JqZWN0VmVyc2lvbih2ZXJzaW9uLmRtc09iamVjdC5pZCwgdmVyc2lvbi5kbXNPYmplY3QudmVyc2lvbikucGlwZShcbiAgICAgIHRhcCgocmVzKSA9PlxuICAgICAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7XG4gICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgIHZlcnNpb25zTGlzdDogdGhpcy5zdGF0ZSQudmVyc2lvbnMudmVyc2lvbnNMaXN0KCksXG4gICAgICAgICAgICBzZWxlY3RlZFZlcnNpb246IFtyZXNdXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnNldEJ1c3koZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBzZXROZXdWZXJzaW9uKHZlcnNpb24/OiBudW1iZXIpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdIHwgbnVsbD4ge1xuICAgIHBhdGNoU3RhdGUodGhpcy5zdGF0ZSQsIHsgYnVzeTogdHJ1ZSB9KTtcbiAgICBjb25zdCBzZWxlY3RlZFZlcnNpb24gPSB0aGlzLnN0YXRlJC52ZXJzaW9ucy5zZWxlY3RlZFZlcnNpb24oKTtcbiAgICBpZiAoc2VsZWN0ZWRWZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uTnVtYmVyOiBudW1iZXIgPSB2ZXJzaW9uID8/IHNlbGVjdGVkVmVyc2lvblswXS52ZXJzaW9uO1xuICAgICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UucmVzdG9yZURtc09iamVjdChzZWxlY3RlZFZlcnNpb25bMF0uaWQsIHZlcnNpb25OdW1iZXIpLnBpcGUoc3dpdGNoTWFwKChvYmplY3Q6IERtc09iamVjdCkgPT4gdGhpcy5nZXRWZXJzaW9ucyhvYmplY3QuaWQpKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIGNsZWFyVmVyc2lvbnMoKSB7XG4gICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyB2ZXJzaW9uczogdGhpcy5pbml0aWFsU3RhdGUudmVyc2lvbnMgfSk7XG4gIH1cbn1cbiJdfQ==
|