@sunbird-cb/consumption 0.0.88 → 0.0.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/bundles/sunbird-cb-consumption.umd.js +1587 -1497
  2. package/bundles/sunbird-cb-consumption.umd.js.map +1 -1
  3. package/bundles/sunbird-cb-consumption.umd.min.js +2 -2
  4. package/bundles/sunbird-cb-consumption.umd.min.js.map +1 -1
  5. package/esm2015/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.js +4 -7
  6. package/esm2015/lib/_common/cards/card-karma-programs/card-karma-programs.component.js +3 -3
  7. package/esm2015/lib/_common/cards/card-mdo-channel/card-mdo-channel.component.js +3 -3
  8. package/esm2015/lib/_common/cards/card-mdo-channel-v1/card-mdo-channel-v1.component.js +3 -3
  9. package/esm2015/lib/_common/cards/card-portrait/card-portrait.component.js +3 -3
  10. package/esm2015/lib/_common/cards/card-portrait-ext/card-portrait-ext.component.js +3 -3
  11. package/esm2015/lib/_common/cards/card-progress-portrait-lib/card-progress-portrait-lib.component.js +3 -3
  12. package/esm2015/lib/_common/cards/cards.component.js +4 -24
  13. package/esm2015/lib/_common/common-strip/common-strip.component.js +5 -5
  14. package/esm2015/lib/_common/competency-passbook/competency-passbook.component.js +3 -3
  15. package/esm2015/lib/_common/competency-passbook-mdo/competency-passbook-mdo.component.js +3 -3
  16. package/esm2015/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +50 -54
  17. package/esm2015/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.component.js +5 -7
  18. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.js +8 -8
  19. package/esm2015/lib/_common/user-progress/user-progress.component.js +1 -2
  20. package/esm2015/lib/_services/widget-content-lib.service.js +899 -0
  21. package/esm2015/lib/_services/widget-user-lib.service.js +523 -0
  22. package/esm2015/public-api.js +3 -2
  23. package/esm2015/sunbird-cb-consumption.js +77 -78
  24. package/esm5/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.js +4 -7
  25. package/esm5/lib/_common/cards/card-karma-programs/card-karma-programs.component.js +3 -3
  26. package/esm5/lib/_common/cards/card-mdo-channel/card-mdo-channel.component.js +3 -3
  27. package/esm5/lib/_common/cards/card-mdo-channel-v1/card-mdo-channel-v1.component.js +3 -3
  28. package/esm5/lib/_common/cards/card-portrait/card-portrait.component.js +3 -3
  29. package/esm5/lib/_common/cards/card-portrait-ext/card-portrait-ext.component.js +3 -3
  30. package/esm5/lib/_common/cards/card-progress-portrait-lib/card-progress-portrait-lib.component.js +3 -3
  31. package/esm5/lib/_common/cards/cards.component.js +4 -27
  32. package/esm5/lib/_common/common-strip/common-strip.component.js +5 -5
  33. package/esm5/lib/_common/competency-passbook/competency-passbook.component.js +3 -3
  34. package/esm5/lib/_common/competency-passbook-mdo/competency-passbook-mdo.component.js +3 -3
  35. package/esm5/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.js +83 -87
  36. package/esm5/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.component.js +5 -7
  37. package/esm5/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.js +8 -9
  38. package/esm5/lib/_common/user-progress/user-progress.component.js +1 -2
  39. package/esm5/lib/_services/widget-content-lib.service.js +1170 -0
  40. package/esm5/lib/_services/widget-user-lib.service.js +607 -0
  41. package/esm5/public-api.js +3 -2
  42. package/esm5/sunbird-cb-consumption.js +77 -78
  43. package/fesm2015/sunbird-cb-consumption.js +1152 -1089
  44. package/fesm2015/sunbird-cb-consumption.js.map +1 -1
  45. package/fesm5/sunbird-cb-consumption.js +1512 -1422
  46. package/fesm5/sunbird-cb-consumption.js.map +1 -1
  47. package/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.d.ts +2 -3
  48. package/lib/_common/cards/card-karma-programs/card-karma-programs.component.d.ts +2 -2
  49. package/lib/_common/cards/card-mdo-channel/card-mdo-channel.component.d.ts +2 -2
  50. package/lib/_common/cards/card-mdo-channel-v1/card-mdo-channel-v1.component.d.ts +2 -2
  51. package/lib/_common/cards/card-portrait/card-portrait.component.d.ts +2 -2
  52. package/lib/_common/cards/card-portrait-ext/card-portrait-ext.component.d.ts +2 -2
  53. package/lib/_common/cards/card-progress-portrait-lib/card-progress-portrait-lib.component.d.ts +2 -2
  54. package/lib/_common/cards/cards.component.d.ts +2 -5
  55. package/lib/_common/common-strip/common-strip.component.d.ts +3 -3
  56. package/lib/_common/competency-passbook/competency-passbook.component.d.ts +3 -3
  57. package/lib/_common/competency-passbook-mdo/competency-passbook-mdo.component.d.ts +3 -3
  58. package/lib/_common/content-strip-with-tabs-lib/content-strip-with-tabs-lib.component.d.ts +4 -6
  59. package/lib/_common/strips/content-strip-facet-filter/content-strip-facet-filter.component.d.ts +3 -4
  60. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.d.ts +3 -4
  61. package/lib/_services/{widget-content.service.d.ts → widget-content-lib.service.d.ts} +6 -3
  62. package/lib/_services/{widget-user.service.d.ts → widget-user-lib.service.d.ts} +9 -4
  63. package/package.json +1 -1
  64. package/public-api.d.ts +2 -1
  65. package/sunbird-cb-consumption.d.ts +75 -76
  66. package/sunbird-cb-consumption.metadata.json +1 -1
  67. package/esm2015/lib/_services/widget-content.service.js +0 -852
  68. package/esm2015/lib/_services/widget-user.service.js +0 -475
  69. package/esm5/lib/_services/widget-content.service.js +0 -1109
  70. package/esm5/lib/_services/widget-user.service.js +0 -542
@@ -1,852 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { HttpClient } from '@angular/common/http';
7
- import { Injectable } from '@angular/core';
8
- import { ConfigurationsService } from '@sunbird-cb/utils-v2';
9
- import { of, EMPTY, BehaviorSubject, Subject } from 'rxjs';
10
- import { catchError, retry, map, shareReplay } from 'rxjs/operators';
11
- import { NsContent } from '../_models/widget-content.model';
12
- // tslint:disable
13
- import * as _ from 'lodash';
14
- import { viewerRouteGenerator } from './viewer-route-util';
15
- import * as moment_ from 'moment';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/common/http";
18
- import * as i2 from "@sunbird-cb/utils-v2";
19
- /** @type {?} */
20
- const moment = moment_;
21
- // tslint:enable
22
- // TODO: move this in some common place
23
- /** @type {?} */
24
- const PROTECTED_SLAG_V8 = '/apis/protected/v8';
25
- const ɵ0 = /**
26
- * @param {?} type
27
- * @param {?} id
28
- * @return {?}
29
- */
30
- (type, id) => `${PROTECTED_SLAG_V8}/content/collection/${type}/${id}`, ɵ1 = /**
31
- * @param {?} contentId
32
- * @return {?}
33
- */
34
- (contentId) => `${PROTECTED_SLAG_V8}/user/progress/${contentId}`, ɵ2 = /**
35
- * @param {?} certId
36
- * @return {?}
37
- */
38
- (certId) => `${PROTECTED_SLAG_V8}/cohorts/course/batch/cert/download/${certId}`, ɵ3 = /**
39
- * @param {?} contentId
40
- * @return {?}
41
- */
42
- (contentId) => `/apis/proxies/v8/action/content/v3/read/${contentId}`;
43
- /** @type {?} */
44
- const API_END_POINTS = {
45
- CONTENT: `${PROTECTED_SLAG_V8}/content`,
46
- AUTHORING_CONTENT: `/api/course/v1/hierarchy`,
47
- CONTENT_LIKES: `${PROTECTED_SLAG_V8}/content/likeCount`,
48
- SET_S3_COOKIE: `${PROTECTED_SLAG_V8}/content/setCookie`,
49
- SET_S3_IMAGE_COOKIE: `${PROTECTED_SLAG_V8}/content/setImageCookie`,
50
- FETCH_MANIFEST: `${PROTECTED_SLAG_V8}/content/getWebModuleManifest`,
51
- FETCH_WEB_MODULE_FILES: `${PROTECTED_SLAG_V8}/content/getWebModuleFiles`,
52
- MULTIPLE_CONTENT: `${PROTECTED_SLAG_V8}/content/multiple`,
53
- CONTENT_SEARCH_V5: `${PROTECTED_SLAG_V8}/content/searchV5`,
54
- CONTENT_SEARCH_V6: `/apis/proxies/v8/sunbirdigot/search`,
55
- TRENDING_CONTENT_SEARCH: `apis/proxies/v8/trending/content/search`,
56
- CONTENT_SEARCH_RELATED_CBP_V6: `/apis/proxies/v8/sunbirdigot/search`,
57
- CONTENT_SEARCH_REGION_RECOMMENDATION: `${PROTECTED_SLAG_V8}/content/searchRegionRecommendation`,
58
- CONTENT_HISTORY: `${PROTECTED_SLAG_V8}/user/history`,
59
- CONTENT_HISTORYV2: `/apis/proxies/v8/read/content-progres`,
60
- COURSE_BATCH_LIST: `/apis/proxies/v8/learner/course/v1/batch/list`,
61
- COURSE_BATCH: `/apis/proxies/v8/course/v1/batch/read`,
62
- AUTO_ASSIGN_BATCH: `/apis/protected/v8/cohorts/user/autoenrollment/`,
63
- AUTO_ASSIGN_CURATED_BATCH: `/apis/proxies/v8/curatedprogram/v1/enrol`,
64
- AUTO_ASSIGN_OPEN_PROGRAM: `/apis/proxies/v8/openprogram/v1/enrol`,
65
- USER_CONTINUE_LEARNING: `${PROTECTED_SLAG_V8}/user/history/continue`,
66
- CONTENT_RATING: `${PROTECTED_SLAG_V8}/user/rating`,
67
- COLLECTION_HIERARCHY: (ɵ0),
68
- REGISTRATION_STATUS: `${PROTECTED_SLAG_V8}/admin/userRegistration/checkUserRegistrationContent`,
69
- MARK_AS_COMPLETE_META: (ɵ1),
70
- ENROLL_BATCH: `/apis/proxies/v8/learner/course/v1/enrol`,
71
- ENROLL_BATCH_WF: `/apis/proxies/v8/workflow/blendedprogram/enrol`,
72
- WITHDRAW_BATCH_WF: `/apis/proxies/v8/workflow/blendedprogram/unenrol`,
73
- BLENDED_USER_WF: `/apis/proxies/v8/workflow/blendedprogram/user/search`,
74
- BLENDED_USER_COUNT: `apis/proxies/v8/workflow/blendedprogram/enrol/status/count`,
75
- CERT_ADD_TEMPLATE: `${PROTECTED_SLAG_V8}/cohorts/course/batch/cert/template/add`,
76
- CERT_ISSUE: `${PROTECTED_SLAG_V8}/cohorts/course/batch/cert/issue`,
77
- CERT_DOWNLOAD: (ɵ2),
78
- READ_KARMAPOINTS: `/apis/proxies/v8/karmapoints/read`,
79
- CONTENT_READ: (ɵ3),
80
- READ_COURSE_KARMAPOINTS: '/apis/proxies/v8/karmapoints/user/course/read',
81
- CLAIM_KARMAPOINTS: '/apis/proxies/v8/claimkarmapoints',
82
- USER_KARMA_POINTS: '/apis/proxies/v8/user/totalkarmapoints',
83
- AGGREGATION_SEARCH: '/apis/proxies/v8/content/aggregation/search',
84
- FEATURE_SEARCH: '/apis/proxies/v8/featured/content/search',
85
- };
86
- export class WidgetContentService {
87
- /**
88
- * @param {?} http
89
- * @param {?} configSvc
90
- */
91
- constructor(http, configSvc) {
92
- this.http = http;
93
- this.configSvc = configSvc;
94
- this.tocConfigData = new BehaviorSubject({});
95
- this.tocConfigData$ = this.tocConfigData.asObservable();
96
- this.telemetryData = new Subject();
97
- this.telemetryData$ = this.telemetryData.asObservable();
98
- this.programChildCourseResumeData = new BehaviorSubject({});
99
- this.programChildCourseResumeData$ = this.programChildCourseResumeData.asObservable();
100
- }
101
- /**
102
- * @param {?} message
103
- * @return {?}
104
- */
105
- changeTelemetryData(message) {
106
- this.telemetryData.next(message);
107
- }
108
- /**
109
- * @param {?} primaryCategory
110
- * @return {?}
111
- */
112
- isResource(primaryCategory) {
113
- if (primaryCategory) {
114
- /** @type {?} */
115
- const isResource = (primaryCategory === NsContent.EResourcePrimaryCategories.LEARNING_RESOURCE) ||
116
- (primaryCategory === NsContent.EResourcePrimaryCategories.PRACTICE_RESOURCE) ||
117
- (primaryCategory === NsContent.EResourcePrimaryCategories.FINAL_ASSESSMENT) ||
118
- (primaryCategory === NsContent.EResourcePrimaryCategories.COMP_ASSESSMENT) ||
119
- (primaryCategory === NsContent.EResourcePrimaryCategories.OFFLINE_SESSION);
120
- return isResource;
121
- }
122
- return false;
123
- }
124
- /**
125
- * @param {?} identifier
126
- * @return {?}
127
- */
128
- fetchMarkAsCompleteMeta(identifier) {
129
- // tslint:disable-next-line
130
- /** @type {?} */
131
- const url = API_END_POINTS.MARK_AS_COMPLETE_META(identifier)
132
- // return this.http.get(url).toPromise()
133
- ;
134
- // return this.http.get(url).toPromise()
135
- if (url) { }
136
- return of().toPromise();
137
- }
138
- /**
139
- * @param {?} data
140
- * @return {?}
141
- */
142
- updateTocConfig(data) {
143
- this.tocConfigData.next(data);
144
- }
145
- /**
146
- * @param {?} contentId
147
- * @param {?=} hierarchyType
148
- * @param {?=} _additionalFields
149
- * @param {?=} primaryCategory
150
- * @return {?}
151
- */
152
- fetchContent(contentId, hierarchyType = 'detail', _additionalFields = [], primaryCategory) {
153
- // const url = `${API_END_POINTS.CONTENT}/${contentId}?hierarchyType=${hierarchyType}`
154
- /** @type {?} */
155
- let url = '';
156
- /** @type {?} */
157
- const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
158
- if (primaryCategory && this.isResource(primaryCategory)) {
159
- if (!forPreview) {
160
- url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
161
- }
162
- else {
163
- url = `/api/content/v1/read/${contentId}`;
164
- }
165
- }
166
- else {
167
- if (!forPreview) {
168
- url = `/apis/proxies/v8/action/content/v3/hierarchy/${contentId}?hierarchyType=${hierarchyType}`;
169
- }
170
- else {
171
- /** @type {?} */
172
- const forcreator = window.location.href.includes('editMode=true');
173
- if (forcreator) {
174
- url = `apis/proxies/v8/action/content/v3/hierarchy/${contentId}?mode=edit`;
175
- }
176
- else {
177
- url = `/api/course/v1/hierarchy/${contentId}?hierarchyType=${hierarchyType}`;
178
- }
179
- }
180
- }
181
- // return this.http
182
- // .post<NsContent.IContent>(url, { additionalFields })
183
- // .pipe(retry(1))
184
- return this.http
185
- .get(url)
186
- .pipe(shareReplay(1));
187
- // if (apiData && apiData.result) {
188
- // return apiData.result.content
189
- // }
190
- }
191
- /**
192
- * @param {?} contentId
193
- * @return {?}
194
- */
195
- fetchAuthoringContent(contentId) {
196
- /** @type {?} */
197
- const forcreator = window.location.href.includes('editMode=true');
198
- /** @type {?} */
199
- let url = '';
200
- if (forcreator) {
201
- url = `apis/proxies/v8/action/content/v3/hierarchy/${contentId}?mode=edit`;
202
- }
203
- else {
204
- url = `${API_END_POINTS.AUTHORING_CONTENT}/${contentId}?hierarchyType=detail`;
205
- }
206
- return this.http.get(url).pipe(shareReplay(1), (/**
207
- * @param {?} r
208
- * @return {?}
209
- */
210
- r => r));
211
- }
212
- /**
213
- * @param {?} ids
214
- * @return {?}
215
- */
216
- fetchMultipleContent(ids) {
217
- return this.http.get(`${API_END_POINTS.MULTIPLE_CONTENT}/${ids.join(',')}`);
218
- }
219
- /**
220
- * @param {?} type
221
- * @param {?} id
222
- * @param {?=} pageNumber
223
- * @param {?=} pageSize
224
- * @return {?}
225
- */
226
- fetchCollectionHierarchy(type, id, pageNumber = 0, pageSize = 1) {
227
- return this.http.get(`${API_END_POINTS.COLLECTION_HIERARCHY(type, id)}?pageNumber=${pageNumber}&pageSize=${pageSize}`);
228
- }
229
- /**
230
- * @return {?}
231
- */
232
- fetchBlendedCourse() {
233
- }
234
- /**
235
- * @param {?} req
236
- * @return {?}
237
- */
238
- fetchCourseBatches(req) {
239
- return this.http
240
- .post(API_END_POINTS.COURSE_BATCH_LIST, req)
241
- .pipe(retry(1), map((/**
242
- * @param {?} data
243
- * @return {?}
244
- */
245
- (data) => data.result.response)));
246
- }
247
- // fetch individual batch
248
- /**
249
- * @param {?} batchId
250
- * @return {?}
251
- */
252
- fetchCourseBatch(batchId) {
253
- return this.http.get(`${API_END_POINTS.COURSE_BATCH}/${batchId}`);
254
- }
255
- /**
256
- * @param {?} identifier
257
- * @return {?}
258
- */
259
- autoAssignBatchApi(identifier) {
260
- return this.http.get(`${API_END_POINTS.AUTO_ASSIGN_BATCH}${identifier}`)
261
- .pipe(retry(1), map((/**
262
- * @param {?} data
263
- * @return {?}
264
- */
265
- (data) => data.result.response)));
266
- }
267
- /**
268
- * @param {?} request
269
- * @param {?} programType
270
- * @return {?}
271
- */
272
- autoAssignCuratedBatchApi(request, programType) {
273
- /** @type {?} */
274
- const url = programType === NsContent.ECourseCategory.MODERATED_PROGRAM ?
275
- API_END_POINTS.AUTO_ASSIGN_OPEN_PROGRAM : API_END_POINTS.AUTO_ASSIGN_CURATED_BATCH;
276
- return this.http.post(`${url}`, request)
277
- .pipe(retry(1), map((/**
278
- * @param {?} data
279
- * @return {?}
280
- */
281
- (data) => data.result.response)));
282
- }
283
- /**
284
- * @param {?} req
285
- * @return {?}
286
- */
287
- enrollUserToBatch(req) {
288
- return this.http
289
- .post(API_END_POINTS.ENROLL_BATCH, req)
290
- .toPromise();
291
- }
292
- /**
293
- * @param {?} req
294
- * @param {?} type
295
- * @return {?}
296
- */
297
- enrollAndUnenrollUserToBatchWF(req, type) {
298
- /** @type {?} */
299
- const url = type === 'WITHDRAW' ? API_END_POINTS.WITHDRAW_BATCH_WF : API_END_POINTS.ENROLL_BATCH_WF;
300
- return this.http
301
- .post(url, req)
302
- .toPromise();
303
- }
304
- /**
305
- * @param {?} req
306
- * @return {?}
307
- */
308
- fetchBlendedUserWF(req) {
309
- return this.http
310
- .post(API_END_POINTS.BLENDED_USER_WF, req)
311
- .toPromise();
312
- }
313
- /**
314
- * @param {?} req
315
- * @return {?}
316
- */
317
- fetchBlendedUserCOUNT(req) {
318
- return this.http
319
- .post(API_END_POINTS.BLENDED_USER_COUNT, req)
320
- .toPromise();
321
- }
322
- /**
323
- * @param {?} contentIds
324
- * @return {?}
325
- */
326
- fetchContentLikes(contentIds) {
327
- return this.http
328
- .post(API_END_POINTS.CONTENT_LIKES, contentIds)
329
- .toPromise();
330
- }
331
- /**
332
- * @param {?} contentIds
333
- * @return {?}
334
- */
335
- fetchContentRatings(contentIds) {
336
- if (contentIds) { }
337
- // return this.http
338
- // .post(`${API_END_POINTS.CONTENT_RATING}/rating`, contentIds)
339
- // .toPromise()
340
- return of().toPromise();
341
- }
342
- /**
343
- * @param {?} contentId
344
- * @return {?}
345
- */
346
- fetchContentHistory(contentId) {
347
- return this.http.get(`${API_END_POINTS.CONTENT_HISTORY}/${contentId}`);
348
- }
349
- /**
350
- * @param {?} req
351
- * @return {?}
352
- */
353
- fetchContentHistoryV2(req) {
354
- req.request.fields = ['progressdetails'];
355
- /** @type {?} */
356
- const data = this.http.post(`${API_END_POINTS.CONTENT_HISTORYV2}/${req.request.courseId}`, req);
357
- data.subscribe((/**
358
- * @param {?} subscribeData
359
- * @return {?}
360
- */
361
- (subscribeData) => {
362
- this.programChildCourseResumeData.next({ resumeData: subscribeData.result.contentList, courseId: req.request.courseId });
363
- }));
364
- return data;
365
- }
366
- /**
367
- * @param {?} id
368
- * @param {?=} collectionId
369
- * @param {?=} collectionType
370
- * @return {?}
371
- */
372
- continueLearning(id, collectionId, collectionType) {
373
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
374
- return new Promise((/**
375
- * @param {?} resolve
376
- * @return {?}
377
- */
378
- (resolve) => tslib_1.__awaiter(this, void 0, void 0, function* () {
379
- if (collectionType &&
380
- collectionType.toLowerCase() === 'playlist') {
381
- /** @type {?} */
382
- const reqBody = {
383
- contextPathId: collectionId ? collectionId : id,
384
- resourceId: id,
385
- data: JSON.stringify({
386
- timestamp: Date.now(),
387
- contextFullPath: [collectionId, id],
388
- }),
389
- dateAccessed: Date.now(),
390
- contextType: 'playlist',
391
- };
392
- yield this.saveContinueLearning(reqBody).toPromise().catch().finally((/**
393
- * @return {?}
394
- */
395
- () => {
396
- resolve(true);
397
- }));
398
- }
399
- else {
400
- /** @type {?} */
401
- const reqBody = {
402
- contextPathId: collectionId ? collectionId : id,
403
- resourceId: id,
404
- data: JSON.stringify({ timestamp: Date.now() }),
405
- dateAccessed: Date.now(),
406
- };
407
- yield this.saveContinueLearning(reqBody).toPromise().catch().finally((/**
408
- * @return {?}
409
- */
410
- () => {
411
- resolve(true);
412
- }));
413
- }
414
- })));
415
- });
416
- }
417
- /**
418
- * @param {?} content
419
- * @return {?}
420
- */
421
- saveContinueLearning(content) {
422
- // const url = API_END_POINTS.USER_CONTINUE_LEARNING
423
- // return this.http.post<any>(url, content)
424
- if (content) {
425
- }
426
- return (/** @type {?} */ (of()));
427
- }
428
- /**
429
- * @param {?} _contentId
430
- * @return {?}
431
- */
432
- setS3Cookie(_contentId) {
433
- // return this.http
434
- // .post(API_END_POINTS.SET_S3_COOKIE, { contentId })
435
- // .pipe(catchError(_err => of(true)))
436
- return EMPTY;
437
- }
438
- /**
439
- * @return {?}
440
- */
441
- setS3ImageCookie() {
442
- return this.http.post(API_END_POINTS.SET_S3_IMAGE_COOKIE, {}).pipe(catchError((/**
443
- * @param {?} _err
444
- * @return {?}
445
- */
446
- _err => of(true))));
447
- }
448
- /**
449
- * @param {?} url
450
- * @return {?}
451
- */
452
- fetchManifest(url) {
453
- return this.http.post(API_END_POINTS.FETCH_MANIFEST, { url });
454
- }
455
- /**
456
- * @param {?} url
457
- * @return {?}
458
- */
459
- fetchWebModuleContent(url) {
460
- return this.http.get(`${API_END_POINTS.FETCH_WEB_MODULE_FILES}?url=${encodeURIComponent(url)}`);
461
- }
462
- /**
463
- * @param {?} req
464
- * @return {?}
465
- */
466
- search(req) {
467
- req.query = req.query || '';
468
- return this.http.post(API_END_POINTS.CONTENT_SEARCH_V5, {
469
- request: req,
470
- });
471
- }
472
- /**
473
- * @param {?} req
474
- * @return {?}
475
- */
476
- searchRegionRecommendation(req) {
477
- req.query = req.query || '';
478
- req.preLabelValue =
479
- (req.preLabelValue || '') +
480
- ((this.configSvc.userProfile && this.configSvc.userProfile.country) || '');
481
- req.filters = Object.assign({}, req.filters, { labels: [req.preLabelValue || ''] });
482
- return this.http.post(API_END_POINTS.CONTENT_SEARCH_REGION_RECOMMENDATION, { request: req });
483
- }
484
- /**
485
- * @param {?} req
486
- * @return {?}
487
- */
488
- searchV6(req) {
489
- /** @type {?} */
490
- const apiPath = _.get(req, 'api.path');
491
- req.query = req.query || '';
492
- if (apiPath) {
493
- return this.http.get(apiPath);
494
- }
495
- return this.http.post(API_END_POINTS.CONTENT_SEARCH_V6, req);
496
- }
497
- /**
498
- * @param {?} req
499
- * @return {?}
500
- */
501
- searchRelatedCBPV6(req) {
502
- return this.http.post(API_END_POINTS.CONTENT_SEARCH_RELATED_CBP_V6, req);
503
- }
504
- /**
505
- * @param {?} contentId
506
- * @return {?}
507
- */
508
- fetchContentRating(contentId) {
509
- return this.http.get(`${API_END_POINTS.CONTENT_RATING}/${contentId}`);
510
- }
511
- /**
512
- * @param {?} contentId
513
- * @return {?}
514
- */
515
- deleteContentRating(contentId) {
516
- return this.http.delete(`${API_END_POINTS.CONTENT_RATING}/${contentId}`);
517
- }
518
- /**
519
- * @param {?} contentId
520
- * @param {?} data
521
- * @return {?}
522
- */
523
- addContentRating(contentId, data) {
524
- return this.http.post(`${API_END_POINTS.CONTENT_RATING}/${contentId}`, data);
525
- }
526
- /**
527
- * @param {?} content
528
- * @return {?}
529
- */
530
- getFirstChildInHierarchy(content) {
531
- if (!(content.children || []).length) {
532
- return content;
533
- }
534
- if ((content.primaryCategory === NsContent.EPrimaryCategory.PROGRAM &&
535
- !(content.artifactUrl && content.artifactUrl.length)) ||
536
- content.primaryCategory === NsContent.EPrimaryCategory.MANDATORY_COURSE_GOAL ||
537
- (content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM &&
538
- !(content.artifactUrl && content.artifactUrl.length)) ||
539
- (content.primaryCategory === NsContent.EPrimaryCategory.MODULE &&
540
- !(content.artifactUrl && content.artifactUrl.length))) {
541
- /** @type {?} */
542
- const child = content.children[0];
543
- return this.getFirstChildInHierarchy(child);
544
- }
545
- if (content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE ||
546
- content.primaryCategory === NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT ||
547
- content.primaryCategory === NsContent.EPrimaryCategory.PROGRAM ||
548
- content.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE ||
549
- content.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT ||
550
- content.primaryCategory === NsContent.EPrimaryCategory.COMP_ASSESSMENT ||
551
- content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM ||
552
- content.primaryCategory === NsContent.EPrimaryCategory.OFFLINE_SESSION) {
553
- return content;
554
- }
555
- /** @type {?} */
556
- const firstChild = content.children[0];
557
- /** @type {?} */
558
- const resultContent = this.getFirstChildInHierarchy(firstChild);
559
- return resultContent;
560
- }
561
- /**
562
- * @param {?} source
563
- * @return {?}
564
- */
565
- getRegistrationStatus(source) {
566
- return this.http.get(`${API_END_POINTS.REGISTRATION_STATUS}/${source}`).toPromise();
567
- }
568
- /**
569
- * @param {?} url
570
- * @return {?}
571
- */
572
- fetchConfig(url) {
573
- return this.http.get(url);
574
- }
575
- /**
576
- * @param {?} body
577
- * @return {?}
578
- */
579
- addCertTemplate(body) {
580
- return this.http.patch(`${API_END_POINTS.CERT_ADD_TEMPLATE}`, body);
581
- }
582
- /**
583
- * @param {?} body
584
- * @return {?}
585
- */
586
- issueCert(body) {
587
- return this.http.post(`${API_END_POINTS.CERT_ISSUE}`, body);
588
- }
589
- /**
590
- * @param {?} certId
591
- * @return {?}
592
- */
593
- downloadCert(certId) {
594
- return this.http.get(`${API_END_POINTS.CERT_DOWNLOAD(certId)}`);
595
- }
596
- /**
597
- * @param {?} req
598
- * @return {?}
599
- */
600
- trendingContentSearch(req) {
601
- req.query = req.query || '';
602
- return this.http.post(API_END_POINTS.TRENDING_CONTENT_SEARCH, req);
603
- }
604
- /**
605
- * @param {?} limit
606
- * @param {?} offset
607
- * @return {?}
608
- */
609
- getKarmaPoitns(limit, offset) {
610
- return this.http.post(API_END_POINTS.READ_KARMAPOINTS, { limit, offset }).pipe(catchError((/**
611
- * @param {?} _err
612
- * @return {?}
613
- */
614
- _err => of(true))));
615
- }
616
- /**
617
- * @param {?} contentId
618
- * @return {?}
619
- */
620
- fetchProgramContent(contentId) {
621
- /** @type {?} */
622
- let url = '';
623
- /** @type {?} */
624
- const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
625
- if (!forPreview) {
626
- return this.http.get(API_END_POINTS.CONTENT_READ(contentId));
627
- }
628
- url = `/api/content/v1/read/${contentId}`;
629
- return this.http.get(url);
630
- // return this.http.get<NsContent.IContent[]>(API_END_POINTS.CONTENT_READ(contentId))
631
- }
632
- /**
633
- * @param {?} request
634
- * @return {?}
635
- */
636
- getCourseKarmaPoints(request) {
637
- return this.http.post(API_END_POINTS.READ_COURSE_KARMAPOINTS, request);
638
- }
639
- /**
640
- * @param {?} request
641
- * @return {?}
642
- */
643
- claimKarmapoints(request) {
644
- return this.http.post(API_END_POINTS.CLAIM_KARMAPOINTS, request);
645
- }
646
- /**
647
- * @return {?}
648
- */
649
- userKarmaPoints() {
650
- return this.http.post(API_END_POINTS.USER_KARMA_POINTS, {});
651
- }
652
- /**
653
- * @param {?} doId
654
- * @return {?}
655
- */
656
- getEnrolledData(doId) {
657
- /** @type {?} */
658
- const enrollmentMapData = JSON.parse(localStorage.getItem('enrollmentMapData') || '{}');
659
- /** @type {?} */
660
- const enrolledCourseData = enrollmentMapData[doId];
661
- return enrolledCourseData;
662
- }
663
- /**
664
- * @param {?} content
665
- * @return {?}
666
- */
667
- getResourseLink(content) {
668
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
669
- /** @type {?} */
670
- const enrolledCourseData = this.getEnrolledData(content.identifier);
671
- if (enrolledCourseData) {
672
- if (enrolledCourseData.content.courseCategory === NsContent.ECourseCategory.BLENDED_PROGRAM ||
673
- enrolledCourseData.content.courseCategory === NsContent.ECourseCategory.INVITE_ONLY_PROGRAM ||
674
- enrolledCourseData.content.courseCategory === NsContent.ECourseCategory.MODERATED_PROGRAM ||
675
- enrolledCourseData.content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM ||
676
- enrolledCourseData.content.primaryCategory === NsContent.EPrimaryCategory.PROGRAM) {
677
- if (!this.isBatchInProgress(enrolledCourseData.batch)) {
678
- return this.gotoTocPage(content);
679
- }
680
- /** @type {?} */
681
- const data = yield this.checkForDataToFormUrl(content, enrolledCourseData);
682
- return data;
683
- }
684
- {
685
- /** @type {?} */
686
- const data = yield this.checkForDataToFormUrl(content, enrolledCourseData);
687
- return data;
688
- }
689
- }
690
- return this.gotoTocPage(content);
691
- });
692
- }
693
- /**
694
- * @param {?} content
695
- * @param {?} enrollData
696
- * @return {?}
697
- */
698
- checkForDataToFormUrl(content, enrollData) {
699
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
700
- /** @type {?} */
701
- let urlData;
702
- if (enrollData.completionPercentage === 100) {
703
- return this.gotoTocPage(enrollData);
704
- }
705
- if (enrollData.lrcProgressDetails && enrollData.lrcProgressDetails.mimeType) {
706
- /** @type {?} */
707
- const modifyEnrollData = Object.assign({}, enrollData, { identifier: enrollData.collectionId, primaryCategory: enrollData.content.primaryCategory, name: enrollData.content.name });
708
- if (modifyEnrollData.lastReadContentId) {
709
- return this.getResourseDataWithData(modifyEnrollData, enrollData.lastReadContentId, enrollData.lrcProgressDetails.mimeType);
710
- }
711
- if (modifyEnrollData.firstChildId) {
712
- return this.getResourseDataWithData(modifyEnrollData, enrollData.firstChildId, enrollData.lrcProgressDetails.mimeType);
713
- }
714
- }
715
- if (enrollData.firstChildId || enrollData.lastReadContentId) {
716
- /** @type {?} */
717
- const doId = enrollData.firstChildId || enrollData.lastReadContentId;
718
- /** @type {?} */
719
- const responseData = yield this.fetchProgramContent(doId).toPromise().then((/**
720
- * @param {?} res
721
- * @return {?}
722
- */
723
- (res) => tslib_1.__awaiter(this, void 0, void 0, function* () {
724
- if (res && res.result && res.result.content) {
725
- /** @type {?} */
726
- const contentData = res.result.content;
727
- /** @type {?} */
728
- const modifyEnrollData = Object.assign({}, enrollData, { identifier: enrollData.collectionId, primaryCategory: enrollData.content.primaryCategory, name: enrollData.content.name });
729
- urlData = this.getResourseDataWithData(modifyEnrollData, contentData.identifier, contentData.mimeType);
730
- if (urlData) {
731
- return urlData;
732
- }
733
- }
734
- })));
735
- return responseData ? responseData : this.gotoTocPage(content);
736
- }
737
- return this.gotoTocPage(content);
738
- });
739
- }
740
- /**
741
- * @param {?} content
742
- * @param {?} resourseId
743
- * @param {?} mimeType
744
- * @return {?}
745
- */
746
- getResourseDataWithData(content, resourseId, mimeType) {
747
- if (content) {
748
- /** @type {?} */
749
- const url = viewerRouteGenerator(resourseId, mimeType, content.identifier, 'Course', false, 'Learning Resource', content.batchId, content.name);
750
- return url;
751
- }
752
- return this.gotoTocPage(content);
753
- }
754
- /**
755
- * @param {?} content
756
- * @return {?}
757
- */
758
- gotoTocPage(content) {
759
- /** @type {?} */
760
- const urlData = {
761
- url: `/app/toc/${content.identifier ? content.identifier : content.collectionId}/overview`,
762
- queryParams: { batchId: content.batchId },
763
- };
764
- if (content.endDate) {
765
- urlData.queryParams = Object.assign({}, urlData.queryParams, { planType: 'cbPlan', endDate: content.endDate });
766
- }
767
- return urlData;
768
- }
769
- /**
770
- * @param {?} batchData
771
- * @return {?}
772
- */
773
- isBatchInProgress(batchData) {
774
- // if (this.content && this.content['batches']) {
775
- // const batches = this.content['batches'] as NsContent.IBatch
776
- if (batchData && batchData.endDate) {
777
- /** @type {?} */
778
- const now = moment().format('YYYY-MM-DD');
779
- /** @type {?} */
780
- const startDate = moment(batchData.startDate).format('YYYY-MM-DD');
781
- /** @type {?} */
782
- const endDate = batchData.endDate ? moment(batchData.endDate).format('YYYY-MM-DD') : now;
783
- return (
784
- // batch.status &&
785
- moment(startDate).isSameOrBefore(now)
786
- && moment(endDate).isSameOrAfter(now));
787
- }
788
- return true;
789
- }
790
- /**
791
- * @param {?} apiUrl
792
- * @param {?} req
793
- * @return {?}
794
- */
795
- postApiMethod(apiUrl, req) {
796
- return this.http.post(apiUrl, req);
797
- }
798
- /**
799
- * @param {?} apiUrl
800
- * @return {?}
801
- */
802
- getApiMethod(apiUrl) {
803
- // req.query = req.query || '';
804
- return this.http.get(apiUrl);
805
- }
806
- }
807
- WidgetContentService.decorators = [
808
- { type: Injectable, args: [{
809
- providedIn: 'root',
810
- },] }
811
- ];
812
- /** @nocollapse */
813
- WidgetContentService.ctorParameters = () => [
814
- { type: HttpClient },
815
- { type: ConfigurationsService }
816
- ];
817
- /** @nocollapse */ WidgetContentService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WidgetContentService_Factory() { return new WidgetContentService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.ConfigurationsService)); }, token: WidgetContentService, providedIn: "root" });
818
- if (false) {
819
- /** @type {?} */
820
- WidgetContentService.prototype.tocConfigData;
821
- /** @type {?} */
822
- WidgetContentService.prototype.tocConfigData$;
823
- /**
824
- * @type {?}
825
- * @private
826
- */
827
- WidgetContentService.prototype.telemetryData;
828
- /** @type {?} */
829
- WidgetContentService.prototype.telemetryData$;
830
- /** @type {?} */
831
- WidgetContentService.prototype.currentMetaData;
832
- /** @type {?} */
833
- WidgetContentService.prototype.currentContentReadMetaData;
834
- /** @type {?} */
835
- WidgetContentService.prototype.currentBatchEnrollmentList;
836
- /** @type {?} */
837
- WidgetContentService.prototype.programChildCourseResumeData;
838
- /** @type {?} */
839
- WidgetContentService.prototype.programChildCourseResumeData$;
840
- /**
841
- * @type {?}
842
- * @private
843
- */
844
- WidgetContentService.prototype.http;
845
- /**
846
- * @type {?}
847
- * @private
848
- */
849
- WidgetContentService.prototype.configSvc;
850
- }
851
- export { ɵ0, ɵ1, ɵ2, ɵ3 };
852
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWNvbnRlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uLyIsInNvdXJjZXMiOlsibGliL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQUc1RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUcsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzRCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7Ozs7TUFDNUIsTUFBTSxHQUFHLE9BQU87Ozs7TUFJaEIsaUJBQWlCLEdBQUcsb0JBQW9COzs7Ozs7QUF5QnRCLENBQUMsSUFBWSxFQUFFLEVBQVUsRUFBRSxFQUFFLENBQ2pELEdBQUcsaUJBQWlCLHVCQUF1QixJQUFJLElBQUksRUFBRSxFQUFFOzs7O0FBRWxDLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsR0FBRyxpQkFBaUIsa0JBQWtCLFNBQVMsRUFBRTs7OztBQVFoRixDQUFDLE1BQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxpQkFBaUIsdUNBQXVDLE1BQU0sRUFBRTs7OztBQUVyRixDQUFDLFNBQWMsRUFBRSxF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O0lBQ2hCLENBQUM7Ozs7OztJQUNELGFBQWEsQ0FBQyxNQUFXLEVBQUUsR0FBUTtRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFxQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsQ0FBQzs7Ozs7SUFDRCxZQUFZLENBQUMsTUFBVztRQUN0QiwrQkFBK0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBcUIsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7O1lBdGdCRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs7WUFoRVEsVUFBVTtZQUVWLHFCQUFxQjs7Ozs7SUFzRTVCLDZDQUFrRDs7SUFDbEQsOENBQW9EOzs7OztJQUVwRCw2Q0FBK0M7O0lBQy9DLDhDQUF5RDs7SUFDekQsK0NBQXFDOztJQUNyQywwREFBZ0Q7O0lBQ2hELDBEQUFpRDs7SUFDakQsNERBQTREOztJQUM1RCw2REFBaUY7Ozs7O0lBZC9FLG9DQUF3Qjs7Ozs7SUFDeEIseUNBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBFTVBUWSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCByZXRyeSwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5zQ29udGVudFN0cmlwTXVsdGlwbGUgfSBmcm9tICcuLi9fbW9kZWxzL2NvbnRlbnQtc3RyaXAtbXVsdGlwbGUubW9kZWwnO1xuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vX21vZGVscy93aWRnZXQtY29udGVudC5tb2RlbCc7XG5pbXBvcnQgeyBOU1NlYXJjaCB9IGZyb20gJy4uL19tb2RlbHMvd2lkZ2V0LXNlYXJjaC5tb2RlbCc7XG4vLyB0c2xpbnQ6ZGlzYWJsZVxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyAgdmlld2VyUm91dGVHZW5lcmF0b3IgfSBmcm9tICcuL3ZpZXdlci1yb3V0ZS11dGlsJ1xuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xuY29uc3QgbW9tZW50ID0gbW9tZW50Xztcbi8vIHRzbGludDplbmFibGVcblxuLy8gVE9ETzogbW92ZSB0aGlzIGluIHNvbWUgY29tbW9uIHBsYWNlXG5jb25zdCBQUk9URUNURURfU0xBR19WOCA9ICcvYXBpcy9wcm90ZWN0ZWQvdjgnO1xuXG5jb25zdCBBUElfRU5EX1BPSU5UUyA9IHtcbiAgQ09OVEVOVDogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnRgLFxuICBBVVRIT1JJTkdfQ09OVEVOVDogYC9hcGkvY291cnNlL3YxL2hpZXJhcmNoeWAsXG4gIENPTlRFTlRfTElLRVM6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L2xpa2VDb3VudGAsXG4gIFNFVF9TM19DT09LSUU6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L3NldENvb2tpZWAsXG4gIFNFVF9TM19JTUFHRV9DT09LSUU6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L3NldEltYWdlQ29va2llYCxcbiAgRkVUQ0hfTUFOSUZFU1Q6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L2dldFdlYk1vZHVsZU1hbmlmZXN0YCxcbiAgRkVUQ0hfV0VCX01PRFVMRV9GSUxFUzogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvZ2V0V2ViTW9kdWxlRmlsZXNgLFxuICBNVUxUSVBMRV9DT05URU5UOiBgJHtQUk9URUNURURfU0xBR19WOH0vY29udGVudC9tdWx0aXBsZWAsXG4gIENPTlRFTlRfU0VBUkNIX1Y1OiBgJHtQUk9URUNURURfU0xBR19WOH0vY29udGVudC9zZWFyY2hWNWAsXG4gIENPTlRFTlRfU0VBUkNIX1Y2OiBgL2FwaXMvcHJveGllcy92OC9zdW5iaXJkaWdvdC9zZWFyY2hgLFxuICBUUkVORElOR19DT05URU5UX1NFQVJDSDogYGFwaXMvcHJveGllcy92OC90cmVuZGluZy9jb250ZW50L3NlYXJjaGAsXG4gIENPTlRFTlRfU0VBUkNIX1JFTEFURURfQ0JQX1Y2OiBgL2FwaXMvcHJveGllcy92OC9zdW5iaXJkaWdvdC9zZWFyY2hgLFxuICBDT05URU5UX1NFQVJDSF9SRUdJT05fUkVDT01NRU5EQVRJT046IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L3NlYXJjaFJlZ2lvblJlY29tbWVuZGF0aW9uYCxcbiAgQ09OVEVOVF9ISVNUT1JZOiBgJHtQUk9URUNURURfU0xBR19WOH0vdXNlci9oaXN0b3J5YCxcbiAgQ09OVEVOVF9ISVNUT1JZVjI6IGAvYXBpcy9wcm94aWVzL3Y4L3JlYWQvY29udGVudC1wcm9ncmVzYCxcbiAgQ09VUlNFX0JBVENIX0xJU1Q6IGAvYXBpcy9wcm94aWVzL3Y4L2xlYXJuZXIvY291cnNlL3YxL2JhdGNoL2xpc3RgLFxuICBDT1VSU0VfQkFUQ0g6IGAvYXBpcy9wcm94aWVzL3Y4L2NvdXJzZS92MS9iYXRjaC9yZWFkYCxcbiAgQVVUT19BU1NJR05fQkFUQ0g6IGAvYXBpcy9wcm90ZWN0ZWQvdjgvY29ob3J0cy91c2VyL2F1dG9lbnJvbGxtZW50L2AsXG4gIEFVVE9fQVNTSUdOX0NVUkFURURfQkFUQ0g6IGAvYXBpcy9wcm94aWVzL3Y4L2N1cmF0ZWRwcm9ncmFtL3YxL2Vucm9sYCxcbiAgQVVUT19BU1NJR05fT1BFTl9QUk9HUkFNOiBgL2FwaXMvcHJveGllcy92OC9vcGVucHJvZ3JhbS92MS9lbnJvbGAsXG4gIFVTRVJfQ09OVElOVUVfTEVBUk5JTkc6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS91c2VyL2hpc3RvcnkvY29udGludWVgLFxuICBDT05URU5UX1JBVElORzogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L3VzZXIvcmF0aW5nYCxcbiAgQ09MTEVDVElPTl9ISUVSQVJDSFk6ICh0eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvY29sbGVjdGlvbi8ke3R5cGV9LyR7aWR9YCxcbiAgUkVHSVNUUkFUSU9OX1NUQVRVUzogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2FkbWluL3VzZXJSZWdpc3RyYXRpb24vY2hlY2tVc2VyUmVnaXN0cmF0aW9uQ29udGVudGAsXG4gIE1BUktfQVNfQ09NUExFVEVfTUVUQTogKGNvbnRlbnRJZDogc3RyaW5nKSA9PiBgJHtQUk9URUNURURfU0xBR19WOH0vdXNlci9wcm9ncmVzcy8ke2NvbnRlbnRJZH1gLFxuICBFTlJPTExfQkFUQ0g6IGAvYXBpcy9wcm94aWVzL3Y4L2xlYXJuZXIvY291cnNlL3YxL2Vucm9sYCxcbiAgRU5ST0xMX0JBVENIX1dGOiBgL2FwaXMvcHJveGllcy92OC93b3JrZmxvdy9ibGVuZGVkcHJvZ3JhbS9lbnJvbGAsXG4gIFdJVEhEUkFXX0JBVENIX1dGOiBgL2FwaXMvcHJveGllcy92OC93b3JrZmxvdy9ibGVuZGVkcHJvZ3JhbS91bmVucm9sYCxcbiAgQkxFTkRFRF9VU0VSX1dGOiBgL2FwaXMvcHJveGllcy92OC93b3JrZmxvdy9ibGVuZGVkcHJvZ3JhbS91c2VyL3NlYXJjaGAsXG4gIEJMRU5ERURfVVNFUl9DT1VOVDogYGFwaXMvcHJveGllcy92OC93b3JrZmxvdy9ibGVuZGVkcHJvZ3JhbS9lbnJvbC9zdGF0dXMvY291bnRgLFxuICBDRVJUX0FERF9URU1QTEFURTogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvY291cnNlL2JhdGNoL2NlcnQvdGVtcGxhdGUvYWRkYCxcbiAgQ0VSVF9JU1NVRTogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvY291cnNlL2JhdGNoL2NlcnQvaXNzdWVgLFxuICBDRVJUX0RPV05MT0FEOiAoY2VydElkOiBhbnkpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzL2NvdXJzZS9iYXRjaC9jZXJ0L2Rvd25sb2FkLyR7Y2VydElkfWAsXG4gIFJFQURfS0FSTUFQT0lOVFM6IGAvYXBpcy9wcm94aWVzL3Y4L2thcm1hcG9pbnRzL3JlYWRgLFxuICBDT05URU5UX1JFQUQ6IChjb250ZW50SWQ6IGFueSkgPT4gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gLFxuICBSRUFEX0NPVVJTRV9LQVJNQVBPSU5UUzogJy9hcGlzL3Byb3hpZXMvdjgva2FybWFwb2ludHMvdXNlci9jb3Vyc2UvcmVhZCcsXG4gIENMQUlNX0tBUk1BUE9JTlRTOiAnL2FwaXMvcHJveGllcy92OC9jbGFpbWthcm1hcG9pbnRzJyxcbiAgVVNFUl9LQVJNQV9QT0lOVFM6ICcvYXBpcy9wcm94aWVzL3Y4L3VzZXIvdG90YWxrYXJtYXBvaW50cycsXG4gIEFHR1JFR0FUSU9OX1NFQVJDSDogJy9hcGlzL3Byb3hpZXMvdjgvY29udGVudC9hZ2dyZWdhdGlvbi9zZWFyY2gnLFxuICBGRUFUVVJFX1NFQVJDSDogJy9hcGlzL3Byb3hpZXMvdjgvZmVhdHVyZWQvY29udGVudC9zZWFyY2gnLFxufTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldENvbnRlbnRTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICkge1xuICB9XG5cbiAgdG9jQ29uZmlnRGF0YTogYW55ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcbiAgdG9jQ29uZmlnRGF0YSQgID0gdGhpcy50b2NDb25maWdEYXRhLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgdGVsZW1ldHJ5RGF0YTogYW55ID0gbmV3IFN1YmplY3Q8YW55PigpXG4gIHB1YmxpYyB0ZWxlbWV0cnlEYXRhJCA9IHRoaXMudGVsZW1ldHJ5RGF0YS5hc09ic2VydmFibGUoKVxuICBjdXJyZW50TWV0YURhdGEhOiBOc0NvbnRlbnQuSUNvbnRlbnQ7XG4gIGN1cnJlbnRDb250ZW50UmVhZE1ldGFEYXRhITogTnNDb250ZW50LklDb250ZW50O1xuICBjdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCE6IE5zQ29udGVudC5JQ291cnNlW107XG4gIHByb2dyYW1DaGlsZENvdXJzZVJlc3VtZURhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuICBwcm9ncmFtQ2hpbGRDb3Vyc2VSZXN1bWVEYXRhJCA9IHRoaXMucHJvZ3JhbUNoaWxkQ291cnNlUmVzdW1lRGF0YS5hc09ic2VydmFibGUoKTtcblxuICBjaGFuZ2VUZWxlbWV0cnlEYXRhKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMudGVsZW1ldHJ5RGF0YS5uZXh0KG1lc3NhZ2UpO1xuICB9XG4gIGlzUmVzb3VyY2UocHJpbWFyeUNhdGVnb3J5OiBzdHJpbmcpIHtcbiAgICBpZiAocHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICBjb25zdCBpc1Jlc291cmNlID0gKHByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVSZXNvdXJjZVByaW1hcnlDYXRlZ29yaWVzLkxFQVJOSU5HX1JFU09VUkNFKSB8fFxuICAgICAgICAocHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVJlc291cmNlUHJpbWFyeUNhdGVnb3JpZXMuUFJBQ1RJQ0VfUkVTT1VSQ0UpIHx8XG4gICAgICAgIChwcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUmVzb3VyY2VQcmltYXJ5Q2F0ZWdvcmllcy5GSU5BTF9BU1NFU1NNRU5UKSB8fFxuICAgICAgICAocHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVJlc291cmNlUHJpbWFyeUNhdGVnb3JpZXMuQ09NUF9BU1NFU1NNRU5UKSB8fFxuICAgICAgICAocHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVJlc291cmNlUHJpbWFyeUNhdGVnb3JpZXMuT0ZGTElORV9TRVNTSU9OKTtcbiAgICAgIHJldHVybiBpc1Jlc291cmNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmZXRjaE1hcmtBc0NvbXBsZXRlTWV0YShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIGNvbnN0IHVybCA9IEFQSV9FTkRfUE9JTlRTLk1BUktfQVNfQ09NUExFVEVfTUVUQShpZGVudGlmaWVyKVxuICAgIC8vIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCkudG9Qcm9taXNlKClcbiAgICBpZiAodXJsKSB7IH1cbiAgICByZXR1cm4gb2YoKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHVwZGF0ZVRvY0NvbmZpZyhkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnRvY0NvbmZpZ0RhdGEubmV4dChkYXRhKTtcbiAgfVxuXG4gIGZldGNoQ29udGVudChcbiAgICBjb250ZW50SWQ6IHN0cmluZyxcbiAgICBoaWVyYXJjaHlUeXBlOiAnYWxsJyB8ICdtaW5pbWFsJyB8ICdkZXRhaWwnID0gJ2RldGFpbCcsXG4gICAgX2FkZGl0aW9uYWxGaWVsZHM6IHN0cmluZ1tdID0gW10sXG4gICAgcHJpbWFyeUNhdGVnb3J5Pzogc3RyaW5nIHwgbnVsbCxcbiAgKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnQ+IHtcbiAgICAvLyBjb25zdCB1cmwgPSBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UfS8ke2NvbnRlbnRJZH0/aGllcmFyY2h5VHlwZT0ke2hpZXJhcmNoeVR5cGV9YFxuICAgIGxldCB1cmwgPSAnJztcbiAgICBjb25zdCBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKTtcbiAgICBpZiAocHJpbWFyeUNhdGVnb3J5ICYmIHRoaXMuaXNSZXNvdXJjZShwcmltYXJ5Q2F0ZWdvcnkpKSB7XG4gICAgICBpZiAoIWZvclByZXZpZXcpIHtcbiAgICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gYC9hcGkvY29udGVudC92MS9yZWFkLyR7Y29udGVudElkfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZm9yUHJldmlldykge1xuICAgICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9oaWVyYXJjaHkvJHtjb250ZW50SWR9P2hpZXJhcmNoeVR5cGU9JHtoaWVyYXJjaHlUeXBlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3JjcmVhdG9yID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2VkaXRNb2RlPXRydWUnKTtcbiAgICAgICAgaWYgKGZvcmNyZWF0b3IpIHtcbiAgICAgICAgICB1cmwgPSBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/bW9kZT1lZGl0YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmwgPSBgL2FwaS9jb3Vyc2UvdjEvaGllcmFyY2h5LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPSR7aGllcmFyY2h5VHlwZX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJldHVybiB0aGlzLmh0dHBcbiAgICAvLyAgIC5wb3N0PE5zQ29udGVudC5JQ29udGVudD4odXJsLCB7IGFkZGl0aW9uYWxGaWVsZHMgfSlcbiAgICAvLyAgIC5waXBlKHJldHJ5KDEpKVxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8TnNDb250ZW50LklDb250ZW50Pih1cmwpXG4gICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgLy8gaWYgKGFwaURhdGEgJiYgYXBpRGF0YS5yZXN1bHQpIHtcbiAgICAvLyAgIHJldHVybiBhcGlEYXRhLnJlc3VsdC5jb250ZW50XG4gICAgLy8gfVxuICB9XG4gIGZldGNoQXV0aG9yaW5nQ29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XG4gICAgY29uc3QgZm9yY3JlYXRvciA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdlZGl0TW9kZT10cnVlJyk7XG4gICAgbGV0IHVybCA9ICcnO1xuICAgIGlmIChmb3JjcmVhdG9yKSB7XG4gICAgICB1cmwgPSBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/bW9kZT1lZGl0YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsID0gYCR7QVBJX0VORF9QT0lOVFMuQVVUSE9SSU5HX0NPTlRFTlR9LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPWRldGFpbGA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4odXJsKS5waXBlKHNoYXJlUmVwbGF5KDEpLCByID0+IHIpO1xuICB9XG4gIGZldGNoTXVsdGlwbGVDb250ZW50KGlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50W10+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuTVVMVElQTEVfQ09OVEVOVH0vJHtpZHMuam9pbignLCcpfWAsXG4gICAgKTtcbiAgfVxuICBmZXRjaENvbGxlY3Rpb25IaWVyYXJjaHkodHlwZTogc3RyaW5nLCBpZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIgPSAwLCBwYWdlU2l6ZTogbnVtYmVyID0gMSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29sbGVjdGlvbkhpZXJhcmNoeVJlc3BvbnNlPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTExFQ1RJT05fSElFUkFSQ0hZKFxuICAgICAgICB0eXBlLFxuICAgICAgICBpZCxcbiAgICAgICl9P3BhZ2VOdW1iZXI9JHtwYWdlTnVtYmVyfSZwYWdlU2l6ZT0ke3BhZ2VTaXplfWAsXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoQmxlbmRlZENvdXJzZSgpIHtcblxuICB9XG5cbiAgZmV0Y2hDb3Vyc2VCYXRjaGVzKHJlcTogYW55KTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8TnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZT4oQVBJX0VORF9QT0lOVFMuQ09VUlNFX0JBVENIX0xJU1QsIHJlcSlcbiAgICAgIC5waXBlKFxuICAgICAgICByZXRyeSgxKSxcbiAgICAgICAgbWFwKFxuICAgICAgICAgIChkYXRhOiBhbnkpID0+IGRhdGEucmVzdWx0LnJlc3BvbnNlXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICAvLyBmZXRjaCBpbmRpdmlkdWFsIGJhdGNoXG4gIGZldGNoQ291cnNlQmF0Y2goYmF0Y2hJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT1VSU0VfQkFUQ0h9LyR7YmF0Y2hJZH1gLFxuICAgICk7XG4gIH1cblxuICBhdXRvQXNzaWduQmF0Y2hBcGkoaWRlbnRpZmllcjogYW55KTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZT4oYCR7QVBJX0VORF9QT0lOVFMuQVVUT19BU1NJR05fQkFUQ0h9JHtpZGVudGlmaWVyfWApXG4gICAgICAucGlwZShcbiAgICAgICAgcmV0cnkoMSksXG4gICAgICAgIG1hcChcbiAgICAgICAgICAoZGF0YTogYW55KSA9PiBkYXRhLnJlc3VsdC5yZXNwb25zZVxuICAgICAgICApXG4gICAgICApO1xuICB9XG5cbiAgYXV0b0Fzc2lnbkN1cmF0ZWRCYXRjaEFwaShyZXF1ZXN0OiBhbnksIHByb2dyYW1UeXBlOiBhbnkpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBwcm9ncmFtVHlwZSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTSA/XG4gICAgQVBJX0VORF9QT0lOVFMuQVVUT19BU1NJR05fT1BFTl9QUk9HUkFNIDogQVBJX0VORF9QT0lOVFMuQVVUT19BU1NJR05fQ1VSQVRFRF9CQVRDSDtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZT4oYCR7dXJsfWAsIHJlcXVlc3QpXG4gICAgICAucGlwZShcbiAgICAgICAgcmV0cnkoMSksXG4gICAgICAgIG1hcChcbiAgICAgICAgICAoZGF0YTogYW55KSA9PiBkYXRhLnJlc3VsdC5yZXNwb25zZVxuICAgICAgICApXG4gICAgICApO1xuICB9XG5cbiAgZW5yb2xsVXNlclRvQmF0Y2gocmVxOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChBUElfRU5EX1BPSU5UUy5FTlJPTExfQkFUQ0gsIHJlcSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGVucm9sbEFuZFVuZW5yb2xsVXNlclRvQmF0Y2hXRihyZXE6IGFueSwgdHlwZTogYW55KSB7XG4gICAgY29uc3QgdXJsOiBhbnkgPSB0eXBlID09PSAnV0lUSERSQVcnID8gQVBJX0VORF9QT0lOVFMuV0lUSERSQVdfQkFUQ0hfV0YgOiBBUElfRU5EX1BPSU5UUy5FTlJPTExfQkFUQ0hfV0Y7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QodXJsLCByZXEpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBmZXRjaEJsZW5kZWRVc2VyV0YocmVxOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChBUElfRU5EX1BPSU5UUy5CTEVOREVEX1VTRVJfV0YsIHJlcSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGZldGNoQmxlbmRlZFVzZXJDT1VOVChyZXE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KEFQSV9FTkRfUE9JTlRTLkJMRU5ERURfVVNFUl9DT1VOVCwgcmVxKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgZmV0Y2hDb250ZW50TGlrZXMoY29udGVudElkczogeyBjb250ZW50X2lkOiBzdHJpbmdbXSB9KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8eyBbaWRlbnRpZmllcjogc3RyaW5nXTogbnVtYmVyIH0+KEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTElLRVMsIGNvbnRlbnRJZHMpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cbiAgZmV0Y2hDb250ZW50UmF0aW5ncyhjb250ZW50SWRzOiB7IGNvbnRlbnRJZHM6IHN0cmluZ1tdIH0pIHtcbiAgICBpZiAoY29udGVudElkcykgeyB9XG4gICAgLy8gcmV0dXJuIHRoaXMuaHR0cFxuICAgIC8vICAgLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9SQVRJTkd9L3JhdGluZ2AsIGNvbnRlbnRJZHMpXG4gICAgLy8gICAudG9Qcm9taXNlKClcbiAgICByZXR1cm4gb2YoKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGZldGNoQ29udGVudEhpc3RvcnkoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfSElTVE9SWX0vJHtjb250ZW50SWR9YCxcbiAgICApO1xuICB9XG5cbiAgZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YVJlcSk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YT4ge1xuICAgIHJlcS5yZXF1ZXN0LmZpZWxkcyA9IFsncHJvZ3Jlc3NkZXRhaWxzJ107XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuaHR0cC5wb3N0PE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGE+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ISVNUT1JZVjJ9LyR7cmVxLnJlcXVlc3QuY291cnNlSWR9YCwgcmVxXG4gICAgKTtcbiAgICBkYXRhLnN1YnNjcmliZSgoc3Vic2NyaWJlRGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9ncmFtQ2hpbGRDb3Vyc2VSZXN1bWVEYXRhLm5leHQoeyByZXN1bWVEYXRhOiBzdWJzY3JpYmVEYXRhLnJlc3VsdC5jb250ZW50TGlzdCwgY291cnNlSWQ6IHJlcS5yZXF1ZXN0LmNvdXJzZUlkIH0pO1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGNvbnRpbnVlTGVhcm5pbmcoaWQ6IHN0cmluZywgY29sbGVjdGlvbklkPzogc3RyaW5nLCBjb2xsZWN0aW9uVHlwZT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgaWYgKGNvbGxlY3Rpb25UeXBlICYmXG4gICAgICAgIGNvbGxlY3Rpb25UeXBlLnRvTG93ZXJDYXNlKCkgPT09ICdwbGF5bGlzdCcpIHtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IHtcbiAgICAgICAgICBjb250ZXh0UGF0aElkOiBjb2xsZWN0aW9uSWQgPyBjb2xsZWN0aW9uSWQgOiBpZCxcbiAgICAgICAgICByZXNvdXJjZUlkOiBpZCxcbiAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBjb250ZXh0RnVsbFBhdGg6IFtjb2xsZWN0aW9uSWQsIGlkXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkYXRlQWNjZXNzZWQ6IERhdGUubm93KCksXG4gICAgICAgICAgY29udGV4dFR5cGU6ICdwbGF5bGlzdCcsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUNvbnRpbnVlTGVhcm5pbmcocmVxQm9keSkudG9Qcm9taXNlKCkuY2F0Y2goKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXFCb2R5ID0ge1xuICAgICAgICAgIGNvbnRleHRQYXRoSWQ6IGNvbGxlY3Rpb25JZCA/IGNvbGxlY3Rpb25JZCA6IGlkLFxuICAgICAgICAgIHJlc291cmNlSWQ6IGlkLFxuICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pLFxuICAgICAgICAgIGRhdGVBY2Nlc3NlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQ29udGludWVMZWFybmluZyhyZXFCb2R5KS50b1Byb21pc2UoKS5jYXRjaCgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNhdmVDb250aW51ZUxlYXJuaW5nKGNvbnRlbnQ6IE5zQ29udGVudC5JVmlld2VyQ29udGludWVMZWFybmluZ1JlcXVlc3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIGNvbnN0IHVybCA9IEFQSV9FTkRfUE9JTlRTLlVTRVJfQ09OVElOVUVfTEVBUk5JTkdcbiAgICAvLyByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih1cmwsIGNvbnRlbnQpXG4gICAgaWYgKGNvbnRlbnQpIHtcblxuICAgIH1cbiAgICByZXR1cm4gb2YoKSBhcyBhbnk7XG4gIH1cblxuICBzZXRTM0Nvb2tpZShcbiAgICBfY29udGVudElkOiBzdHJpbmcsXG4gICAgLy8gX3BhdGg6IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyByZXR1cm4gdGhpcy5odHRwXG4gICAgLy8gICAucG9zdChBUElfRU5EX1BPSU5UUy5TRVRfUzNfQ09PS0lFLCB7IGNvbnRlbnRJZCB9KVxuICAgIC8vICAgLnBpcGUoY2F0Y2hFcnJvcihfZXJyID0+IG9mKHRydWUpKSlcblxuICAgIHJldHVybiBFTVBUWTtcbiAgfVxuXG4gIHNldFMzSW1hZ2VDb29raWUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuU0VUX1MzX0lNQUdFX0NPT0tJRSwge30pLnBpcGUoY2F0Y2hFcnJvcihfZXJyID0+IG9mKHRydWUpKSk7XG4gIH1cblxuICBmZXRjaE1hbmlmZXN0KHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuRkVUQ0hfTUFOSUZFU1QsIHsgdXJsIH0pO1xuICB9XG4gIGZldGNoV2ViTW9kdWxlQ29udGVudCh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7QVBJX0VORF9QT0lOVFMuRkVUQ0hfV0VCX01PRFVMRV9GSUxFU30/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YCk7XG4gIH1cbiAgc2VhcmNoKHJlcTogTlNTZWFyY2guSVNlYXJjaFJlcXVlc3QpOiBPYnNlcnZhYmxlPE5TU2VhcmNoLklTZWFyY2hBcGlSZXN1bHQ+IHtcbiAgICByZXEucXVlcnkgPSByZXEucXVlcnkgfHwgJyc7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE5TU2VhcmNoLklTZWFyY2hBcGlSZXN1bHQ+KEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfU0VBUkNIX1Y1LCB7XG4gICAgICByZXF1ZXN0OiByZXEsXG4gICAgfSk7XG4gIH1cbiAgc2VhcmNoUmVnaW9uUmVjb21tZW5kYXRpb24oXG4gICAgcmVxOiBOU1NlYXJjaC5JU2VhcmNoT3JnUmVnaW9uUmVjb21tZW5kYXRpb25SZXF1ZXN0LFxuICApOiBPYnNlcnZhYmxlPE5zQ29udGVudFN0cmlwTXVsdGlwbGUuSUNvbnRlbnRTdHJpcFJlc3BvbnNlQXBpPiB7XG4gICAgcmVxLnF1ZXJ5ID0gcmVxLnF1ZXJ5IHx8ICcnO1xuICAgIHJlcS5wcmVMYWJlbFZhbHVlID1cbiAgICAgIChyZXEucHJlTGFiZWxWYWx1ZSB8fCAnJykgK1xuICAgICAgKCh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5jb3VudHJ5KSB8fCAnJyk7XG4gICAgcmVxLmZpbHRlcnMgPSB7XG4gICAgICAuLi5yZXEuZmlsdGVycyxcbiAgICAgIGxhYmVsczogW3JlcS5wcmVMYWJlbFZhbHVlIHx8ICcnXSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxOc0NvbnRlbnRTdHJpcE11bHRpcGxlLklDb250ZW50U3RyaXBSZXNwb25zZUFwaT4oXG4gICAgICBBUElfRU5EX1BPSU5UUy5DT05URU5UX1NFQVJDSF9SRUdJT05fUkVDT01NRU5EQVRJT04sXG4gICAgICB7IHJlcXVlc3Q6IHJlcSB9LFxuICAgICk7XG4gIH1cbiAgc2VhcmNoVjYocmVxOiBOU1NlYXJjaC5JU2VhcmNoVjZSZXF1ZXN0KTogT2JzZXJ2YWJsZTxOU1NlYXJjaC5JU2VhcmNoVjZBcGlSZXN1bHRWMj4ge1xuICAgIGNvbnN0IGFwaVBhdGggPSBfLmdldChyZXEsICdhcGkucGF0aCcpO1xuICAgIHJlcS5xdWVyeSA9IHJlcS5xdWVyeSB8fCAnJztcbiAgICBpZiAoYXBpUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TlNTZWFyY2guSVNlYXJjaFY2QXBpUmVzdWx0VjI+KGFwaVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TlNTZWFyY2guSVNlYXJjaFY2QXBpUmVzdWx0VjI+KEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfU0VBUkNIX1Y2LCByZXEpO1xuICB9XG5cbiAgc2VhcmNoUmVsYXRlZENCUFY2KHJlcTogTlNTZWFyY2guSVNlYXJjaFY2UmVxdWVzdFYyKTogT2JzZXJ2YWJsZTxOU1NlYXJjaC5JU2VhcmNoVjZBcGlSZXN1bHRWMj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxOU1NlYXJjaC5JU2VhcmNoVjZBcGlSZXN1bHRWMj4oQVBJX0VORF9QT0lOVFMuQ09OVEVOVF9TRUFSQ0hfUkVMQVRFRF9DQlBfVjYsIHJlcSk7XG4gIH1cblxuICBmZXRjaENvbnRlbnRSYXRpbmcoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgcmF0aW5nOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmF0aW5nOiBudW1iZXIgfT4oYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9SQVRJTkd9LyR7Y29udGVudElkfWApO1xuICB9XG4gIGRlbGV0ZUNvbnRlbnRSYXRpbmcoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfUkFUSU5HfS8ke2NvbnRlbnRJZH1gKTtcbiAgfVxuICBhZGRDb250ZW50UmF0aW5nKGNvbnRlbnRJZDogc3RyaW5nLCBkYXRhOiB7IHJhdGluZzogbnVtYmVyIH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfUkFUSU5HfS8ke2NvbnRlbnRJZH1gLCBkYXRhKTtcbiAgfVxuXG4gIGdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQpOiBOc0NvbnRlbnQuSUNvbnRlbnQge1xuICAgIGlmICghKGNvbnRlbnQuY2hpbGRyZW4gfHwgW10pLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJlxuICAgICAgICAhKGNvbnRlbnQuYXJ0aWZhY3RVcmwgJiYgY29udGVudC5hcnRpZmFjdFVybC5sZW5ndGgpKSB8fFxuICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCB8fFxuICAgICAgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgICAgIShjb250ZW50LmFydGlmYWN0VXJsICYmIGNvbnRlbnQuYXJ0aWZhY3RVcmwubGVuZ3RoKSkgfHxcbiAgICAgIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFICYmXG4gICAgICAgICEoY29udGVudC5hcnRpZmFjdFVybCAmJiBjb250ZW50LmFydGlmYWN0VXJsLmxlbmd0aCkpXG4gICAgKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNvbnRlbnQuY2hpbGRyZW5bMF07XG4gICAgICByZXR1cm4gdGhpcy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkoY2hpbGQpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UgfHxcbiAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5LTk9XTEVER0VfQVJUSUZBQ1QgfHxcbiAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUk9HUkFNIHx8XG4gICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0UgfHxcbiAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNIHx8XG4gICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IGNvbnRlbnQuY2hpbGRyZW5bMF07XG4gICAgY29uc3QgcmVzdWx0Q29udGVudCA9IHRoaXMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGZpcnN0Q2hpbGQpO1xuICAgIHJldHVybiByZXN1bHRDb250ZW50O1xuICB9XG5cbiAgZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTx7IGhhc0FjY2VzczogYm9vbGVhbjsgcmVnaXN0cmF0aW9uVXJsPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLlJFR0lTVFJBVElPTl9TVEFUVVN9LyR7c291cmNlfWApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgZmV0Y2hDb25maWcodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVybCk7XG4gIH1cblxuICBhZGRDZXJ0VGVtcGxhdGUoYm9keTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLkNFUlRfQUREX1RFTVBMQVRFfWAsIGJvZHkpO1xuICB9XG5cbiAgaXNzdWVDZXJ0KGJvZHk6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLkNFUlRfSVNTVUV9YCwgYm9keSk7XG4gIH1cbiAgZG93bmxvYWRDZXJ0KGNlcnRJZDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHtBUElfRU5EX1BPSU5UUy5DRVJUX0RPV05MT0FEKGNlcnRJZCl9YCk7XG4gIH1cblxuICB0cmVuZGluZ0NvbnRlbnRTZWFyY2gocmVxOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJlcS5xdWVyeSA9IHJlcS5xdWVyeSB8fCAnJztcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihBUElfRU5EX1BPSU5UUy5UUkVORElOR19DT05URU5UX1NFQVJDSCwgcmVxKTtcbiAgfVxuXG4gIGdldEthcm1hUG9pdG5zKGxpbWl0OiBudW1iZXIsIG9mZnNldDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLlJFQURfS0FSTUFQT0lOVFMsIHsgbGltaXQsIG9mZnNldCB9KS5waXBlKGNhdGNoRXJyb3IoX2VyciA9PiBvZih0cnVlKSkpO1xuICB9XG4gIGZldGNoUHJvZ3JhbUNvbnRlbnQoY29udGVudElkOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50W10+IHtcbiAgICBsZXQgdXJsID0gJyc7XG4gICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJyk7XG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRbXT4oXG4gICAgICAgIEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfUkVBRChjb250ZW50SWQpLFxuICAgICAgKTtcbiAgICB9XG4gICAgdXJsID0gYC9hcGkvY29udGVudC92MS9yZWFkLyR7Y29udGVudElkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50W10+KHVybCk7XG4gICAgLy8gcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50W10+KEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfUkVBRChjb250ZW50SWQpKVxuICB9XG5cbiAgZ2V0Q291cnNlS2FybWFQb2ludHMocmVxdWVzdDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oQVBJX0VORF9QT0lOVFMuUkVBRF9DT1VSU0VfS0FSTUFQT0lOVFMsIHJlcXVlc3QpO1xuICB9XG5cbiAgY2xhaW1LYXJtYXBvaW50cyhyZXF1ZXN0OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihBUElfRU5EX1BPSU5UUy5DTEFJTV9LQVJNQVBPSU5UUywgcmVxdWVzdCk7XG4gIH1cblxuICB1c2VyS2FybWFQb2ludHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oQVBJX0VORF9QT0lOVFMuVVNFUl9LQVJNQV9QT0lOVFMsIHt9KTtcbiAgfVxuXG4gIGdldEVucm9sbGVkRGF0YShkb0lkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbnJvbGxtZW50TWFwRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Vucm9sbG1lbnRNYXBEYXRhJykgfHwgJ3t9Jyk7XG4gICAgY29uc3QgZW5yb2xsZWRDb3Vyc2VEYXRhID0gZW5yb2xsbWVudE1hcERhdGFbZG9JZF07XG4gICAgcmV0dXJuIGVucm9sbGVkQ291cnNlRGF0YTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cnNlTGluayhjb250ZW50OiBhbnkpIHtcbiAgICBjb25zdCBlbnJvbGxlZENvdXJzZURhdGE6IGFueSA9IHRoaXMuZ2V0RW5yb2xsZWREYXRhKGNvbnRlbnQuaWRlbnRpZmllcik7XG4gICAgaWYgKGVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgaWYgKGVucm9sbGVkQ291cnNlRGF0YS5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gfHxcbiAgICAgICAgZW5yb2xsZWRDb3Vyc2VEYXRhLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09ICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LklOVklURV9PTkxZX1BST0dSQU0gfHxcbiAgICAgICAgZW5yb2xsZWRDb3Vyc2VEYXRhLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09ICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNIHx8XG4gICAgICAgIGVucm9sbGVkQ291cnNlRGF0YS5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gIE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSB8fFxuICAgICAgICBlbnJvbGxlZENvdXJzZURhdGEuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUk9HUkFNKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQmF0Y2hJblByb2dyZXNzKGVucm9sbGVkQ291cnNlRGF0YS5iYXRjaCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdvdG9Ub2NQYWdlKGNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkYXRhID0gIGF3YWl0IHRoaXMuY2hlY2tGb3JEYXRhVG9Gb3JtVXJsKGNvbnRlbnQsIGVucm9sbGVkQ291cnNlRGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9ICB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAgYXdhaXQgdGhpcy5jaGVja0ZvckRhdGFUb0Zvcm1VcmwoY29udGVudCwgZW5yb2xsZWRDb3Vyc2VEYXRhKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ290b1RvY1BhZ2UoY29udGVudCk7XG5cbiAgfVxuICBhc3luYyBjaGVja0ZvckRhdGFUb0Zvcm1VcmwoY29udGVudDogYW55LCBlbnJvbGxEYXRhOiBhbnkpIHtcbiAgICBsZXQgdXJsRGF0YTogYW55O1xuICAgIGlmIChlbnJvbGxEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlICA9PT0gMTAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5nb3RvVG9jUGFnZShlbnJvbGxEYXRhKTtcbiAgICB9XG4gICAgaWYgKGVucm9sbERhdGEubHJjUHJvZ3Jlc3NEZXRhaWxzICYmIGVucm9sbERhdGEubHJjUHJvZ3Jlc3NEZXRhaWxzLm1pbWVUeXBlKSB7XG4gICAgICBjb25zdCBtb2RpZnlFbnJvbGxEYXRhICA9IHtcbiAgICAgICAgLi4uZW5yb2xsRGF0YSxcbiAgICAgICAgaWRlbnRpZmllcjogZW5yb2xsRGF0YS5jb2xsZWN0aW9uSWQsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogZW5yb2xsRGF0YS5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgbmFtZTogZW5yb2xsRGF0YS5jb250ZW50Lm5hbWUsXG4gICAgICB9O1xuICAgICAgaWYgKG1vZGlmeUVucm9sbERhdGEubGFzdFJlYWRDb250ZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3Vyc2VEYXRhV2l0aERhdGEobW9kaWZ5RW5yb2xsRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5yb2xsRGF0YS5sYXN0UmVhZENvbnRlbnRJZCwgZW5yb2xsRGF0YS5scmNQcm9ncmVzc0RldGFpbHMubWltZVR5cGUpO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmeUVucm9sbERhdGEuZmlyc3RDaGlsZElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc291cnNlRGF0YVdpdGhEYXRhKG1vZGlmeUVucm9sbERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucm9sbERhdGEuZmlyc3RDaGlsZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxEYXRhLmxyY1Byb2dyZXNzRGV0YWlscy5taW1lVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnJvbGxEYXRhLmZpcnN0Q2hpbGRJZCB8fCBlbnJvbGxEYXRhLmxhc3RSZWFkQ29udGVudElkKSB7XG4gICAgICAgIGNvbnN0IGRvSWQgPSBlbnJvbGxEYXRhLmZpcnN0Q2hpbGRJZCB8fCBlbnJvbGxEYXRhLmxhc3RSZWFkQ29udGVudElkO1xuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmZldGNoUHJvZ3JhbUNvbnRlbnQoZG9JZCkudG9Qcm9taXNlKCkudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5jb250ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGF0YTogYW55ID0gcmVzLnJlc3VsdC5jb250ZW50O1xuICAgICAgICAgICAgY29uc3QgbW9kaWZ5RW5yb2xsRGF0YSAgPSB7XG4gICAgICAgICAgICAgIC4uLmVucm9sbERhdGEsXG4gICAgICAgICAgICAgIGlkZW50aWZpZXI6IGVucm9sbERhdGEuY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGVucm9sbERhdGEuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIG5hbWU6IGVucm9sbERhdGEuY29udGVudC5uYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHVybERhdGEgPSAgdGhpcy5nZXRSZXNvdXJzZURhdGFXaXRoRGF0YShtb2RpZnlFbnJvbGxEYXRhLCBjb250ZW50RGF0YS5pZGVudGlmaWVyLCBjb250ZW50RGF0YS5taW1lVHlwZSk7XG4gICAgICAgICAgICBpZiAodXJsRGF0YSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXJsRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VEYXRhID8gcmVzcG9uc2VEYXRhIDogdGhpcy5nb3RvVG9jUGFnZShjb250ZW50KTtcbiAgICAgIH1cbiAgICByZXR1cm4gdGhpcy5nb3RvVG9jUGFnZShjb250ZW50KTtcblxuICB9XG5cbiAgZ2V0UmVzb3Vyc2VEYXRhV2l0aERhdGEoY29udGVudDogYW55LCByZXNvdXJzZUlkOiBhbnksIG1pbWVUeXBlOiBhbnkpIHtcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgdXJsID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIHJlc291cnNlSWQsXG4gICAgICAgIG1pbWVUeXBlLFxuICAgICAgICBjb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICdDb3Vyc2UnLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ0xlYXJuaW5nIFJlc291cmNlJyxcbiAgICAgICAgY29udGVudC5iYXRjaElkLFxuICAgICAgICBjb250ZW50Lm5hbWUsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ290b1RvY1BhZ2UoY29udGVudCk7XG4gIH1cbiAgZ290b1RvY1BhZ2UoY29udGVudDogYW55KSB7XG4gICAgY29uc3QgdXJsRGF0YTogYW55ID0ge1xuICAgICAgdXJsOiBgL2FwcC90b2MvJHtjb250ZW50LmlkZW50aWZpZXIgPyBjb250ZW50LmlkZW50aWZpZXIgOiBjb250ZW50LmNvbGxlY3Rpb25JZH0vb3ZlcnZpZXdgLFxuICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogY29udGVudC5iYXRjaElkIH0sXG4gICAgfTtcbiAgICBpZiAoY29udGVudC5lbmREYXRlKSB7XG4gICAgICB1cmxEYXRhLnF1ZXJ5UGFyYW1zID0geyAuLi51cmxEYXRhLnF1ZXJ5UGFyYW1zLCBwbGFuVHlwZTogJ2NiUGxhbicsIGVuZERhdGU6IGNvbnRlbnQuZW5kRGF0ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gdXJsRGF0YTtcbiAgfVxuICBpc0JhdGNoSW5Qcm9ncmVzcyhiYXRjaERhdGE6IGFueSkge1xuICAgIC8vIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50WydiYXRjaGVzJ10pIHtcbiAgICAvLyBjb25zdCBiYXRjaGVzID0gdGhpcy5jb250ZW50WydiYXRjaGVzJ10gYXMgTnNDb250ZW50LklCYXRjaFxuICAgIGlmIChiYXRjaERhdGEgJiYgYmF0Y2hEYXRhLmVuZERhdGUpIHtcbiAgICAgIGNvbnN0IG5vdyA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGJhdGNoRGF0YS5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgY29uc3QgZW5kRGF0ZSA9IGJhdGNoRGF0YS5lbmREYXRlID8gbW9tZW50KGJhdGNoRGF0YS5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG5vdztcbiAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAvLyBiYXRjaC5zdGF0dXMgJiZcbiAgICAgICAgICAgIG1vbWVudChzdGFydERhdGUpLmlzU2FtZU9yQmVmb3JlKG5vdylcbiAgICAgICAgICAgICYmIG1vbWVudChlbmREYXRlKS5pc1NhbWVPckFmdGVyKG5vdylcbiAgICAgICAgICApO1xuICAgIH0gcmV0dXJuIHRydWU7XG4gIH1cbiAgcG9zdEFwaU1ldGhvZChhcGlVcmw6IGFueSwgcmVxOiBhbnkpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxOc0NvbnRlbnQuSUNvbnRlbnQ+KGFwaVVybCwgcmVxKTtcbiAgfVxuICBnZXRBcGlNZXRob2QoYXBpVXJsOiBhbnkpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudD4ge1xuICAgIC8vIHJlcS5xdWVyeSA9IHJlcS5xdWVyeSB8fCAnJztcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnQ+KGFwaVVybCk7XG4gIH1cbn1cbiJdfQ==