@sunbird-cb/utils-v2 0.0.0-watch
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/components/image-crop/image-crop.component.mjs +172 -0
- package/esm2022/lib/components/image-crop/image-crop.module.mjs +55 -0
- package/esm2022/lib/constants/features.enum.mjs +555 -0
- package/esm2022/lib/constants/instances.enum.mjs +5 -0
- package/esm2022/lib/constants/misc.constants.mjs +2 -0
- package/esm2022/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.mjs +87 -0
- package/esm2022/lib/directives/class-change-on-scroll/class-change-on-scroll.module.mjs +20 -0
- package/esm2022/lib/directives/default-thumbnail/default-thumbnail.directive.mjs +40 -0
- package/esm2022/lib/directives/default-thumbnail/default-thumbnail.module.mjs +20 -0
- package/esm2022/lib/directives/image-responsive/image-responsive.directive.mjs +86 -0
- package/esm2022/lib/directives/image-responsive/image-responsive.module.mjs +20 -0
- package/esm2022/lib/directives/in-view-port/in-view-port.directive.mjs +62 -0
- package/esm2022/lib/directives/in-view-port/in-view-port.module.mjs +20 -0
- package/esm2022/lib/directives/navigation/navigation.directive.mjs +43 -0
- package/esm2022/lib/directives/navigation/navigation.module.mjs +20 -0
- package/esm2022/lib/directives/permission/permission.directive.mjs +14 -0
- package/esm2022/lib/directives/permission/permission.module.mjs +20 -0
- package/esm2022/lib/helpers/functions/getStringifiedQueryParams.mjs +9 -0
- package/esm2022/lib/helpers/horizontal-scroller/horizontal-scroller.component.mjs +96 -0
- package/esm2022/lib/helpers/horizontal-scroller/horizontal-scroller.module.mjs +32 -0
- package/esm2022/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.mjs +186 -0
- package/esm2022/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.mjs +32 -0
- package/esm2022/lib/helpers/logout/logout.component.mjs +78 -0
- package/esm2022/lib/helpers/logout/logout.module.mjs +31 -0
- package/esm2022/lib/models/profile-v3.models.mjs +2 -0
- package/esm2022/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.mjs +117 -0
- package/esm2022/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.mjs +18 -0
- package/esm2022/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.mjs +57 -0
- package/esm2022/lib/pipes/pipe-count-transform/pipe-count-transform.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.mjs +37 -0
- package/esm2022/lib/pipes/pipe-coursename/PipeCourseNameModule.mjs +20 -0
- package/esm2022/lib/pipes/pipe-coursename/pipe-coursename.pipe.mjs +17 -0
- package/esm2022/lib/pipes/pipe-date-concat/pipe-date-concat.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.mjs +36 -0
- package/esm2022/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.mjs +86 -0
- package/esm2022/lib/pipes/pipe-email/pipe-email.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-email/pipe-email.pipe.mjs +16 -0
- package/esm2022/lib/pipes/pipe-filter/pipe-filter.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-filter/pipe-filter.pipe.mjs +20 -0
- package/esm2022/lib/pipes/pipe-filter-search/pipe-filter-search.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.mjs +42 -0
- package/esm2022/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.mjs +25 -0
- package/esm2022/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.mjs +27 -0
- package/esm2022/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.mjs +16 -0
- package/esm2022/lib/pipes/pipe-limit-to/pipe-limit-to.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.mjs +29 -0
- package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.mjs +21 -0
- package/esm2022/lib/pipes/pipe-name-transform/pipe-name-transform.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.mjs +26 -0
- package/esm2022/lib/pipes/pipe-nic-relative/pipe-nic-relative.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-nic-relative/pipe-nic-relative.pipe.mjs +40 -0
- package/esm2022/lib/pipes/pipe-order-by/pipe-order-by.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-order-by/pipe-order-by.pipe.mjs +17 -0
- package/esm2022/lib/pipes/pipe-ordinal/pipe-ordinal.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-ordinal/pipe-ordinal.pipe.mjs +21 -0
- package/esm2022/lib/pipes/pipe-partial-content/pipe-partial-content.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.mjs +22 -0
- package/esm2022/lib/pipes/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.mjs +27 -0
- package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.mjs +20 -0
- package/esm2022/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.mjs +20 -0
- package/esm2022/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.mjs +33 -0
- package/esm2022/lib/resolvers/explore-detail.resolver.mjs +76 -0
- package/esm2022/lib/resolvers/marketing-offering.resolve.mjs +35 -0
- package/esm2022/lib/resolvers/module-name.resolver.mjs +36 -0
- package/esm2022/lib/resolvers/page-name.resolver.mjs +33 -0
- package/esm2022/lib/resolvers/page.constant.mjs +4 -0
- package/esm2022/lib/resolvers/page.model.mjs +2 -0
- package/esm2022/lib/resolvers/page.resolver.mjs +82 -0
- package/esm2022/lib/resolvers/resolver.model.mjs +2 -0
- package/esm2022/lib/services/auth-keycloak.service.mjs +124 -0
- package/esm2022/lib/services/auth-microsoft.service.mjs +173 -0
- package/esm2022/lib/services/card-content.model.mjs +11 -0
- package/esm2022/lib/services/configurations.model.mjs +2 -0
- package/esm2022/lib/services/configurations.service.mjs +83 -0
- package/esm2022/lib/services/content-strip-multiple.model.mjs +2 -0
- package/esm2022/lib/services/event.model.mjs +145 -0
- package/esm2022/lib/services/event.service.mjs +294 -0
- package/esm2022/lib/services/logger.service.mjs +45 -0
- package/esm2022/lib/services/ms-office.model.mjs +2 -0
- package/esm2022/lib/services/multilingual-translations.service.mjs +121 -0
- package/esm2022/lib/services/nps-grid.service.mjs +38 -0
- package/esm2022/lib/services/subapplication-respond.service.mjs +206 -0
- package/esm2022/lib/services/telemetry.service.mjs +695 -0
- package/esm2022/lib/services/user-preference.model.mjs +2 -0
- package/esm2022/lib/services/user-preference.service.mjs +92 -0
- package/esm2022/lib/services/utility.service.mjs +122 -0
- package/esm2022/lib/services/value.service.mjs +25 -0
- package/esm2022/lib/services/widget-content.model.mjs +144 -0
- package/esm2022/lib/services/widget-content.service.mjs +198 -0
- package/esm2022/lib/services/widget-resolver.model.mjs +2 -0
- package/esm2022/lib/services/widget-search.model.mjs +2 -0
- package/esm2022/lib/services-new/data-transfer.service.mjs +23 -0
- package/esm2022/lib/services-new/widget-enroll.service.mjs +55 -0
- package/esm2022/public-api.mjs +98 -0
- package/esm2022/sunbird-cb-utils-v2.mjs +2 -0
- package/fesm2022/sunbird-cb-utils-v2.mjs +5424 -0
- package/fesm2022/sunbird-cb-utils-v2.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/lib/components/image-crop/image-crop.component.d.ts +59 -0
- package/lib/components/image-crop/image-crop.module.d.ts +16 -0
- package/lib/constants/features.enum.d.ts +553 -0
- package/lib/constants/instances.enum.d.ts +3 -0
- package/lib/constants/misc.constants.d.ts +2 -0
- package/lib/directives/class-change-on-scroll/class-change-on-scroll.directive.d.ts +21 -0
- package/lib/directives/class-change-on-scroll/class-change-on-scroll.module.d.ts +8 -0
- package/lib/directives/default-thumbnail/default-thumbnail.directive.d.ts +12 -0
- package/lib/directives/default-thumbnail/default-thumbnail.module.d.ts +8 -0
- package/lib/directives/image-responsive/image-responsive.directive.d.ts +20 -0
- package/lib/directives/image-responsive/image-responsive.module.d.ts +8 -0
- package/lib/directives/in-view-port/in-view-port.directive.d.ts +14 -0
- package/lib/directives/in-view-port/in-view-port.module.d.ts +8 -0
- package/lib/directives/navigation/navigation.directive.d.ts +12 -0
- package/lib/directives/navigation/navigation.module.d.ts +8 -0
- package/lib/directives/permission/permission.directive.d.ts +6 -0
- package/lib/directives/permission/permission.module.d.ts +8 -0
- package/lib/helpers/functions/getStringifiedQueryParams.d.ts +3 -0
- package/lib/helpers/horizontal-scroller/horizontal-scroller.component.d.ts +21 -0
- package/lib/helpers/horizontal-scroller/horizontal-scroller.module.d.ts +11 -0
- package/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.component.d.ts +39 -0
- package/lib/helpers/horizontal-scroller-v2/horizontal-scroller-v2.module.d.ts +11 -0
- package/lib/helpers/logout/logout.component.d.ts +23 -0
- package/lib/helpers/logout/logout.module.d.ts +11 -0
- package/lib/models/profile-v3.models.d.ts +91 -0
- package/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.module.d.ts +8 -0
- package/lib/pipes/pipe-certificate-image-URL/pipe-certimage-URL.pipe.d.ts +9 -0
- package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.module.d.ts +8 -0
- package/lib/pipes/pipe-concise-date-range/pipe-concise-date-range.pipe.d.ts +13 -0
- package/lib/pipes/pipe-count-transform/pipe-count-transform.module.d.ts +8 -0
- package/lib/pipes/pipe-count-transform/pipe-count-transform.pipe.d.ts +7 -0
- package/lib/pipes/pipe-coursename/PipeCourseNameModule.d.ts +8 -0
- package/lib/pipes/pipe-coursename/pipe-coursename.pipe.d.ts +7 -0
- package/lib/pipes/pipe-date-concat/pipe-date-concat.module.d.ts +8 -0
- package/lib/pipes/pipe-date-concat/pipe-date-concat.pipe.d.ts +16 -0
- package/lib/pipes/pipe-duration-transform/pipe-duration-transform.module.d.ts +8 -0
- package/lib/pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +9 -0
- package/lib/pipes/pipe-email/pipe-email.module.d.ts +8 -0
- package/lib/pipes/pipe-email/pipe-email.pipe.d.ts +7 -0
- package/lib/pipes/pipe-filter/pipe-filter.module.d.ts +8 -0
- package/lib/pipes/pipe-filter/pipe-filter.pipe.d.ts +7 -0
- package/lib/pipes/pipe-filter-search/pipe-filter-search.module.d.ts +8 -0
- package/lib/pipes/pipe-filter-search/pipe-filter-search.pipe.d.ts +7 -0
- package/lib/pipes/pipe-filter-v2/pipe-filter-v2.module.d.ts +8 -0
- package/lib/pipes/pipe-filter-v2/pipe-filter-v2.pipe.d.ts +7 -0
- package/lib/pipes/pipe-filter-v3/pipe-filter-v3.module.d.ts +8 -0
- package/lib/pipes/pipe-filter-v3/pipe-filter-v3.pipe.d.ts +7 -0
- package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.module.d.ts +8 -0
- package/lib/pipes/pipe-html-tag-removal/pipe-html-tag-removal.pipe.d.ts +7 -0
- package/lib/pipes/pipe-limit-to/pipe-limit-to.module.d.ts +8 -0
- package/lib/pipes/pipe-limit-to/pipe-limit-to.pipe.d.ts +7 -0
- package/lib/pipes/pipe-list-filter/pipe-list-filter.module.d.ts +8 -0
- package/lib/pipes/pipe-list-filter/pipe-list-filter.pipe.d.ts +7 -0
- package/lib/pipes/pipe-name-transform/pipe-name-transform.module.d.ts +8 -0
- package/lib/pipes/pipe-name-transform/pipe-name-transform.pipe.d.ts +12 -0
- package/lib/pipes/pipe-nic-relative/pipe-nic-relative.module.d.ts +8 -0
- package/lib/pipes/pipe-nic-relative/pipe-nic-relative.pipe.d.ts +10 -0
- package/lib/pipes/pipe-order-by/pipe-order-by.module.d.ts +8 -0
- package/lib/pipes/pipe-order-by/pipe-order-by.pipe.d.ts +12 -0
- package/lib/pipes/pipe-ordinal/pipe-ordinal.module.d.ts +8 -0
- package/lib/pipes/pipe-ordinal/pipe-ordinal.pipe.d.ts +7 -0
- package/lib/pipes/pipe-partial-content/pipe-partial-content.module.d.ts +8 -0
- package/lib/pipes/pipe-partial-content/pipe-partial-content.pipe.d.ts +7 -0
- package/lib/pipes/pipe-public-URL/pipe-public-URL.module.d.ts +8 -0
- package/lib/pipes/pipe-public-URL/pipe-public-URL.pipe.d.ts +9 -0
- package/lib/pipes/pipe-relative-time/pipe-relative-time.module.d.ts +8 -0
- package/lib/pipes/pipe-relative-time/pipe-relative-time.pipe.d.ts +7 -0
- package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.module.d.ts +8 -0
- package/lib/pipes/pipe-safe-sanitizer/pipe-safe-sanitizer.pipe.d.ts +10 -0
- package/lib/resolvers/explore-detail.resolver.d.ts +19 -0
- package/lib/resolvers/marketing-offering.resolve.d.ts +13 -0
- package/lib/resolvers/module-name.resolver.d.ts +9 -0
- package/lib/resolvers/page-name.resolver.d.ts +8 -0
- package/lib/resolvers/page.constant.d.ts +1 -0
- package/lib/resolvers/page.model.d.ts +41 -0
- package/lib/resolvers/page.resolver.d.ts +20 -0
- package/lib/resolvers/resolver.model.d.ts +4 -0
- package/lib/services/auth-keycloak.service.d.ts +23 -0
- package/lib/services/auth-microsoft.service.d.ts +33 -0
- package/lib/services/card-content.model.d.ts +29 -0
- package/lib/services/configurations.model.d.ts +526 -0
- package/lib/services/configurations.service.d.ts +79 -0
- package/lib/services/content-strip-multiple.model.d.ts +80 -0
- package/lib/services/event.model.d.ts +222 -0
- package/lib/services/event.service.d.ts +39 -0
- package/lib/services/logger.service.d.ts +18 -0
- package/lib/services/ms-office.model.d.ts +6 -0
- package/lib/services/multilingual-translations.service.d.ts +23 -0
- package/lib/services/nps-grid.service.d.ts +15 -0
- package/lib/services/subapplication-respond.service.d.ts +26 -0
- package/lib/services/telemetry.service.d.ts +59 -0
- package/lib/services/user-preference.model.d.ts +34 -0
- package/lib/services/user-preference.service.d.ts +14 -0
- package/lib/services/utility.service.d.ts +34 -0
- package/lib/services/value.service.d.ts +11 -0
- package/lib/services/widget-content.model.d.ts +356 -0
- package/lib/services/widget-content.service.d.ts +54 -0
- package/lib/services/widget-resolver.model.d.ts +48 -0
- package/lib/services/widget-search.model.d.ts +114 -0
- package/lib/services-new/data-transfer.service.d.ts +10 -0
- package/lib/services-new/widget-enroll.service.d.ts +17 -0
- package/package.json +38 -0
- package/public-api.d.ts +97 -0
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { filter } from 'rxjs/operators';
|
|
3
|
+
import { WsEvents } from './event.model';
|
|
4
|
+
import { NavigationStart } from '@angular/router';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./configurations.service";
|
|
7
|
+
import * as i2 from "./event.service";
|
|
8
|
+
import * as i3 from "./logger.service";
|
|
9
|
+
import * as i4 from "@angular/router";
|
|
10
|
+
import * as i5 from "./nps-grid.service";
|
|
11
|
+
export class TelemetryService {
|
|
12
|
+
constructor(configSvc, eventsSvc, environment, logger, router, npsSvc) {
|
|
13
|
+
this.configSvc = configSvc;
|
|
14
|
+
this.eventsSvc = eventsSvc;
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
this.router = router;
|
|
17
|
+
this.npsSvc = npsSvc;
|
|
18
|
+
this.previousUrl = null;
|
|
19
|
+
this.telemetryConfig = null;
|
|
20
|
+
this.pData = null;
|
|
21
|
+
this.contextCdata = [];
|
|
22
|
+
this.isAnonymousTelemetry = true;
|
|
23
|
+
this.telArray = [];
|
|
24
|
+
this.externalApps = {
|
|
25
|
+
RBCP: 'rbcp-web-ui',
|
|
26
|
+
};
|
|
27
|
+
this.environment = environment;
|
|
28
|
+
const instanceConfig = this.configSvc.instanceConfig;
|
|
29
|
+
this.navigationStart();
|
|
30
|
+
this.initializeConfig(instanceConfig);
|
|
31
|
+
this.addPlayerListener();
|
|
32
|
+
this.addCustomEventListener();
|
|
33
|
+
this.addInteractListener();
|
|
34
|
+
this.addFeedbackListener();
|
|
35
|
+
this.addTimeSpentListener();
|
|
36
|
+
this.addSearchListener();
|
|
37
|
+
this.addHearbeatListener();
|
|
38
|
+
this.addCustomImpressionListener();
|
|
39
|
+
this.addCustomListener();
|
|
40
|
+
this.addCustomListenerForGetStart();
|
|
41
|
+
this.addCustomListenerForPlatformRating();
|
|
42
|
+
}
|
|
43
|
+
navigationStart() {
|
|
44
|
+
this.router.events.subscribe((event) => {
|
|
45
|
+
if (event instanceof NavigationStart) {
|
|
46
|
+
if (event.url.includes('/public/') || event.url.includes('&preview=true') || event.url.includes('/certs')) {
|
|
47
|
+
this.isAnonymousTelemetry = true;
|
|
48
|
+
this.updateTelemetryConfig();
|
|
49
|
+
const instanceConfig = this.configSvc.instanceConfig;
|
|
50
|
+
this.initializeConfig(instanceConfig);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
get isAnonymousTelemetryRequired() {
|
|
56
|
+
return this.isAnonymousTelemetry;
|
|
57
|
+
}
|
|
58
|
+
updateTelemetryConfig() {
|
|
59
|
+
if (this.configSvc.instanceConfig && this.configSvc.instanceConfig.telemetryConfig) {
|
|
60
|
+
if (this.isAnonymousTelemetryRequired) {
|
|
61
|
+
this.configSvc.instanceConfig.telemetryConfig.endpoint = this.configSvc.instanceConfig.telemetryConfig.publicEndpoint;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.configSvc.instanceConfig.telemetryConfig.endpoint = this.configSvc.instanceConfig.telemetryConfig.protectedEndpoint;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
initializeConfig(instanceConfig) {
|
|
69
|
+
if (instanceConfig) {
|
|
70
|
+
this.telemetryConfig = instanceConfig.telemetryConfig;
|
|
71
|
+
this.telemetryConfig = {
|
|
72
|
+
...this.telemetryConfig,
|
|
73
|
+
pdata: {
|
|
74
|
+
...this.telemetryConfig.pdata,
|
|
75
|
+
id: `${this.environment.name}.${this.telemetryConfig.pdata.id}`,
|
|
76
|
+
},
|
|
77
|
+
uid: (this.configSvc.userProfile && this.configSvc.userProfile.userId) ?
|
|
78
|
+
this.configSvc.userProfile.userId : '',
|
|
79
|
+
channel: this.rootOrgId || this.telemetryConfig.channel,
|
|
80
|
+
sid: this.getTelemetrySessionId,
|
|
81
|
+
};
|
|
82
|
+
this.pData = this.telemetryConfig.pdata;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
get getTelemetrySessionId() {
|
|
86
|
+
return localStorage.getItem('telemetrySessionId') || '';
|
|
87
|
+
}
|
|
88
|
+
get rootOrgId() {
|
|
89
|
+
if (this.configSvc && this.configSvc.userProfile && this.configSvc.userProfile.rootOrgId) {
|
|
90
|
+
return this.configSvc.userProfile.rootOrgId;
|
|
91
|
+
}
|
|
92
|
+
return '';
|
|
93
|
+
}
|
|
94
|
+
triggerNPSUpdate(data) {
|
|
95
|
+
this.telArray.push(data);
|
|
96
|
+
if (this.telArray && this.telArray.length === 4) {
|
|
97
|
+
if (localStorage.getItem('ratingformID')) {
|
|
98
|
+
this.telArray = [];
|
|
99
|
+
this.npsSvc.updateTelemetryData(true);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
start(edata, data, pageContext) {
|
|
104
|
+
try {
|
|
105
|
+
if (this.telemetryConfig) {
|
|
106
|
+
$t.start(this.telemetryConfig, (pageContext && pageContext.pageId) ?
|
|
107
|
+
pageContext.pageId
|
|
108
|
+
: '', '1.0', {
|
|
109
|
+
type: edata.type,
|
|
110
|
+
mode: edata.mode,
|
|
111
|
+
pageid: (pageContext && pageContext.pageId) ?
|
|
112
|
+
pageContext.pageId
|
|
113
|
+
: '',
|
|
114
|
+
duration: 1,
|
|
115
|
+
}, {
|
|
116
|
+
context: {
|
|
117
|
+
pdata: {
|
|
118
|
+
...this.pData,
|
|
119
|
+
id: this.pData.id,
|
|
120
|
+
},
|
|
121
|
+
...(pageContext && pageContext.module ? { env: pageContext.module } : null),
|
|
122
|
+
},
|
|
123
|
+
object: {
|
|
124
|
+
...(data) && data,
|
|
125
|
+
},
|
|
126
|
+
...(this.configSvc.userProfile && this.configSvc.userProfile.userId ?
|
|
127
|
+
null : { actor: { id: '', type: 'AnonymousUser' } }),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.logger.error('Error Initializing Telemetry. Config missing.');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
console.log('Error in telemetry start', e);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
end(edata, data, pageContext) {
|
|
139
|
+
try {
|
|
140
|
+
$t.end({
|
|
141
|
+
type: edata.type,
|
|
142
|
+
mode: edata.mode,
|
|
143
|
+
pageid: (pageContext && pageContext.pageId) ?
|
|
144
|
+
pageContext.pageId
|
|
145
|
+
: '',
|
|
146
|
+
}, {
|
|
147
|
+
context: {
|
|
148
|
+
pdata: {
|
|
149
|
+
...this.pData,
|
|
150
|
+
id: this.pData.id,
|
|
151
|
+
},
|
|
152
|
+
...(pageContext && pageContext.module ? { env: pageContext.module } : null),
|
|
153
|
+
},
|
|
154
|
+
object: {
|
|
155
|
+
...(data) && data,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
console.log('Error in telemetry end', e);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
audit(type, props, data) {
|
|
164
|
+
try {
|
|
165
|
+
$t.audit({
|
|
166
|
+
type,
|
|
167
|
+
props,
|
|
168
|
+
state: data,
|
|
169
|
+
prevstate: '',
|
|
170
|
+
duration: '',
|
|
171
|
+
}, {
|
|
172
|
+
context: {
|
|
173
|
+
pdata: {
|
|
174
|
+
...this.pData,
|
|
175
|
+
id: this.pData.id,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
console.log('Error in telemetry audit', e);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
heartbeat(type, id) {
|
|
185
|
+
try {
|
|
186
|
+
$t.heartbeat({
|
|
187
|
+
id,
|
|
188
|
+
type,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
console.log('Error in telemetry heartbeat', e);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
impression(data, objectType) {
|
|
196
|
+
this.triggerNPSUpdate(data);
|
|
197
|
+
try {
|
|
198
|
+
const page = this.getPageDetails();
|
|
199
|
+
if (data && data.pageContext) {
|
|
200
|
+
page.pageid = data.pageContext.pageId;
|
|
201
|
+
page.module = data.pageContext.module;
|
|
202
|
+
}
|
|
203
|
+
const edata = {
|
|
204
|
+
pageid: page.pageid,
|
|
205
|
+
type: page.pageUrlParts[0],
|
|
206
|
+
uri: page.pageUrl,
|
|
207
|
+
};
|
|
208
|
+
if (page.objectId) {
|
|
209
|
+
const config = {
|
|
210
|
+
context: {
|
|
211
|
+
pdata: {
|
|
212
|
+
...this.pData,
|
|
213
|
+
id: this.pData.id,
|
|
214
|
+
},
|
|
215
|
+
env: page.module || (this.telemetryConfig && this.telemetryConfig.env),
|
|
216
|
+
},
|
|
217
|
+
object: {
|
|
218
|
+
id: page.objectId,
|
|
219
|
+
type: objectType,
|
|
220
|
+
...(data && data.object),
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
if (!page.objectId || !objectType) {
|
|
224
|
+
config.object = {};
|
|
225
|
+
}
|
|
226
|
+
$t.impression(edata, config);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
$t.impression(edata, {
|
|
230
|
+
context: {
|
|
231
|
+
pdata: {
|
|
232
|
+
...this.pData,
|
|
233
|
+
id: this.pData && this.pData.id,
|
|
234
|
+
},
|
|
235
|
+
env: page.module || '',
|
|
236
|
+
},
|
|
237
|
+
object: {
|
|
238
|
+
...(data && data.object),
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
this.previousUrl = page.pageUrl;
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
console.log('Error in telemetry impression', e);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
externalImpression(impressionData) {
|
|
249
|
+
try {
|
|
250
|
+
const page = this.getPageDetails();
|
|
251
|
+
if (this.externalApps[impressionData.subApplicationName]) {
|
|
252
|
+
const externalConfig = page.objectId ? {
|
|
253
|
+
context: {
|
|
254
|
+
pdata: {
|
|
255
|
+
...this.pData,
|
|
256
|
+
id: this.externalApps[impressionData.subApplicationName],
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
object: {
|
|
260
|
+
id: page.objectId,
|
|
261
|
+
},
|
|
262
|
+
} : {
|
|
263
|
+
context: {
|
|
264
|
+
pdata: {
|
|
265
|
+
...this.pData,
|
|
266
|
+
id: this.externalApps[impressionData.subApplicationName],
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
$t.impression(impressionData.data, externalConfig);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
console.log('Error in telemetry externalImpression', e);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
addCustomListenerForPlatformRating() {
|
|
278
|
+
this.eventsSvc.getPREvents$
|
|
279
|
+
.pipe(filter(event => event &&
|
|
280
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
281
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.PlatformRating &&
|
|
282
|
+
event.data.mode &&
|
|
283
|
+
event.data))
|
|
284
|
+
.subscribe(event => {
|
|
285
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
|
|
286
|
+
this.start({
|
|
287
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
288
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
289
|
+
}, {}, event.pageContext);
|
|
290
|
+
}
|
|
291
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
|
|
292
|
+
this.end({
|
|
293
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
294
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
295
|
+
}, event.data.object, event.pageContext);
|
|
296
|
+
}
|
|
297
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
|
|
298
|
+
$t.interact({
|
|
299
|
+
type: event.data.edata.type,
|
|
300
|
+
subtype: event.data.edata.subType,
|
|
301
|
+
id: (event.data.edata && event.data.edata.id) ?
|
|
302
|
+
event.data.edata.id
|
|
303
|
+
: '',
|
|
304
|
+
pageid: event.pageContext && event.pageContext.pageId || '',
|
|
305
|
+
}, {
|
|
306
|
+
context: {
|
|
307
|
+
pdata: {
|
|
308
|
+
...this.pData,
|
|
309
|
+
id: this.pData.id,
|
|
310
|
+
},
|
|
311
|
+
...(event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null),
|
|
312
|
+
},
|
|
313
|
+
object: {
|
|
314
|
+
...event.data.object,
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
addCustomListenerForGetStart() {
|
|
321
|
+
this.eventsSvc.getStartEvents$
|
|
322
|
+
.pipe(filter(event => event &&
|
|
323
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
324
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.GetStarted &&
|
|
325
|
+
event.data.mode &&
|
|
326
|
+
event.data))
|
|
327
|
+
.subscribe(event => {
|
|
328
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
|
|
329
|
+
this.start({
|
|
330
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
331
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
332
|
+
}, {}, event.pageContext);
|
|
333
|
+
}
|
|
334
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
|
|
335
|
+
this.end({
|
|
336
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
337
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
338
|
+
}, event.data.object, event.pageContext);
|
|
339
|
+
}
|
|
340
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
|
|
341
|
+
$t.interact({
|
|
342
|
+
type: event.data.edata.type,
|
|
343
|
+
subtype: event.data.edata.subType,
|
|
344
|
+
id: (event.data.edata && event.data.edata.id) ?
|
|
345
|
+
event.data.edata.id
|
|
346
|
+
: '',
|
|
347
|
+
pageid: event.pageContext && event.pageContext.pageId || '',
|
|
348
|
+
}, {
|
|
349
|
+
context: {
|
|
350
|
+
pdata: {
|
|
351
|
+
...this.pData,
|
|
352
|
+
id: this.pData.id,
|
|
353
|
+
},
|
|
354
|
+
...(event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null),
|
|
355
|
+
},
|
|
356
|
+
object: {
|
|
357
|
+
...event.data.object,
|
|
358
|
+
},
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
addCustomListener() {
|
|
364
|
+
this.eventsSvc.chatbotEvents$
|
|
365
|
+
.pipe(filter(event => event &&
|
|
366
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
367
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Chatbot &&
|
|
368
|
+
event.data.mode &&
|
|
369
|
+
event.data))
|
|
370
|
+
.subscribe(event => {
|
|
371
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
|
|
372
|
+
this.start({
|
|
373
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
374
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
375
|
+
}, {}, event.pageContext);
|
|
376
|
+
}
|
|
377
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
|
|
378
|
+
this.end({
|
|
379
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
380
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
381
|
+
}, {}, event.pageContext);
|
|
382
|
+
}
|
|
383
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Interact) {
|
|
384
|
+
$t.interact({
|
|
385
|
+
type: event.data.edata.type,
|
|
386
|
+
subtype: event.data.edata.subType,
|
|
387
|
+
id: (event.data.edata && event.data.edata.id) ?
|
|
388
|
+
event.data.edata.id
|
|
389
|
+
: '',
|
|
390
|
+
pageid: event.pageContext && event.pageContext.pageId || '',
|
|
391
|
+
}, {
|
|
392
|
+
context: {
|
|
393
|
+
pdata: {
|
|
394
|
+
...this.pData,
|
|
395
|
+
id: this.pData.id,
|
|
396
|
+
},
|
|
397
|
+
...(event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null),
|
|
398
|
+
},
|
|
399
|
+
object: {
|
|
400
|
+
...event.data.object,
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
addCustomImpressionListener() {
|
|
407
|
+
this.eventsSvc.events$
|
|
408
|
+
.pipe(filter((event) => event &&
|
|
409
|
+
event.data &&
|
|
410
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
411
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Impression))
|
|
412
|
+
.subscribe(event => {
|
|
413
|
+
try {
|
|
414
|
+
this.impression(event.data);
|
|
415
|
+
}
|
|
416
|
+
catch (e) {
|
|
417
|
+
console.log('Error in telemetry impression', e);
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
addTimeSpentListener() {
|
|
422
|
+
this.eventsSvc.events$
|
|
423
|
+
.pipe(filter(event => event &&
|
|
424
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
425
|
+
event.data.type === WsEvents.WsTimeSpentType.Page &&
|
|
426
|
+
event.data.mode &&
|
|
427
|
+
event.data))
|
|
428
|
+
.subscribe(event => {
|
|
429
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded) {
|
|
430
|
+
this.start({
|
|
431
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
432
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
433
|
+
}, {}, event.pageContext);
|
|
434
|
+
}
|
|
435
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded) {
|
|
436
|
+
this.end({
|
|
437
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
438
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
439
|
+
}, {}, event.pageContext);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
addCustomEventListener() {
|
|
444
|
+
this.eventsSvc.events$
|
|
445
|
+
.pipe(filter(event => event &&
|
|
446
|
+
event.eventType === WsEvents.WsEventType.Telemetry))
|
|
447
|
+
.subscribe(event => {
|
|
448
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
|
|
449
|
+
event.data.type !== WsEvents.WsTimeSpentType.Player) {
|
|
450
|
+
this.start({
|
|
451
|
+
type: event.data.type,
|
|
452
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
453
|
+
}, event.data.object, event.pageContext);
|
|
454
|
+
}
|
|
455
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
|
|
456
|
+
event.data.type !== WsEvents.WsTimeSpentType.Player) {
|
|
457
|
+
this.end({
|
|
458
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
459
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
460
|
+
}, event.data.object, event.pageContext);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
addPlayerListener() {
|
|
465
|
+
this.eventsSvc.events$
|
|
466
|
+
.pipe(filter(event => event &&
|
|
467
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
468
|
+
event.data.type === WsEvents.WsTimeSpentType.Player &&
|
|
469
|
+
event.data.mode &&
|
|
470
|
+
event.data))
|
|
471
|
+
.subscribe(event => {
|
|
472
|
+
const content = event.data.content;
|
|
473
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Loaded &&
|
|
474
|
+
(!content ||
|
|
475
|
+
(content.isIframeSupported || '').toLowerCase() === 'maybe' ||
|
|
476
|
+
(content.isIframeSupported || '').toLowerCase() === 'yes' ||
|
|
477
|
+
(content.mimeType === 'application/pdf' || 'application/json'))) {
|
|
478
|
+
this.start({
|
|
479
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
480
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
481
|
+
}, event.data.object, event.pageContext);
|
|
482
|
+
}
|
|
483
|
+
if (event.data.state === WsEvents.EnumTelemetrySubType.Unloaded &&
|
|
484
|
+
(!content ||
|
|
485
|
+
(content.isIframeSupported || '').toLowerCase() === 'maybe' ||
|
|
486
|
+
(content.isIframeSupported || '').toLowerCase() === 'yes' ||
|
|
487
|
+
(content.mimeType === 'application/pdf' || 'application/json'))) {
|
|
488
|
+
this.end({
|
|
489
|
+
type: event.data.type || WsEvents.WsTimeSpentType.Player,
|
|
490
|
+
mode: event.data.mode || WsEvents.WsTimeSpentMode.Play,
|
|
491
|
+
}, event.data.object, event.pageContext);
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
addInteractListener() {
|
|
496
|
+
const data = this.getPageDetails();
|
|
497
|
+
this.triggerNPSUpdate(data.pageid);
|
|
498
|
+
this.eventsSvc.events$
|
|
499
|
+
.pipe(filter((event) => event &&
|
|
500
|
+
event.data &&
|
|
501
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
502
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Interact))
|
|
503
|
+
.subscribe(event => {
|
|
504
|
+
const page = this.getPageDetails();
|
|
505
|
+
if (typeof event.from === 'string' && this.externalApps[event.from]) {
|
|
506
|
+
const externalConfig = {
|
|
507
|
+
context: {
|
|
508
|
+
pdata: {
|
|
509
|
+
...this.pData,
|
|
510
|
+
id: this.externalApps[event.from],
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
};
|
|
514
|
+
try {
|
|
515
|
+
$t.interact(event.data, externalConfig);
|
|
516
|
+
}
|
|
517
|
+
catch (e) {
|
|
518
|
+
console.log('Error in telemetry interact', e);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
try {
|
|
523
|
+
$t.interact({
|
|
524
|
+
type: event.data.edata.type,
|
|
525
|
+
subtype: event.data.edata.subType,
|
|
526
|
+
id: (event.data.edata && event.data.edata.id) ?
|
|
527
|
+
event.data.edata.id
|
|
528
|
+
: '',
|
|
529
|
+
pageid: event.data.pageContext && event.data.pageContext.pageId || page.pageid,
|
|
530
|
+
...(event.data.edata.target && { target: event.data.edata.target })
|
|
531
|
+
}, {
|
|
532
|
+
context: {
|
|
533
|
+
pdata: {
|
|
534
|
+
...this.pData,
|
|
535
|
+
id: this.pData.id,
|
|
536
|
+
},
|
|
537
|
+
...(event.pageContext && event.pageContext.module ? { env: event.pageContext.module } : null),
|
|
538
|
+
},
|
|
539
|
+
object: {
|
|
540
|
+
...event.data.object,
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
catch (e) {
|
|
545
|
+
console.log('Error in telemetry interact', e);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
addFeedbackListener() {
|
|
551
|
+
this.eventsSvc.events$
|
|
552
|
+
.pipe(filter((event) => event &&
|
|
553
|
+
event.data &&
|
|
554
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
555
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Feedback))
|
|
556
|
+
.subscribe(event => {
|
|
557
|
+
const page = this.getPageDetails();
|
|
558
|
+
try {
|
|
559
|
+
$t.feedback({
|
|
560
|
+
rating: event.data.object.rating || 0,
|
|
561
|
+
commentid: event.data.object.commentid || '',
|
|
562
|
+
commenttxt: event.data.object.commenttxt || '',
|
|
563
|
+
pageid: page.pageid,
|
|
564
|
+
}, {
|
|
565
|
+
context: {
|
|
566
|
+
pdata: {
|
|
567
|
+
...this.pData,
|
|
568
|
+
id: this.pData.id,
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
object: {
|
|
572
|
+
id: event.data.object.contentId || event.data.object.id || '',
|
|
573
|
+
type: event.data.edata.type || '',
|
|
574
|
+
ver: `${(event.data.object.version || '1')}${''}`,
|
|
575
|
+
rollup: {},
|
|
576
|
+
},
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
catch (e) {
|
|
580
|
+
console.log('Error in telemetry interact', e);
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
addHearbeatListener() {
|
|
585
|
+
this.eventsSvc.events$
|
|
586
|
+
.pipe(filter((event) => event &&
|
|
587
|
+
event.data &&
|
|
588
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
589
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.HeartBeat))
|
|
590
|
+
.subscribe(event => {
|
|
591
|
+
if (typeof event.from === 'string' && this.externalApps[event.from]) {
|
|
592
|
+
const externalConfig = {
|
|
593
|
+
context: {
|
|
594
|
+
pdata: {
|
|
595
|
+
...this.pData,
|
|
596
|
+
id: this.externalApps[event.from],
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
};
|
|
600
|
+
try {
|
|
601
|
+
$t.heartbeat(event.data, externalConfig);
|
|
602
|
+
}
|
|
603
|
+
catch (e) {
|
|
604
|
+
console.log('Error in telemetry heartbeat', e);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
try {
|
|
609
|
+
$t.heartbeat({
|
|
610
|
+
type: event.data.type,
|
|
611
|
+
id: event.data.id,
|
|
612
|
+
}, {
|
|
613
|
+
context: {
|
|
614
|
+
pdata: {
|
|
615
|
+
...this.pData,
|
|
616
|
+
id: this.pData.id,
|
|
617
|
+
},
|
|
618
|
+
},
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
catch (e) {
|
|
622
|
+
console.log('Error in telemetry heartbeat', e);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
addSearchListener() {
|
|
628
|
+
this.eventsSvc.events$
|
|
629
|
+
.pipe(filter((event) => event &&
|
|
630
|
+
event.data &&
|
|
631
|
+
event.eventType === WsEvents.WsEventType.Telemetry &&
|
|
632
|
+
event.data.eventSubType === WsEvents.EnumTelemetrySubType.Search))
|
|
633
|
+
.subscribe(event => {
|
|
634
|
+
try {
|
|
635
|
+
$t.search({
|
|
636
|
+
query: event.data.query,
|
|
637
|
+
filters: event.data.filters,
|
|
638
|
+
size: event.data.size,
|
|
639
|
+
}, {
|
|
640
|
+
context: {
|
|
641
|
+
pdata: {
|
|
642
|
+
...this.pData,
|
|
643
|
+
id: this.pData.id,
|
|
644
|
+
},
|
|
645
|
+
},
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
catch (e) {
|
|
649
|
+
console.log('Error in telemetry search', e);
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
getPageDetails() {
|
|
654
|
+
const path = window.location.pathname.replace('/', '');
|
|
655
|
+
const url = path + window.location.search;
|
|
656
|
+
let moduleValue = '';
|
|
657
|
+
if (path.includes('discussion-forum')) {
|
|
658
|
+
moduleValue = 'Discuss';
|
|
659
|
+
}
|
|
660
|
+
return {
|
|
661
|
+
pageid: path,
|
|
662
|
+
pageUrl: url,
|
|
663
|
+
pageUrlParts: path.split('/'),
|
|
664
|
+
refferUrl: this.previousUrl,
|
|
665
|
+
objectId: this.extractContentIdFromUrlParts(path.split('/')),
|
|
666
|
+
module: moduleValue,
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
extractContentIdFromUrlParts(urlParts) {
|
|
670
|
+
const tocIdx = urlParts.indexOf('toc');
|
|
671
|
+
const viewerIdx = urlParts.indexOf('viewer');
|
|
672
|
+
if (tocIdx === -1 && viewerIdx === -1) {
|
|
673
|
+
return null;
|
|
674
|
+
}
|
|
675
|
+
if (tocIdx !== -1 && tocIdx < urlParts.length - 1) {
|
|
676
|
+
return urlParts[tocIdx + 1];
|
|
677
|
+
}
|
|
678
|
+
if (viewerIdx !== -1 && viewerIdx < urlParts.length - 2) {
|
|
679
|
+
return urlParts[viewerIdx + 2];
|
|
680
|
+
}
|
|
681
|
+
return null;
|
|
682
|
+
}
|
|
683
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TelemetryService, deps: [{ token: i1.ConfigurationsService }, { token: i2.EventService }, { token: 'environment' }, { token: i3.LoggerService }, { token: i4.Router }, { token: i5.NPSGridService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
684
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TelemetryService, providedIn: 'root' }); }
|
|
685
|
+
}
|
|
686
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TelemetryService, decorators: [{
|
|
687
|
+
type: Injectable,
|
|
688
|
+
args: [{
|
|
689
|
+
providedIn: 'root',
|
|
690
|
+
}]
|
|
691
|
+
}], ctorParameters: function () { return [{ type: i1.ConfigurationsService }, { type: i2.EventService }, { type: undefined, decorators: [{
|
|
692
|
+
type: Inject,
|
|
693
|
+
args: ['environment']
|
|
694
|
+
}] }, { type: i3.LoggerService }, { type: i4.Router }, { type: i5.NPSGridService }]; } });
|
|
695
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdXRpbHMtdjIvc3JjL2xpYi9zZXJ2aWNlcy90ZWxlbWV0cnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFJdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUl4QyxPQUFPLEVBQVUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUE7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLGdCQUFnQjtJQVczQixZQUNVLFNBQWdDLEVBQ2hDLFNBQXVCLEVBQ1IsV0FBZ0IsRUFFL0IsTUFBcUIsRUFDckIsTUFBYyxFQUNkLE1BQXNCO1FBTnRCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFHdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFqQmhDLGdCQUFXLEdBQWtCLElBQUksQ0FBQTtRQUNqQyxvQkFBZSxHQUE2QyxJQUFJLENBQUE7UUFDaEUsVUFBSyxHQUFRLElBQUksQ0FBQTtRQUNqQixpQkFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNqQix5QkFBb0IsR0FBRyxJQUFJLENBQUE7UUFDM0IsYUFBUSxHQUFRLEVBQUUsQ0FBQTtRQUNsQixpQkFBWSxHQUFRO1lBQ2xCLElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUE7UUFXQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQTtRQUNwRCxJQUFJ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RTtZQUN2RCxPQUFPLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUE7U0FDL0I7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7K0dBcjJCVSxnQkFBZ0IsbUZBY2pCLGFBQWE7bUhBZFosZ0JBQWdCLGNBRmYsTUFBTTs7NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBZUksTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbi8vIGltcG9ydCB7IEF1dGhLZXljbG9ha1NlcnZpY2UgfSBmcm9tICcuL2F1dGgta2V5Y2xvYWsuc2VydmljZSdcclxuaW1wb3J0IHsgTnNJbnN0YW5jZUNvbmZpZyB9IGZyb20gJy4vY29uZmlndXJhdGlvbnMubW9kZWwnXHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbnMuc2VydmljZSdcclxuaW1wb3J0IHsgV3NFdmVudHMgfSBmcm9tICcuL2V2ZW50Lm1vZGVsJ1xyXG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgfSBmcm9tICcuL2V2ZW50LnNlcnZpY2UnXHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuL2xvZ2dlci5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25TdGFydCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcclxuaW1wb3J0IHsgTlBTR3JpZFNlcnZpY2UgfSBmcm9tICcuL25wcy1ncmlkLnNlcnZpY2UnXHJcblxyXG5kZWNsYXJlIHZhciAkdDogYW55XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGVsZW1ldHJ5U2VydmljZSB7XHJcbiAgcHJldmlvdXNVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsXHJcbiAgdGVsZW1ldHJ5Q29uZmlnOiBOc0luc3RhbmNlQ29uZmlnLklUZWxlbWV0cnlDb25maWcgfCBudWxsID0gbnVsbFxyXG4gIHBEYXRhOiBhbnkgPSBudWxsXHJcbiAgY29udGV4dENkYXRhID0gW11cclxuICBpc0Fub255bW91c1RlbGVtZXRyeSA9IHRydWVcclxuICB0ZWxBcnJheTogYW55ID0gW11cclxuICBleHRlcm5hbEFwcHM6IGFueSA9IHtcclxuICAgIFJCQ1A6ICdyYmNwLXdlYi11aScsXHJcbiAgfVxyXG4gIGVudmlyb25tZW50OiBhbnlcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV2ZW50c1N2YzogRXZlbnRTZXJ2aWNlLFxyXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55LFxyXG4gICAgLy8gcHJpdmF0ZSBhdXRoU3ZjOiBBdXRoS2V5Y2xvYWtTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBucHNTdmM6IE5QU0dyaWRTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50XHJcbiAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXHJcbiAgICB0aGlzLm5hdmlnYXRpb25TdGFydCgpXHJcbiAgICB0aGlzLmluaXRpYWxpemVDb25maWcoaW5zdGFuY2VDb25maWcpXHJcbiAgICB0aGlzLmFkZFBsYXllckxpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkQ3VzdG9tRXZlbnRMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEludGVyYWN0TGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRGZWVkYmFja0xpc3RlbmVyKClcclxuICAgIHRoaXMuYWRkVGltZVNwZW50TGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRTZWFyY2hMaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEhlYXJiZWF0TGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRDdXN0b21JbXByZXNzaW9uTGlzdGVuZXIoKVxyXG4gICAgdGhpcy5hZGRDdXN0b21MaXN0ZW5lcigpXHJcbiAgICB0aGlzLmFkZEN1c3RvbUxpc3RlbmVyRm9yR2V0U3RhcnQoKVxyXG4gICAgdGhpcy5hZGRDdXN0b21MaXN0ZW5lckZvclBsYXRmb3JtUmF0aW5nKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbmF2aWdhdGlvblN0YXJ0KCkge1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudXJsLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IGV2ZW50LnVybC5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpIHx8IGV2ZW50LnVybC5pbmNsdWRlcygnL2NlcnRzJykpIHtcclxuICAgICAgICAgIHRoaXMuaXNBbm9ueW1vdXNUZWxlbWV0cnkgPSB0cnVlXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRlbGVtZXRyeUNvbmZpZygpXHJcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXHJcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVDb25maWcoaW5zdGFuY2VDb25maWcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQW5vbnltb3VzVGVsZW1ldHJ5UmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0Fub255bW91c1RlbGVtZXRyeVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUZWxlbWV0cnlDb25maWcoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcgJiYgdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWcudGVsZW1ldHJ5Q29uZmlnKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzQW5vbnltb3VzVGVsZW1ldHJ5UmVxdWlyZWQpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy50ZWxlbWV0cnlDb25maWcuZW5kcG9pbnQgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy50ZWxlbWV0cnlDb25maWcucHVibGljRW5kcG9pbnRcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy50ZWxlbWV0cnlDb25maWcuZW5kcG9pbnQgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy50ZWxlbWV0cnlDb25maWcucHJvdGVjdGVkRW5kcG9pbnRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29uZmlnKGluc3RhbmNlQ29uZmlnOiBOc0luc3RhbmNlQ29uZmlnLklDb25maWcgfCBudWxsKSB7XHJcbiAgICBpZiAoaW5zdGFuY2VDb25maWcpIHtcclxuICAgICAgdGhpcy50ZWxlbWV0cnlDb25maWcgPSBpbnN0YW5jZUNvbmZpZy50ZWxlbWV0cnlDb25maWdcclxuICAgICAgdGhpcy50ZWxlbWV0cnlDb25maWcgPSB7XHJcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlDb25maWcsXHJcbiAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5Q29uZmlnLnBkYXRhLFxyXG4gICAgICAgICAgLy8gcGlkOiBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICAgICAgaWQ6IGAke3RoaXMuZW52aXJvbm1lbnQubmFtZX0uJHt0aGlzLnRlbGVtZXRyeUNvbmZpZy5wZGF0YS5pZH1gLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdWlkOiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkKSA/XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIDogJycsXHJcbiAgICAgICAgLy8gYXV0aHRva2VuOiB0aGlzLmF1dGhTdmMudG9rZW4sXHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBjaGFubmVsOiB0aGlzLnJvb3RPcmdJZCB8fCB0aGlzLnRlbGVtZXRyeUNvbmZpZy5jaGFubmVsLFxyXG4gICAgICAgIHNpZDogdGhpcy5nZXRUZWxlbWV0cnlTZXNzaW9uSWQsXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wRGF0YSA9IHRoaXMudGVsZW1ldHJ5Q29uZmlnLnBkYXRhXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZ2V0VGVsZW1ldHJ5U2Vzc2lvbklkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RlbGVtZXRyeVNlc3Npb25JZCcpIHx8ICcnXHJcbiAgfVxyXG5cclxuICBnZXQgcm9vdE9yZ0lkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5jb25maWdTdmMgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5yb290T3JnSWRcclxuICAgIH1cclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgdHJpZ2dlck5QU1VwZGF0ZShkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMudGVsQXJyYXkucHVzaChkYXRhKVxyXG4gICAgaWYgKHRoaXMudGVsQXJyYXkgJiYgdGhpcy50ZWxBcnJheS5sZW5ndGggPT09IDQpIHtcclxuICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyYXRpbmdmb3JtSUQnKSkge1xyXG4gICAgICAgIHRoaXMudGVsQXJyYXkgPSBbXVxyXG4gICAgICAgIHRoaXMubnBzU3ZjLnVwZGF0ZVRlbGVtZXRyeURhdGEodHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnQoZWRhdGE6IGFueSwgZGF0YTogYW55LCBwYWdlQ29udGV4dD86IFdzRXZlbnRzLklUZWxlbWV0cnlQYWdlQ29udGV4dCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMudGVsZW1ldHJ5Q29uZmlnKSB7XHJcbiAgICAgICAgJHQuc3RhcnQoXHJcbiAgICAgICAgICB0aGlzLnRlbGVtZXRyeUNvbmZpZyxcclxuICAgICAgICAgIChwYWdlQ29udGV4dCAmJiBwYWdlQ29udGV4dC5wYWdlSWQpID9cclxuICAgICAgICAgICAgcGFnZUNvbnRleHQucGFnZUlkXHJcbiAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgICAnMS4wJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gaWQsXHJcbiAgICAgICAgICAgIHR5cGU6IGVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgIG1vZGU6IGVkYXRhLm1vZGUsXHJcbiAgICAgICAgICAgIHBhZ2VpZDogKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0LnBhZ2VJZCkgP1xyXG4gICAgICAgICAgICAgIHBhZ2VDb250ZXh0LnBhZ2VJZFxyXG4gICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAuLi4ocGFnZUNvbnRleHQgJiYgcGFnZUNvbnRleHQubW9kdWxlID8geyBlbnY6IHBhZ2VDb250ZXh0Lm1vZHVsZSB9IDogbnVsbCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgICAgIC4uLihkYXRhKSAmJiBkYXRhLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi4odGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkID9cclxuICAgICAgICAgICAgICAgbnVsbCA6IHsgYWN0b3I6IHsgaWQ6ICcnLCB0eXBlOiAnQW5vbnltb3VzVXNlcicgfSB9KSxcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIEluaXRpYWxpemluZyBUZWxlbWV0cnkuIENvbmZpZyBtaXNzaW5nLicpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgc3RhcnQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5kKGVkYXRhOiBhbnksIGRhdGE6IGFueSwgcGFnZUNvbnRleHQ/OiBXc0V2ZW50cy5JVGVsZW1ldHJ5UGFnZUNvbnRleHQpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICR0LmVuZChcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0eXBlOiBlZGF0YS50eXBlLFxyXG4gICAgICAgICAgbW9kZTogZWRhdGEubW9kZSxcclxuICAgICAgICAgIHBhZ2VpZDogKHBhZ2VDb250ZXh0ICYmIHBhZ2VDb250ZXh0LnBhZ2VJZCkgP1xyXG4gICAgICAgICAgICBwYWdlQ29udGV4dC5wYWdlSWRcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi4ocGFnZUNvbnRleHQgJiYgcGFnZUNvbnRleHQubW9kdWxlID8geyBlbnY6IHBhZ2VDb250ZXh0Lm1vZHVsZSB9IDogbnVsbCksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgIC4uLihkYXRhKSAmJiBkYXRhLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICApXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGVuZCcsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpdCh0eXBlOiBzdHJpbmcsIHByb3BzOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgJHQuYXVkaXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIHByb3BzLFxyXG4gICAgICAgICAgLy8gZGF0YSxcclxuICAgICAgICAgIHN0YXRlOiBkYXRhLCAvLyBPcHRpb25hbC4gQ3VycmVudCBTdGF0ZVxyXG4gICAgICAgICAgcHJldnN0YXRlOiAnJywgLy8gT3B0aW9uYWwuIFByZXZpb3VzIFN0YXRlXHJcbiAgICAgICAgICBkdXJhdGlvbjogJycsIC8vIE9wdGlvbmFsLlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIClcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgYXVkaXQnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGVhcnRiZWF0KHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgJHQuaGVhcnRiZWF0KHtcclxuICAgICAgICBpZCxcclxuICAgICAgICAvLyBtb2RlLFxyXG4gICAgICAgIHR5cGUsXHJcbiAgICAgIH0pXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGhlYXJ0YmVhdCcsIGUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbXByZXNzaW9uKGRhdGE/OiBhbnksIG9iamVjdFR5cGU/OiBhbnkpIHtcclxuICAgIHRoaXMudHJpZ2dlck5QU1VwZGF0ZShkYXRhKVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZ2V0UGFnZURldGFpbHMoKVxyXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLnBhZ2VDb250ZXh0KSB7XHJcbiAgICAgICAgcGFnZS5wYWdlaWQgPSBkYXRhLnBhZ2VDb250ZXh0LnBhZ2VJZFxyXG4gICAgICAgIHBhZ2UubW9kdWxlID0gZGF0YS5wYWdlQ29udGV4dC5tb2R1bGVcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlZGF0YSA9IHtcclxuICAgICAgICBwYWdlaWQ6IHBhZ2UucGFnZWlkLCAvLyBSZXF1aXJlZC4gVW5pcXVlIHBhZ2UgaWRcclxuICAgICAgICB0eXBlOiBwYWdlLnBhZ2VVcmxQYXJ0c1swXSwgLy8gUmVxdWlyZWQuIEltcHJlc3Npb24gdHlwZSAobGlzdCwgZGV0YWlsLCB2aWV3LCBlZGl0LCB3b3JrZmxvdywgc2VhcmNoKVxyXG4gICAgICAgIHVyaTogcGFnZS5wYWdlVXJsLFxyXG4gICAgICB9XHJcbiAgICAgIGlmIChwYWdlLm9iamVjdElkKSB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudjogcGFnZS5tb2R1bGUgfHwgKHRoaXMudGVsZW1ldHJ5Q29uZmlnICYmIHRoaXMudGVsZW1ldHJ5Q29uZmlnLmVudiksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgIGlkOiBwYWdlLm9iamVjdElkLFxyXG4gICAgICAgICAgICB0eXBlOiBvYmplY3RUeXBlLFxyXG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgb3ZlcnJpZGUgYWJvdmUgaWQgaWYgdGhlIGRhdGEgaGFzIG9iamVjdCBpbiBpdC5cclxuICAgICAgICAgICAgLi4uKGRhdGEgJiYgZGF0YS5vYmplY3QpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFwYWdlLm9iamVjdElkIHx8ICFvYmplY3RUeXBlKSB7XHJcbiAgICAgICAgICBjb25maWcub2JqZWN0ID0ge31cclxuICAgICAgICB9XHJcbiAgICAgICAgJHQuaW1wcmVzc2lvbihlZGF0YSwgY29uZmlnKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICR0LmltcHJlc3Npb24oZWRhdGEsIHtcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhICYmIHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudjogcGFnZS5tb2R1bGUgfHwgJycsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICAgIC4uLihkYXRhICYmIGRhdGEub2JqZWN0KSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByZXZpb3VzVXJsID0gcGFnZS5wYWdlVXJsXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGltcHJlc3Npb24nLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXh0ZXJuYWxJbXByZXNzaW9uKGltcHJlc3Npb25EYXRhOiBhbnkpIHtcclxuICAgIC8vIHRoaXMudHJpZ2dlck5QU1VwZGF0ZShpbXByZXNzaW9uRGF0YSlcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgICAgaWYgKHRoaXMuZXh0ZXJuYWxBcHBzW2ltcHJlc3Npb25EYXRhLnN1YkFwcGxpY2F0aW9uTmFtZV0pIHtcclxuICAgICAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IHBhZ2Uub2JqZWN0SWQgPyB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5leHRlcm5hbEFwcHNbaW1wcmVzc2lvbkRhdGEuc3ViQXBwbGljYXRpb25OYW1lXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgaWQ6IHBhZ2Uub2JqZWN0SWQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0gOiB7XHJcbiAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICBpZDogdGhpcy5leHRlcm5hbEFwcHNbaW1wcmVzc2lvbkRhdGEuc3ViQXBwbGljYXRpb25OYW1lXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICAgICR0LmltcHJlc3Npb24oaW1wcmVzc2lvbkRhdGEuZGF0YSwgZXh0ZXJuYWxDb25maWcpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgZXh0ZXJuYWxJbXByZXNzaW9uJywgZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGZvciBQbGFydGZvcm0gcmF0aW5nXHJcbiAgYWRkQ3VzdG9tTGlzdGVuZXJGb3JQbGF0Zm9ybVJhdGluZygpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmdldFBSRXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICBldmVudCA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLmV2ZW50U3ViVHlwZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuUGxhdGZvcm1SYXRpbmcgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5tb2RlICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAkdC5pbnRlcmFjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEuZWRhdGEudHlwZSxcclxuICAgICAgICAgICAgICBzdWJ0eXBlOiBldmVudC5kYXRhLmVkYXRhLnN1YlR5cGUsXHJcbiAgICAgICAgICAgICAgaWQ6IChldmVudC5kYXRhLmVkYXRhICYmIGV2ZW50LmRhdGEuZWRhdGEuaWQpID9cclxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuZWRhdGEuaWRcclxuICAgICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgICAgICAgcGFnZWlkOiBldmVudC5wYWdlQ29udGV4dCAmJiBldmVudC5wYWdlQ29udGV4dC5wYWdlSWQgfHwgJycsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAuLi4oZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQubW9kdWxlID8geyBlbnY6IGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSB9IDogbnVsbCksXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEN1c3RvbUxpc3RlbmVyRm9yR2V0U3RhcnQoKSB7XHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5nZXRTdGFydEV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgZXZlbnQgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkdldFN0YXJ0ZWQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5tb2RlICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICBldmVudC5kYXRhLm9iamVjdCxcclxuICAgICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAkdC5pbnRlcmFjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEuZWRhdGEudHlwZSxcclxuICAgICAgICAgICAgICBzdWJ0eXBlOiBldmVudC5kYXRhLmVkYXRhLnN1YlR5cGUsXHJcbiAgICAgICAgICAgICAgaWQ6IChldmVudC5kYXRhLmVkYXRhICYmIGV2ZW50LmRhdGEuZWRhdGEuaWQpID9cclxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuZWRhdGEuaWRcclxuICAgICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgICAgICAgcGFnZWlkOiBldmVudC5wYWdlQ29udGV4dCAmJiBldmVudC5wYWdlQ29udGV4dC5wYWdlSWQgfHwgJycsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAuLi4oZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQubW9kdWxlID8geyBlbnY6IGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSB9IDogbnVsbCksXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEN1c3RvbUxpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuY2hhdGJvdEV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgZXZlbnQgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkNoYXRib3QgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5tb2RlICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuTG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgICAgbW9kZTogZXZlbnQuZGF0YS5tb2RlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50TW9kZS5QbGF5LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgZXZlbnQucGFnZUNvbnRleHRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAkdC5pbnRlcmFjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEuZWRhdGEudHlwZSxcclxuICAgICAgICAgICAgICBzdWJ0eXBlOiBldmVudC5kYXRhLmVkYXRhLnN1YlR5cGUsXHJcbiAgICAgICAgICAgICAgaWQ6IChldmVudC5kYXRhLmVkYXRhICYmIGV2ZW50LmRhdGEuZWRhdGEuaWQpID9cclxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuZWRhdGEuaWRcclxuICAgICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgICAgICAgcGFnZWlkOiBldmVudC5wYWdlQ29udGV4dCAmJiBldmVudC5wYWdlQ29udGV4dC5wYWdlSWQgfHwgJycsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAuLi4oZXZlbnQucGFnZUNvbnRleHQgJiYgZXZlbnQucGFnZUNvbnRleHQubW9kdWxlID8geyBlbnY6IGV2ZW50LnBhZ2VDb250ZXh0Lm1vZHVsZSB9IDogbnVsbCksXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGFkZEN1c3RvbUltcHJlc3Npb25MaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgKGV2ZW50OiBXc0V2ZW50cy5Xc0V2ZW50VGVsZW1ldHJ5SW1wcmVzc2lvbikgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YSAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLmV2ZW50U3ViVHlwZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuSW1wcmVzc2lvbixcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZXZlbnQuZGF0YTo6JywgZXZlbnQuZGF0YSlcclxuICAgICAgICAgIHRoaXMuaW1wcmVzc2lvbihldmVudC5kYXRhKVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBpbXByZXNzaW9uJywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRUaW1lU3BlbnRMaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgZXZlbnQgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS50eXBlID09PSBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGFnZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLm1vZGUgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YSxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgIGlmIChldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQpIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQpIHtcclxuICAgICAgICAgIHRoaXMuZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YS50eXBlIHx8IFdzRXZlbnRzLldzVGltZVNwZW50VHlwZS5QbGF5ZXIsXHJcbiAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkQ3VzdG9tRXZlbnRMaXN0ZW5lcigpIHtcclxuXHJcbiAgICB0aGlzLmV2ZW50c1N2Yy5ldmVudHMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5XHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5Mb2FkZWQgJiZcclxuICAgICAgICAgIGV2ZW50LmRhdGEudHlwZSAhPT0gV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllclxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSxcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBldmVudC5kYXRhLnN0YXRlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5VbmxvYWRlZCAmJlxyXG4gICAgICAgICAgZXZlbnQuZGF0YS50eXBlICE9PSBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuICBhZGRQbGF5ZXJMaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgZXZlbnQgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS50eXBlID09PSBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEubW9kZSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IGV2ZW50LmRhdGEuY29udGVudFxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGV2ZW50LmRhdGEuc3RhdGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkxvYWRlZCAmJlxyXG4gICAgICAgICAgKCFjb250ZW50IHx8XHJcbiAgICAgICAgICAgIChjb250ZW50LmlzSWZyYW1lU3VwcG9ydGVkIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnbWF5YmUnIHx8XHJcbiAgICAgICAgICAgIChjb250ZW50LmlzSWZyYW1lU3VwcG9ydGVkIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAneWVzJyB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicgfHwgJ2FwcGxpY2F0aW9uL2pzb24nKSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnQoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRUeXBlLlBsYXllcixcclxuICAgICAgICAgICAgICBtb2RlOiBldmVudC5kYXRhLm1vZGUgfHwgV3NFdmVudHMuV3NUaW1lU3BlbnRNb2RlLlBsYXksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICBldmVudC5wYWdlQ29udGV4dFxyXG5cclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZXZlbnQuZGF0YS5zdGF0ZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuVW5sb2FkZWQgJiZcclxuICAgICAgICAgICghY29udGVudCB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ21heWJlJyB8fFxyXG4gICAgICAgICAgICAoY29udGVudC5pc0lmcmFtZVN1cHBvcnRlZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3llcycgfHxcclxuICAgICAgICAgICAgKGNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnIHx8ICdhcHBsaWNhdGlvbi9qc29uJykpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRhdGEudHlwZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudFR5cGUuUGxheWVyLFxyXG4gICAgICAgICAgICAgIG1vZGU6IGV2ZW50LmRhdGEubW9kZSB8fCBXc0V2ZW50cy5Xc1RpbWVTcGVudE1vZGUuUGxheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgIGV2ZW50LnBhZ2VDb250ZXh0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkSW50ZXJhY3RMaXN0ZW5lcigpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFBhZ2VEZXRhaWxzKClcclxuICAgIHRoaXMudHJpZ2dlck5QU1VwZGF0ZShkYXRhLnBhZ2VpZClcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgKGV2ZW50OiBXc0V2ZW50cy5Xc0V2ZW50VGVsZW1ldHJ5SW50ZXJhY3QpID0+XHJcbiAgICAgICAgICAgIGV2ZW50ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcclxuICAgICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSBXc0V2ZW50cy5Xc0V2ZW50VHlwZS5UZWxlbWV0cnkgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YS5ldmVudFN1YlR5cGUgPT09IFdzRXZlbnRzLkVudW1UZWxlbWV0cnlTdWJUeXBlLkludGVyYWN0LFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZ2V0UGFnZURldGFpbHMoKVxyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZnJvbSA9PT0gJ3N0cmluZycgJiYgdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0pIHtcclxuICAgICAgICAgIGNvbnN0IGV4dGVybmFsQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgcGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5leHRlcm5hbEFwcHNbZXZlbnQuZnJvbV0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICR0LmludGVyYWN0KGV2ZW50LmRhdGEsIGV4dGVybmFsQ29uZmlnKVxyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBpbnRlcmFjdCcsIGUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGxldCBpbnRlcmFjdGlkXHJcbiAgICAgICAgICAvLyBpZiAoZXZlbnQuZGF0YS5lZGF0YS50eXBlID09PSAnZ29hbCcpIHtcclxuICAgICAgICAgIC8vICAgaW50ZXJhY3RpZCA9IHBhZ2UucGFnZVVybFBhcnRzWzRdXHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAkdC5pbnRlcmFjdChcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgICBzdWJ0eXBlOiBldmVudC5kYXRhLmVkYXRhLnN1YlR5cGUsXHJcbiAgICAgICAgICAgICAgICAvLyBvYmplY3Q6IGV2ZW50LmRhdGEub2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IChldmVudC5kYXRhLmVkYXRhICYmIGV2ZW50LmRhdGEuZWRhdGEuaWQpID9cclxuICAgICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5lZGF0YS5pZFxyXG4gICAgICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgICAgICAgICAgcGFnZWlkOiBldmVudC5kYXRhLnBhZ2VDb250ZXh0ICYmIGV2ZW50LmRhdGEucGFnZUNvbnRleHQucGFnZUlkIHx8IHBhZ2UucGFnZWlkLFxyXG4gICAgICAgICAgICAgICAgLi4uKGV2ZW50LmRhdGEuZWRhdGEudGFyZ2V0ICYmIHsgdGFyZ2V0OiBldmVudC5kYXRhLmVkYXRhLnRhcmdldCB9KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMucERhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIC4uLihldmVudC5wYWdlQ29udGV4dCAmJiBldmVudC5wYWdlQ29udGV4dC5tb2R1bGUgPyB7IGVudjogZXZlbnQucGFnZUNvbnRleHQubW9kdWxlIH0gOiBudWxsKSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgICAgLi4uZXZlbnQuZGF0YS5vYmplY3QsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGludGVyYWN0JywgZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRGZWVkYmFja0xpc3RlbmVyKCkge1xyXG4gICAgdGhpcy5ldmVudHNTdmMuZXZlbnRzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAoZXZlbnQ6IFdzRXZlbnRzLldzRXZlbnRUZWxlbWV0cnlGZWVkYmFjaykgPT5cclxuICAgICAgICAgICAgZXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQuZGF0YSAmJlxyXG4gICAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09IFdzRXZlbnRzLldzRXZlbnRUeXBlLlRlbGVtZXRyeSAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhLmV2ZW50U3ViVHlwZSA9PT0gV3NFdmVudHMuRW51bVRlbGVtZXRyeVN1YlR5cGUuRmVlZGJhY2ssXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5nZXRQYWdlRGV0YWlscygpXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICR0LmZlZWRiYWNrKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgcmF0aW5nOiBldmVudC5kYXRhLm9iamVjdC5yYXRpbmcgfHwgMCxcclxuICAgICAgICAgICAgICBjb21tZW50aWQ6IGV2ZW50LmRhdGEub2JqZWN0LmNvbW1lbnRpZCB8fCAnJyxcclxuICAgICAgICAgICAgICBjb21tZW50dHh0OiBldmVudC5kYXRhLm9iamVjdC5jb21tZW50dHh0IHx8ICcnLFxyXG4gICAgICAgICAgICAgIHBhZ2VpZDogcGFnZS5wYWdlaWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgICAgICAgIGlkOiBldmVudC5kYXRhLm9iamVjdC5jb250ZW50SWQgfHwgZXZlbnQuZGF0YS5vYmplY3QuaWQgfHwgJycsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLmVkYXRhLnR5cGUgfHwgJycsXHJcbiAgICAgICAgICAgICAgICB2ZXI6IGAkeyhldmVudC5kYXRhLm9iamVjdC52ZXJzaW9uIHx8ICcxJyl9JHsnJ31gLFxyXG4gICAgICAgICAgICAgICAgcm9sbHVwOiB7fSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBpbnRlcmFjdCcsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkSGVhcmJlYXRMaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgKGV2ZW50OiBXc0V2ZW50cy5Xc0V2ZW50VGVsZW1ldHJ5SGVhcnRCZWF0KSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5IZWFydEJlYXQsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmZyb20gPT09ICdzdHJpbmcnICYmIHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dKSB7XHJcbiAgICAgICAgICBjb25zdCBleHRlcm5hbENvbmZpZyA9IHtcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLnBEYXRhLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZXh0ZXJuYWxBcHBzW2V2ZW50LmZyb21dLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAkdC5oZWFydGJlYXQoZXZlbnQuZGF0YSwgZXh0ZXJuYWxDb25maWcpXHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgaW4gdGVsZW1ldHJ5IGhlYXJ0YmVhdCcsIGUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICR0LmhlYXJ0YmVhdChcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBldmVudC5kYXRhLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAvLyBzdWJ0eXBlOiBldmVudC5kYXRhLmV2ZW50U3ViVHlwZSxcclxuICAgICAgICAgICAgICAgIGlkOiBldmVudC5kYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgLy8gbWltZVR5cGU6IGV2ZW50LmRhdGEubWltZVR5cGUsXHJcbiAgICAgICAgICAgICAgICAvLyBtb2RlOiBldmVudC5kYXRhLm1vZGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5wRGF0YS5pZCxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiB0ZWxlbWV0cnkgaGVhcnRiZWF0JywgZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRTZWFyY2hMaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuZXZlbnRzU3ZjLmV2ZW50cyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKFxyXG4gICAgICAgICAgKGV2ZW50OiBXc0V2ZW50cy5Xc0V2ZW50VGVsZW1ldHJ5U2VhcmNoKSA9PlxyXG4gICAgICAgICAgICBldmVudCAmJlxyXG4gICAgICAgICAgICBldmVudC5kYXRhICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gV3NFdmVudHMuV3NFdmVudFR5cGUuVGVsZW1ldHJ5ICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuZXZlbnRTdWJUeXBlID09PSBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5U3ViVHlwZS5TZWFyY2gsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgJHQuc2VhcmNoKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgcXVlcnk6IGV2ZW50LmRhdGEucXVlcnksXHJcbiAgICAgICAgICAgICAgZmlsdGVyczogZXZlbnQuZGF0YS5maWx0ZXJzLFxyXG4gICAgICAgICAgICAgIHNpemU6IGV2ZW50LmRhdGEuc2l6ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMucERhdGEsXHJcbiAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnBEYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHRlbGVtZXRyeSBzZWFyY2gnLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldFBhZ2VEZXRhaWxzKCkge1xyXG4gICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKCcvJywgJycpXHJcbiAgICBjb25zdCB1cmwgPSBwYXRoICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaFxyXG4gICAgbGV0IG1vZHVsZVZhbHVlID0gJydcclxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCdkaXNjdXNzaW9uLWZvcnVtJykpIHtcclxuICAgICAgbW9kdWxlVmFsdWUgPSAnRGlzY3VzcydcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBhZ2VpZDogcGF0aCxcclxuICAgICAgcGFnZVVybDogdXJsLFxyXG4gICAgICBwYWdlVXJsUGFydHM6IHBhdGguc3BsaXQoJy8nKSxcclxuICAgICAgcmVmZmVyVXJsOiB0aGlzLnByZXZpb3VzVXJsLFxyXG4gICAgICBvYmplY3RJZDogdGhpcy5leHRyYWN0Q29udGVudElkRnJvbVVybFBhcnRzKHBhdGguc3BsaXQoJy8nKSksXHJcbiAgICAgIG1vZHVsZTogbW9kdWxlVmFsdWUsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHRyYWN0Q29udGVudElkRnJvbVVybFBhcnRzKHVybFBhcnRzOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gVE9ETzogcGljayB0b2MgYW5kIHZpZXdlciB1cmwgZnJvbSBzb21lIGNvbmZpZ3VyYXRpb25cclxuICAgIGNvbnN0IHRvY0lkeCA9IHVybFBhcnRzLmluZGV4T2YoJ3RvYycpXHJcbiAgICBjb25zdCB2aWV3ZXJJZHggPSB1cmxQYXJ0cy5pbmRleE9mKCd2aWV3ZXInKVxyXG5cclxuICAgIGlmICh0b2NJZHggPT09IC0xICYmIHZpZXdlcklkeCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodG9jSWR4ICE9PSAtMSAmJiB0b2NJZHggPCB1cmxQYXJ0cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgIHJldHVybiB1cmxQYXJ0c1t0b2NJZHggKyAxXSAvLyBlLmcuIHVybCAvYXBwL3RvYy88Y29udGVudF9pZD5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodmlld2VySWR4ICE9PSAtMSAmJiB2aWV3ZXJJZHggPCB1cmxQYXJ0cy5sZW5ndGggLSAyKSB7XHJcbiAgICAgIHJldHVybiB1cmxQYXJ0c1t2aWV3ZXJJZHggKyAyXSAvLyBlLmcuIHVybCAvYXBwL3ZpZXdlci88Y29udGVudF90eXBlPi88Y29udGVudF9pZD5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG4iXX0=
|