@deeksha2309/sunbird-collection-editor 8.0.7
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 +24 -0
- package/esm2022/lib/collection-editor-cursor.service.mjs +3 -0
- package/esm2022/lib/collection-editor-library.component.mjs +16 -0
- package/esm2022/lib/collection-editor-library.module.mjs +137 -0
- package/esm2022/lib/components/answer/answer.component.mjs +43 -0
- package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +325 -0
- package/esm2022/lib/components/asset-browser/asset-browser.data.mjs +53 -0
- package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +191 -0
- package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +895 -0
- package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +43 -0
- package/esm2022/lib/components/contentplayer-page/contentplayer-page.component.mjs +351 -0
- package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +178 -0
- package/esm2022/lib/components/dialcode/dialcode.component.mjs +182 -0
- package/esm2022/lib/components/editor/editor.component.mjs +1125 -0
- package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +529 -0
- package/esm2022/lib/components/header/header.component.mjs +123 -0
- package/esm2022/lib/components/library/library.component.mjs +242 -0
- package/esm2022/lib/components/library-filter/library-filter.component.mjs +149 -0
- package/esm2022/lib/components/library-list/library-list.component.mjs +92 -0
- package/esm2022/lib/components/library-player/library-player.component.mjs +62 -0
- package/esm2022/lib/components/manage-collaborator/manage-collaborator.component.mjs +256 -0
- package/esm2022/lib/components/meta-form/meta-form.component.mjs +377 -0
- package/esm2022/lib/components/options/options.component.mjs +144 -0
- package/esm2022/lib/components/plain-tree/plain-tree.component.mjs +125 -0
- package/esm2022/lib/components/progress-status/progress-status.component.mjs +46 -0
- package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +67 -0
- package/esm2022/lib/components/quality-params-modal/quality-params-modal.component.mjs +52 -0
- package/esm2022/lib/components/question/question.component.mjs +1360 -0
- package/esm2022/lib/components/quml-player/quml-player.component.mjs +73 -0
- package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +84 -0
- package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +143 -0
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +26 -0
- package/esm2022/lib/components/template/template.component.mjs +42 -0
- package/esm2022/lib/components/term-and-condition/term-and-condition.component.mjs +68 -0
- package/esm2022/lib/directives/telemetry-interact/telemetry-interact.directive.mjs +33 -0
- package/esm2022/lib/interfaces/McqForm.mjs +29 -0
- package/esm2022/lib/interfaces/editor.mjs +2 -0
- package/esm2022/lib/interfaces/framework.mjs +2 -0
- package/esm2022/lib/interfaces/httpOptions.mjs +2 -0
- package/esm2022/lib/interfaces/requestParam.mjs +2 -0
- package/esm2022/lib/interfaces/serverResponse.mjs +2 -0
- package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
- package/esm2022/lib/services/config/category.config.json +8 -0
- package/esm2022/lib/services/config/config.service.mjs +27 -0
- package/esm2022/lib/services/config/editor.config.json +31 -0
- package/esm2022/lib/services/config/label.config.json +314 -0
- package/esm2022/lib/services/config/player.config.json +96 -0
- package/esm2022/lib/services/config/url.config.json +69 -0
- package/esm2022/lib/services/data/data.service.mjs +192 -0
- package/esm2022/lib/services/dialcode/dialcode.service.mjs +309 -0
- package/esm2022/lib/services/editor/editor.service.mjs +682 -0
- package/esm2022/lib/services/framework/framework.service.mjs +106 -0
- package/esm2022/lib/services/helper/helper.service.mjs +160 -0
- package/esm2022/lib/services/player/player.service.mjs +99 -0
- package/esm2022/lib/services/public-data/public-data.service.mjs +21 -0
- package/esm2022/lib/services/question/question.service.mjs +167 -0
- package/esm2022/lib/services/telemetry/telemetry.service.mjs +120 -0
- package/esm2022/lib/services/toaster/toaster.service.mjs +105 -0
- package/esm2022/lib/services/tree/tree.service.mjs +284 -0
- package/esm2022/project-sunbird-sunbird-collection-editor.mjs +5 -0
- package/esm2022/public-api.mjs +4 -0
- package/fesm2022/project-sunbird-sunbird-collection-editor.mjs +10138 -0
- package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/assets/.gitkeep +0 -0
- package/lib/assets/images/MCQ.png +0 -0
- package/lib/assets/images/Spin.gif +0 -0
- package/lib/assets/images/bulkuploadfile.png +0 -0
- package/lib/assets/images/cancel-sign copy.png +0 -0
- package/lib/assets/images/cancel-sign.png +0 -0
- package/lib/assets/images/emptyResult.svg +1 -0
- package/lib/assets/images/icons-rtl.gif +0 -0
- package/lib/assets/images/icons.gif +0 -0
- package/lib/assets/images/imageicon.svg +16 -0
- package/lib/assets/images/imageicon_blue.svg +16 -0
- package/lib/assets/images/layoutoneicon.svg +16 -0
- package/lib/assets/images/layoutoneicon_blue.svg +16 -0
- package/lib/assets/images/layoutthreeicon.svg +18 -0
- package/lib/assets/images/layoutthreeicon_blue.svg +18 -0
- package/lib/assets/images/layouttwoicon.svg +18 -0
- package/lib/assets/images/layouttwoicon_blue.svg +18 -0
- package/lib/assets/images/leftalignicon.svg +17 -0
- package/lib/assets/images/leftalignicon_blue.svg +17 -0
- package/lib/assets/images/loader.gif +0 -0
- package/lib/assets/images/loader.svg +1 -0
- package/lib/assets/images/loading.gif +0 -0
- package/lib/assets/images/middlealignicon.svg +17 -0
- package/lib/assets/images/middlealignicon_blue.svg +17 -0
- package/lib/assets/images/question_collection.svg +18 -0
- package/lib/assets/images/rightalignicon.svg +17 -0
- package/lib/assets/images/rightalignicon_blue.svg +17 -0
- package/lib/assets/images/vline-rtl.gif +0 -0
- package/lib/assets/images/vline.gif +0 -0
- package/lib/assets/images/writing.png +0 -0
- package/lib/collection-editor-cursor.service.d.ts +5 -0
- package/lib/collection-editor-cursor.service.d.ts.map +1 -0
- package/lib/collection-editor-library.component.d.ts +9 -0
- package/lib/collection-editor-library.component.d.ts.map +1 -0
- package/lib/collection-editor-library.module.d.ts +50 -0
- package/lib/collection-editor-library.module.d.ts.map +1 -0
- package/lib/components/answer/answer.component.d.ts +24 -0
- package/lib/components/answer/answer.component.d.ts.map +1 -0
- package/lib/components/asset-browser/asset-browser.component.d.ts +81 -0
- package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -0
- package/lib/components/asset-browser/asset-browser.data.d.ts +52 -0
- package/lib/components/asset-browser/asset-browser.data.d.ts.map +1 -0
- package/lib/components/assign-page-number/assign-page-number.component.d.ts +38 -0
- package/lib/components/assign-page-number/assign-page-number.component.d.ts.map +1 -0
- package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +161 -0
- package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -0
- package/lib/components/collection-icon/collection-icon.component.d.ts +18 -0
- package/lib/components/collection-icon/collection-icon.component.d.ts.map +1 -0
- package/lib/components/contentplayer-page/contentplayer-page.component.d.ts +54 -0
- package/lib/components/contentplayer-page/contentplayer-page.component.d.ts.map +1 -0
- package/lib/components/csv-upload/csv-upload.component.d.ts +42 -0
- package/lib/components/csv-upload/csv-upload.component.d.ts.map +1 -0
- package/lib/components/dialcode/dialcode.component.d.ts +48 -0
- package/lib/components/dialcode/dialcode.component.d.ts.map +1 -0
- package/lib/components/editor/editor.component.d.ts +146 -0
- package/lib/components/editor/editor.component.d.ts.map +1 -0
- package/lib/components/fancy-tree/fancy-tree.component.d.ts +77 -0
- package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -0
- package/lib/components/header/header.component.d.ts +46 -0
- package/lib/components/header/header.component.d.ts.map +1 -0
- package/lib/components/library/library.component.d.ts +69 -0
- package/lib/components/library/library.component.d.ts.map +1 -0
- package/lib/components/library-filter/library-filter.component.d.ts +47 -0
- package/lib/components/library-filter/library-filter.component.d.ts.map +1 -0
- package/lib/components/library-list/library-list.component.d.ts +32 -0
- package/lib/components/library-list/library-list.component.d.ts.map +1 -0
- package/lib/components/library-player/library-player.component.d.ts +24 -0
- package/lib/components/library-player/library-player.component.d.ts.map +1 -0
- package/lib/components/manage-collaborator/manage-collaborator.component.d.ts +75 -0
- package/lib/components/manage-collaborator/manage-collaborator.component.d.ts.map +1 -0
- package/lib/components/meta-form/meta-form.component.d.ts +51 -0
- package/lib/components/meta-form/meta-form.component.d.ts.map +1 -0
- package/lib/components/options/options.component.d.ts +53 -0
- package/lib/components/options/options.component.d.ts.map +1 -0
- package/lib/components/plain-tree/plain-tree.component.d.ts +20 -0
- package/lib/components/plain-tree/plain-tree.component.d.ts.map +1 -0
- package/lib/components/progress-status/progress-status.component.d.ts +25 -0
- package/lib/components/progress-status/progress-status.component.d.ts.map +1 -0
- package/lib/components/publish-checklist/publish-checklist.component.d.ts +23 -0
- package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -0
- package/lib/components/quality-params-modal/quality-params-modal.component.d.ts +24 -0
- package/lib/components/quality-params-modal/quality-params-modal.component.d.ts.map +1 -0
- package/lib/components/question/question.component.d.ts +215 -0
- package/lib/components/question/question.component.d.ts.map +1 -0
- package/lib/components/quml-player/quml-player.component.d.ts +26 -0
- package/lib/components/quml-player/quml-player.component.d.ts.map +1 -0
- package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts +31 -0
- package/lib/components/qumlplayer-page/qumlplayer-page.component.d.ts.map +1 -0
- package/lib/components/resource-reorder/resource-reorder.component.d.ts +45 -0
- package/lib/components/resource-reorder/resource-reorder.component.d.ts.map +1 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +13 -0
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts.map +1 -0
- package/lib/components/template/template.component.d.ts +21 -0
- package/lib/components/template/template.component.d.ts.map +1 -0
- package/lib/components/term-and-condition/term-and-condition.component.d.ts +26 -0
- package/lib/components/term-and-condition/term-and-condition.component.d.ts.map +1 -0
- package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts +27 -0
- package/lib/directives/telemetry-interact/telemetry-interact.directive.d.ts.map +1 -0
- package/lib/interfaces/McqForm.d.ts +32 -0
- package/lib/interfaces/McqForm.d.ts.map +1 -0
- package/lib/interfaces/editor.d.ts +78 -0
- package/lib/interfaces/editor.d.ts.map +1 -0
- package/lib/interfaces/framework.d.ts +46 -0
- package/lib/interfaces/framework.d.ts.map +1 -0
- package/lib/interfaces/httpOptions.d.ts +35 -0
- package/lib/interfaces/httpOptions.d.ts.map +1 -0
- package/lib/interfaces/requestParam.d.ts +24 -0
- package/lib/interfaces/requestParam.d.ts.map +1 -0
- package/lib/interfaces/serverResponse.d.ts +38 -0
- package/lib/interfaces/serverResponse.d.ts.map +1 -0
- package/lib/pipes/sanitize-html.pipe.d.ts +11 -0
- package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -0
- package/lib/services/config/config.service.d.ts +13 -0
- package/lib/services/config/config.service.d.ts.map +1 -0
- package/lib/services/data/data.service.d.ts +85 -0
- package/lib/services/data/data.service.d.ts.map +1 -0
- package/lib/services/dialcode/dialcode.service.d.ts +36 -0
- package/lib/services/dialcode/dialcode.service.d.ts.map +1 -0
- package/lib/services/editor/editor.service.d.ts +150 -0
- package/lib/services/editor/editor.service.d.ts.map +1 -0
- package/lib/services/framework/framework.service.d.ts +35 -0
- package/lib/services/framework/framework.service.d.ts.map +1 -0
- package/lib/services/helper/helper.service.d.ts +41 -0
- package/lib/services/helper/helper.service.d.ts.map +1 -0
- package/lib/services/player/player.service.d.ts +33 -0
- package/lib/services/player/player.service.d.ts.map +1 -0
- package/lib/services/public-data/public-data.service.d.ts +15 -0
- package/lib/services/public-data/public-data.service.d.ts.map +1 -0
- package/lib/services/question/question.service.d.ts +30 -0
- package/lib/services/question/question.service.d.ts.map +1 -0
- package/lib/services/telemetry/telemetry.service.d.ts +45 -0
- package/lib/services/telemetry/telemetry.service.d.ts.map +1 -0
- package/lib/services/toaster/toaster.service.d.ts +50 -0
- package/lib/services/toaster/toaster.service.d.ts.map +1 -0
- package/lib/services/tree/tree.service.d.ts +51 -0
- package/lib/services/tree/tree.service.d.ts.map +1 -0
- package/package.json +32 -0
- package/project-sunbird-sunbird-collection-editor.d.ts.map +1 -0
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +1,682 @@
|
|
|
1
|
+
import { Injectable, EventEmitter } from '@angular/core';
|
|
2
|
+
import { Subject, BehaviorSubject } from 'rxjs';
|
|
3
|
+
import * as _ from 'lodash-es';
|
|
4
|
+
import { map } from 'rxjs/operators';
|
|
5
|
+
import { ExportToCsv } from 'export-to-csv';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../tree/tree.service";
|
|
8
|
+
import * as i2 from "../../services/toaster/toaster.service";
|
|
9
|
+
import * as i3 from "../config/config.service";
|
|
10
|
+
import * as i4 from "../../services/telemetry/telemetry.service";
|
|
11
|
+
import * as i5 from "../public-data/public-data.service";
|
|
12
|
+
import * as i6 from "../data/data.service";
|
|
13
|
+
import * as i7 from "@angular/common/http";
|
|
14
|
+
export class EditorService {
|
|
15
|
+
constructor(treeService, toasterService, configService, telemetryService, publicDataService, dataService, httpClient) {
|
|
16
|
+
this.treeService = treeService;
|
|
17
|
+
this.toasterService = toasterService;
|
|
18
|
+
this.configService = configService;
|
|
19
|
+
this.telemetryService = telemetryService;
|
|
20
|
+
this.publicDataService = publicDataService;
|
|
21
|
+
this.dataService = dataService;
|
|
22
|
+
this.httpClient = httpClient;
|
|
23
|
+
this.data = {};
|
|
24
|
+
this._selectedChildren = {};
|
|
25
|
+
this.questionStream$ = new Subject();
|
|
26
|
+
this._editorMode = 'edit';
|
|
27
|
+
this._isReviewerEditEnable = false;
|
|
28
|
+
this._isReviewModificationAllowed = false;
|
|
29
|
+
this.showLibraryPage = new EventEmitter();
|
|
30
|
+
this.showQuestionLibraryPage = new EventEmitter();
|
|
31
|
+
this._bulkUploadStatus$ = new BehaviorSubject(undefined);
|
|
32
|
+
this.bulkUploadStatus$ = this._bulkUploadStatus$;
|
|
33
|
+
this.contentsCount = 0;
|
|
34
|
+
this.templateList = [];
|
|
35
|
+
this.branchingLogic = {};
|
|
36
|
+
this.questionIds = [];
|
|
37
|
+
}
|
|
38
|
+
initialize(config) {
|
|
39
|
+
this._editorConfig = config;
|
|
40
|
+
if (this.configService.editorConfig && this.configService.editorConfig.default) {
|
|
41
|
+
this._editorConfig.config = _.assign(this.configService.editorConfig.default, this._editorConfig.config);
|
|
42
|
+
}
|
|
43
|
+
this._editorMode = _.get(this._editorConfig, 'config.mode').toLowerCase();
|
|
44
|
+
this.setIsReviewerEditEnable(_.get(this._editorConfig, 'context.enableReviewEdit', false));
|
|
45
|
+
this.setQualityFormConfig(_.get(this._editorConfig, 'config.qualityFormConfig', null));
|
|
46
|
+
this.setIsReviewerQualityCheckEnabled(_.get(this._editorConfig, 'config.isReviewerQualityCheckEnabled', false));
|
|
47
|
+
}
|
|
48
|
+
set selectedChildren(value) {
|
|
49
|
+
if (value.mimeType) {
|
|
50
|
+
this._selectedChildren.mimeType = value.mimeType;
|
|
51
|
+
}
|
|
52
|
+
if (value.primaryCategory) {
|
|
53
|
+
this._selectedChildren.primaryCategory = value.primaryCategory;
|
|
54
|
+
}
|
|
55
|
+
if (value.interactionType) {
|
|
56
|
+
this._selectedChildren.interactionType = value.interactionType;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
get selectedChildren() {
|
|
60
|
+
return this._selectedChildren;
|
|
61
|
+
}
|
|
62
|
+
get editorConfig() {
|
|
63
|
+
return this._editorConfig;
|
|
64
|
+
}
|
|
65
|
+
get editorMode() {
|
|
66
|
+
return this._editorMode;
|
|
67
|
+
}
|
|
68
|
+
get isReviewerEditEnable() {
|
|
69
|
+
return this._isReviewerEditEnable;
|
|
70
|
+
}
|
|
71
|
+
setIsReviewerEditEnable(value) {
|
|
72
|
+
return this._isReviewerEditEnable = value;
|
|
73
|
+
}
|
|
74
|
+
get isReviewModificationAllowed() {
|
|
75
|
+
return this._isReviewModificationAllowed;
|
|
76
|
+
}
|
|
77
|
+
setIsReviewModificationAllowed(value) {
|
|
78
|
+
return this._isReviewModificationAllowed = value;
|
|
79
|
+
}
|
|
80
|
+
get contentPolicyUrl() {
|
|
81
|
+
const url = _.get(this.editorConfig, 'config.contentPolicyUrl');
|
|
82
|
+
return url ? url : this.configService.urlConFig.ContentPolicyUrl;
|
|
83
|
+
}
|
|
84
|
+
getToolbarConfig() {
|
|
85
|
+
return _.cloneDeep(_.merge(this.configService.labelConfig.button_labels, _.get(this.editorConfig, 'context.labels')));
|
|
86
|
+
}
|
|
87
|
+
emitshowLibraryPageEvent(page) {
|
|
88
|
+
this.showLibraryPage.emit(page);
|
|
89
|
+
}
|
|
90
|
+
getshowLibraryPageEmitter() {
|
|
91
|
+
return this.showLibraryPage;
|
|
92
|
+
}
|
|
93
|
+
getQuestionList(questionIds) {
|
|
94
|
+
const option = {
|
|
95
|
+
url: _.get(this.configService.urlConFig, 'URLS.QUESTION.LIST'),
|
|
96
|
+
data: {
|
|
97
|
+
request: {
|
|
98
|
+
search: {
|
|
99
|
+
identifier: questionIds
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
return this.dataService.post(option).pipe(map(data => _.get(data, 'result')));
|
|
105
|
+
}
|
|
106
|
+
fetchCollectionHierarchy(collectionId) {
|
|
107
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
108
|
+
const hierarchyUrl = `${url.HIERARCHY_READ}/${collectionId}`;
|
|
109
|
+
const req = {
|
|
110
|
+
url: hierarchyUrl,
|
|
111
|
+
param: { mode: 'edit' }
|
|
112
|
+
};
|
|
113
|
+
return this.publicDataService.get(req);
|
|
114
|
+
}
|
|
115
|
+
readQuestionSet(questionSetId, option = { params: {} }) {
|
|
116
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
117
|
+
const param = {
|
|
118
|
+
mode: 'edit',
|
|
119
|
+
fields: url.DEFAULT_PARAMS_FIELDS
|
|
120
|
+
};
|
|
121
|
+
const hierarchyUrl = `${url.READ}/${questionSetId}`;
|
|
122
|
+
const req = {
|
|
123
|
+
url: hierarchyUrl,
|
|
124
|
+
param: { ...param, ...option.params }
|
|
125
|
+
};
|
|
126
|
+
return this.publicDataService.get(req);
|
|
127
|
+
}
|
|
128
|
+
fetchContentDetails(contentId) {
|
|
129
|
+
const req = {
|
|
130
|
+
url: _.get(this.configService.urlConFig, 'URLS.CONTENT.READ') + contentId
|
|
131
|
+
};
|
|
132
|
+
return this.publicDataService.get(req);
|
|
133
|
+
}
|
|
134
|
+
updateHierarchy() {
|
|
135
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
136
|
+
const req = {
|
|
137
|
+
url: url.HIERARCHY_UPDATE,
|
|
138
|
+
data: {
|
|
139
|
+
request: {
|
|
140
|
+
data: {
|
|
141
|
+
...this.getCollectionHierarchy(),
|
|
142
|
+
...{ lastUpdatedBy: _.get(this.editorConfig, 'context.user.id') }
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
return this.publicDataService.patch(req);
|
|
148
|
+
}
|
|
149
|
+
getFieldsToUpdate(collectionId) {
|
|
150
|
+
let formFields = {};
|
|
151
|
+
const editableFields = _.get(this.editorConfig.config, 'editableFields');
|
|
152
|
+
if (editableFields && !_.isEmpty(editableFields[this.editorMode])) {
|
|
153
|
+
const fields = editableFields[this.editorMode];
|
|
154
|
+
const nodesModified = _.get(this.getCollectionHierarchy(), 'nodesModified');
|
|
155
|
+
const collectionFormData = _.get(nodesModified[collectionId], 'metadata');
|
|
156
|
+
_.forEach(fields, fieldCode => {
|
|
157
|
+
formFields[fieldCode] = collectionFormData[fieldCode];
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return formFields;
|
|
161
|
+
}
|
|
162
|
+
updateCollection(collectionId, data) {
|
|
163
|
+
let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
|
|
164
|
+
objType = objType.toLowerCase();
|
|
165
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
166
|
+
const fieldsObj = this.getFieldsToUpdate(collectionId);
|
|
167
|
+
const requestBody = {
|
|
168
|
+
request: {
|
|
169
|
+
[objType]: {
|
|
170
|
+
...fieldsObj,
|
|
171
|
+
lastPublishedBy: this.editorConfig.context.user.id
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const publishData = _.get(data, 'publishData');
|
|
176
|
+
if (publishData) {
|
|
177
|
+
requestBody.request[objType] = { ...requestBody.request[objType], ...publishData };
|
|
178
|
+
}
|
|
179
|
+
const option = {
|
|
180
|
+
url: `${url.SYSYTEM_UPDATE}${collectionId}`,
|
|
181
|
+
data: requestBody
|
|
182
|
+
};
|
|
183
|
+
return this.publicDataService.patch(option);
|
|
184
|
+
}
|
|
185
|
+
reviewContent(contentId) {
|
|
186
|
+
let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
|
|
187
|
+
objType = objType.toLowerCase();
|
|
188
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
189
|
+
const option = {
|
|
190
|
+
url: url.CONTENT_REVIEW + contentId,
|
|
191
|
+
data: {
|
|
192
|
+
request: {
|
|
193
|
+
[objType]: {}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
return this.publicDataService.post(option);
|
|
198
|
+
}
|
|
199
|
+
submitRequestChanges(contentId, comment) {
|
|
200
|
+
let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
|
|
201
|
+
objType = objType.toLowerCase();
|
|
202
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
203
|
+
const requestBody = {
|
|
204
|
+
request: {
|
|
205
|
+
[objType]: {
|
|
206
|
+
rejectComment: _.trim(comment)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
const option = {
|
|
211
|
+
url: `${url.CONTENT_REJECT}${contentId}`,
|
|
212
|
+
data: requestBody
|
|
213
|
+
};
|
|
214
|
+
return this.publicDataService.post(option);
|
|
215
|
+
}
|
|
216
|
+
publishContent(contentId, event) {
|
|
217
|
+
let objType = this.configService.categoryConfig[this.editorConfig.config.objectType];
|
|
218
|
+
objType = objType.toLowerCase();
|
|
219
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
220
|
+
const requestBody = {
|
|
221
|
+
request: {
|
|
222
|
+
[objType]: {
|
|
223
|
+
lastPublishedBy: this.editorConfig.context.user.id
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const publishData = _.get(event, 'publishData');
|
|
228
|
+
if (publishData) {
|
|
229
|
+
requestBody.request[objType] = { ...requestBody.request[objType], ...publishData };
|
|
230
|
+
}
|
|
231
|
+
const option = {
|
|
232
|
+
url: `${url.CONTENT_PUBLISH}${contentId}`,
|
|
233
|
+
data: requestBody
|
|
234
|
+
};
|
|
235
|
+
return this.publicDataService.post(option);
|
|
236
|
+
}
|
|
237
|
+
addResourceToHierarchy(collection, unitIdentifier, contentId) {
|
|
238
|
+
const req = {
|
|
239
|
+
url: _.get(this.configService.urlConFig, 'URLS.CONTENT.HIERARCHY_ADD'),
|
|
240
|
+
data: {
|
|
241
|
+
request: {
|
|
242
|
+
rootId: collection,
|
|
243
|
+
unitId: unitIdentifier,
|
|
244
|
+
children: [contentId]
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
return this.publicDataService.patch(req);
|
|
249
|
+
}
|
|
250
|
+
addResourceToQuestionset(collection, unitIdentifier, contentId) {
|
|
251
|
+
const children = _.isArray(contentId) ? contentId : [contentId];
|
|
252
|
+
let req = {
|
|
253
|
+
url: _.get(this.configService.urlConFig, 'URLS.QuestionSet.ADD'),
|
|
254
|
+
data: {
|
|
255
|
+
request: {
|
|
256
|
+
questionset: {
|
|
257
|
+
rootId: collection,
|
|
258
|
+
collectionId: unitIdentifier,
|
|
259
|
+
children
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
if (collection === unitIdentifier) {
|
|
265
|
+
req = _.omit(req, 'data.request.questionset.collectionId');
|
|
266
|
+
}
|
|
267
|
+
return this.publicDataService.patch(req);
|
|
268
|
+
}
|
|
269
|
+
getQuestionStream$() {
|
|
270
|
+
return this.questionStream$;
|
|
271
|
+
}
|
|
272
|
+
publish(value) {
|
|
273
|
+
this.questionStream$.next(value);
|
|
274
|
+
}
|
|
275
|
+
setQuestionIds(childrens) {
|
|
276
|
+
const self = this;
|
|
277
|
+
for (const children of childrens) {
|
|
278
|
+
if (children.data.objectType === 'QuestionSet') {
|
|
279
|
+
let questionCount = 0;
|
|
280
|
+
if (children?.data?.metadata?.maxQuestions && (children?.data?.metadata?.maxQuestions < children?.children?.length)) {
|
|
281
|
+
questionCount = children.data.metadata.maxQuestions;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
questionCount = children?.children ?
|
|
285
|
+
children?.children?.length : 0;
|
|
286
|
+
}
|
|
287
|
+
if (questionCount > 0) {
|
|
288
|
+
for (let i = 0; i < questionCount; i++) {
|
|
289
|
+
if (!_.isEmpty(children, 'children')) {
|
|
290
|
+
if (children.children[i].data.objectType === 'QuestionSet') {
|
|
291
|
+
self.setQuestionIds([children.children[i]]);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
if (!_.includes(this.questionIds, children.children[i].data.id)) {
|
|
295
|
+
this.questionIds.push(children.children[i].data.id);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async getMaxScore() {
|
|
305
|
+
let maxScore = 0;
|
|
306
|
+
let rootNode = [];
|
|
307
|
+
this.questionIds = [];
|
|
308
|
+
const rootNodeData = this.treeService.getFirstChild();
|
|
309
|
+
if (rootNodeData.children) {
|
|
310
|
+
rootNode = [rootNodeData];
|
|
311
|
+
}
|
|
312
|
+
if (!_.isEmpty(rootNode)) {
|
|
313
|
+
this.setQuestionIds(rootNode);
|
|
314
|
+
}
|
|
315
|
+
if (!_.isEmpty(this.questionIds)) {
|
|
316
|
+
const { questions } = await this.getQuestionList(this.questionIds).toPromise();
|
|
317
|
+
maxScore = this.calculateMaxScore(questions);
|
|
318
|
+
}
|
|
319
|
+
return maxScore;
|
|
320
|
+
}
|
|
321
|
+
calculateMaxScore(questions) {
|
|
322
|
+
return _.reduce(questions, (sum, question) => {
|
|
323
|
+
const nodeData = this.treeService.getNodeById(question.identifier);
|
|
324
|
+
if (_.has(nodeData.parent.data.metadata, 'shuffle') && nodeData.parent.data.metadata.shuffle === true) {
|
|
325
|
+
return sum + 1;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
return sum + (question?.responseDeclaration?.response1?.maxScore ? _.get(question, 'responseDeclaration.response1.maxScore') : 0);
|
|
329
|
+
}
|
|
330
|
+
}, 0);
|
|
331
|
+
}
|
|
332
|
+
getCollectionHierarchy() {
|
|
333
|
+
const instance = this;
|
|
334
|
+
this.data = {};
|
|
335
|
+
const data = this.treeService.getFirstChild();
|
|
336
|
+
return {
|
|
337
|
+
nodesModified: this.treeService.treeCache.nodesModified,
|
|
338
|
+
hierarchy: instance._toFlatObj(data)
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
_toFlatObj(data, questionId, selectUnitId) {
|
|
342
|
+
const instance = this;
|
|
343
|
+
if (data && data.data) {
|
|
344
|
+
instance.data[data.data.id] = {
|
|
345
|
+
name: data.title,
|
|
346
|
+
children: _.map(data.children, (child) => {
|
|
347
|
+
return child.data.id;
|
|
348
|
+
}),
|
|
349
|
+
root: data.data.root
|
|
350
|
+
};
|
|
351
|
+
if (questionId && selectUnitId && selectUnitId === data.data.id) {
|
|
352
|
+
instance.data[data.data.id].children.push(questionId);
|
|
353
|
+
}
|
|
354
|
+
if (questionId && selectUnitId && data.folder === false) {
|
|
355
|
+
delete instance.data[data.data.id];
|
|
356
|
+
}
|
|
357
|
+
_.forEach(data.children, (collection) => {
|
|
358
|
+
instance._toFlatObj(collection, questionId, selectUnitId);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
return instance.data;
|
|
362
|
+
}
|
|
363
|
+
getHierarchyObj(data, questionId, selectUnitId, parentIdentifier) {
|
|
364
|
+
return this._toFlatObj(data, questionId, selectUnitId);
|
|
365
|
+
}
|
|
366
|
+
_toFlatObjFromHierarchy(data) {
|
|
367
|
+
const instance = this;
|
|
368
|
+
if (data && data.children) {
|
|
369
|
+
instance.data[data.identifier] = {
|
|
370
|
+
name: data.name,
|
|
371
|
+
children: _.map(data.children, (child) => {
|
|
372
|
+
return child.identifier;
|
|
373
|
+
}),
|
|
374
|
+
branchingLogic: data.branchingLogic
|
|
375
|
+
};
|
|
376
|
+
_.forEach(data.children, (collection) => {
|
|
377
|
+
instance._toFlatObjFromHierarchy(collection);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
return instance.data;
|
|
381
|
+
}
|
|
382
|
+
getRelationalMetadataObj(data) {
|
|
383
|
+
let relationalMetadata = {};
|
|
384
|
+
_.forEach(data, (child) => {
|
|
385
|
+
if (_.get(child, 'data.metadata.relationalMetadata')) {
|
|
386
|
+
relationalMetadata = {
|
|
387
|
+
...relationalMetadata,
|
|
388
|
+
[child.data.id]: _.get(child, 'data.metadata.relationalMetadata')
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
return relationalMetadata;
|
|
393
|
+
}
|
|
394
|
+
getCategoryDefinition(categoryName, channel, objectType) {
|
|
395
|
+
const req = {
|
|
396
|
+
url: _.get(this.configService.urlConFig, 'URLS.getCategoryDefinition'),
|
|
397
|
+
data: {
|
|
398
|
+
request: {
|
|
399
|
+
objectCategoryDefinition: {
|
|
400
|
+
objectType: objectType ? objectType : 'Content',
|
|
401
|
+
name: categoryName,
|
|
402
|
+
...(channel && { channel })
|
|
403
|
+
},
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
return this.publicDataService.post(req);
|
|
408
|
+
}
|
|
409
|
+
fetchContentListDetails(req) {
|
|
410
|
+
return this.publicDataService.post(req);
|
|
411
|
+
}
|
|
412
|
+
sort(a, b, column) {
|
|
413
|
+
if (!this.isNotEmpty(a, column) || !this.isNotEmpty(b, column)) {
|
|
414
|
+
return 1;
|
|
415
|
+
}
|
|
416
|
+
let aColumn = a[column];
|
|
417
|
+
let bColumn = b[column];
|
|
418
|
+
if (_.isArray(aColumn)) {
|
|
419
|
+
aColumn = _.join(aColumn, ', ');
|
|
420
|
+
}
|
|
421
|
+
if (_.isArray(bColumn)) {
|
|
422
|
+
bColumn = _.join(bColumn, ', ');
|
|
423
|
+
}
|
|
424
|
+
if (_.isNumber(aColumn)) {
|
|
425
|
+
aColumn = _.toString(aColumn);
|
|
426
|
+
}
|
|
427
|
+
if (_.isNumber(bColumn)) {
|
|
428
|
+
bColumn = _.toString(bColumn);
|
|
429
|
+
}
|
|
430
|
+
return bColumn.localeCompare(aColumn);
|
|
431
|
+
}
|
|
432
|
+
isNotEmpty(obj, key) {
|
|
433
|
+
if (_.isNil(obj) || _.isNil(obj[key])) {
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
apiErrorHandling(err, errorInfo) {
|
|
439
|
+
if (_.get(err, 'error.params.errmsg') || errorInfo.errorMsg) {
|
|
440
|
+
this.toasterService.error(_.get(err, 'error.params.errmsg') || errorInfo.errorMsg);
|
|
441
|
+
}
|
|
442
|
+
const telemetryErrorData = {
|
|
443
|
+
err: _.toString(err.status),
|
|
444
|
+
errtype: 'SYSTEM',
|
|
445
|
+
stacktrace: JSON.stringify({ response: _.pick(err, ['error', 'url']), request: _.get(errorInfo, 'request') }) || errorInfo.errorMsg,
|
|
446
|
+
pageid: this.telemetryService.telemetryPageId
|
|
447
|
+
};
|
|
448
|
+
this.telemetryService.error(telemetryErrorData);
|
|
449
|
+
}
|
|
450
|
+
// this method is used to get all the contents in course/question inside every module and sub module
|
|
451
|
+
getContentChildrens(activeNode) {
|
|
452
|
+
let treeObj = this.treeService.getTreeObject();
|
|
453
|
+
const contents = [];
|
|
454
|
+
if (activeNode) {
|
|
455
|
+
treeObj = activeNode;
|
|
456
|
+
}
|
|
457
|
+
treeObj.visit((node) => {
|
|
458
|
+
if (node.folder === false) {
|
|
459
|
+
contents.push(node.data.id);
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
return contents;
|
|
463
|
+
}
|
|
464
|
+
// this method is used to keep count of contents added from library page
|
|
465
|
+
contentsCountAddedInLibraryPage(setToZero) {
|
|
466
|
+
if (setToZero) {
|
|
467
|
+
this.contentsCount = 0; // setting this count to zero while going out from library page
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
this.contentsCount = this.contentsCount + 1;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
checkIfContentsCanbeAdded() {
|
|
474
|
+
const config = {
|
|
475
|
+
errorMessage: '',
|
|
476
|
+
maxLimit: 0
|
|
477
|
+
};
|
|
478
|
+
if (_.get(this.editorConfig, 'config.objectType') === 'QuestionSet') {
|
|
479
|
+
config.errorMessage = _.get(this.configService, 'labelConfig.messages.error.031');
|
|
480
|
+
config.maxLimit = _.get(this.editorConfig, 'config.questionSet.maxQuestionsLimit');
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
config.errorMessage = _.get(this.configService, 'labelConfig.messages.error.032');
|
|
484
|
+
config.maxLimit = _.get(this.editorConfig, 'config.collection.maxContentsLimit');
|
|
485
|
+
}
|
|
486
|
+
const childrenCount = this.getContentChildrens().length + this.contentsCount;
|
|
487
|
+
if (childrenCount >= config.maxLimit) {
|
|
488
|
+
this.toasterService.error(config.errorMessage);
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
return true;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
getHierarchyFolder() {
|
|
496
|
+
const treeObj = this.treeService.getTreeObject();
|
|
497
|
+
const contents = [];
|
|
498
|
+
if (treeObj) {
|
|
499
|
+
treeObj.visit((node) => {
|
|
500
|
+
if (node && !node.data.root) {
|
|
501
|
+
contents.push(node.data.id);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
return contents;
|
|
506
|
+
}
|
|
507
|
+
validateCSVFile(formData, collectionnId) {
|
|
508
|
+
const url = _.get(this.configService.urlConFig, 'URLS.CSV.UPLOAD');
|
|
509
|
+
const reqParam = {
|
|
510
|
+
url: `${url}${collectionnId}`,
|
|
511
|
+
data: formData.data
|
|
512
|
+
};
|
|
513
|
+
return this.publicDataService.post(reqParam);
|
|
514
|
+
}
|
|
515
|
+
downloadHierarchyCsv(collectionId) {
|
|
516
|
+
const url = _.get(this.configService.urlConFig, 'URLS.CSV.DOWNLOAD');
|
|
517
|
+
const req = {
|
|
518
|
+
url: `${url}${collectionId}`,
|
|
519
|
+
};
|
|
520
|
+
return this.publicDataService.get(req);
|
|
521
|
+
}
|
|
522
|
+
generatePreSignedUrl(req, contentId, type) {
|
|
523
|
+
const reqParam = {
|
|
524
|
+
url: `${this.configService.urlConFig.URLS.CONTENT.UPLOAD_URL}${contentId}?type=${type}`,
|
|
525
|
+
data: {
|
|
526
|
+
request: req
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
return this.publicDataService.post(reqParam);
|
|
530
|
+
}
|
|
531
|
+
downloadBlobUrlFile(config) {
|
|
532
|
+
try {
|
|
533
|
+
this.httpClient.get(config.blobUrl, { responseType: 'blob' })
|
|
534
|
+
.subscribe(blob => {
|
|
535
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
536
|
+
const a = document.createElement('a');
|
|
537
|
+
a.href = objectUrl;
|
|
538
|
+
a.download = config.fileName;
|
|
539
|
+
document.body.appendChild(a);
|
|
540
|
+
a.click();
|
|
541
|
+
document.body.removeChild(a);
|
|
542
|
+
URL.revokeObjectURL(objectUrl);
|
|
543
|
+
if (config.successMessage) {
|
|
544
|
+
this.toasterService.success(config.successMessage);
|
|
545
|
+
}
|
|
546
|
+
}, (error) => {
|
|
547
|
+
console.error(_.get(this.configService, 'labelConfig.messages.error.034') + error);
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
catch (error) {
|
|
551
|
+
console.error(_.replace(_.get(this.configService, 'labelConfig.messages.error.033'), '{FILE_TYPE}', config.fileType) + error);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
generateCSV(config) {
|
|
555
|
+
const tableData = config.tableData;
|
|
556
|
+
delete config.tableData;
|
|
557
|
+
let options = {
|
|
558
|
+
fieldSeparator: ',',
|
|
559
|
+
quoteStrings: '"',
|
|
560
|
+
decimalSeparator: '.',
|
|
561
|
+
showLabels: true,
|
|
562
|
+
useTextFile: false,
|
|
563
|
+
useBom: true,
|
|
564
|
+
showTitle: true,
|
|
565
|
+
title: '',
|
|
566
|
+
filename: '',
|
|
567
|
+
headers: []
|
|
568
|
+
};
|
|
569
|
+
options = _.merge(options, config);
|
|
570
|
+
const csvExporter = new ExportToCsv(options);
|
|
571
|
+
csvExporter.generateCsv(tableData);
|
|
572
|
+
}
|
|
573
|
+
getBranchingLogicByFolder(identifier) {
|
|
574
|
+
const nodeData = this.treeService.getNodeById(identifier);
|
|
575
|
+
const branchingLogic = _.get(nodeData, 'data.metadata.branchingLogic');
|
|
576
|
+
return branchingLogic || {};
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
*
|
|
580
|
+
* @public
|
|
581
|
+
* @param identifier identifier of the node
|
|
582
|
+
* @returns { source: [], target: [], sourceTarget?: [] }
|
|
583
|
+
* @memberof EditorService
|
|
584
|
+
*/
|
|
585
|
+
getDependentNodes(identifier) {
|
|
586
|
+
const sectionBranchingLogic = this.getBranchingLogicByNodeId(identifier);
|
|
587
|
+
if (!_.isEmpty(sectionBranchingLogic)) {
|
|
588
|
+
const branchingEntry = this.getBranchingLogicEntry(sectionBranchingLogic, identifier);
|
|
589
|
+
const source = _.get(branchingEntry, 'source');
|
|
590
|
+
if (!_.isEmpty(source)) { // if the node is a dependent node
|
|
591
|
+
const sourceBranchingEntry = this.getBranchingLogicEntry(sectionBranchingLogic, _.first(branchingEntry.source));
|
|
592
|
+
return !_.isEmpty(sourceBranchingEntry) ? { source: branchingEntry.source, target: branchingEntry.target,
|
|
593
|
+
sourceTarget: sourceBranchingEntry.target } : {};
|
|
594
|
+
}
|
|
595
|
+
else { // if the node is a parent node
|
|
596
|
+
return !_.isEmpty(branchingEntry) ? { source: branchingEntry.source, target: branchingEntry.target } : {};
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
*
|
|
602
|
+
* @public
|
|
603
|
+
* @param identifier identifier of the node
|
|
604
|
+
* @returns {"do_id": { "target": [ "do_id123", "do_id456" ], "preCondition": {}, "source": [] }}
|
|
605
|
+
* @memberof EditorService
|
|
606
|
+
*/
|
|
607
|
+
getBranchingLogicByNodeId(identifier) {
|
|
608
|
+
const leafNode = this.treeService.getNodeById(identifier);
|
|
609
|
+
const parentIdentifier = _.get(leafNode, 'parent.data.id');
|
|
610
|
+
return this.getBranchingLogicByFolder(parentIdentifier);
|
|
611
|
+
}
|
|
612
|
+
getBranchingLogicEntry(parentBranchingLogic, identifier) {
|
|
613
|
+
return _.find(parentBranchingLogic, (logic, key) => {
|
|
614
|
+
return key === identifier;
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
getFlattenedBranchingLogic(data) {
|
|
618
|
+
const flatHierarchy = this._toFlatObjFromHierarchy(data);
|
|
619
|
+
const branchingLogics = _.compact(_.map(flatHierarchy, 'branchingLogic'));
|
|
620
|
+
return _.reduce(branchingLogics, (acc, val) => {
|
|
621
|
+
return _.assign(acc, val);
|
|
622
|
+
}, {});
|
|
623
|
+
}
|
|
624
|
+
getParentDependentMap(data) {
|
|
625
|
+
const branchingLogic = this.getFlattenedBranchingLogic(data);
|
|
626
|
+
const obj = {};
|
|
627
|
+
_.forEach(_.keys(branchingLogic), item => {
|
|
628
|
+
obj[item] = !_.isEmpty(branchingLogic[item].source) ? 'dependent' : !_.isEmpty(branchingLogic[item].target) ? 'parent' : '';
|
|
629
|
+
});
|
|
630
|
+
return obj;
|
|
631
|
+
}
|
|
632
|
+
getPrimaryCategoryName(sectionId) {
|
|
633
|
+
const nodeData = this.treeService.getNodeById(sectionId);
|
|
634
|
+
return _.get(nodeData, 'data.primaryCategory');
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* fetch Outcome Declaration levels using the questionsetId
|
|
638
|
+
* only for Observation with Rubrics
|
|
639
|
+
* @param identifier questionset identifier
|
|
640
|
+
*/
|
|
641
|
+
fetchOutComeDeclaration(questionSetId, option = { params: {} }) {
|
|
642
|
+
const url = this.configService.urlConFig.URLS[this.editorConfig.config.objectType];
|
|
643
|
+
const param = {
|
|
644
|
+
fields: 'outcomeDeclaration'
|
|
645
|
+
};
|
|
646
|
+
const hierarchyUrl = `${url.READ}/${questionSetId}`;
|
|
647
|
+
const req = {
|
|
648
|
+
url: hierarchyUrl,
|
|
649
|
+
param: { ...param, ...option.params }
|
|
650
|
+
};
|
|
651
|
+
return this.publicDataService.get(req);
|
|
652
|
+
}
|
|
653
|
+
get qualityFormConfig() {
|
|
654
|
+
return this._qualityFormConfig;
|
|
655
|
+
}
|
|
656
|
+
setQualityFormConfig(value) {
|
|
657
|
+
return this._qualityFormConfig = value;
|
|
658
|
+
}
|
|
659
|
+
get isReviewerQualityCheckEnabled() {
|
|
660
|
+
return this._isReviewerQualityCheckEnabled;
|
|
661
|
+
}
|
|
662
|
+
setIsReviewerQualityCheckEnabled(value) {
|
|
663
|
+
return this._isReviewerQualityCheckEnabled = value;
|
|
664
|
+
}
|
|
665
|
+
appendCloudStorageHeaders(config) {
|
|
666
|
+
const headers = _.get(this.editorConfig, 'context.cloudStorage.presigned_headers', {});
|
|
667
|
+
if (!_.isEmpty(headers)) {
|
|
668
|
+
config.headers = { ...config.headers, ...headers };
|
|
669
|
+
return config;
|
|
670
|
+
}
|
|
671
|
+
else {
|
|
672
|
+
return config;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorService, deps: [{ token: i1.TreeService }, { token: i2.ToasterService }, { token: i3.ConfigService }, { token: i4.EditorTelemetryService }, { token: i5.PublicDataService }, { token: i6.DataService }, { token: i7.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
676
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
677
|
+
}
|
|
678
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditorService, decorators: [{
|
|
679
|
+
type: Injectable,
|
|
680
|
+
args: [{ providedIn: 'root' }]
|
|
681
|
+
}], ctorParameters: function () { return [{ type: i1.TreeService }, { type: i2.ToasterService }, { type: i3.ConfigService }, { type: i4.EditorTelemetryService }, { type: i5.PublicDataService }, { type: i6.DataService }, { type: i7.HttpClient }]; } });
|
|
682
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xsZWN0aW9uLWVkaXRvci1saWJyYXJ5L3NyYy9saWIvc2VydmljZXMvZWRpdG9yL2VkaXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBUS9CLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFTNUMsTUFBTSxPQUFPLGFBQWE7SUF5QnhCLFlBQW1CLFdBQXdCLEVBQVUsY0FBOEIsRUFDaEUsYUFBNEIsRUFBVSxnQkFBd0MsRUFDN0UsaUJBQW9DLEVBQVUsV0FBd0IsRUFBUyxVQUFzQjtRQUZ0RyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNoRSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFDN0Usc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTFCekgsU0FBSSxHQUFRLEVBQUUsQ0FBQztRQUNQLHNCQUFpQixHQUFxQixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBRXBDLGdCQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixpQ0FBNEIsR0FBRyxLQUFLLENBQUM7UUFD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QixLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU7U0FDdEMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQVU7UUFDckMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLDZCQUE2QjtRQUMvQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztJQUMzQyxDQUFDO0lBRU8sZ0NBQWdDLENBQUMsS0FBYztRQUNyRCxPQUFPLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUM7SUFDckQsQ0FBQztJQUVILHlCQUF5QixDQUFDLE1BQU07UUFDOUIsTUFBTSxPQUFPLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLHdDQUF3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQztZQUNqRCxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQzsrR0Fwc0JVLGFBQWE7bUhBQWIsYUFBYSxjQUZBLE1BQU07OzRGQUVuQixhQUFhO2tCQUZ6QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gJy4uL3RyZWUvdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IFB1YmxpY0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vcHVibGljLWRhdGEvcHVibGljLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBJRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lZGl0b3InO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Rlci90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RlbGVtZXRyeS90ZWxlbWV0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uL2RhdGEvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFeHBvcnRUb0NzdiB9IGZyb20gJ2V4cG9ydC10by1jc3YnO1xuXG5pbnRlcmZhY2UgU2VsZWN0ZWRDaGlsZHJlbiB7XG4gIHByaW1hcnlDYXRlZ29yeT86IHN0cmluZztcbiAgbWltZVR5cGU/OiBzdHJpbmc7XG4gIGludGVyYWN0aW9uVHlwZT86IHN0cmluZztcbn1cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JTZXJ2aWNlIHtcbiAgZGF0YTogYW55ID0ge307XG4gIHByaXZhdGUgX3NlbGVjdGVkQ2hpbGRyZW46IFNlbGVjdGVkQ2hpbGRyZW4gPSB7fTtcbiAgcHVibGljIHF1ZXN0aW9uU3RyZWFtJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBfZWRpdG9yQ29uZmlnOiBJRWRpdG9yQ29uZmlnO1xuICBwcml2YXRlIF9lZGl0b3JNb2RlID0gJ2VkaXQnO1xuICBwcml2YXRlIF9pc1Jldmlld2VyRWRpdEVuYWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9pc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQgPSBmYWxzZTtcbiAgcHVibGljIHNob3dMaWJyYXJ5UGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBzaG93UXVlc3Rpb25MaWJyYXJ5UGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHByaXZhdGUgX2J1bGtVcGxvYWRTdGF0dXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBidWxrVXBsb2FkU3RhdHVzJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5fYnVsa1VwbG9hZFN0YXR1cyQ7XG4gIHB1YmxpYyBjb250ZW50c0NvdW50ID0gMDtcbiAgdGVtcGxhdGVMaXN0ID0gW107XG4gIHBhcmVudElkZW50aWZpZXI6IGFueTtcbiAgYnJhbmNoaW5nTG9naWMgPSB7fTtcbiAgc2VsZWN0ZWRTZWN0aW9uOiBhbnk7XG4gIG9wdGlvbnNMZW5ndGg6IGFueTtcbiAgc2VsZWN0ZWRQcmltYXJ5Q2F0ZWdvcnk6IGFueTtcbiAgbGVhZlBhcmVudElkZW50aWZpZXI6IGFueTtcbiAgcXVlc3Rpb25JZHMgPSBbXTtcbiAgb3V0Y29tZURlY2xhcmF0aW9uOiBhbnk7XG4gIHRyZWVEYXRhOiBhbnk7XG4gIHByaXZhdGUgX3F1YWxpdHlGb3JtQ29uZmlnOiBhbnk7XG4gIHByaXZhdGUgX2lzUmV2aWV3ZXJRdWFsaXR5Q2hlY2tFbmFibGVkOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcbiAgICAgICAgICAgICAgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIHByaXZhdGUgdGVsZW1ldHJ5U2VydmljZTogRWRpdG9yVGVsZW1ldHJ5U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwdWJsaWNEYXRhU2VydmljZTogUHVibGljRGF0YVNlcnZpY2UsIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLCBwdWJsaWMgaHR0cENsaWVudDogSHR0cENsaWVudCkge1xuICAgICAgICAgICAgICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUoY29uZmlnOiBJRWRpdG9yQ29uZmlnKSB7XG4gICAgdGhpcy5fZWRpdG9yQ29uZmlnID0gY29uZmlnO1xuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuZWRpdG9yQ29uZmlnICYmIHRoaXMuY29uZmlnU2VydmljZS5lZGl0b3JDb25maWcuZGVmYXVsdCkge1xuICAgICAgdGhpcy5fZWRpdG9yQ29uZmlnLmNvbmZpZyA9IF8uYXNzaWduKHRoaXMuY29uZmlnU2VydmljZS5lZGl0b3JDb25maWcuZGVmYXVsdCwgdGhpcy5fZWRpdG9yQ29uZmlnLmNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuX2VkaXRvck1vZGUgPSBfLmdldCh0aGlzLl9lZGl0b3JDb25maWcsICdjb25maWcubW9kZScpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5zZXRJc1Jldmlld2VyRWRpdEVuYWJsZShfLmdldCh0aGlzLl9lZGl0b3JDb25maWcsICdjb250ZXh0LmVuYWJsZVJldmlld0VkaXQnLCBmYWxzZSkpO1xuICAgIHRoaXMuc2V0UXVhbGl0eUZvcm1Db25maWcoXy5nZXQodGhpcy5fZWRpdG9yQ29uZmlnLCAnY29uZmlnLnF1YWxpdHlGb3JtQ29uZmlnJywgbnVsbCkpO1xuICAgIHRoaXMuc2V0SXNSZXZpZXdlclF1YWxpdHlDaGVja0VuYWJsZWQoXy5nZXQodGhpcy5fZWRpdG9yQ29uZmlnLCAnY29uZmlnLmlzUmV2aWV3ZXJRdWFsaXR5Q2hlY2tFbmFibGVkJywgZmFsc2UpKTtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZENoaWxkcmVuKHZhbHVlOiBTZWxlY3RlZENoaWxkcmVuKSB7XG4gICAgaWYgKHZhbHVlLm1pbWVUeXBlKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENoaWxkcmVuLm1pbWVUeXBlID0gdmFsdWUubWltZVR5cGU7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5wcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkQ2hpbGRyZW4ucHJpbWFyeUNhdGVnb3J5ID0gdmFsdWUucHJpbWFyeUNhdGVnb3J5O1xuICAgIH1cbiAgICBpZiAodmFsdWUuaW50ZXJhY3Rpb25UeXBlKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENoaWxkcmVuLmludGVyYWN0aW9uVHlwZSA9IHZhbHVlLmludGVyYWN0aW9uVHlwZTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDaGlsZHJlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWRpdG9yQ29uZmlnKCk6IElFZGl0b3JDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3JDb25maWc7XG4gIH1cblxuICBnZXQgZWRpdG9yTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yTW9kZTtcbiAgfVxuXG4gIGdldCBpc1Jldmlld2VyRWRpdEVuYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXZpZXdlckVkaXRFbmFibGU7XG4gIH1cblxuICBwcml2YXRlIHNldElzUmV2aWV3ZXJFZGl0RW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmV2aWV3ZXJFZGl0RW5hYmxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQ7XG4gIH1cblxuICBzZXRJc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY29udGVudFBvbGljeVVybCgpIHtcbiAgICBjb25zdCB1cmwgPSBfLmdldCh0aGlzLmVkaXRvckNvbmZpZywgJ2NvbmZpZy5jb250ZW50UG9saWN5VXJsJyk7XG4gICAgcmV0dXJuIHVybCA/IHVybCA6IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuQ29udGVudFBvbGljeVVybDtcbiAgfVxuXG4gIGdldFRvb2xiYXJDb25maWcoKSB7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKF8ubWVyZ2UodGhpcy5jb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnLmJ1dHRvbl9sYWJlbHMsIF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29udGV4dC5sYWJlbHMnKSkpO1xuICB9XG5cbiAgZW1pdHNob3dMaWJyYXJ5UGFnZUV2ZW50KHBhZ2UpIHtcbiAgICB0aGlzLnNob3dMaWJyYXJ5UGFnZS5lbWl0KHBhZ2UpO1xuICB9XG4gIGdldHNob3dMaWJyYXJ5UGFnZUVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0xpYnJhcnlQYWdlO1xuICB9XG5cbiAgZ2V0UXVlc3Rpb25MaXN0KHF1ZXN0aW9uSWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgdXJsOiBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5RVUVTVElPTi5MSVNUJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHF1ZXN0aW9uSWRzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wb3N0KG9wdGlvbikucGlwZShtYXAoZGF0YSA9PiBfLmdldChkYXRhLCAncmVzdWx0JykpKTtcbiAgfVxuXG4gIGZldGNoQ29sbGVjdGlvbkhpZXJhcmNoeShjb2xsZWN0aW9uSWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgaGllcmFyY2h5VXJsID0gYCR7dXJsLkhJRVJBUkNIWV9SRUFEfS8ke2NvbGxlY3Rpb25JZH1gO1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHVybDogaGllcmFyY2h5VXJsLFxuICAgICAgcGFyYW06IHsgbW9kZTogJ2VkaXQnIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLmdldChyZXEpO1xuICB9XG5cbiAgcmVhZFF1ZXN0aW9uU2V0KHF1ZXN0aW9uU2V0SWQsIG9wdGlvbjogYW55ID0geyBwYXJhbXM6IHt9IH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICBtb2RlOiAnZWRpdCcsXG4gICAgICBmaWVsZHM6IHVybC5ERUZBVUxUX1BBUkFNU19GSUVMRFNcbiAgICB9O1xuICAgIGNvbnN0IGhpZXJhcmNoeVVybCA9IGAke3VybC5SRUFEfS8ke3F1ZXN0aW9uU2V0SWR9YDtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICB1cmw6IGhpZXJhcmNoeVVybCxcbiAgICAgIHBhcmFtOiB7IC4uLnBhcmFtLCAuLi5vcHRpb24ucGFyYW1zIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLmdldChyZXEpO1xuICB9XG5cbiAgZmV0Y2hDb250ZW50RGV0YWlscyhjb250ZW50SWQpIHtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICB1cmw6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcsICdVUkxTLkNPTlRFTlQuUkVBRCcpICsgY29udGVudElkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5nZXQocmVxKTtcbiAgfVxuXG4gIHVwZGF0ZUhpZXJhcmNoeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgdXJsOiB1cmwuSElFUkFSQ0hZX1VQREFURSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZ2V0Q29sbGVjdGlvbkhpZXJhcmNoeSgpLFxuICAgICAgICAgICAgLi4ue2xhc3RVcGRhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29udGV4dC51c2VyLmlkJyl9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5wYXRjaChyZXEpO1xuICB9XG5cbiAgZ2V0RmllbGRzVG9VcGRhdGUoY29sbGVjdGlvbklkKSB7XG4gICAgbGV0IGZvcm1GaWVsZHMgPSB7fTtcbiAgICBjb25zdCBlZGl0YWJsZUZpZWxkcyA9IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZywgJ2VkaXRhYmxlRmllbGRzJyk7XG4gICAgaWYgKGVkaXRhYmxlRmllbGRzICYmICFfLmlzRW1wdHkoZWRpdGFibGVGaWVsZHNbdGhpcy5lZGl0b3JNb2RlXSkpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IGVkaXRhYmxlRmllbGRzW3RoaXMuZWRpdG9yTW9kZV07XG4gICAgICBjb25zdCBub2Rlc01vZGlmaWVkID0gXy5nZXQodGhpcy5nZXRDb2xsZWN0aW9uSGllcmFyY2h5KCksICdub2Rlc01vZGlmaWVkJyk7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uRm9ybURhdGEgPSBfLmdldChub2Rlc01vZGlmaWVkW2NvbGxlY3Rpb25JZF0sICdtZXRhZGF0YScpO1xuICAgICAgXy5mb3JFYWNoKGZpZWxkcywgZmllbGRDb2RlID0+IHtcbiAgICAgICAgZm9ybUZpZWxkc1tmaWVsZENvZGVdID0gY29sbGVjdGlvbkZvcm1EYXRhW2ZpZWxkQ29kZV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1GaWVsZHM7XG4gIH1cblxuICB1cGRhdGVDb2xsZWN0aW9uKGNvbGxlY3Rpb25JZCwgZGF0YT8pIHtcbiAgICBsZXQgb2JqVHlwZSA9IHRoaXMuY29uZmlnU2VydmljZS5jYXRlZ29yeUNvbmZpZ1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgb2JqVHlwZSA9IG9ialR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLlVSTFNbdGhpcy5lZGl0b3JDb25maWcuY29uZmlnLm9iamVjdFR5cGVdO1xuICAgIGNvbnN0IGZpZWxkc09iaiA9IHRoaXMuZ2V0RmllbGRzVG9VcGRhdGUoY29sbGVjdGlvbklkKTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgW29ialR5cGVdOiB7XG4gICAgICAgICAgLi4uZmllbGRzT2JqLFxuICAgICAgICAgIGxhc3RQdWJsaXNoZWRCeTogdGhpcy5lZGl0b3JDb25maWcuY29udGV4dC51c2VyLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHB1Ymxpc2hEYXRhID0gIF8uZ2V0KGRhdGEsICdwdWJsaXNoRGF0YScpO1xuICAgIGlmKHB1Ymxpc2hEYXRhKSB7IFxuICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0W29ialR5cGVdID0geyAuLi5yZXF1ZXN0Qm9keS5yZXF1ZXN0W29ialR5cGVdLCAuLi5wdWJsaXNoRGF0YSB9O1xuICAgIH1cbiAgICBjb25zdCBvcHRpb24gPSB7XG4gICAgICB1cmw6IGAke3VybC5TWVNZVEVNX1VQREFURX0ke2NvbGxlY3Rpb25JZH1gLFxuICAgICAgZGF0YTogcmVxdWVzdEJvZHlcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBhdGNoKG9wdGlvbik7XG4gIH1cblxuICByZXZpZXdDb250ZW50KGNvbnRlbnRJZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IG9ialR5cGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY2F0ZWdvcnlDb25maWdbdGhpcy5lZGl0b3JDb25maWcuY29uZmlnLm9iamVjdFR5cGVdO1xuICAgIG9ialR5cGUgPSBvYmpUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZy5VUkxTW3RoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZy5vYmplY3RUeXBlXTtcbiAgICBjb25zdCBvcHRpb24gPSB7XG4gICAgICB1cmw6IHVybC5DT05URU5UX1JFVklFVyArIGNvbnRlbnRJZCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIFtvYmpUeXBlXToge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChvcHRpb24pO1xuICB9XG5cbiAgc3VibWl0UmVxdWVzdENoYW5nZXMoY29udGVudElkLCBjb21tZW50KSB7XG4gICAgbGV0IG9ialR5cGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY2F0ZWdvcnlDb25maWdbdGhpcy5lZGl0b3JDb25maWcuY29uZmlnLm9iamVjdFR5cGVdO1xuICAgIG9ialR5cGUgPSBvYmpUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZy5VUkxTW3RoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZy5vYmplY3RUeXBlXTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgW29ialR5cGVdOiB7XG4gICAgICAgICAgcmVqZWN0Q29tbWVudDogXy50cmltKGNvbW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9wdGlvbiA9IHtcbiAgICAgIHVybDogYCR7dXJsLkNPTlRFTlRfUkVKRUNUfSR7Y29udGVudElkfWAsXG4gICAgICBkYXRhOiByZXF1ZXN0Qm9keVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChvcHRpb24pO1xuICB9XG5cbiAgcHVibGlzaENvbnRlbnQoY29udGVudElkLCBldmVudCkge1xuICAgIGxldCBvYmpUeXBlID0gdGhpcy5jb25maWdTZXJ2aWNlLmNhdGVnb3J5Q29uZmlnW3RoaXMuZWRpdG9yQ29uZmlnLmNvbmZpZy5vYmplY3RUeXBlXTtcbiAgICBvYmpUeXBlID0gb2JqVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIFtvYmpUeXBlXToge1xuICAgICAgICAgIGxhc3RQdWJsaXNoZWRCeTogdGhpcy5lZGl0b3JDb25maWcuY29udGV4dC51c2VyLmlkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgY29uc3QgcHVibGlzaERhdGEgPSAgXy5nZXQoZXZlbnQsICdwdWJsaXNoRGF0YScpO1xuICAgaWYocHVibGlzaERhdGEpIHsgXG4gICAgcmVxdWVzdEJvZHkucmVxdWVzdFtvYmpUeXBlXSA9IHsgLi4ucmVxdWVzdEJvZHkucmVxdWVzdFtvYmpUeXBlXSwgLi4ucHVibGlzaERhdGEgfTtcbiAgIH0gXG4gICAgY29uc3Qgb3B0aW9uID0ge1xuICAgICAgdXJsOiBgJHt1cmwuQ09OVEVOVF9QVUJMSVNIfSR7Y29udGVudElkfWAsXG4gICAgICBkYXRhOiByZXF1ZXN0Qm9keVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChvcHRpb24pO1xuICB9XG5cbiAgYWRkUmVzb3VyY2VUb0hpZXJhcmNoeShjb2xsZWN0aW9uLCB1bml0SWRlbnRpZmllciwgY29udGVudElkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCByZXEgPSB7XG4gICAgICB1cmw6IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcsICdVUkxTLkNPTlRFTlQuSElFUkFSQ0hZX0FERCcpLFxuICAgICAgZGF0YToge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgcm9vdElkOiBjb2xsZWN0aW9uLFxuICAgICAgICAgIHVuaXRJZDogdW5pdElkZW50aWZpZXIsXG4gICAgICAgICAgY2hpbGRyZW46IFtjb250ZW50SWRdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBhdGNoKHJlcSk7XG4gIH1cblxuICBhZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQoY29sbGVjdGlvbiwgdW5pdElkZW50aWZpZXIsIGNvbnRlbnRJZCkge1xuICAgIGNvbnN0IGNoaWxkcmVuOiBhbnlbXSA9IF8uaXNBcnJheShjb250ZW50SWQpID8gY29udGVudElkIDogW2NvbnRlbnRJZF07XG4gICAgbGV0IHJlcSA9IHtcbiAgICAgIHVybDogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZywgJ1VSTFMuUXVlc3Rpb25TZXQuQUREJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBxdWVzdGlvbnNldDoge1xuICAgICAgICAgICAgcm9vdElkOiBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgY29sbGVjdGlvbklkOiB1bml0SWRlbnRpZmllcixcbiAgICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY29sbGVjdGlvbiA9PT0gdW5pdElkZW50aWZpZXIpIHtcbiAgICAgIHJlcSA9IF8ub21pdChyZXEsICdkYXRhLnJlcXVlc3QucXVlc3Rpb25zZXQuY29sbGVjdGlvbklkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBhdGNoKHJlcSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVlc3Rpb25TdHJlYW0kKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uU3RyZWFtJDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uU3RyZWFtJC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uSWRzKGNoaWxkcmVucykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZvciAoY29uc3QgY2hpbGRyZW4gb2YgY2hpbGRyZW5zKSB7XG4gICAgICBpZiAoY2hpbGRyZW4uZGF0YS5vYmplY3RUeXBlID09PSAnUXVlc3Rpb25TZXQnKSB7XG4gICAgICAgIGxldCBxdWVzdGlvbkNvdW50ID0gMDtcbiAgICAgICAgaWYgKGNoaWxkcmVuPy5kYXRhPy5tZXRhZGF0YT8ubWF4UXVlc3Rpb25zICYmIChjaGlsZHJlbj8uZGF0YT8ubWV0YWRhdGE/Lm1heFF1ZXN0aW9ucyA8IGNoaWxkcmVuPy5jaGlsZHJlbj8ubGVuZ3RoKSkge1xuICAgICAgICAgIHF1ZXN0aW9uQ291bnQgPSBjaGlsZHJlbi5kYXRhLm1ldGFkYXRhLm1heFF1ZXN0aW9ucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVzdGlvbkNvdW50ID0gY2hpbGRyZW4/LmNoaWxkcmVuID9cbiAgICAgICAgICBjaGlsZHJlbj8uY2hpbGRyZW4/Lmxlbmd0aCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXN0aW9uQ291bnQgPiAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVzdGlvbkNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmICghXy5pc0VtcHR5KGNoaWxkcmVuLCAnY2hpbGRyZW4nKSkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uY2hpbGRyZW5baV0uZGF0YS5vYmplY3RUeXBlID09PSAnUXVlc3Rpb25TZXQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRRdWVzdGlvbklkcyhbY2hpbGRyZW4uY2hpbGRyZW5baV1dKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIV8uaW5jbHVkZXModGhpcy5xdWVzdGlvbklkcywgY2hpbGRyZW4uY2hpbGRyZW5baV0uZGF0YS5pZCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25JZHMucHVzaChjaGlsZHJlbi5jaGlsZHJlbltpXS5kYXRhLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRNYXhTY29yZSgpIHtcbiAgICBsZXQgbWF4U2NvcmUgPSAwO1xuICAgIGxldCByb290Tm9kZSA9IFtdO1xuICAgIHRoaXMucXVlc3Rpb25JZHMgPSBbXTtcbiAgICBjb25zdCByb290Tm9kZURhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEZpcnN0Q2hpbGQoKTtcbiAgICBpZiAocm9vdE5vZGVEYXRhLmNoaWxkcmVuKSB7XG4gICAgICByb290Tm9kZSA9IFtyb290Tm9kZURhdGFdO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShyb290Tm9kZSkpIHtcbiAgICAgIHRoaXMuc2V0UXVlc3Rpb25JZHMocm9vdE5vZGUpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLnF1ZXN0aW9uSWRzKSkge1xuICAgICAgY29uc3QgeyBxdWVzdGlvbnMgfSA9ICBhd2FpdCB0aGlzLmdldFF1ZXN0aW9uTGlzdCh0aGlzLnF1ZXN0aW9uSWRzKS50b1Byb21pc2UoKTtcbiAgICAgIG1heFNjb3JlID0gdGhpcy5jYWxjdWxhdGVNYXhTY29yZShxdWVzdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gbWF4U2NvcmU7XG4gIH1cblxuICBjYWxjdWxhdGVNYXhTY29yZShxdWVzdGlvbnM6IEFycmF5PGFueT4pIHtcbiAgIHJldHVybiBfLnJlZHVjZShxdWVzdGlvbnMsIChzdW0sIHF1ZXN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Tm9kZUJ5SWQocXVlc3Rpb24uaWRlbnRpZmllcik7XG4gICAgICBpZiAoXy5oYXMobm9kZURhdGEucGFyZW50LmRhdGEubWV0YWRhdGEsICdzaHVmZmxlJykgJiYgbm9kZURhdGEucGFyZW50LmRhdGEubWV0YWRhdGEuc2h1ZmZsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gc3VtICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdW0gKyAocXVlc3Rpb24/LnJlc3BvbnNlRGVjbGFyYXRpb24/LnJlc3BvbnNlMT8ubWF4U2NvcmUgPyBfLmdldChxdWVzdGlvbiwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlJykgOiAwKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIGdldENvbGxlY3Rpb25IaWVyYXJjaHkoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzO1xuICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEZpcnN0Q2hpbGQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXNNb2RpZmllZDogdGhpcy50cmVlU2VydmljZS50cmVlQ2FjaGUubm9kZXNNb2RpZmllZCxcbiAgICAgIGhpZXJhcmNoeTogaW5zdGFuY2UuX3RvRmxhdE9iaihkYXRhKVxuICAgIH07XG4gIH1cblxuICBfdG9GbGF0T2JqKGRhdGEsIHF1ZXN0aW9uSWQ/LCBzZWxlY3RVbml0SWQ/KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzO1xuICAgIGlmIChkYXRhICYmIGRhdGEuZGF0YSkge1xuICAgICAgaW5zdGFuY2UuZGF0YVtkYXRhLmRhdGEuaWRdID0ge1xuICAgICAgICBuYW1lOiBkYXRhLnRpdGxlLFxuICAgICAgICBjaGlsZHJlbjogXy5tYXAoZGF0YS5jaGlsZHJlbiwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLmRhdGEuaWQ7XG4gICAgICAgIH0pLFxuICAgICAgICByb290OiBkYXRhLmRhdGEucm9vdFxuICAgICAgfTtcbiAgICAgIGlmIChxdWVzdGlvbklkICYmIHNlbGVjdFVuaXRJZCAmJiBzZWxlY3RVbml0SWQgPT09IGRhdGEuZGF0YS5pZCkge1xuICAgICAgICAgIGluc3RhbmNlLmRhdGFbZGF0YS5kYXRhLmlkXS5jaGlsZHJlbi5wdXNoKHF1ZXN0aW9uSWQpO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXN0aW9uSWQgJiYgc2VsZWN0VW5pdElkICYmIGRhdGEuZm9sZGVyID09PSBmYWxzZSkge1xuICAgICAgICAgIGRlbGV0ZSBpbnN0YW5jZS5kYXRhW2RhdGEuZGF0YS5pZF07XG4gICAgICB9XG4gICAgICBfLmZvckVhY2goZGF0YS5jaGlsZHJlbiwgKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgaW5zdGFuY2UuX3RvRmxhdE9iaihjb2xsZWN0aW9uLCBxdWVzdGlvbklkLCBzZWxlY3RVbml0SWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZS5kYXRhO1xuICB9XG5cbiAgZ2V0SGllcmFyY2h5T2JqKGRhdGEsIHF1ZXN0aW9uSWQ/LCBzZWxlY3RVbml0SWQ/LCBwYXJlbnRJZGVudGlmaWVyPykge1xuICAgIHJldHVybiB0aGlzLl90b0ZsYXRPYmooZGF0YSwgcXVlc3Rpb25JZCwgc2VsZWN0VW5pdElkKTtcbiAgfVxuXG4gX3RvRmxhdE9iakZyb21IaWVyYXJjaHkoZGF0YSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcztcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmNoaWxkcmVuKSB7XG4gICAgICBpbnN0YW5jZS5kYXRhW2RhdGEuaWRlbnRpZmllcl0gPSB7XG4gICAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgICAgY2hpbGRyZW46IF8ubWFwKGRhdGEuY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGlsZC5pZGVudGlmaWVyO1xuICAgICAgICB9KSxcbiAgICAgICAgYnJhbmNoaW5nTG9naWM6IGRhdGEuYnJhbmNoaW5nTG9naWNcbiAgICAgIH07XG4gICAgICBfLmZvckVhY2goZGF0YS5jaGlsZHJlbiwgKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgaW5zdGFuY2UuX3RvRmxhdE9iakZyb21IaWVyYXJjaHkoY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlLmRhdGE7XG4gIH1cblxuICBnZXRSZWxhdGlvbmFsTWV0YWRhdGFPYmooZGF0YSkge1xuICAgIGxldCByZWxhdGlvbmFsTWV0YWRhdGEgPSB7fTtcbiAgICBfLmZvckVhY2goZGF0YSwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoXy5nZXQoY2hpbGQsICdkYXRhLm1ldGFkYXRhLnJlbGF0aW9uYWxNZXRhZGF0YScpKSB7XG4gICAgICAgIHJlbGF0aW9uYWxNZXRhZGF0YSA9IHtcbiAgICAgICAgICAuLi5yZWxhdGlvbmFsTWV0YWRhdGEsXG4gICAgICAgICAgW2NoaWxkLmRhdGEuaWRdOiBfLmdldChjaGlsZCwgJ2RhdGEubWV0YWRhdGEucmVsYXRpb25hbE1ldGFkYXRhJylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVsYXRpb25hbE1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0Q2F0ZWdvcnlEZWZpbml0aW9uKGNhdGVnb3J5TmFtZSwgY2hhbm5lbCwgb2JqZWN0VHlwZT86IGFueSkge1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHVybDogXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLnVybENvbkZpZywgJ1VSTFMuZ2V0Q2F0ZWdvcnlEZWZpbml0aW9uJyksXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBvYmplY3RDYXRlZ29yeURlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgb2JqZWN0VHlwZTogb2JqZWN0VHlwZSA/IG9iamVjdFR5cGUgOiAnQ29udGVudCcsXG4gICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5TmFtZSxcbiAgICAgICAgICAgICAgLi4uKGNoYW5uZWwgJiYgeyBjaGFubmVsIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChyZXEpO1xuICB9XG4gIGZldGNoQ29udGVudExpc3REZXRhaWxzKHJlcSkge1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBvc3QocmVxKTtcbiAgfVxuICBzb3J0KGEsIGIsIGNvbHVtbikge1xuICAgIGlmICghdGhpcy5pc05vdEVtcHR5KGEsIGNvbHVtbikgfHwgIXRoaXMuaXNOb3RFbXB0eShiLCBjb2x1bW4pKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgbGV0IGFDb2x1bW4gPSBhW2NvbHVtbl07XG4gICAgbGV0IGJDb2x1bW4gPSBiW2NvbHVtbl07XG4gICAgaWYgKF8uaXNBcnJheShhQ29sdW1uKSkge1xuICAgICAgYUNvbHVtbiA9IF8uam9pbihhQ29sdW1uLCAnLCAnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheShiQ29sdW1uKSkge1xuICAgICAgYkNvbHVtbiA9IF8uam9pbihiQ29sdW1uLCAnLCAnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNOdW1iZXIoYUNvbHVtbikpIHtcbiAgICBhQ29sdW1uID0gXy50b1N0cmluZyhhQ29sdW1uKTtcbiAgICB9XG4gICAgaWYgKF8uaXNOdW1iZXIoYkNvbHVtbikpIHtcbiAgICBiQ29sdW1uID0gXy50b1N0cmluZyhiQ29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGJDb2x1bW4ubG9jYWxlQ29tcGFyZShhQ29sdW1uKTtcbiAgfVxuICBpc05vdEVtcHR5KG9iaiwga2V5KSB7XG4gICAgaWYgKF8uaXNOaWwob2JqKSB8fCBfLmlzTmlsKG9ialtrZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgIH1cblxuICAgYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVycm9ySW5mbykge1xuICAgIGlmIChfLmdldChlcnIsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgZXJyb3JJbmZvLmVycm9yTXNnKSB7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KGVyciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCBlcnJvckluZm8uZXJyb3JNc2cpO1xuICAgIH1cbiAgICBjb25zdCB0ZWxlbWV0cnlFcnJvckRhdGEgPSB7XG4gICAgICAgIGVycjogXy50b1N0cmluZyhlcnIuc3RhdHVzKSxcbiAgICAgICAgZXJydHlwZTogJ1NZU1RFTScsXG4gICAgICAgIHN0YWNrdHJhY2U6IEpTT04uc3RyaW5naWZ5KHtyZXNwb25zZTogXy5waWNrKGVyciwgWydlcnJvcicsICd1cmwnXSksIHJlcXVlc3Q6IF8uZ2V0KGVycm9ySW5mbywgJ3JlcXVlc3QnKX0pIHx8IGVycm9ySW5mby5lcnJvck1zZyxcbiAgICAgICAgcGFnZWlkOiB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkXG4gICAgfTtcbiAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UuZXJyb3IodGVsZW1ldHJ5RXJyb3JEYXRhKTtcbiAgfVxuICAvLyB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCBhbGwgdGhlIGNvbnRlbnRzIGluIGNvdXJzZS9xdWVzdGlvbiBpbnNpZGUgZXZlcnkgbW9kdWxlIGFuZCBzdWIgbW9kdWxlXG4gIGdldENvbnRlbnRDaGlsZHJlbnMoYWN0aXZlTm9kZT8pIHtcbiAgICBsZXQgdHJlZU9iaiA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0VHJlZU9iamVjdCgpO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gW107XG4gICAgaWYgKGFjdGl2ZU5vZGUpIHsgdHJlZU9iaiA9IGFjdGl2ZU5vZGU7IH1cbiAgICB0cmVlT2JqLnZpc2l0KChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5mb2xkZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRlbnRzLnB1c2gobm9kZS5kYXRhLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgLy8gdGhpcyBtZXRob2QgaXMgdXNlZCB0byBrZWVwIGNvdW50IG9mIGNvbnRlbnRzIGFkZGVkIGZyb20gbGlicmFyeSBwYWdlXG4gIGNvbnRlbnRzQ291bnRBZGRlZEluTGlicmFyeVBhZ2Uoc2V0VG9aZXJvPykge1xuICAgIGlmIChzZXRUb1plcm8pIHtcbiAgICAgIHRoaXMuY29udGVudHNDb3VudCA9IDA7IC8vIHNldHRpbmcgdGhpcyBjb3VudCB0byB6ZXJvICB3aGlsZSBnb2luZyBvdXQgZnJvbSBsaWJyYXJ5IHBhZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50c0NvdW50ID0gdGhpcy5jb250ZW50c0NvdW50ICsgMTtcbiAgICB9XG4gIH1cbiAgY2hlY2tJZkNvbnRlbnRzQ2FuYmVBZGRlZCgpIHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgICAgbWF4TGltaXQ6IDBcbiAgICB9O1xuICAgIGlmIChfLmdldCh0aGlzLmVkaXRvckNvbmZpZywgJ2NvbmZpZy5vYmplY3RUeXBlJykgPT09ICdRdWVzdGlvblNldCcpIHtcbiAgICAgIGNvbmZpZy5lcnJvck1lc3NhZ2UgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzEnKTtcbiAgICAgIGNvbmZpZy5tYXhMaW1pdCA9IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29uZmlnLnF1ZXN0aW9uU2V0Lm1heFF1ZXN0aW9uc0xpbWl0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5lcnJvck1lc3NhZ2UgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzInKTtcbiAgICAgIGNvbmZpZy5tYXhMaW1pdCA9IF8uZ2V0KHRoaXMuZWRpdG9yQ29uZmlnLCAnY29uZmlnLmNvbGxlY3Rpb24ubWF4Q29udGVudHNMaW1pdCcpO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gdGhpcy5nZXRDb250ZW50Q2hpbGRyZW5zKCkubGVuZ3RoICsgdGhpcy5jb250ZW50c0NvdW50O1xuICAgIGlmIChjaGlsZHJlbkNvdW50ID49IGNvbmZpZy5tYXhMaW1pdCkge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihjb25maWcuZXJyb3JNZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGdldEhpZXJhcmNoeUZvbGRlcigpIHtcbiAgICBjb25zdCB0cmVlT2JqID0gdGhpcy50cmVlU2VydmljZS5nZXRUcmVlT2JqZWN0KCk7XG4gICAgY29uc3QgY29udGVudHMgPSBbXTtcbiAgICBpZiAodHJlZU9iaikge1xuICAgIHRyZWVPYmoudmlzaXQoKG5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlICYmICFub2RlLmRhdGEucm9vdCkge1xuICAgICAgICBjb250ZW50cy5wdXNoKG5vZGUuZGF0YS5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgdmFsaWRhdGVDU1ZGaWxlKGZvcm1EYXRhLCBjb2xsZWN0aW9ubklkOiBhbnkpIHtcbiAgICBjb25zdCB1cmwgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UudXJsQ29uRmlnLCAnVVJMUy5DU1YuVVBMT0FEJyk7XG4gICAgY29uc3QgcmVxUGFyYW0gPSB7XG4gICAgICB1cmw6IGAke3VybH0ke2NvbGxlY3Rpb25uSWR9YCxcbiAgICAgIGRhdGE6IGZvcm1EYXRhLmRhdGFcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnB1YmxpY0RhdGFTZXJ2aWNlLnBvc3QocmVxUGFyYW0pO1xuICB9XG4gIGRvd25sb2FkSGllcmFyY2h5Q3N2KGNvbGxlY3Rpb25JZCkge1xuICAgIGNvbnN0IHVybCA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcsICdVUkxTLkNTVi5ET1dOTE9BRCcpO1xuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIHVybDogYCR7dXJsfSR7Y29sbGVjdGlvbklkfWAsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5nZXQocmVxKTtcbiAgfVxuICBnZW5lcmF0ZVByZVNpZ25lZFVybChyZXEsIGNvbnRlbnRJZDogYW55LCB0eXBlKSB7XG4gICAgY29uc3QgcmVxUGFyYW0gPSB7XG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMUy5DT05URU5ULlVQTE9BRF9VUkx9JHtjb250ZW50SWR9P3R5cGU9JHt0eXBlfWAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlcXVlc3Q6IHJlcVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMucHVibGljRGF0YVNlcnZpY2UucG9zdChyZXFQYXJhbSk7XG4gIH1cbiAgZG93bmxvYWRCbG9iVXJsRmlsZShjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5odHRwQ2xpZW50LmdldChjb25maWcuYmxvYlVybCwge3Jlc3BvbnNlVHlwZTogJ2Jsb2InfSlcbiAgICAgIC5zdWJzY3JpYmUoYmxvYiA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdFVybDogc3RyaW5nID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgIGEuaHJlZiA9IG9iamVjdFVybDtcbiAgICAgICAgYS5kb3dubG9hZCA9IGNvbmZpZy5maWxlTmFtZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgICAgIGlmIChjb25maWcuc3VjY2Vzc01lc3NhZ2UpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoY29uZmlnLnN1Y2Nlc3NNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDM0JykgKyBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvciggXy5yZXBsYWNlKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAzMycpLCAne0ZJTEVfVFlQRX0nLCBjb25maWcuZmlsZVR5cGUgKSArIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUNTVihjb25maWcpIHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSBjb25maWcudGFibGVEYXRhO1xuICAgIGRlbGV0ZSBjb25maWcudGFibGVEYXRhO1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgZmllbGRTZXBhcmF0b3I6ICcsJyxcbiAgICAgIHF1b3RlU3RyaW5nczogJ1wiJyxcbiAgICAgIGRlY2ltYWxTZXBhcmF0b3I6ICcuJyxcbiAgICAgIHNob3dMYWJlbHM6IHRydWUsXG4gICAgICB1c2VUZXh0RmlsZTogZmFsc2UsXG4gICAgICB1c2VCb206IHRydWUsXG4gICAgICBzaG93VGl0bGU6IHRydWUsXG4gICAgICB0aXRsZTogJycsXG4gICAgICBmaWxlbmFtZTogJycsXG4gICAgICBoZWFkZXJzOiBbXVxuICAgIH07XG4gICAgb3B0aW9ucyA9IF8ubWVyZ2Uob3B0aW9ucywgY29uZmlnKTtcbiAgICBjb25zdCBjc3ZFeHBvcnRlciA9IG5ldyBFeHBvcnRUb0NzdihvcHRpb25zKTtcbiAgICBjc3ZFeHBvcnRlci5nZW5lcmF0ZUNzdih0YWJsZURhdGEpO1xuICB9XG5cbiAgZ2V0QnJhbmNoaW5nTG9naWNCeUZvbGRlcihpZGVudGlmaWVyKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldE5vZGVCeUlkKGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljID0gXy5nZXQobm9kZURhdGEsICdkYXRhLm1ldGFkYXRhLmJyYW5jaGluZ0xvZ2ljJyk7XG4gICAgcmV0dXJuIGJyYW5jaGluZ0xvZ2ljIHx8IHt9O1xuICB9XG5cbi8qKlxuICpcbiAqIEBwdWJsaWNcbiAqIEBwYXJhbSBpZGVudGlmaWVyIGlkZW50aWZpZXIgb2YgdGhlIG5vZGVcbiAqIEByZXR1cm5zIHsgc291cmNlOiBbXSwgdGFyZ2V0OiBbXSwgc291cmNlVGFyZ2V0PzogW10gfVxuICogQG1lbWJlcm9mIEVkaXRvclNlcnZpY2VcbiAqL1xuZ2V0RGVwZW5kZW50Tm9kZXMoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IHNlY3Rpb25CcmFuY2hpbmdMb2dpYyA9IHRoaXMuZ2V0QnJhbmNoaW5nTG9naWNCeU5vZGVJZChpZGVudGlmaWVyKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHNlY3Rpb25CcmFuY2hpbmdMb2dpYykpIHtcbiAgICAgY29uc3QgYnJhbmNoaW5nRW50cnkgPSB0aGlzLmdldEJyYW5jaGluZ0xvZ2ljRW50cnkoc2VjdGlvbkJyYW5jaGluZ0xvZ2ljLCBpZGVudGlmaWVyKTtcbiAgICAgY29uc3Qgc291cmNlID0gXy5nZXQoYnJhbmNoaW5nRW50cnksICdzb3VyY2UnKTtcbiAgICAgaWYgKCFfLmlzRW1wdHkoc291cmNlKSkgeyAvLyBpZiB0aGUgbm9kZSBpcyBhIGRlcGVuZGVudCBub2RlXG5cbiAgICAgICBjb25zdCBzb3VyY2VCcmFuY2hpbmdFbnRyeSA9IHRoaXMuZ2V0QnJhbmNoaW5nTG9naWNFbnRyeShzZWN0aW9uQnJhbmNoaW5nTG9naWMsIF8uZmlyc3QoYnJhbmNoaW5nRW50cnkuc291cmNlKSk7XG5cbiAgICAgICByZXR1cm4gIV8uaXNFbXB0eShzb3VyY2VCcmFuY2hpbmdFbnRyeSkgPyB7IHNvdXJjZTogYnJhbmNoaW5nRW50cnkuc291cmNlLCB0YXJnZXQ6IGJyYW5jaGluZ0VudHJ5LnRhcmdldCxcbiAgICAgICAgc291cmNlVGFyZ2V0OiBzb3VyY2VCcmFuY2hpbmdFbnRyeS50YXJnZXQgfSA6IHt9O1xuXG4gICAgIH0gZWxzZSB7IC8vIGlmIHRoZSBub2RlIGlzIGEgcGFyZW50IG5vZGVcbiAgICAgICByZXR1cm4gIV8uaXNFbXB0eShicmFuY2hpbmdFbnRyeSkgPyB7IHNvdXJjZTogYnJhbmNoaW5nRW50cnkuc291cmNlLCB0YXJnZXQ6IGJyYW5jaGluZ0VudHJ5LnRhcmdldCB9IDoge307XG4gICAgIH1cbiAgICB9XG4gIH1cblxuLyoqXG4gKlxuICogQHB1YmxpY1xuICogQHBhcmFtIGlkZW50aWZpZXIgaWRlbnRpZmllciBvZiB0aGUgbm9kZVxuICogQHJldHVybnMge1wiZG9faWRcIjogeyBcInRhcmdldFwiOiBbIFwiZG9faWQxMjNcIiwgXCJkb19pZDQ1NlwiIF0sIFwicHJlQ29uZGl0aW9uXCI6IHt9LCBcInNvdXJjZVwiOiBbXSB9fVxuICogQG1lbWJlcm9mIEVkaXRvclNlcnZpY2VcbiAqL1xuICBnZXRCcmFuY2hpbmdMb2dpY0J5Tm9kZUlkKGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBsZWFmTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Tm9kZUJ5SWQoaWRlbnRpZmllcik7XG4gICAgY29uc3QgcGFyZW50SWRlbnRpZmllciA9IF8uZ2V0KGxlYWZOb2RlLCAncGFyZW50LmRhdGEuaWQnKTtcbiAgICByZXR1cm4gdGhpcy5nZXRCcmFuY2hpbmdMb2dpY0J5Rm9sZGVyKHBhcmVudElkZW50aWZpZXIpO1xuICB9XG5cbiAgZ2V0QnJhbmNoaW5nTG9naWNFbnRyeShwYXJlbnRCcmFuY2hpbmdMb2dpYywgaWRlbnRpZmllcikge1xuICAgIHJldHVybiBfLmZpbmQocGFyZW50QnJhbmNoaW5nTG9naWMsIChsb2dpYywga2V5KSA9PiB7XG4gICAgICByZXR1cm4ga2V5ID09PSBpZGVudGlmaWVyO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmxhdHRlbmVkQnJhbmNoaW5nTG9naWMoZGF0YSkge1xuICAgIGNvbnN0IGZsYXRIaWVyYXJjaHkgPSB0aGlzLl90b0ZsYXRPYmpGcm9tSGllcmFyY2h5KGRhdGEpO1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljcyA9IF8uY29tcGFjdChfLm1hcChmbGF0SGllcmFyY2h5LCAnYnJhbmNoaW5nTG9naWMnKSk7XG4gICAgcmV0dXJuIF8ucmVkdWNlKGJyYW5jaGluZ0xvZ2ljcywgKGFjYywgdmFsKSA9PiB7XG4gICAgICByZXR1cm4gIF8uYXNzaWduKGFjYywgdmFsKTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBnZXRQYXJlbnREZXBlbmRlbnRNYXAoZGF0YSkge1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljID0gdGhpcy5nZXRGbGF0dGVuZWRCcmFuY2hpbmdMb2dpYyhkYXRhKTtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBfLmZvckVhY2goXy5rZXlzKGJyYW5jaGluZ0xvZ2ljKSwgaXRlbSA9PiB7XG4gICAgICBvYmpbaXRlbV0gPSAhXy5pc0VtcHR5KGJyYW5jaGluZ0xvZ2ljW2l0ZW1dLnNvdXJjZSkgPyAnZGVwZW5kZW50JyA6ICFfLmlzRW1wdHkoYnJhbmNoaW5nTG9naWNbaXRlbV0udGFyZ2V0KSA/ICdwYXJlbnQnIDogJyc7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGdldFByaW1hcnlDYXRlZ29yeU5hbWUoc2VjdGlvbklkKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldE5vZGVCeUlkKHNlY3Rpb25JZCk7XG4gICAgcmV0dXJuIF8uZ2V0KG5vZGVEYXRhLCAnZGF0YS5wcmltYXJ5Q2F0ZWdvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmZXRjaCBPdXRjb21lIERlY2xhcmF0aW9uIGxldmVscyB1c2luZyB0aGUgcXVlc3Rpb25zZXRJZFxuICAgKiBvbmx5IGZvciBPYnNlcnZhdGlvbiB3aXRoIFJ1YnJpY3NcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgcXVlc3Rpb25zZXQgaWRlbnRpZmllclxuICAgKi9cbiAgIGZldGNoT3V0Q29tZURlY2xhcmF0aW9uKHF1ZXN0aW9uU2V0SWQsIG9wdGlvbjogYW55ID0geyBwYXJhbXM6IHt9IH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS51cmxDb25GaWcuVVJMU1t0aGlzLmVkaXRvckNvbmZpZy5jb25maWcub2JqZWN0VHlwZV07XG4gICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICBmaWVsZHM6ICdvdXRjb21lRGVjbGFyYXRpb24nXG4gICAgfTtcbiAgICBjb25zdCBoaWVyYXJjaHlVcmwgPSBgJHt1cmwuUkVBRH0vJHtxdWVzdGlvblNldElkfWA7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgdXJsOiBoaWVyYXJjaHlVcmwsXG4gICAgICBwYXJhbTogeyAuLi5wYXJhbSwgLi4ub3B0aW9uLnBhcmFtcyB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNEYXRhU2VydmljZS5nZXQocmVxKTtcbiAgfVxuXG4gIGdldCBxdWFsaXR5Rm9ybUNvbmZpZygpe1xuICAgIHJldHVybiB0aGlzLl9xdWFsaXR5Rm9ybUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc2V0UXVhbGl0eUZvcm1Db25maWcodmFsdWU6IGFueSl7XG4gICAgcmV0dXJuIHRoaXMuX3F1YWxpdHlGb3JtQ29uZmlnID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaXNSZXZpZXdlclF1YWxpdHlDaGVja0VuYWJsZWQoKXtcbiAgICByZXR1cm4gdGhpcy5faXNSZXZpZXdlclF1YWxpdHlDaGVja0VuYWJsZWQ7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIHNldElzUmV2aWV3ZXJRdWFsaXR5Q2hlY2tFbmFibGVkKHZhbHVlOiBib29sZWFuKXtcbiAgICAgIHJldHVybiB0aGlzLl9pc1Jldmlld2VyUXVhbGl0eUNoZWNrRW5hYmxlZCA9IHZhbHVlO1xuICAgIH1cblxuICBhcHBlbmRDbG91ZFN0b3JhZ2VIZWFkZXJzKGNvbmZpZykge1xuICAgIGNvbnN0IGhlYWRlcnMgPSAgXy5nZXQodGhpcy5lZGl0b3JDb25maWcsICdjb250ZXh0LmNsb3VkU3RvcmFnZS5wcmVzaWduZWRfaGVhZGVycycsIHt9KTtcbiAgICBpZiAoIV8uaXNFbXB0eShoZWFkZXJzKSkge1xuICAgICAgY29uZmlnLmhlYWRlcnMgPSB7Li4uY29uZmlnLmhlYWRlcnMsIC4uLmhlYWRlcnN9O1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|