@eui/core 16.1.1 → 17.0.0-next.1
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/docs/classes/UpdateUserRightsAction.html +3 -3
- package/docs/dependencies.html +2 -2
- package/docs/injectables/CoreAppEffects.html +12 -10
- package/docs/injectables/{UxDynamicMenuService.html → EuiDynamicMenuService.html} +10 -10
- package/docs/injectables/EuiPermissionService.html +4 -4
- package/docs/injectables/{UxTimezoneService.html → EuiTimezoneService.html} +5 -5
- package/docs/injectables/UxAppShellService.html +123 -1207
- package/docs/interfaces/{TimeZone.html → EuiTimeZone.html} +3 -3
- package/docs/interfaces/UIState.html +8 -8
- package/docs/js/menu-wc.js +9 -9
- package/docs/js/search/search_index.js +2 -2
- package/docs/miscellaneous/variables.html +705 -705
- package/esm2022/lib/services/dynamic-menu/dynamic-menu.service.mjs +66 -0
- package/esm2022/lib/services/errors/http-error-handler-callback-functions.mjs +5 -4
- package/esm2022/lib/services/eui-timezone.service.mjs +716 -0
- package/esm2022/lib/services/i18n/i18n.service.mjs +5 -5
- package/esm2022/lib/services/index.mjs +3 -3
- package/esm2022/lib/services/permission/permission.service.mjs +2 -2
- package/esm2022/lib/services/store/actions/user.actions.mjs +1 -1
- package/esm2022/lib/services/store/effects/app.effects.mjs +13 -3
- package/esm2022/lib/services/ux-app-shell.service.mjs +3 -149
- package/esm2022/lib/services/ux-error-feedback/ux-error-feedback.service.mjs +26 -17
- package/fesm2022/eui-core.mjs +63 -189
- package/fesm2022/eui-core.mjs.map +1 -1
- package/lib/services/dynamic-menu/dynamic-menu.service.d.ts +15 -0
- package/lib/services/dynamic-menu/dynamic-menu.service.d.ts.map +1 -0
- package/lib/services/errors/http-error-handler-callback-functions.d.ts.map +1 -1
- package/lib/services/{ux-timezone.service.d.ts → eui-timezone.service.d.ts} +9 -9
- package/lib/services/eui-timezone.service.d.ts.map +1 -0
- package/lib/services/index.d.ts +2 -2
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/permission/permission.service.d.ts +7 -7
- package/lib/services/permission/permission.service.d.ts.map +1 -1
- package/lib/services/store/actions/user.actions.d.ts +3 -3
- package/lib/services/store/actions/user.actions.d.ts.map +1 -1
- package/lib/services/store/effects/app.effects.d.ts.map +1 -1
- package/lib/services/ux-app-shell.service.d.ts +8 -31
- package/lib/services/ux-app-shell.service.d.ts.map +1 -1
- package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts.map +1 -1
- package/package.json +2 -2
- package/esm2022/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs +0 -66
- package/esm2022/lib/services/ux-timezone.service.mjs +0 -717
- package/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.d.ts +0 -15
- package/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.d.ts.map +0 -1
- package/lib/services/ux-timezone.service.d.ts.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { getUserState } from '@eui/base';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../permission/permission.service";
|
|
5
|
+
import * as i2 from "../store/store.service";
|
|
6
|
+
export class EuiDynamicMenuService {
|
|
7
|
+
// TODO: it should be moved euiservice, or it should be static
|
|
8
|
+
// TODO: can we moved that service inside the module of the component that's using it?
|
|
9
|
+
constructor(uxPermission, store) {
|
|
10
|
+
this.uxPermission = uxPermission;
|
|
11
|
+
this.store = store;
|
|
12
|
+
this.menuLinks = [];
|
|
13
|
+
this.store.select(getUserState).subscribe((user) => {
|
|
14
|
+
if (user.menuLinks) {
|
|
15
|
+
this.menuLinks = user.menuLinks;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
getMenuLinks() {
|
|
20
|
+
return this.menuLinks;
|
|
21
|
+
}
|
|
22
|
+
filterEuiMenuItemsWithRights(links) {
|
|
23
|
+
return links.filter((link) => {
|
|
24
|
+
if (link.hasChildren) {
|
|
25
|
+
link.children = this.filterEuiMenuItemsWithRights(link.children);
|
|
26
|
+
}
|
|
27
|
+
// First check if the user is denied access:
|
|
28
|
+
if (link.deniedRightId) {
|
|
29
|
+
if (this.uxPermission.checkRight(link.deniedRightId)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (link.deniedRightIds) {
|
|
34
|
+
for (const deniedRightId of link.deniedRightIds) {
|
|
35
|
+
if (this.uxPermission.checkRight(deniedRightId)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Then check if the user needs to be allowed access explicitly:
|
|
41
|
+
if (link.allowedRightId) {
|
|
42
|
+
return this.uxPermission.checkRight(link.allowedRightId);
|
|
43
|
+
}
|
|
44
|
+
if (link.allowedRightIds) {
|
|
45
|
+
for (const allowedRightId of link.allowedRightIds) {
|
|
46
|
+
if (this.uxPermission.checkRight(allowedRightId)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// User doesn't have one of the allowed rights. Deny access:
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Access to the menu item is not denied, therefore allow it:
|
|
54
|
+
return true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: EuiDynamicMenuService, deps: [{ token: i1.EuiPermissionService }, { token: i2.StoreService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
58
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: EuiDynamicMenuService, providedIn: 'root' }); }
|
|
59
|
+
}
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: EuiDynamicMenuService, decorators: [{
|
|
61
|
+
type: Injectable,
|
|
62
|
+
args: [{
|
|
63
|
+
providedIn: 'root',
|
|
64
|
+
}]
|
|
65
|
+
}], ctorParameters: function () { return [{ type: i1.EuiPermissionService }, { type: i2.StoreService }]; } });
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2R5bmFtaWMtbWVudS9keW5hbWljLW1lbnUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxXQUFXLENBQUM7Ozs7QUFPdEQsTUFBTSxPQUFPLHFCQUFxQjtJQUc5Qiw4REFBOEQ7SUFDOUQsc0ZBQXNGO0lBQ3RGLFlBQW9CLFlBQWtDLEVBQVUsS0FBbUI7UUFBL0QsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUpuRixjQUFTLEdBQWUsRUFBRSxDQUFDO1FBS3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQy9DLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ25DO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsNEJBQTRCLENBQUMsS0FBeUI7UUFDbEQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDcEU7WUFFRCw0Q0FBNEM7WUFDNUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtvQkFDbEQsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2FBQ0o7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3JCLEtBQUssTUFBTSxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDN0MsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRTt3QkFDN0MsT0FBTyxLQUFLLENBQUM7cUJBQ2hCO2lCQUNKO2FBQ0o7WUFFRCxnRUFBZ0U7WUFDaEUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM1RDtZQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsS0FBSyxNQUFNLGNBQWMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUMvQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFO3dCQUM5QyxPQUFPLElBQUksQ0FBQztxQkFDZjtpQkFDSjtnQkFDRCw0REFBNEQ7Z0JBQzVELE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsNkRBQTZEO1lBQzdELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztpSUF0RFEscUJBQXFCO3FJQUFyQixxQkFBcUIsY0FGbEIsTUFBTTs7MkZBRVQscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldFVzZXJTdGF0ZSwgRXVpTWVudUl0ZW0gfSBmcm9tICdAZXVpL2Jhc2UnO1xuaW1wb3J0IHsgRXVpUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICcuLi9wZXJtaXNzaW9uL3Blcm1pc3Npb24uc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yZS9zdG9yZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRXVpRHluYW1pY01lbnVTZXJ2aWNlIHtcbiAgICBtZW51TGlua3M6IEFycmF5PGFueT4gPSBbXTtcblxuICAgIC8vIFRPRE86IGl0IHNob3VsZCBiZSBtb3ZlZCBldWlzZXJ2aWNlLCBvciBpdCBzaG91bGQgYmUgc3RhdGljXG4gICAgLy8gVE9ETzogY2FuIHdlIG1vdmVkIHRoYXQgc2VydmljZSBpbnNpZGUgdGhlIG1vZHVsZSBvZiB0aGUgY29tcG9uZW50IHRoYXQncyB1c2luZyBpdD9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV4UGVybWlzc2lvbjogRXVpUGVybWlzc2lvblNlcnZpY2UsIHByaXZhdGUgc3RvcmU6IFN0b3JlU2VydmljZSkge1xuICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRVc2VyU3RhdGUpLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXIubWVudUxpbmtzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51TGlua3MgPSB1c2VyLm1lbnVMaW5rcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0TWVudUxpbmtzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW51TGlua3M7XG4gICAgfVxuXG4gICAgZmlsdGVyRXVpTWVudUl0ZW1zV2l0aFJpZ2h0cyhsaW5rczogQXJyYXk8RXVpTWVudUl0ZW0+KTogQXJyYXk8RXVpTWVudUl0ZW0+IHtcbiAgICAgICAgcmV0dXJuIGxpbmtzLmZpbHRlcigobGluaykgPT4ge1xuICAgICAgICAgICAgaWYgKGxpbmsuaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBsaW5rLmNoaWxkcmVuID0gdGhpcy5maWx0ZXJFdWlNZW51SXRlbXNXaXRoUmlnaHRzKGxpbmsuY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgdXNlciBpcyBkZW5pZWQgYWNjZXNzOlxuICAgICAgICAgICAgaWYgKGxpbmsuZGVuaWVkUmlnaHRJZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnV4UGVybWlzc2lvbi5jaGVja1JpZ2h0KGxpbmsuZGVuaWVkUmlnaHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsaW5rLmRlbmllZFJpZ2h0SWRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZW5pZWRSaWdodElkIG9mIGxpbmsuZGVuaWVkUmlnaHRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXhQZXJtaXNzaW9uLmNoZWNrUmlnaHQoZGVuaWVkUmlnaHRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhlbiBjaGVjayBpZiB0aGUgdXNlciBuZWVkcyB0byBiZSBhbGxvd2VkIGFjY2VzcyBleHBsaWNpdGx5OlxuICAgICAgICAgICAgaWYgKGxpbmsuYWxsb3dlZFJpZ2h0SWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51eFBlcm1pc3Npb24uY2hlY2tSaWdodChsaW5rLmFsbG93ZWRSaWdodElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsaW5rLmFsbG93ZWRSaWdodElkcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWxsb3dlZFJpZ2h0SWQgb2YgbGluay5hbGxvd2VkUmlnaHRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXhQZXJtaXNzaW9uLmNoZWNrUmlnaHQoYWxsb3dlZFJpZ2h0SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBVc2VyIGRvZXNuJ3QgaGF2ZSBvbmUgb2YgdGhlIGFsbG93ZWQgcmlnaHRzLiBEZW55IGFjY2VzczpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFjY2VzcyB0byB0aGUgbWVudSBpdGVtIGlzIG5vdCBkZW5pZWQsIHRoZXJlZm9yZSBhbGxvdyBpdDpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LogService } from '../log/log.service';
|
|
2
|
-
import { UxAppShellService } from '../ux-app-shell.service';
|
|
2
|
+
// import { UxAppShellService } from '../ux-app-shell.service';
|
|
3
3
|
export function AlertHttpErrorCallbackFn(error) {
|
|
4
4
|
alert(error.statusText);
|
|
5
5
|
}
|
|
@@ -11,7 +11,8 @@ export function LogHttpErrorCallbackFn(error, injector) {
|
|
|
11
11
|
logService.error('HttpError', error);
|
|
12
12
|
}
|
|
13
13
|
export function GrowlHttpErrorCallbackFn(error, injector) {
|
|
14
|
-
|
|
15
|
-
asService.
|
|
14
|
+
// TODO v17 should not display growl from here but from where it's called
|
|
15
|
+
// const asService = injector.get(UxAppShellService);
|
|
16
|
+
// asService.growlError(error.statusText);
|
|
16
17
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1lcnJvci1oYW5kbGVyLWNhbGxiYWNrLWZ1bmN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZXJyb3JzL2h0dHAtZXJyb3ItaGFuZGxlci1jYWxsYmFjay1mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELCtEQUErRDtBQUUvRCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBd0I7SUFDN0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEtBQXdCO0lBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsS0FBd0IsRUFBRSxRQUFrQjtJQUMvRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBd0IsRUFBRSxRQUFrQjtJQUNqRix5RUFBeUU7SUFDekUscURBQXFEO0lBQ3JELDBDQUEwQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJy4uL2xvZy9sb2cuc2VydmljZSc7XG4vLyBpbXBvcnQgeyBVeEFwcFNoZWxsU2VydmljZSB9IGZyb20gJy4uL3V4LWFwcC1zaGVsbC5zZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIEFsZXJ0SHR0cEVycm9yQ2FsbGJhY2tGbihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICBhbGVydChlcnJvci5zdGF0dXNUZXh0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvbnNvbGVIdHRwRXJyb3JDYWxsYmFja0ZuKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0h0dHBFcnJvcicsIGVycm9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExvZ0h0dHBFcnJvckNhbGxiYWNrRm4oZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlLCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBjb25zdCBsb2dTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KExvZ1NlcnZpY2UpO1xuICAgIGxvZ1NlcnZpY2UuZXJyb3IoJ0h0dHBFcnJvcicsIGVycm9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdyb3dsSHR0cEVycm9yQ2FsbGJhY2tGbihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UsIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIC8vIFRPRE8gdjE3IHNob3VsZCBub3QgZGlzcGxheSBncm93bCBmcm9tIGhlcmUgYnV0IGZyb20gd2hlcmUgaXQncyBjYWxsZWRcbiAgICAvLyBjb25zdCBhc1NlcnZpY2UgPSBpbmplY3Rvci5nZXQoVXhBcHBTaGVsbFNlcnZpY2UpO1xuICAgIC8vIGFzU2VydmljZS5ncm93bEVycm9yKGVycm9yLnN0YXR1c1RleHQpO1xufVxuIl19
|