@yuuvis/client-core 0.6.5
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 +111 -0
- package/esm2022/index.mjs +65 -0
- package/esm2022/lib/client-core.module.mjs +117 -0
- package/esm2022/lib/client-core.shared.module.mjs +18 -0
- package/esm2022/lib/common/pipes/filesize.pipe.mjs +37 -0
- package/esm2022/lib/common/pipes/index.mjs +6 -0
- package/esm2022/lib/common/pipes/keys.pipe.mjs +17 -0
- package/esm2022/lib/common/pipes/locale-date.pipe.mjs +45 -0
- package/esm2022/lib/common/pipes/locale-number.pipe.mjs +115 -0
- package/esm2022/lib/common/pipes/safe-html.pipe.mjs +44 -0
- package/esm2022/lib/common/services/native-notifications.interface.mjs +2 -0
- package/esm2022/lib/common/services/native-notifications.mjs +40 -0
- package/esm2022/lib/model/dms-object.interface.mjs +2 -0
- package/esm2022/lib/model/dms-object.model.mjs +79 -0
- package/esm2022/lib/model/object-flavor.interface.mjs +2 -0
- package/esm2022/lib/model/range-value.interface.mjs +2 -0
- package/esm2022/lib/model/yuv-error.model.mjs +37 -0
- package/esm2022/lib/model/yuv-user.model.mjs +38 -0
- package/esm2022/lib/service/audit/audit.interface.mjs +2 -0
- package/esm2022/lib/service/audit/audit.service.mjs +135 -0
- package/esm2022/lib/service/auth/auth.interceptor.mjs +50 -0
- package/esm2022/lib/service/auth/auth.interface.mjs +7 -0
- package/esm2022/lib/service/auth/auth.service.mjs +130 -0
- package/esm2022/lib/service/auth/oidc.service.mjs +81 -0
- package/esm2022/lib/service/backend/api.enum.mjs +11 -0
- package/esm2022/lib/service/backend/backend.interface.mjs +2 -0
- package/esm2022/lib/service/backend/backend.service.mjs +206 -0
- package/esm2022/lib/service/bpm/bpm.interface.mjs +8 -0
- package/esm2022/lib/service/bpm/bpm.service.mjs +51 -0
- package/esm2022/lib/service/cache/app-cache.service.mjs +51 -0
- package/esm2022/lib/service/catalog/catalog.interface.mjs +2 -0
- package/esm2022/lib/service/catalog/catalog.service.mjs +13 -0
- package/esm2022/lib/service/clipboard/clipboard.interface.mjs +2 -0
- package/esm2022/lib/service/clipboard/clipboard.service.mjs +90 -0
- package/esm2022/lib/service/config/config.interface.mjs +6 -0
- package/esm2022/lib/service/config/config.service.mjs +115 -0
- package/esm2022/lib/service/config/core-config.mjs +20 -0
- package/esm2022/lib/service/config/core-config.tokens.mjs +9 -0
- package/esm2022/lib/service/connection/connection.service.mjs +36 -0
- package/esm2022/lib/service/connection/offline.interceptor.mjs +28 -0
- package/esm2022/lib/service/core-init/core-init.service.mjs +29 -0
- package/esm2022/lib/service/core-init/missing-translation-handler.mjs +10 -0
- package/esm2022/lib/service/core-init/translate-json-loader.mjs +117 -0
- package/esm2022/lib/service/device/device.interface.mjs +6 -0
- package/esm2022/lib/service/device/device.service.mjs +144 -0
- package/esm2022/lib/service/dms/dms.service.interface.mjs +2 -0
- package/esm2022/lib/service/dms/dms.service.mjs +440 -0
- package/esm2022/lib/service/event/event.interface.mjs +2 -0
- package/esm2022/lib/service/event/event.service.mjs +38 -0
- package/esm2022/lib/service/event/events.mjs +14 -0
- package/esm2022/lib/service/idm/idm.interface.mjs +2 -0
- package/esm2022/lib/service/idm/idm.service.mjs +34 -0
- package/esm2022/lib/service/logger/logger-console.service.mjs +73 -0
- package/esm2022/lib/service/logger/logger.interface.mjs +2 -0
- package/esm2022/lib/service/logger/logger.mjs +27 -0
- package/esm2022/lib/service/notification/notification.service.mjs +131 -0
- package/esm2022/lib/service/object-config/object-config.interface.mjs +2 -0
- package/esm2022/lib/service/object-config/object-config.service.mjs +229 -0
- package/esm2022/lib/service/pending-changes/pending-changes-component.interface.mjs +5 -0
- package/esm2022/lib/service/pending-changes/pending-changes-guard.service.mjs +25 -0
- package/esm2022/lib/service/pending-changes/pending-changes.service.mjs +123 -0
- package/esm2022/lib/service/prediction/prediction.interface.mjs +2 -0
- package/esm2022/lib/service/prediction/prediction.service.mjs +60 -0
- package/esm2022/lib/service/search/search.service.interface.mjs +39 -0
- package/esm2022/lib/service/search/search.service.mjs +178 -0
- package/esm2022/lib/service/session-storage/session-storage.service.mjs +50 -0
- package/esm2022/lib/service/system/object-form.interface.mjs +2 -0
- package/esm2022/lib/service/system/system.enum.mjs +179 -0
- package/esm2022/lib/service/system/system.interface.mjs +2 -0
- package/esm2022/lib/service/system/system.service.mjs +597 -0
- package/esm2022/lib/service/upload/upload.interface.mjs +2 -0
- package/esm2022/lib/service/upload/upload.service.mjs +228 -0
- package/esm2022/lib/service/user/user.service.mjs +211 -0
- package/esm2022/lib/util/utils.helper.enum.mjs +15 -0
- package/esm2022/lib/util/utils.mjs +373 -0
- package/esm2022/yuuvis-client-core.mjs +5 -0
- package/fesm2022/yuuvis-client-core.mjs +4775 -0
- package/fesm2022/yuuvis-client-core.mjs.map +1 -0
- package/index.d.ts +61 -0
- package/lib/client-core.module.d.ts +20 -0
- package/lib/client-core.shared.module.d.ts +10 -0
- package/lib/common/pipes/filesize.pipe.d.ts +18 -0
- package/lib/common/pipes/index.d.ts +5 -0
- package/lib/common/pipes/keys.pipe.d.ts +10 -0
- package/lib/common/pipes/locale-date.pipe.d.ts +12 -0
- package/lib/common/pipes/locale-number.pipe.d.ts +47 -0
- package/lib/common/pipes/safe-html.pipe.d.ts +28 -0
- package/lib/common/services/native-notifications.d.ts +8 -0
- package/lib/common/services/native-notifications.interface.d.ts +5 -0
- package/lib/model/dms-object.interface.d.ts +16 -0
- package/lib/model/dms-object.model.d.ts +26 -0
- package/lib/model/object-flavor.interface.d.ts +30 -0
- package/lib/model/range-value.interface.d.ts +9 -0
- package/lib/model/yuv-error.model.d.ts +18 -0
- package/lib/model/yuv-user.model.d.ts +44 -0
- package/lib/service/audit/audit.interface.d.ts +47 -0
- package/lib/service/audit/audit.service.d.ts +35 -0
- package/lib/service/auth/auth.interceptor.d.ts +12 -0
- package/lib/service/auth/auth.interface.d.ts +34 -0
- package/lib/service/auth/auth.service.d.ts +50 -0
- package/lib/service/auth/oidc.service.d.ts +16 -0
- package/lib/service/backend/api.enum.d.ts +7 -0
- package/lib/service/backend/backend.interface.d.ts +29 -0
- package/lib/service/backend/backend.service.d.ts +118 -0
- package/lib/service/bpm/bpm.interface.d.ts +86 -0
- package/lib/service/bpm/bpm.service.d.ts +19 -0
- package/lib/service/cache/app-cache.service.d.ts +18 -0
- package/lib/service/catalog/catalog.interface.d.ts +12 -0
- package/lib/service/catalog/catalog.service.d.ts +5 -0
- package/lib/service/clipboard/clipboard.interface.d.ts +11 -0
- package/lib/service/clipboard/clipboard.service.d.ts +23 -0
- package/lib/service/config/config.interface.d.ts +34 -0
- package/lib/service/config/config.service.d.ts +45 -0
- package/lib/service/config/core-config.d.ts +14 -0
- package/lib/service/config/core-config.tokens.d.ts +7 -0
- package/lib/service/connection/connection.service.d.ts +25 -0
- package/lib/service/connection/offline.interceptor.d.ts +15 -0
- package/lib/service/core-init/core-init.service.d.ts +11 -0
- package/lib/service/core-init/missing-translation-handler.d.ts +8 -0
- package/lib/service/core-init/translate-json-loader.d.ts +20 -0
- package/lib/service/device/device.interface.d.ts +15 -0
- package/lib/service/device/device.service.d.ts +54 -0
- package/lib/service/dms/dms.service.d.ts +153 -0
- package/lib/service/dms/dms.service.interface.d.ts +59 -0
- package/lib/service/event/event.interface.d.ts +13 -0
- package/lib/service/event/event.service.d.ts +23 -0
- package/lib/service/event/events.d.ts +12 -0
- package/lib/service/idm/idm.interface.d.ts +5 -0
- package/lib/service/idm/idm.service.d.ts +9 -0
- package/lib/service/logger/logger-console.service.d.ts +20 -0
- package/lib/service/logger/logger.d.ts +17 -0
- package/lib/service/logger/logger.interface.d.ts +10 -0
- package/lib/service/notification/notification.service.d.ts +71 -0
- package/lib/service/object-config/object-config.interface.d.ts +62 -0
- package/lib/service/object-config/object-config.service.d.ts +38 -0
- package/lib/service/pending-changes/pending-changes-component.interface.d.ts +6 -0
- package/lib/service/pending-changes/pending-changes-guard.service.d.ts +14 -0
- package/lib/service/pending-changes/pending-changes.service.d.ts +57 -0
- package/lib/service/prediction/prediction.interface.d.ts +18 -0
- package/lib/service/prediction/prediction.service.d.ts +15 -0
- package/lib/service/search/search.service.d.ts +46 -0
- package/lib/service/search/search.service.interface.d.ts +119 -0
- package/lib/service/session-storage/session-storage.service.d.ts +15 -0
- package/lib/service/system/object-form.interface.d.ts +46 -0
- package/lib/service/system/system.enum.d.ts +141 -0
- package/lib/service/system/system.interface.d.ts +146 -0
- package/lib/service/system/system.service.d.ts +168 -0
- package/lib/service/upload/upload.interface.d.ts +55 -0
- package/lib/service/upload/upload.service.d.ts +34 -0
- package/lib/service/user/user.service.d.ts +69 -0
- package/lib/util/utils.d.ts +118 -0
- package/lib/util/utils.helper.enum.d.ts +13 -0
- package/package.json +33 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { of } from 'rxjs';
|
|
3
|
+
import { delay, map, switchMap, tap } from 'rxjs/operators';
|
|
4
|
+
import { DmsObject } from '../../model/dms-object.model';
|
|
5
|
+
import { Utils } from '../../util/utils';
|
|
6
|
+
import { ApiBase } from '../backend/api.enum';
|
|
7
|
+
import { BackendService } from '../backend/backend.service';
|
|
8
|
+
import { EventService } from '../event/event.service';
|
|
9
|
+
import { YuvEventType } from '../event/events';
|
|
10
|
+
import { SearchService } from '../search/search.service';
|
|
11
|
+
import { BaseObjectTypeField, ContentStreamField, SystemResult } from '../system/system.enum';
|
|
12
|
+
import { UploadService } from '../upload/upload.service';
|
|
13
|
+
import { Sort } from '../../util/utils.helper.enum';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
/**
|
|
16
|
+
* Service for working with dms objects: create them, delete, etc.
|
|
17
|
+
*/
|
|
18
|
+
export class DmsService {
|
|
19
|
+
#searchService = inject(SearchService);
|
|
20
|
+
#backend = inject(BackendService);
|
|
21
|
+
#eventService = inject(EventService);
|
|
22
|
+
#uploadService = inject(UploadService);
|
|
23
|
+
// general trigger operator to handle all dms events
|
|
24
|
+
triggerEvent(event, id, silent = false) {
|
|
25
|
+
return (stream) => stream.pipe(
|
|
26
|
+
// update does not return permissions, so we need to re-load the whole dms object
|
|
27
|
+
// TODO: Remove once permissions are provided
|
|
28
|
+
switchMap((res) => (!id ? of(res) : this.getDmsObject(id))),
|
|
29
|
+
// TODO: enable once permissions are provided
|
|
30
|
+
// map((res) => this.searchResultToDmsObject(this.searchService.toSearchResult(res).items[0])),
|
|
31
|
+
tap((res) => !silent && this.#eventService.trigger(event, res)));
|
|
32
|
+
}
|
|
33
|
+
// general trigger operator to handle all dms events
|
|
34
|
+
#triggerEvents(event, ids, silent = false) {
|
|
35
|
+
return (stream) => stream.pipe(
|
|
36
|
+
// update does not return permissions, so we need to re-load the whole dms object
|
|
37
|
+
// TODO: Remove once permissions are provided
|
|
38
|
+
switchMap((res) => (!ids ? of(res) : this.getDmsObjects(ids))),
|
|
39
|
+
// TODO: enable once permissions are provided
|
|
40
|
+
// map((_res: any[]) => _res.map((res, i) => res?._error ? { ...res, id: ids?[i] } : this.searchResultToDmsObject(this.searchService.toSearchResult(res).items[0]))),
|
|
41
|
+
map((_res) => _res.map((res, i) => (res?._error && ids ? { ...res, id: ids[i] } : res))), tap((res) => !silent && res.forEach((o) => o && this.#eventService.trigger(event, o))));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create new dms object(s). Providing an array of files here instead of one will create
|
|
45
|
+
* a new dms object for every file. In this case indexdata will shared across all files.
|
|
46
|
+
* @param objectTypeId The ID of the object type to be created
|
|
47
|
+
* @param indexdata Indexdata for the new object(s)
|
|
48
|
+
* @param files File(s) to create dms objects content(s) with
|
|
49
|
+
* @param label A label that will show up in the upload overlay dialog while uploading
|
|
50
|
+
*
|
|
51
|
+
* @returns Array of IDs of the objects that have been created
|
|
52
|
+
*/
|
|
53
|
+
createDmsObject(objectTypeId, indexdata, files, label, silent = false) {
|
|
54
|
+
const url = `${this.#backend.getApiBase(ApiBase.apiWeb)}/dms/objects`;
|
|
55
|
+
const data = indexdata;
|
|
56
|
+
data[BaseObjectTypeField.OBJECT_TYPE_ID] = objectTypeId;
|
|
57
|
+
const upload = files.length ? this.#uploadService.uploadMultipart(url, files, data, label, silent) : this.#uploadService.createDocument(url, data);
|
|
58
|
+
return upload
|
|
59
|
+
.pipe(map((res) => res.map((r) => r.properties[BaseObjectTypeField.OBJECT_ID].value)),
|
|
60
|
+
// TODO: Replace by proper solution
|
|
61
|
+
// Right now there is a gap between when the object was
|
|
62
|
+
// created and when it is indexed. So delaying here will
|
|
63
|
+
// give backend time to get its stuff together.
|
|
64
|
+
delay(1000))
|
|
65
|
+
.pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_CREATED, '', silent));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Delete a dms object.
|
|
69
|
+
* @param id ID of the object to be deleted
|
|
70
|
+
*/
|
|
71
|
+
deleteDmsObject(id, silent = false) {
|
|
72
|
+
const url = `/dms/objects/${id}`;
|
|
73
|
+
return this.#backend
|
|
74
|
+
.delete(url, ApiBase.apiWeb)
|
|
75
|
+
.pipe(map(() => ({ id })))
|
|
76
|
+
.pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_DELETED, '', silent));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Restore older version of a dms object.
|
|
80
|
+
* @param id ID of the object to be restored
|
|
81
|
+
* @param version version of the object to be restored
|
|
82
|
+
*/
|
|
83
|
+
restoreDmsObject(id, version, silent = false) {
|
|
84
|
+
const url = `/dms/objects/${id}/versions/${version}/actions/restore?waitForSearchConsistency=true&restoreParentId=false`;
|
|
85
|
+
return this.#backend.post(url, {}, ApiBase.apiWeb).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Upload (add/replace) content to a dms object.
|
|
89
|
+
* @param objectId ID of the dms object to upload the file to
|
|
90
|
+
* @param file The file to be uploaded
|
|
91
|
+
*/
|
|
92
|
+
uploadContent(objectId, file) {
|
|
93
|
+
return this.#uploadService.upload(this.getContentPath(objectId), file).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, objectId));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Path of dms object content file.
|
|
97
|
+
* @param objectId ID of the dms object
|
|
98
|
+
* @param version version number of the dms object
|
|
99
|
+
*/
|
|
100
|
+
getContentPath(objectId, version) {
|
|
101
|
+
return `${this.#backend.getApiBase(ApiBase.apiWeb)}/dms/objects/${objectId}/contents/file${version ? '?version=' + version : ''}`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Original API Path of dms object content file.
|
|
105
|
+
* @param objectId ID of the dms object
|
|
106
|
+
* @param version version number of the dms object
|
|
107
|
+
* @param rendition should return rendition path of the dms object
|
|
108
|
+
*/
|
|
109
|
+
getFullContentPath(objectId, version, rendition = false) {
|
|
110
|
+
return `${this.#backend.getApiBase(ApiBase.core, true)}/dms/objects/${objectId}${version ? '/versions/' + version : ''}/contents/${rendition ? 'renditions/pdf' : 'file'}`;
|
|
111
|
+
}
|
|
112
|
+
getSlideURI(objectId, mimeType) {
|
|
113
|
+
const supportedMimeTypes = ['*/*'];
|
|
114
|
+
let supported = false;
|
|
115
|
+
if (mimeType) {
|
|
116
|
+
// check if mime type supports slides
|
|
117
|
+
supportedMimeTypes.forEach((p) => (supported = supported || Utils.patternToRegExp(p).test(mimeType)));
|
|
118
|
+
}
|
|
119
|
+
return !mimeType || supported ? `${this.#backend.getApiBase(ApiBase.core, true)}/dms/objects/${objectId}/contents/renditions/slide` : undefined;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Downloads the content of dms objects.
|
|
123
|
+
*
|
|
124
|
+
* @param DmsObject[] dmsObjects Array of dms objects to be downloaded
|
|
125
|
+
* @param withVersion should download specific version of the object
|
|
126
|
+
*/
|
|
127
|
+
downloadContent(objects, withVersion) {
|
|
128
|
+
objects.forEach((object, i) => setTimeout(() => {
|
|
129
|
+
const uri = `${this.getContentPath(object?.id, withVersion ? object?.version : undefined)}`;
|
|
130
|
+
this.#backend.download(uri);
|
|
131
|
+
}, Utils.isSafari() ? i * 1000 : 0 // Safari does not allow multi download
|
|
132
|
+
));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Fetch a dms object.
|
|
136
|
+
* @param id ID of the object to be retrieved
|
|
137
|
+
* @param version Desired version of the object
|
|
138
|
+
*/
|
|
139
|
+
getDmsObject(id, version, silent = false, requestOptions) {
|
|
140
|
+
return this.#backend
|
|
141
|
+
.get(`/dms/objects/${id}${version ? '/versions/' + version : ''}`, undefined, requestOptions)
|
|
142
|
+
.pipe(map((res) => {
|
|
143
|
+
const item = this.#searchService.toSearchResult(res).items[0];
|
|
144
|
+
return this.#searchResultToDmsObject(item);
|
|
145
|
+
}))
|
|
146
|
+
.pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_LOADED, '', silent));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Updates a tag on a dms object.
|
|
150
|
+
* @param id The ID of the object
|
|
151
|
+
* @param tag The tag to be updated
|
|
152
|
+
* @param value The tags new value
|
|
153
|
+
*/
|
|
154
|
+
setDmsObjectTag(id, tag, value, silent = false) {
|
|
155
|
+
return this.#backend
|
|
156
|
+
.post(`/dms/objects/tags/${tag}/state/${value}?query=SELECT * FROM system:object WHERE system:objectId='${id}'`, {}, ApiBase.core)
|
|
157
|
+
.pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Deletes a tag from a dms object.
|
|
161
|
+
* @param id The ID of the object
|
|
162
|
+
* @param tag The tag to be deleted
|
|
163
|
+
*/
|
|
164
|
+
deleteDmsObjectTag(id, tag, silent = false) {
|
|
165
|
+
return this.#backend.delete(`/dms/objects/${id}/tags/${tag}`, ApiBase.core).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Update indexdata of a dms object.
|
|
169
|
+
* @param id ID of the object to apply the data to
|
|
170
|
+
* @param data Indexdata to be applied
|
|
171
|
+
* @param silent flag to trigger DMS_OBJECT_UPDATED event
|
|
172
|
+
*/
|
|
173
|
+
updateDmsObject(id, data, silent = false) {
|
|
174
|
+
return this.#backend.patch(`/dms/objects/${id}`, data).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Updates given objects.
|
|
178
|
+
* @param objects the objects to updated
|
|
179
|
+
*/
|
|
180
|
+
updateDmsObjects(objects, silent = false) {
|
|
181
|
+
return this.#backend
|
|
182
|
+
.patch(`/dms/objects`, {
|
|
183
|
+
patches: objects.map((o) => ({
|
|
184
|
+
id: o.id,
|
|
185
|
+
data: o.data
|
|
186
|
+
}))
|
|
187
|
+
})
|
|
188
|
+
.pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_UPDATED, objects.map((o) => o.id), silent));
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Updates a tag on a dms object.
|
|
192
|
+
* @param ids List of IDs of objects
|
|
193
|
+
* @param tag The tag to be updated
|
|
194
|
+
* @param value The tags new value
|
|
195
|
+
*/
|
|
196
|
+
updateDmsObjectsTag(ids, tag, value, silent = false) {
|
|
197
|
+
return this.batchUpdateTag(ids, tag, value).pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_UPDATED, ids, silent));
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Moves given objects to a different folder.
|
|
201
|
+
* @param folderId the id of the new parent folder
|
|
202
|
+
* @param objects objects to be moved
|
|
203
|
+
* @param options options for the move operation
|
|
204
|
+
*/
|
|
205
|
+
moveDmsObjects(targetFolderId, objects, options) {
|
|
206
|
+
return this.updateDmsObjects(objects.map((o) => ({ id: o.id, data: { [BaseObjectTypeField.PARENT_ID]: targetFolderId } }), true)).pipe(tap((res) => !options?.silent && this.#eventService.trigger(YuvEventType.DMS_OBJECTS_MOVED, res)));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Copy given objects to a different folder. The objects will be copied with their indexdata referencing
|
|
210
|
+
* the existing content of the source object.
|
|
211
|
+
* @param targetFolderId The ID of the target folder
|
|
212
|
+
* @param objects The objects to be copied
|
|
213
|
+
* @param options options for the copy operation
|
|
214
|
+
*/
|
|
215
|
+
copyDmsObjects(targetFolderId, objects, options) {
|
|
216
|
+
const excludeProperties = [
|
|
217
|
+
BaseObjectTypeField.OBJECT_ID,
|
|
218
|
+
BaseObjectTypeField.CREATED_BY,
|
|
219
|
+
BaseObjectTypeField.CREATION_DATE,
|
|
220
|
+
BaseObjectTypeField.MODIFIED_BY,
|
|
221
|
+
BaseObjectTypeField.MODIFICATION_DATE,
|
|
222
|
+
BaseObjectTypeField.VERSION_NUMBER,
|
|
223
|
+
BaseObjectTypeField.TRACE_ID,
|
|
224
|
+
BaseObjectTypeField.PARENT_OBJECT_TYPE_ID,
|
|
225
|
+
BaseObjectTypeField.PARENT_VERSION_NUMBER
|
|
226
|
+
];
|
|
227
|
+
const mappedObjects = objects.map((o) => {
|
|
228
|
+
o.data[BaseObjectTypeField.PARENT_ID] = targetFolderId;
|
|
229
|
+
// Remove properties that are not allowed to be copied.
|
|
230
|
+
// This also includes content stream fields bundled into the objects data field.
|
|
231
|
+
// Properties ending with '_title' are also excluded as they are enrichment values
|
|
232
|
+
// provided by API-Web.
|
|
233
|
+
Object.keys(o.data)
|
|
234
|
+
.filter((key) => key.endsWith('_title') || excludeProperties.includes(key) || Object.values(ContentStreamField).includes(key))
|
|
235
|
+
.forEach((key) => Reflect.deleteProperty(o.data, key));
|
|
236
|
+
// map filtered data field to data format required by the Core-API
|
|
237
|
+
const properties = Object.keys(o.data).reduce((acc, key) => {
|
|
238
|
+
acc[key] = { value: o.data[key] };
|
|
239
|
+
return acc;
|
|
240
|
+
}, {});
|
|
241
|
+
return {
|
|
242
|
+
properties: properties,
|
|
243
|
+
objectTypeId: o.objectTypeId,
|
|
244
|
+
...(o.content
|
|
245
|
+
? {
|
|
246
|
+
contentStreams: [o.content]
|
|
247
|
+
}
|
|
248
|
+
: {})
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
const query = options
|
|
252
|
+
? Object.keys(options)
|
|
253
|
+
.map((key) => `${key}=${options[key]}`)
|
|
254
|
+
.join('&')
|
|
255
|
+
: '';
|
|
256
|
+
return this.#backend.post(`/dms/objects?${query}}`, { objects: mappedObjects }, ApiBase.core);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get a bunch of dms objects.
|
|
260
|
+
* @param ids List of IDs of objects to be retrieved
|
|
261
|
+
*/
|
|
262
|
+
getDmsObjects(ids, silent = false) {
|
|
263
|
+
return this.batchGet(ids)
|
|
264
|
+
.pipe(map((_res) => _res.map((res, i) => (res?._error ? { ...res, id: ids[i] } : this.#searchResultToDmsObject(this.#searchService.toSearchResult(res).items[0])))))
|
|
265
|
+
.pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_LOADED, undefined, silent));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Delete a bunch of dms objects.
|
|
269
|
+
* @param ids List of IDs of objects to be deleted
|
|
270
|
+
* @param options Options for the delete operation
|
|
271
|
+
* @returns Array of delete results.
|
|
272
|
+
*/
|
|
273
|
+
deleteDmsObjects(objects, options) {
|
|
274
|
+
const queryParams = options
|
|
275
|
+
? `?${Object.keys(options)
|
|
276
|
+
.filter((k) => ['waitForSearchConsistency', 'greedy'].includes(k))
|
|
277
|
+
.map((k) => `${k}=${options[k]}`)
|
|
278
|
+
.join('&')}`
|
|
279
|
+
: '';
|
|
280
|
+
return this.#backend
|
|
281
|
+
.delete(`/dms/objects${queryParams}`, ApiBase.core, {
|
|
282
|
+
body: {
|
|
283
|
+
objects: objects.map((o) => ({
|
|
284
|
+
properties: typeof o === 'string'
|
|
285
|
+
? {
|
|
286
|
+
'system:objectId': {
|
|
287
|
+
value: o
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
: {
|
|
291
|
+
'system:objectId': { value: o.id },
|
|
292
|
+
subject: { value: o.subject }
|
|
293
|
+
}
|
|
294
|
+
}))
|
|
295
|
+
}
|
|
296
|
+
})
|
|
297
|
+
.pipe(map((res) => res?.objects?.map((r) => {
|
|
298
|
+
const v = r.options?.[SystemResult.DELETE];
|
|
299
|
+
return {
|
|
300
|
+
id: r.properties?.[BaseObjectTypeField.OBJECT_ID]?.value,
|
|
301
|
+
properties: r.properties,
|
|
302
|
+
...(v?.httpStatusCode >= 400 ? { _error: { status: v.httpStatusCode, message: v.message } } : {})
|
|
303
|
+
};
|
|
304
|
+
})))
|
|
305
|
+
.pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_DELETED, undefined, options?.silent));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Fetch a dms object versions.
|
|
309
|
+
* @param id ID of the object to be retrieved
|
|
310
|
+
*/
|
|
311
|
+
getDmsObjectVersions(id) {
|
|
312
|
+
return this.#backend.get('/dms/objects/' + id + '/versions').pipe(map((res) => {
|
|
313
|
+
const items = this.#searchService.toSearchResult(res).items || [];
|
|
314
|
+
return items.map((item) => this.#searchResultToDmsObject(item));
|
|
315
|
+
}), map((res) => res.sort(Utils.sortValues('version', Sort.DESC))));
|
|
316
|
+
}
|
|
317
|
+
getDmsObjectVersion(id, version) {
|
|
318
|
+
return this.#backend
|
|
319
|
+
.get(`/dms/objects/${id}/versions/${version}`)
|
|
320
|
+
.pipe(map((res) => this.#searchResultToDmsObject(this.#searchService.toSearchResult(res).items[0])));
|
|
321
|
+
}
|
|
322
|
+
coreApiResponseToDmsObject(res) {
|
|
323
|
+
return this.#searchResultToDmsObject({
|
|
324
|
+
objectTypeId: res.properties[BaseObjectTypeField.OBJECT_TYPE_ID].value,
|
|
325
|
+
fields: new Map(Object.entries(res.properties)),
|
|
326
|
+
content: res.contentStreams?.[0]
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
#searchResultToDmsObject(resItem) {
|
|
330
|
+
return new DmsObject(resItem);
|
|
331
|
+
}
|
|
332
|
+
batchUpdateTag(ids, tag, value) {
|
|
333
|
+
return this.#backend.batch(ids.map((id) => ({
|
|
334
|
+
method: 'POST',
|
|
335
|
+
uri: `/dms/objects/tags/${tag}/state/${value}?query=SELECT * FROM system:object WHERE system:objectId='${id}'`,
|
|
336
|
+
base: ApiBase.core,
|
|
337
|
+
body: {}
|
|
338
|
+
})));
|
|
339
|
+
}
|
|
340
|
+
batchDeleteTag(ids, tag) {
|
|
341
|
+
return this.#backend.batch(ids.map((id) => ({
|
|
342
|
+
method: 'DELETE',
|
|
343
|
+
uri: `/dms/objects/${id}/tags/${tag}`,
|
|
344
|
+
base: ApiBase.core
|
|
345
|
+
})));
|
|
346
|
+
}
|
|
347
|
+
batchDelete(ids) {
|
|
348
|
+
return this.#backend.batch(ids.map((id) => ({ method: 'DELETE', uri: `/dms/objects/${id}` })));
|
|
349
|
+
}
|
|
350
|
+
batchGet(ids) {
|
|
351
|
+
return this.#backend.batch(ids.map((id) => ({ method: 'GET', uri: `/dms/objects/${id}` })));
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Map search result from the backend to applications SearchResult object
|
|
355
|
+
* @param searchResponse The backend response
|
|
356
|
+
*/
|
|
357
|
+
toSearchResult(searchResponse) {
|
|
358
|
+
const resultListItems = [];
|
|
359
|
+
const objectTypes = [];
|
|
360
|
+
searchResponse.objects.forEach((o) => {
|
|
361
|
+
const fields = new Map();
|
|
362
|
+
// process properties section of result
|
|
363
|
+
Object.keys(o.properties).forEach((key) => {
|
|
364
|
+
let value = o.properties[key].value;
|
|
365
|
+
if (o.properties[key].clvalue) {
|
|
366
|
+
// table fields will have a clientValue too ...
|
|
367
|
+
value = o.properties[key].clvalue;
|
|
368
|
+
// ... and also may contain values that need to be resolved
|
|
369
|
+
if (o.properties[key].resolvedValues) {
|
|
370
|
+
value.forEach((v) => {
|
|
371
|
+
Object.keys(v).forEach((k) => {
|
|
372
|
+
const resValue = Array.isArray(v[k]) ? v[k].map((i) => o.properties[key].resolvedValues[i]) : o.properties[key].resolvedValues[v[k]];
|
|
373
|
+
if (resValue) {
|
|
374
|
+
v[`${k}_title`] = resValue;
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
fields.set(key, value);
|
|
381
|
+
if (o.properties[key].title) {
|
|
382
|
+
fields.set(key + '_title', o.properties[key].title);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
// process contentStreams section of result if available.
|
|
386
|
+
// Objects that don't have files attached won't have this section
|
|
387
|
+
let content;
|
|
388
|
+
if (o.contentStreams && o.contentStreams.length > 0) {
|
|
389
|
+
// we assume that each result object only has ONE file attached, altough
|
|
390
|
+
// this is an array and there may be more
|
|
391
|
+
const contentStream = o.contentStreams[0];
|
|
392
|
+
// also add contentstream related fields to the result fields
|
|
393
|
+
fields.set(ContentStreamField.LENGTH, contentStream.length);
|
|
394
|
+
fields.set(ContentStreamField.MIME_TYPE, contentStream.mimeType);
|
|
395
|
+
fields.set(ContentStreamField.FILENAME, contentStream.fileName);
|
|
396
|
+
fields.set(ContentStreamField.ID, contentStream.contentStreamId);
|
|
397
|
+
fields.set(ContentStreamField.RANGE, contentStream.contentStreamRange);
|
|
398
|
+
fields.set(ContentStreamField.REPOSITORY_ID, contentStream.repositoryId);
|
|
399
|
+
fields.set(ContentStreamField.DIGEST, contentStream.digest);
|
|
400
|
+
fields.set(ContentStreamField.ARCHIVE_PATH, contentStream.archivePath);
|
|
401
|
+
content = {
|
|
402
|
+
contentStreamId: contentStream.contentStreamId,
|
|
403
|
+
repositoryId: contentStream.repositoryId,
|
|
404
|
+
range: contentStream.range,
|
|
405
|
+
digest: contentStream.digest,
|
|
406
|
+
archivePath: contentStream.archivePath,
|
|
407
|
+
fileName: contentStream.fileName,
|
|
408
|
+
mimeType: contentStream.mimeType,
|
|
409
|
+
size: contentStream.length
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
const objectTypeId = o.properties[BaseObjectTypeField.OBJECT_TYPE_ID] ? o.properties[BaseObjectTypeField.OBJECT_TYPE_ID].value : null;
|
|
413
|
+
if (objectTypes.indexOf(objectTypeId) === -1) {
|
|
414
|
+
objectTypes.push(objectTypeId);
|
|
415
|
+
}
|
|
416
|
+
resultListItems.push({
|
|
417
|
+
objectTypeId,
|
|
418
|
+
content,
|
|
419
|
+
fields,
|
|
420
|
+
permissions: o.permissions
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
const result = {
|
|
424
|
+
hasMoreItems: searchResponse.hasMoreItems,
|
|
425
|
+
totalNumItems: searchResponse.totalNumItems,
|
|
426
|
+
items: resultListItems,
|
|
427
|
+
objectTypes
|
|
428
|
+
};
|
|
429
|
+
return result;
|
|
430
|
+
}
|
|
431
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
432
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, providedIn: 'root' }); }
|
|
433
|
+
}
|
|
434
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, decorators: [{
|
|
435
|
+
type: Injectable,
|
|
436
|
+
args: [{
|
|
437
|
+
providedIn: 'root'
|
|
438
|
+
}]
|
|
439
|
+
}] });
|
|
440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG1zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2UvZG1zL2Rtcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFjLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBVXpELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFDcEQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUNyQixjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFD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QUssRUFBRSxlQUFlO1lBQ3RCLFdBQVc7U0FDWixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0F0ZlUsVUFBVTttSEFBVixVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERtc09iamVjdCB9IGZyb20gJy4uLy4uL21vZGVsL2Rtcy1vYmplY3QubW9kZWwnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3V0aWxzJztcbmltcG9ydCB7IEFwaUJhc2UgfSBmcm9tICcuLi9iYWNrZW5kL2FwaS5lbnVtJztcbmltcG9ydCB7IEh0dHBPcHRpb25zIH0gZnJvbSAnLi4vYmFja2VuZC9iYWNrZW5kLmludGVyZmFjZSc7XG5pbXBvcnQgeyBCYWNrZW5kU2VydmljZSB9IGZyb20gJy4uL2JhY2tlbmQvYmFja2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uL2V2ZW50L2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgWXV2RXZlbnRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvZXZlbnRzJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoUmVzcG9uc2UsIFNlYXJjaFJlc3VsdCwgU2VhcmNoUmVzdWx0Q29udGVudCwgU2VhcmNoUmVzdWx0SXRlbSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCwgQ29udGVudFN0cmVhbUZpZWxkLCBTeXN0ZW1SZXN1bHQgfSBmcm9tICcuLi9zeXN0ZW0vc3lzdGVtLmVudW0nO1xuaW1wb3J0IHsgU3lzdGVtU2VydmljZSB9IGZyb20gJy4uL3N5c3RlbS9zeXN0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vdXBsb2FkL3VwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENvcmVBcGlPYmplY3QsXG4gIENvcmVBcGlPYmplY3RQcm9wZXJ0eSxcbiAgQ29yZUFwaVJlc3BvbnNlLFxuICBPYmplY3RDb3B5T3B0aW9ucyxcbiAgT2JqZWN0RGVsZXRlT3B0aW9ucyxcbiAgT2JqZWN0RGVsZXRlUmVzdWx0LFxuICBPYmplY3RNb3ZlT3B0aW9uc1xufSBmcm9tICcuL2Rtcy5zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnLi4vLi4vdXRpbC91dGlscy5oZWxwZXIuZW51bSc7XG4vKipcbiAqIFNlcnZpY2UgZm9yIHdvcmtpbmcgd2l0aCBkbXMgb2JqZWN0czogY3JlYXRlIHRoZW0sIGRlbGV0ZSwgZXRjLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEbXNTZXJ2aWNlIHtcbiAgI3NlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gICNiYWNrZW5kID0gaW5qZWN0KEJhY2tlbmRTZXJ2aWNlKTtcbiAgI2V2ZW50U2VydmljZSA9IGluamVjdChFdmVudFNlcnZpY2UpO1xuICAjdXBsb2FkU2VydmljZSA9IGluamVjdChVcGxvYWRTZXJ2aWNlKTtcblxuICAvLyBnZW5lcmFsIHRyaWdnZXIgb3BlcmF0b3IgdG8gaGFuZGxlIGFsbCBkbXMgZXZlbnRzXG4gIHByaXZhdGUgdHJpZ2dlckV2ZW50KGV2ZW50OiBZdXZFdmVudFR5cGUsIGlkPzogc3RyaW5nLCBzaWxlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiAoc3RyZWFtOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgIHN0cmVhbS5waXBlKFxuICAgICAgICAvLyB1cGRhdGUgZG9lcyBub3QgcmV0dXJuIHBlcm1pc3Npb25zLCBzbyB3ZSBuZWVkIHRvIHJlLWxvYWQgdGhlIHdob2xlIGRtcyBvYmplY3RcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgcGVybWlzc2lvbnMgYXJlIHByb3ZpZGVkXG4gICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiAoIWlkID8gb2YocmVzKSA6IHRoaXMuZ2V0RG1zT2JqZWN0KGlkKSkpLFxuICAgICAgICAvLyBUT0RPOiBlbmFibGUgb25jZSBwZXJtaXNzaW9ucyBhcmUgcHJvdmlkZWRcbiAgICAgICAgLy8gbWFwKChyZXMpID0+IHRoaXMuc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy5zZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSxcbiAgICAgICAgdGFwKChyZXM6IGFueSkgPT4gIXNpbGVudCAmJiB0aGlzLiNldmVudFNlcnZpY2UudHJpZ2dlcihldmVudCwgcmVzKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyBnZW5lcmFsIHRyaWdnZXIgb3BlcmF0b3IgdG8gaGFuZGxlIGFsbCBkbXMgZXZlbnRzXG4gICN0cmlnZ2VyRXZlbnRzKGV2ZW50OiBZdXZFdmVudFR5cGUsIGlkcz86IHN0cmluZ1tdLCBzaWxlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiAoc3RyZWFtOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgIHN0cmVhbS5waXBlKFxuICAgICAgICAvLyB1cGRhdGUgZG9lcyBub3QgcmV0dXJuIHBlcm1pc3Npb25zLCBzbyB3ZSBuZWVkIHRvIHJlLWxvYWQgdGhlIHdob2xlIGRtcyBvYmplY3RcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgcGVybWlzc2lvbnMgYXJlIHByb3ZpZGVkXG4gICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiAoIWlkcyA/IG9mKHJlcykgOiB0aGlzLmdldERtc09iamVjdHMoaWRzKSkpLFxuICAgICAgICAvLyBUT0RPOiBlbmFibGUgb25jZSBwZXJtaXNzaW9ucyBhcmUgcHJvdmlkZWRcbiAgICAgICAgLy8gbWFwKChfcmVzOiBhbnlbXSkgPT4gX3Jlcy5tYXAoKHJlcywgaSkgPT4gcmVzPy5fZXJyb3IgPyB7IC4uLnJlcywgaWQ6IGlkcz9baV0gfSA6IHRoaXMuc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy5zZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSksXG4gICAgICAgIG1hcCgoX3JlczogYW55W10pID0+IF9yZXMubWFwKChyZXMsIGkpID0+IChyZXM/Ll9lcnJvciAmJiBpZHMgPyB7IC4uLnJlcywgaWQ6IGlkc1tpXSB9IDogcmVzKSkpLFxuICAgICAgICB0YXAoKHJlczogYW55KSA9PiAhc2lsZW50ICYmIHJlcy5mb3JFYWNoKChvOiBhbnkpID0+IG8gJiYgdGhpcy4jZXZlbnRTZXJ2aWNlLnRyaWdnZXIoZXZlbnQsIG8pKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG5ldyBkbXMgb2JqZWN0KHMpLiBQcm92aWRpbmcgYW4gYXJyYXkgb2YgZmlsZXMgaGVyZSBpbnN0ZWFkIG9mIG9uZSB3aWxsIGNyZWF0ZVxuICAgKiBhIG5ldyBkbXMgb2JqZWN0IGZvciBldmVyeSBmaWxlLiBJbiB0aGlzIGNhc2UgaW5kZXhkYXRhIHdpbGwgc2hhcmVkIGFjcm9zcyBhbGwgZmlsZXMuXG4gICAqIEBwYXJhbSBvYmplY3RUeXBlSWQgVGhlIElEIG9mIHRoZSBvYmplY3QgdHlwZSB0byBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSBpbmRleGRhdGEgSW5kZXhkYXRhIGZvciB0aGUgbmV3IG9iamVjdChzKVxuICAgKiBAcGFyYW0gZmlsZXMgRmlsZShzKSB0byBjcmVhdGUgZG1zIG9iamVjdHMgY29udGVudChzKSB3aXRoXG4gICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHRoYXQgd2lsbCBzaG93IHVwIGluIHRoZSB1cGxvYWQgb3ZlcmxheSBkaWFsb2cgd2hpbGUgdXBsb2FkaW5nXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIElEcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBjcmVhdGVEbXNPYmplY3Qob2JqZWN0VHlwZUlkOiBzdHJpbmcsIGluZGV4ZGF0YTogYW55LCBmaWxlczogRmlsZVtdLCBsYWJlbD86IHN0cmluZywgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy4jYmFja2VuZC5nZXRBcGlCYXNlKEFwaUJhc2UuYXBpV2ViKX0vZG1zL29iamVjdHNgO1xuICAgIGNvbnN0IGRhdGEgPSBpbmRleGRhdGE7XG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXSA9IG9iamVjdFR5cGVJZDtcblxuICAgIGNvbnN0IHVwbG9hZCA9IGZpbGVzLmxlbmd0aCA/IHRoaXMuI3VwbG9hZFNlcnZpY2UudXBsb2FkTXVsdGlwYXJ0KHVybCwgZmlsZXMsIGRhdGEsIGxhYmVsLCBzaWxlbnQpIDogdGhpcy4jdXBsb2FkU2VydmljZS5jcmVhdGVEb2N1bWVudCh1cmwsIGRhdGEpO1xuXG4gICAgcmV0dXJuIHVwbG9hZFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiByZXMubWFwKChyOiBhbnkpID0+IHIucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9JRF0udmFsdWUpKSxcbiAgICAgICAgLy8gVE9ETzogUmVwbGFjZSBieSBwcm9wZXIgc29sdXRpb25cbiAgICAgICAgLy8gUmlnaHQgbm93IHRoZXJlIGlzIGEgZ2FwIGJldHdlZW4gd2hlbiB0aGUgb2JqZWN0IHdhc1xuICAgICAgICAvLyBjcmVhdGVkIGFuZCB3aGVuIGl0IGlzIGluZGV4ZWQuIFNvIGRlbGF5aW5nIGhlcmUgd2lsbFxuICAgICAgICAvLyBnaXZlIGJhY2tlbmQgdGltZSB0byBnZXQgaXRzIHN0dWZmIHRvZ2V0aGVyLlxuICAgICAgICBkZWxheSgxMDAwKVxuICAgICAgKVxuICAgICAgLnBpcGUodGhpcy50cmlnZ2VyRXZlbnQoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfQ1JFQVRFRCwgJycsIHNpbGVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIGRlbGV0ZURtc09iamVjdChpZDogc3RyaW5nLCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgdXJsID0gYC9kbXMvb2JqZWN0cy8ke2lkfWA7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5kZWxldGUodXJsLCBBcGlCYXNlLmFwaVdlYilcbiAgICAgIC5waXBlKG1hcCgoKSA9PiAoeyBpZCB9KSkpXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9ERUxFVEVELCAnJywgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBvbGRlciB2ZXJzaW9uIG9mIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIElEIG9mIHRoZSBvYmplY3QgdG8gYmUgcmVzdG9yZWRcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIHJlc3RvcmVkXG4gICAqL1xuICByZXN0b3JlRG1zT2JqZWN0KGlkOiBzdHJpbmcsIHZlcnNpb246IG51bWJlciwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IGAvZG1zL29iamVjdHMvJHtpZH0vdmVyc2lvbnMvJHt2ZXJzaW9ufS9hY3Rpb25zL3Jlc3RvcmU/d2FpdEZvclNlYXJjaENvbnNpc3RlbmN5PXRydWUmcmVzdG9yZVBhcmVudElkPWZhbHNlYDtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5wb3N0KHVybCwge30sIEFwaUJhc2UuYXBpV2ViKS5waXBlKHRoaXMudHJpZ2dlckV2ZW50KFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX1VQREFURUQsIGlkLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgKGFkZC9yZXBsYWNlKSBjb250ZW50IHRvIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIG9iamVjdElkIElEIG9mIHRoZSBkbXMgb2JqZWN0IHRvIHVwbG9hZCB0aGUgZmlsZSB0b1xuICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgdXBsb2FkQ29udGVudChvYmplY3RJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jdXBsb2FkU2VydmljZS51cGxvYWQodGhpcy5nZXRDb250ZW50UGF0aChvYmplY3RJZCksIGZpbGUpLnBpcGUodGhpcy50cmlnZ2VyRXZlbnQoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCwgb2JqZWN0SWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIG9mIGRtcyBvYmplY3QgY29udGVudCBmaWxlLlxuICAgKiBAcGFyYW0gb2JqZWN0SWQgSUQgb2YgdGhlIGRtcyBvYmplY3RcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRtcyBvYmplY3RcbiAgICovXG4gIGdldENvbnRlbnRQYXRoKG9iamVjdElkOiBzdHJpbmcsIHZlcnNpb24/OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jYmFja2VuZC5nZXRBcGlCYXNlKEFwaUJhc2UuYXBpV2ViKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0vY29udGVudHMvZmlsZSR7dmVyc2lvbiA/ICc/dmVyc2lvbj0nICsgdmVyc2lvbiA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogT3JpZ2luYWwgQVBJIFBhdGggb2YgZG1zIG9iamVjdCBjb250ZW50IGZpbGUuXG4gICAqIEBwYXJhbSBvYmplY3RJZCBJRCBvZiB0aGUgZG1zIG9iamVjdFxuICAgKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZG1zIG9iamVjdFxuICAgKiBAcGFyYW0gcmVuZGl0aW9uIHNob3VsZCByZXR1cm4gcmVuZGl0aW9uIHBhdGggb2YgdGhlIGRtcyBvYmplY3RcbiAgICovXG4gIGdldEZ1bGxDb250ZW50UGF0aChvYmplY3RJZDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyLCByZW5kaXRpb24gPSBmYWxzZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNiYWNrZW5kLmdldEFwaUJhc2UoQXBpQmFzZS5jb3JlLCB0cnVlKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0ke3ZlcnNpb24gPyAnL3ZlcnNpb25zLycgKyB2ZXJzaW9uIDogJyd9L2NvbnRlbnRzLyR7XG4gICAgICByZW5kaXRpb24gPyAncmVuZGl0aW9ucy9wZGYnIDogJ2ZpbGUnXG4gICAgfWA7XG4gIH1cblxuICBnZXRTbGlkZVVSSShvYmplY3RJZDogc3RyaW5nLCBtaW1lVHlwZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkTWltZVR5cGVzID0gWycqLyonXTtcbiAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAvLyBjaGVjayBpZiBtaW1lIHR5cGUgc3VwcG9ydHMgc2xpZGVzXG4gICAgICBzdXBwb3J0ZWRNaW1lVHlwZXMuZm9yRWFjaCgocCkgPT4gKHN1cHBvcnRlZCA9IHN1cHBvcnRlZCB8fCBVdGlscy5wYXR0ZXJuVG9SZWdFeHAocCkudGVzdChtaW1lVHlwZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuICFtaW1lVHlwZSB8fCBzdXBwb3J0ZWQgPyBgJHt0aGlzLiNiYWNrZW5kLmdldEFwaUJhc2UoQXBpQmFzZS5jb3JlLCB0cnVlKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0vY29udGVudHMvcmVuZGl0aW9ucy9zbGlkZWAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIHRoZSBjb250ZW50IG9mIGRtcyBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gRG1zT2JqZWN0W10gZG1zT2JqZWN0cyBBcnJheSBvZiBkbXMgb2JqZWN0cyB0byBiZSBkb3dubG9hZGVkXG4gICAqIEBwYXJhbSB3aXRoVmVyc2lvbiBzaG91bGQgZG93bmxvYWQgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgb2JqZWN0XG4gICAqL1xuICBkb3dubG9hZENvbnRlbnQob2JqZWN0czogRG1zT2JqZWN0W10sIHdpdGhWZXJzaW9uPzogYm9vbGVhbikge1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqZWN0LCBpKSA9PlxuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVyaSA9IGAke3RoaXMuZ2V0Q29udGVudFBhdGgob2JqZWN0Py5pZCwgd2l0aFZlcnNpb24gPyBvYmplY3Q/LnZlcnNpb24gOiB1bmRlZmluZWQpfWA7XG4gICAgICAgICAgdGhpcy4jYmFja2VuZC5kb3dubG9hZCh1cmkpO1xuICAgICAgICB9LFxuICAgICAgICBVdGlscy5pc1NhZmFyaSgpID8gaSAqIDEwMDAgOiAwIC8vIFNhZmFyaSBkb2VzIG5vdCBhbGxvdyBtdWx0aSBkb3dubG9hZFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBkbXMgb2JqZWN0LlxuICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIG9iamVjdCB0byBiZSByZXRyaWV2ZWRcbiAgICogQHBhcmFtIHZlcnNpb24gRGVzaXJlZCB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcbiAgICovXG4gIGdldERtc09iamVjdChpZDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyLCBzaWxlbnQgPSBmYWxzZSwgcmVxdWVzdE9wdGlvbnM/OiBIdHRwT3B0aW9ucyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RG1zT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5nZXQoYC9kbXMvb2JqZWN0cy8ke2lkfSR7dmVyc2lvbiA/ICcvdmVyc2lvbnMvJyArIHZlcnNpb24gOiAnJ31gLCB1bmRlZmluZWQsIHJlcXVlc3RPcHRpb25zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbTogU2VhcmNoUmVzdWx0SXRlbSA9IHRoaXMuI3NlYXJjaFNlcnZpY2UudG9TZWFyY2hSZXN1bHQocmVzKS5pdGVtc1swXTtcbiAgICAgICAgICByZXR1cm4gdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QoaXRlbSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9MT0FERUQsICcnLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgdGFnIG9uIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSB1cGRhdGVkXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdGFncyBuZXcgdmFsdWVcbiAgICovXG4gIHNldERtc09iamVjdFRhZyhpZDogc3RyaW5nLCB0YWc6IHN0cmluZywgdmFsdWU6IGFueSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kXG4gICAgICAucG9zdChgL2Rtcy9vYmplY3RzL3RhZ3MvJHt0YWd9L3N0YXRlLyR7dmFsdWV9P3F1ZXJ5PVNFTEVDVCAqIEZST00gc3lzdGVtOm9iamVjdCBXSEVSRSBzeXN0ZW06b2JqZWN0SWQ9JyR7aWR9J2AsIHt9LCBBcGlCYXNlLmNvcmUpXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVELCBpZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHRhZyBmcm9tIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSBkZWxldGVkXG4gICAqL1xuICBkZWxldGVEbXNPYmplY3RUYWcoaWQ6IHN0cmluZywgdGFnOiBzdHJpbmcsIHNpbGVudCA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5kZWxldGUoYC9kbXMvb2JqZWN0cy8ke2lkfS90YWdzLyR7dGFnfWAsIEFwaUJhc2UuY29yZSkucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVELCBpZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGluZGV4ZGF0YSBvZiBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBkYXRhIHRvXG4gICAqIEBwYXJhbSBkYXRhIEluZGV4ZGF0YSB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSBzaWxlbnQgZmxhZyB0byB0cmlnZ2VyIERNU19PQkpFQ1RfVVBEQVRFRCBldmVudFxuICAgKi9cbiAgdXBkYXRlRG1zT2JqZWN0KGlkOiBzdHJpbmcsIGRhdGE6IGFueSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBhdGNoKGAvZG1zL29iamVjdHMvJHtpZH1gLCBkYXRhKS5waXBlKHRoaXMudHJpZ2dlckV2ZW50KFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX1VQREFURUQsIGlkLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGdpdmVuIG9iamVjdHMuXG4gICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZURtc09iamVjdHMob2JqZWN0czogeyBpZDogc3RyaW5nOyBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH1bXSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5wYXRjaChgL2Rtcy9vYmplY3RzYCwge1xuICAgICAgICBwYXRjaGVzOiBvYmplY3RzLm1hcCgobykgPT4gKHtcbiAgICAgICAgICBpZDogby5pZCxcbiAgICAgICAgICBkYXRhOiBvLmRhdGFcbiAgICAgICAgfSkpXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRoaXMuI3RyaWdnZXJFdmVudHMoXG4gICAgICAgICAgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCxcbiAgICAgICAgICBvYmplY3RzLm1hcCgobykgPT4gby5pZCksXG4gICAgICAgICAgc2lsZW50XG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHRhZyBvbiBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZHMgTGlzdCBvZiBJRHMgb2Ygb2JqZWN0c1xuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gYmUgdXBkYXRlZFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHRhZ3MgbmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGVEbXNPYmplY3RzVGFnKGlkczogc3RyaW5nW10sIHRhZzogc3RyaW5nLCB2YWx1ZTogYW55LCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hVcGRhdGVUYWcoaWRzLCB0YWcsIHZhbHVlKS5waXBlKHRoaXMuI3RyaWdnZXJFdmVudHMoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCwgaWRzLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBnaXZlbiBvYmplY3RzIHRvIGEgZGlmZmVyZW50IGZvbGRlci5cbiAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBpZCBvZiB0aGUgbmV3IHBhcmVudCBmb2xkZXJcbiAgICogQHBhcmFtIG9iamVjdHMgb2JqZWN0cyB0byBiZSBtb3ZlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgbW92ZSBvcGVyYXRpb25cbiAgICovXG4gIG1vdmVEbXNPYmplY3RzKHRhcmdldEZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvYmplY3RzOiBEbXNPYmplY3RbXSwgb3B0aW9ucz86IE9iamVjdE1vdmVPcHRpb25zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVEbXNPYmplY3RzKG9iamVjdHMubWFwKChvKSA9PiAoeyBpZDogby5pZCwgZGF0YTogeyBbQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfSURdOiB0YXJnZXRGb2xkZXJJZCB9IH0pLCB0cnVlKSkucGlwZShcbiAgICAgIHRhcCgocmVzKSA9PiAhb3B0aW9ucz8uc2lsZW50ICYmIHRoaXMuI2V2ZW50U2VydmljZS50cmlnZ2VyKFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUU19NT1ZFRCwgcmVzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgZ2l2ZW4gb2JqZWN0cyB0byBhIGRpZmZlcmVudCBmb2xkZXIuIFRoZSBvYmplY3RzIHdpbGwgYmUgY29waWVkIHdpdGggdGhlaXIgaW5kZXhkYXRhIHJlZmVyZW5jaW5nXG4gICAqIHRoZSBleGlzdGluZyBjb250ZW50IG9mIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVySWQgVGhlIElEIG9mIHRoZSB0YXJnZXQgZm9sZGVyXG4gICAqIEBwYXJhbSBvYmplY3RzIFRoZSBvYmplY3RzIHRvIGJlIGNvcGllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgY29weSBvcGVyYXRpb25cbiAgICovXG4gIGNvcHlEbXNPYmplY3RzKHRhcmdldEZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvYmplY3RzOiBEbXNPYmplY3RbXSwgb3B0aW9ucz86IE9iamVjdENvcHlPcHRpb25zKTogT2JzZXJ2YWJsZTxDb3JlQXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBleGNsdWRlUHJvcGVydGllcyA9IFtcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX0lELFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVEVEX0JZLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5NT0RJRklFRF9CWSxcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuTU9ESUZJQ0FUSU9OX0RBVEUsXG4gICAgICBCYXNlT2JqZWN0VHlwZUZpZWxkLlZFUlNJT05fTlVNQkVSLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5UUkFDRV9JRCxcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX09CSkVDVF9UWVBFX0lELFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfVkVSU0lPTl9OVU1CRVJcbiAgICBdO1xuXG4gICAgY29uc3QgbWFwcGVkT2JqZWN0czogQ29yZUFwaU9iamVjdFtdID0gb2JqZWN0cy5tYXAoKG8pID0+IHtcbiAgICAgIG8uZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRF0gPSB0YXJnZXRGb2xkZXJJZDtcblxuICAgICAgLy8gUmVtb3ZlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgY29waWVkLlxuICAgICAgLy8gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbnRlbnQgc3RyZWFtIGZpZWxkcyBidW5kbGVkIGludG8gdGhlIG9iamVjdHMgZGF0YSBmaWVsZC5cbiAgICAgIC8vIFByb3BlcnRpZXMgZW5kaW5nIHdpdGggJ190aXRsZScgYXJlIGFsc28gZXhjbHVkZWQgYXMgdGhleSBhcmUgZW5yaWNobWVudCB2YWx1ZXNcbiAgICAgIC8vIHByb3ZpZGVkIGJ5IEFQSS1XZWIuXG4gICAgICBPYmplY3Qua2V5cyhvLmRhdGEpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5LmVuZHNXaXRoKCdfdGl0bGUnKSB8fCBleGNsdWRlUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpIHx8IE9iamVjdC52YWx1ZXMoQ29udGVudFN0cmVhbUZpZWxkKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KG8uZGF0YSwga2V5KSk7XG5cbiAgICAgIC8vIG1hcCBmaWx0ZXJlZCBkYXRhIGZpZWxkIHRvIGRhdGEgZm9ybWF0IHJlcXVpcmVkIGJ5IHRoZSBDb3JlLUFQSVxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG8uZGF0YSkucmVkdWNlKFxuICAgICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHsgdmFsdWU6IG8uZGF0YVtrZXldIH07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgQ29yZUFwaU9iamVjdFByb3BlcnR5PlxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgICAgb2JqZWN0VHlwZUlkOiBvLm9iamVjdFR5cGVJZCxcbiAgICAgICAgLi4uKG8uY29udGVudFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb250ZW50U3RyZWFtczogW28uY29udGVudF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfSBhcyBDb3JlQXBpT2JqZWN0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgcXVlcnkgPSBvcHRpb25zXG4gICAgICA/IE9iamVjdC5rZXlzKG9wdGlvbnMpXG4gICAgICAgICAgLm1hcCgoa2V5OiBzdHJpbmcpID0+IGAke2tleX09JHsob3B0aW9ucyBhcyBhbnkpW2tleV19YClcbiAgICAgICAgICAuam9pbignJicpXG4gICAgICA6ICcnO1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBvc3QoYC9kbXMvb2JqZWN0cz8ke3F1ZXJ5fX1gLCB7IG9iamVjdHM6IG1hcHBlZE9iamVjdHMgfSwgQXBpQmFzZS5jb3JlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBidW5jaCBvZiBkbXMgb2JqZWN0cy5cbiAgICogQHBhcmFtIGlkcyBMaXN0IG9mIElEcyBvZiBvYmplY3RzIHRvIGJlIHJldHJpZXZlZFxuICAgKi9cbiAgZ2V0RG1zT2JqZWN0cyhpZHM6IHN0cmluZ1tdLCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8RG1zT2JqZWN0W10+IHtcbiAgICByZXR1cm4gdGhpcy5iYXRjaEdldChpZHMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChfcmVzOiBhbnlbXSkgPT5cbiAgICAgICAgICBfcmVzLm1hcCgocmVzLCBpKSA9PiAocmVzPy5fZXJyb3IgPyB7IC4uLnJlcywgaWQ6IGlkc1tpXSB9IDogdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy4jc2VhcmNoU2VydmljZS50b1NlYXJjaFJlc3VsdChyZXMpLml0ZW1zWzBdKSkpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5waXBlKHRoaXMuI3RyaWdnZXJFdmVudHMoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfTE9BREVELCB1bmRlZmluZWQsIHNpbGVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGJ1bmNoIG9mIGRtcyBvYmplY3RzLlxuICAgKiBAcGFyYW0gaWRzIExpc3Qgb2YgSURzIG9mIG9iamVjdHMgdG8gYmUgZGVsZXRlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWxldGUgcmVzdWx0cy5cbiAgICovXG4gIGRlbGV0ZURtc09iamVjdHMoXG4gICAgb2JqZWN0czogc3RyaW5nW10gfCB7IGlkOiBzdHJpbmc7IHN1YmplY3Q6IHN0cmluZyB9W10sXG5cbiAgICBvcHRpb25zPzogT2JqZWN0RGVsZXRlT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPE9iamVjdERlbGV0ZVJlc3VsdFtdPiB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBvcHRpb25zXG4gICAgICA/IGA/JHtPYmplY3Qua2V5cyhvcHRpb25zKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IFsnd2FpdEZvclNlYXJjaENvbnNpc3RlbmN5JywgJ2dyZWVkeSddLmluY2x1ZGVzKGspKVxuICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7KG9wdGlvbnMgYXMgYW55KVtrXX1gKVxuICAgICAgICAgIC5qb2luKCcmJyl9YFxuICAgICAgOiAnJztcblxuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kXG4gICAgICAuZGVsZXRlKGAvZG1zL29iamVjdHMke3F1ZXJ5UGFyYW1zfWAsIEFwaUJhc2UuY29yZSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgb2JqZWN0czogb2JqZWN0cy5tYXAoKG8pID0+ICh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOlxuICAgICAgICAgICAgICB0eXBlb2YgbyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbTpvYmplY3RJZCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW06b2JqZWN0SWQnOiB7IHZhbHVlOiBvLmlkIH0sXG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3Q6IHsgdmFsdWU6IG8uc3ViamVjdCB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXMpID0+XG4gICAgICAgICAgcmVzPy5vYmplY3RzPy5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdiA9IHIub3B0aW9ucz8uW1N5c3RlbVJlc3VsdC5ERUxFVEVdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IHIucHJvcGVydGllcz8uW0Jhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX0lEXT8udmFsdWUsXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHIucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgLi4uKHY/Lmh0dHBTdGF0dXNDb2RlID49IDQwMCA/IHsgX2Vycm9yOiB7IHN0YXR1czogdi5odHRwU3RhdHVzQ29kZSwgbWVzc2FnZTogdi5tZXNzYWdlIH0gfSA6IHt9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucGlwZSh0aGlzLiN0cmlnZ2VyRXZlbnRzKFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX0RFTEVURUQsIHVuZGVmaW5lZCwgb3B0aW9ucz8uc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBkbXMgb2JqZWN0IHZlcnNpb25zLlxuICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIG9iamVjdCB0byBiZSByZXRyaWV2ZWRcbiAgICovXG4gIGdldERtc09iamVjdFZlcnNpb25zKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuZ2V0KCcvZG1zL29iamVjdHMvJyArIGlkICsgJy92ZXJzaW9ucycpLnBpcGUoXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICBjb25zdCBpdGVtczogU2VhcmNoUmVzdWx0SXRlbVtdID0gdGhpcy4jc2VhcmNoU2VydmljZS50b1NlYXJjaFJlc3VsdChyZXMpLml0ZW1zIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLiNzZWFyY2hSZXN1bHRUb0Rtc09iamVjdChpdGVtKSk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgocmVzKSA9PiByZXMuc29ydChVdGlscy5zb3J0VmFsdWVzKCd2ZXJzaW9uJywgU29ydC5ERVNDKSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldERtc09iamVjdFZlcnNpb24oaWQ6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTxEbXNPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZFxuICAgICAgLmdldChgL2Rtcy9vYmplY3RzLyR7aWR9L3ZlcnNpb25zLyR7dmVyc2lvbn1gKVxuICAgICAgLnBpcGUobWFwKChyZXMpID0+IHRoaXMuI3NlYXJjaFJlc3VsdFRvRG1zT2JqZWN0KHRoaXMuI3NlYXJjaFNlcnZpY2UudG9TZWFyY2hSZXN1bHQocmVzKS5pdGVtc1swXSkpKTtcbiAgfVxuXG4gIGNvcmVBcGlSZXNwb25zZVRvRG1zT2JqZWN0KHJlczogQ29yZUFwaVJlc3BvbnNlKTogRG1zT2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3Qoe1xuICAgICAgb2JqZWN0VHlwZUlkOiByZXMucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXS52YWx1ZSBhcyBzdHJpbmcsXG4gICAgICBmaWVsZHM6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMocmVzLnByb3BlcnRpZXMpKSxcbiAgICAgIGNvbnRlbnQ6IHJlcy5jb250ZW50U3RyZWFtcz8uWzBdXG4gICAgfSk7XG4gIH1cblxuICAjc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QocmVzSXRlbTogU2VhcmNoUmVzdWx0SXRlbSk6IERtc09iamVjdCB7XG4gICAgcmV0dXJuIG5ldyBEbXNPYmplY3QocmVzSXRlbSk7XG4gIH1cblxuICBiYXRjaFVwZGF0ZVRhZyhpZHM6IHN0cmluZ1tdLCB0YWc6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLmJhdGNoKFxuICAgICAgaWRzLm1hcCgoaWQpID0+ICh7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmk6IGAvZG1zL29iamVjdHMvdGFncy8ke3RhZ30vc3RhdGUvJHt2YWx1ZX0/cXVlcnk9U0VMRUNUICogRlJPTSBzeXN0ZW06b2JqZWN0IFdIRVJFIHN5c3RlbTpvYmplY3RJZD0nJHtpZH0nYCxcbiAgICAgICAgYmFzZTogQXBpQmFzZS5jb3JlLFxuICAgICAgICBib2R5OiB7fVxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIGJhdGNoRGVsZXRlVGFnKGlkczogc3RyaW5nW10sIHRhZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuYmF0Y2goXG4gICAgICBpZHMubWFwKChpZCkgPT4gKHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgdXJpOiBgL2Rtcy9vYmplY3RzLyR7aWR9L3RhZ3MvJHt0YWd9YCxcbiAgICAgICAgYmFzZTogQXBpQmFzZS5jb3JlXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgYmF0Y2hEZWxldGUoaWRzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLmJhdGNoKGlkcy5tYXAoKGlkKSA9PiAoeyBtZXRob2Q6ICdERUxFVEUnLCB1cmk6IGAvZG1zL29iamVjdHMvJHtpZH1gIH0pKSk7XG4gIH1cblxuICBiYXRjaEdldChpZHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuYmF0Y2goaWRzLm1hcCgoaWQpID0+ICh7IG1ldGhvZDogJ0dFVCcsIHVyaTogYC9kbXMvb2JqZWN0cy8ke2lkfWAgfSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgc2VhcmNoIHJlc3VsdCBmcm9tIHRoZSBiYWNrZW5kIHRvIGFwcGxpY2F0aW9ucyBTZWFyY2hSZXN1bHQgb2JqZWN0XG4gICAqIEBwYXJhbSBzZWFyY2hSZXNwb25zZSBUaGUgYmFja2VuZCByZXNwb25zZVxuICAgKi9cbiAgdG9TZWFyY2hSZXN1bHQoc2VhcmNoUmVzcG9uc2U6IFNlYXJjaFJlc3BvbnNlKTogU2VhcmNoUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHRMaXN0SXRlbXM6IFNlYXJjaFJlc3VsdEl0ZW1bXSA9IFtdO1xuICAgIGNvbnN0IG9iamVjdFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgc2VhcmNoUmVzcG9uc2Uub2JqZWN0cy5mb3JFYWNoKChvOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IG5ldyBNYXAoKTtcbiAgICAgIC8vIHByb2Nlc3MgcHJvcGVydGllcyBzZWN0aW9uIG9mIHJlc3VsdFxuICAgICAgT2JqZWN0LmtleXMoby5wcm9wZXJ0aWVzKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBvLnByb3BlcnRpZXNba2V5XS52YWx1ZTtcbiAgICAgICAgaWYgKG8ucHJvcGVydGllc1trZXldLmNsdmFsdWUpIHtcbiAgICAgICAgICAvLyB0YWJsZSBmaWVsZHMgd2lsbCBoYXZlIGEgY2xpZW50VmFsdWUgdG9vIC4uLlxuICAgICAgICAgIHZhbHVlID0gby5wcm9wZXJ0aWVzW2tleV0uY2x2YWx1ZTtcbiAgICAgICAgICAvLyAuLi4gYW5kIGFsc28gbWF5IGNvbnRhaW4gdmFsdWVzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZFxuICAgICAgICAgIGlmIChvLnByb3BlcnRpZXNba2V5XS5yZXNvbHZlZFZhbHVlcykge1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHYpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNWYWx1ZSA9IEFycmF5LmlzQXJyYXkodltrXSkgPyB2W2tdLm1hcCgoaTogYW55KSA9PiBvLnByb3BlcnRpZXNba2V5XS5yZXNvbHZlZFZhbHVlc1tpXSkgOiBvLnByb3BlcnRpZXNba2V5XS5yZXNvbHZlZFZhbHVlc1t2W2tdXTtcbiAgICAgICAgICAgICAgICBpZiAocmVzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZbYCR7a31fdGl0bGVgXSA9IHJlc1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoby5wcm9wZXJ0aWVzW2tleV0udGl0bGUpIHtcbiAgICAgICAgICBmaWVsZHMuc2V0KGtleSArICdfdGl0bGUnLCBvLnByb3BlcnRpZXNba2V5XS50aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBwcm9jZXNzIGNvbnRlbnRTdHJlYW1zIHNlY3Rpb24gb2YgcmVzdWx0IGlmIGF2YWlsYWJsZS5cbiAgICAgIC8vIE9iamVjdHMgdGhhdCBkb24ndCBoYXZlIGZpbGVzIGF0dGFjaGVkIHdvbid0IGhhdmUgdGhpcyBzZWN0aW9uXG4gICAgICBsZXQgY29udGVudDogU2VhcmNoUmVzdWx0Q29udGVudCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvLmNvbnRlbnRTdHJlYW1zICYmIG8uY29udGVudFN0cmVhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBlYWNoIHJlc3VsdCBvYmplY3Qgb25seSBoYXMgT05FIGZpbGUgYXR0YWNoZWQsIGFsdG91Z2hcbiAgICAgICAgLy8gdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlcmUgbWF5IGJlIG1vcmVcbiAgICAgICAgY29uc3QgY29udGVudFN0cmVhbSA9IG8uY29udGVudFN0cmVhbXNbMF07XG4gICAgICAgIC8vIGFsc28gYWRkIGNvbnRlbnRzdHJlYW0gcmVsYXRlZCBmaWVsZHMgdG8gdGhlIHJlc3VsdCBmaWVsZHNcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuTEVOR1RILCBjb250ZW50U3RyZWFtLmxlbmd0aCk7XG4gICAgICAgIGZpZWxkcy5zZXQoQ29udGVudFN0cmVhbUZpZWxkLk1JTUVfVFlQRSwgY29udGVudFN0cmVhbS5taW1lVHlwZSk7XG4gICAgICAgIGZpZWxkcy5zZXQoQ29udGVudFN0cmVhbUZpZWxkLkZJTEVOQU1FLCBjb250ZW50U3RyZWFtLmZpbGVOYW1lKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuSUQsIGNvbnRlbnRTdHJlYW0uY29udGVudFN0cmVhbUlkKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuUkFOR0UsIGNvbnRlbnRTdHJlYW0uY29udGVudFN0cmVhbVJhbmdlKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuUkVQT1NJVE9SWV9JRCwgY29udGVudFN0cmVhbS5yZXBvc2l0b3J5SWQpO1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5ESUdFU1QsIGNvbnRlbnRTdHJlYW0uZGlnZXN0KTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuQVJDSElWRV9QQVRILCBjb250ZW50U3RyZWFtLmFyY2hpdmVQYXRoKTtcblxuICAgICAgICBjb250ZW50ID0ge1xuICAgICAgICAgIGNvbnRlbnRTdHJlYW1JZDogY29udGVudFN0cmVhbS5jb250ZW50U3RyZWFtSWQsXG4gICAgICAgICAgcmVwb3NpdG9yeUlkOiBjb250ZW50U3RyZWFtLnJlcG9zaXRvcnlJZCxcbiAgICAgICAgICByYW5nZTogY29udGVudFN0cmVhbS5yYW5nZSxcbiAgICAgICAgICBkaWdlc3Q6IGNvbnRlbnRTdHJlYW0uZGlnZXN0LFxuICAgICAgICAgIGFyY2hpdmVQYXRoOiBjb250ZW50U3RyZWFtLmFyY2hpdmVQYXRoLFxuICAgICAgICAgIGZpbGVOYW1lOiBjb250ZW50U3RyZWFtLmZpbGVOYW1lLFxuICAgICAgICAgIG1pbWVUeXBlOiBjb250ZW50U3RyZWFtLm1pbWVUeXBlLFxuICAgICAgICAgIHNpemU6IGNvbnRlbnRTdHJlYW0ubGVuZ3RoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iamVjdFR5cGVJZCA9IG8ucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXSA/IG8ucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXS52YWx1ZSA6IG51bGw7XG4gICAgICBpZiAob2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlSWQpID09PSAtMSkge1xuICAgICAgICBvYmplY3RUeXBlcy5wdXNoKG9iamVjdFR5cGVJZCk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdExpc3RJdGVtcy5wdXNoKHtcbiAgICAgICAgb2JqZWN0VHlwZUlkLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHBlcm1pc3Npb25zOiBvLnBlcm1pc3Npb25zXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdDogU2VhcmNoUmVzdWx0ID0ge1xuICAgICAgaGFzTW9yZUl0ZW1zOiBzZWFyY2hSZXNwb25zZS5oYXNNb3JlSXRlbXMsXG4gICAgICB0b3RhbE51bUl0ZW1zOiBzZWFyY2hSZXNwb25zZS50b3RhbE51bUl0ZW1zLFxuICAgICAgaXRlbXM6IHJlc3VsdExpc3RJdGVtcyxcbiAgICAgIG9iamVjdFR5cGVzXG4gICAgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2V2ZW50L2V2ZW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmlnZ2VyYWJsZSBhbmQgU3Vic2NyaWJhYmxlIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFl1dkV2ZW50IHtcbiAgICAvKipcbiAgICAgKiB0eXBlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGRhdGEgdG8gYmUgcGFzc2VkIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gICAgICovXG4gICAgZGF0YT86IGFueTtcbiAgfSJdfQ==
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { filter } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Service for providing triggered events
|
|
7
|
+
*/
|
|
8
|
+
export class EventService {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.#eventSource = new Subject();
|
|
11
|
+
this.event$ = this.#eventSource.asObservable();
|
|
12
|
+
}
|
|
13
|
+
#eventSource;
|
|
14
|
+
/**
|
|
15
|
+
* Trigger an global event
|
|
16
|
+
* @param type Type/key of the event
|
|
17
|
+
* @param data Data to be send along with the event
|
|
18
|
+
*/
|
|
19
|
+
trigger(type, data) {
|
|
20
|
+
this.#eventSource.next({ type, data });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Listen on a triggered event
|
|
24
|
+
* @param types Type/key of the event
|
|
25
|
+
*/
|
|
26
|
+
on(...types) {
|
|
27
|
+
return this.event$.pipe(filter((event) => event && !!types.find((t) => t === event.type)));
|
|
28
|
+
}
|
|
29
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
30
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, providedIn: 'root' }); }
|
|
31
|
+
}
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, decorators: [{
|
|
33
|
+
type: Injectable,
|
|
34
|
+
args: [{
|
|
35
|
+
providedIn: 'root'
|
|
36
|
+
}]
|
|
37
|
+
}] });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS9ldmVudC9ldmVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJRSxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFDdkMsV0FBTSxHQUF5QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBa0JqRTtJQW5CQyxZQUFZLENBQTJCO0lBR3ZDOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVU7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsRUFBRSxDQUFDLEdBQUcsS0FBZTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDOytHQW5CVSxZQUFZO21IQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFl1dkV2ZW50IH0gZnJvbSAnLi9ldmVudC5pbnRlcmZhY2UnO1xuLyoqXG4gKiBTZXJ2aWNlIGZvciBwcm92aWRpbmcgdHJpZ2dlcmVkIGV2ZW50c1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFdmVudFNlcnZpY2Uge1xuICAjZXZlbnRTb3VyY2UgPSBuZXcgU3ViamVjdDxZdXZFdmVudD4oKTtcbiAgZXZlbnQkOiBPYnNlcnZhYmxlPFl1dkV2ZW50PiA9IHRoaXMuI2V2ZW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGdsb2JhbCBldmVudFxuICAgKiBAcGFyYW0gdHlwZSBUeXBlL2tleSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gICAqL1xuICB0cmlnZ2VyKHR5cGU6IHN0cmluZywgZGF0YT86IGFueSkge1xuICAgIHRoaXMuI2V2ZW50U291cmNlLm5leHQoeyB0eXBlLCBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBvbiBhIHRyaWdnZXJlZCBldmVudFxuICAgKiBAcGFyYW0gdHlwZXMgVHlwZS9rZXkgb2YgdGhlIGV2ZW50XG4gICAqL1xuICBvbiguLi50eXBlczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFl1dkV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnQkLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgJiYgISF0eXBlcy5maW5kKCh0KSA9PiB0ID09PSBldmVudC50eXBlKSkpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Events emitted by parts of the application
|
|
3
|
+
*/
|
|
4
|
+
export var YuvEventType;
|
|
5
|
+
(function (YuvEventType) {
|
|
6
|
+
YuvEventType["LOGOUT"] = "yuv.user.logout";
|
|
7
|
+
YuvEventType["CLIENT_LOCALE_CHANGED"] = "yuv.user.locale.client.changed";
|
|
8
|
+
YuvEventType["DMS_OBJECT_LOADED"] = "yuv.dms.object.loaded";
|
|
9
|
+
YuvEventType["DMS_OBJECT_CREATED"] = "yuv.dms.object.created";
|
|
10
|
+
YuvEventType["DMS_OBJECT_DELETED"] = "yuv.dms.object.deleted";
|
|
11
|
+
YuvEventType["DMS_OBJECT_UPDATED"] = "yuv.dms.object.updated";
|
|
12
|
+
YuvEventType["DMS_OBJECTS_MOVED"] = "yuv.dms.objects.moved";
|
|
13
|
+
})(YuvEventType || (YuvEventType = {}));
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2V2ZW50L2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDdEIsMENBQTBCLENBQUE7SUFDMUIsd0VBQXdELENBQUE7SUFDeEQsMkRBQTJDLENBQUE7SUFDM0MsNkRBQTZDLENBQUE7SUFDN0MsNkRBQTZDLENBQUE7SUFDN0MsNkRBQTZDLENBQUE7SUFDN0MsMkRBQTJDLENBQUE7QUFDN0MsQ0FBQyxFQVJXLFlBQVksS0FBWixZQUFZLFFBUXZCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdmVudHMgZW1pdHRlZCBieSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gWXV2RXZlbnRUeXBlIHtcbiAgTE9HT1VUID0gJ3l1di51c2VyLmxvZ291dCcsXG4gIENMSUVOVF9MT0NBTEVfQ0hBTkdFRCA9ICd5dXYudXNlci5sb2NhbGUuY2xpZW50LmNoYW5nZWQnLFxuICBETVNfT0JKRUNUX0xPQURFRCA9ICd5dXYuZG1zLm9iamVjdC5sb2FkZWQnLFxuICBETVNfT0JKRUNUX0NSRUFURUQgPSAneXV2LmRtcy5vYmplY3QuY3JlYXRlZCcsXG4gIERNU19PQkpFQ1RfREVMRVRFRCA9ICd5dXYuZG1zLm9iamVjdC5kZWxldGVkJyxcbiAgRE1TX09CSkVDVF9VUERBVEVEID0gJ3l1di5kbXMub2JqZWN0LnVwZGF0ZWQnLFxuICBETVNfT0JKRUNUU19NT1ZFRCA9ICd5dXYuZG1zLm9iamVjdHMubW92ZWQnXG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRtLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS9pZG0vaWRtLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBPcmdhbml6YXRpb25TZXRFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6ICd1c2VyJyB8ICdyb2xlJztcbn1cbiJdfQ==
|