@azure/msal-angular 2.5.7 → 3.0.0-alpha.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.
Files changed (69) hide show
  1. package/IMsalService.d.ts +2 -3
  2. package/README.md +14 -9
  3. package/constants.d.ts +1 -2
  4. package/esm2020/IMsalService.mjs +6 -0
  5. package/esm2020/constants.mjs +10 -0
  6. package/{esm2015/msal.broadcast.config.js → esm2020/msal.broadcast.config.mjs} +1 -1
  7. package/esm2020/msal.broadcast.service.mjs +57 -0
  8. package/esm2020/msal.guard.config.mjs +6 -0
  9. package/esm2020/msal.guard.mjs +218 -0
  10. package/esm2020/msal.interceptor.config.mjs +6 -0
  11. package/esm2020/msal.interceptor.mjs +270 -0
  12. package/esm2020/msal.module.mjs +46 -0
  13. package/esm2020/msal.navigation.client.mjs +51 -0
  14. package/esm2020/msal.redirect.component.mjs +31 -0
  15. package/esm2020/msal.service.mjs +81 -0
  16. package/{esm2015/packageMetadata.js → esm2020/packageMetadata.mjs} +2 -2
  17. package/esm2020/public-api.mjs +18 -0
  18. package/fesm2015/{azure-msal-angular.js → azure-msal-angular.mjs} +259 -180
  19. package/fesm2015/azure-msal-angular.mjs.map +1 -0
  20. package/fesm2020/azure-msal-angular.mjs +732 -0
  21. package/fesm2020/azure-msal-angular.mjs.map +1 -0
  22. package/{azure-msal-angular.d.ts → index.d.ts} +1 -1
  23. package/msal.broadcast.config.d.ts +0 -1
  24. package/msal.broadcast.service.d.ts +7 -5
  25. package/msal.guard.config.d.ts +4 -5
  26. package/msal.guard.d.ts +12 -10
  27. package/msal.interceptor.config.d.ts +4 -5
  28. package/msal.interceptor.d.ts +11 -8
  29. package/msal.module.d.ts +10 -5
  30. package/msal.navigation.client.d.ts +7 -5
  31. package/msal.redirect.component.d.ts +5 -3
  32. package/msal.service.d.ts +7 -5
  33. package/package.json +25 -14
  34. package/packageMetadata.d.ts +1 -2
  35. package/public-api.d.ts +13 -14
  36. package/IMsalService.d.ts.map +0 -1
  37. package/azure-msal-angular.d.ts.map +0 -1
  38. package/azure-msal-angular.metadata.json +0 -1
  39. package/bundles/azure-msal-angular.umd.js +0 -1071
  40. package/bundles/azure-msal-angular.umd.js.map +0 -1
  41. package/bundles/azure-msal-angular.umd.min.js +0 -2
  42. package/bundles/azure-msal-angular.umd.min.js.map +0 -1
  43. package/constants.d.ts.map +0 -1
  44. package/esm2015/IMsalService.js +0 -6
  45. package/esm2015/constants.js +0 -10
  46. package/esm2015/msal.broadcast.service.js +0 -46
  47. package/esm2015/msal.guard.config.js +0 -6
  48. package/esm2015/msal.guard.js +0 -189
  49. package/esm2015/msal.interceptor.config.js +0 -6
  50. package/esm2015/msal.interceptor.js +0 -230
  51. package/esm2015/msal.module.js +0 -46
  52. package/esm2015/msal.navigation.client.js +0 -53
  53. package/esm2015/msal.redirect.component.js +0 -33
  54. package/esm2015/msal.service.js +0 -77
  55. package/esm2015/public-api.js +0 -18
  56. package/fesm2015/azure-msal-angular.js.map +0 -1
  57. package/msal.broadcast.config.d.ts.map +0 -1
  58. package/msal.broadcast.service.d.ts.map +0 -1
  59. package/msal.guard.config.d.ts.map +0 -1
  60. package/msal.guard.d.ts.map +0 -1
  61. package/msal.interceptor.config.d.ts.map +0 -1
  62. package/msal.interceptor.d.ts.map +0 -1
  63. package/msal.module.d.ts.map +0 -1
  64. package/msal.navigation.client.d.ts.map +0 -1
  65. package/msal.redirect.component.d.ts.map +0 -1
  66. package/msal.service.d.ts.map +0 -1
  67. package/packageMetadata.d.ts.map +0 -1
  68. package/public-api.d.ts.map +0 -1
  69. /package/{esm2015/azure-msal-angular.js → esm2020/azure-msal-angular.mjs} +0 -0
@@ -1,189 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { Router } from "@angular/router";
6
- import { MsalService } from "./msal.service";
7
- import { Injectable, Inject, VERSION } from "@angular/core";
8
- import { Location } from "@angular/common";
9
- import { InteractionType, BrowserConfigurationAuthError, BrowserUtils, UrlString } from "@azure/msal-browser";
10
- import { MSAL_GUARD_CONFIG } from "./constants";
11
- import { concatMap, catchError, map } from "rxjs/operators";
12
- import { of } from "rxjs";
13
- import { MsalBroadcastService } from "./msal.broadcast.service";
14
- export class MsalGuard {
15
- constructor(msalGuardConfig, msalBroadcastService, authService, location, router) {
16
- this.msalGuardConfig = msalGuardConfig;
17
- this.msalBroadcastService = msalBroadcastService;
18
- this.authService = authService;
19
- this.location = location;
20
- this.router = router;
21
- // Subscribing so events in MsalGuard will set inProgress$ observable
22
- this.msalBroadcastService.inProgress$.subscribe();
23
- }
24
- /**
25
- * Parses url string to UrlTree
26
- * @param url
27
- */
28
- parseUrl(url) {
29
- return this.router.parseUrl(url);
30
- }
31
- /**
32
- * Builds the absolute url for the destination page
33
- * @param path Relative path of requested page
34
- * @returns Full destination url
35
- */
36
- getDestinationUrl(path) {
37
- this.authService.getLogger().verbose("Guard - getting destination url");
38
- // Absolute base url for the application (default to origin if base element not present)
39
- const baseElements = document.getElementsByTagName("base");
40
- const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);
41
- // Path of page (including hash, if using hash routing)
42
- const pathUrl = this.location.prepareExternalUrl(path);
43
- // Hash location strategy
44
- if (pathUrl.startsWith("#")) {
45
- this.authService.getLogger().verbose("Guard - destination by hash routing");
46
- return `${baseUrl}/${pathUrl}`;
47
- }
48
- /*
49
- * If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).
50
- * Since baseUrl also includes /base, can just concatentate baseUrl + path
51
- */
52
- return `${baseUrl}${path}`;
53
- }
54
- /**
55
- * Interactively prompt the user to login
56
- * @param url Path of the requested page
57
- */
58
- loginInteractively(state) {
59
- const authRequest = typeof this.msalGuardConfig.authRequest === "function"
60
- ? this.msalGuardConfig.authRequest(this.authService, state)
61
- : Object.assign({}, this.msalGuardConfig.authRequest);
62
- if (this.msalGuardConfig.interactionType === InteractionType.Popup) {
63
- this.authService.getLogger().verbose("Guard - logging in by popup");
64
- return this.authService.loginPopup(authRequest)
65
- .pipe(map((response) => {
66
- this.authService.getLogger().verbose("Guard - login by popup successful, can activate, setting active account");
67
- this.authService.instance.setActiveAccount(response.account);
68
- return true;
69
- }));
70
- }
71
- this.authService.getLogger().verbose("Guard - logging in by redirect");
72
- const redirectStartPage = this.getDestinationUrl(state.url);
73
- return this.authService.loginRedirect(Object.assign({ redirectStartPage }, authRequest))
74
- .pipe(map(() => false));
75
- }
76
- /**
77
- * Helper which checks for the correct interaction type, prevents page with Guard to be set as reidrect, and calls handleRedirectObservable
78
- * @param state
79
- */
80
- activateHelper(state) {
81
- if (this.msalGuardConfig.interactionType !== InteractionType.Popup && this.msalGuardConfig.interactionType !== InteractionType.Redirect) {
82
- throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Guard. InteractionType.Popup or InteractionType.Redirect must be provided in the MsalGuardConfiguration");
83
- }
84
- this.authService.getLogger().verbose("MSAL Guard activated");
85
- /*
86
- * If a page with MSAL Guard is set as the redirect for acquireTokenSilent,
87
- * short-circuit to prevent redirecting or popups.
88
- */
89
- if (typeof window !== "undefined") {
90
- if (UrlString.hashContainsKnownProperties(window.location.hash) && BrowserUtils.isInIframe() && !this.authService.instance.getConfiguration().system.allowRedirectInIframe) {
91
- this.authService.getLogger().warning("Guard - redirectUri set to page with MSAL Guard. It is recommended to not set redirectUri to a page that requires authentication.");
92
- return of(false);
93
- }
94
- }
95
- else {
96
- this.authService.getLogger().info("Guard - window is undefined, MSAL does not support server-side token acquisition");
97
- return of(true);
98
- }
99
- /**
100
- * If a loginFailedRoute is set in the config, set this as the loginFailedRoute
101
- */
102
- if (this.msalGuardConfig.loginFailedRoute) {
103
- this.loginFailedRoute = this.parseUrl(this.msalGuardConfig.loginFailedRoute);
104
- }
105
- // Capture current path before it gets changed by handleRedirectObservable
106
- const currentPath = this.location.path(true);
107
- return this.authService.handleRedirectObservable()
108
- .pipe(concatMap(() => {
109
- if (!this.authService.instance.getAllAccounts().length) {
110
- if (state) {
111
- this.authService.getLogger().verbose("Guard - no accounts retrieved, log in required to activate");
112
- return this.loginInteractively(state);
113
- }
114
- this.authService.getLogger().verbose("Guard - no accounts retrieved, no state, cannot load");
115
- return of(false);
116
- }
117
- this.authService.getLogger().verbose("Guard - at least 1 account exists, can activate or load");
118
- // Prevent navigating the app to /#code= or /code=
119
- if (state) {
120
- /*
121
- * Path routing:
122
- * state.url: /#code=...
123
- * state.root.fragment: code=...
124
- */
125
- /*
126
- * Hash routing:
127
- * state.url: /code
128
- * state.root.fragment: null
129
- */
130
- const urlContainsCode = this.includesCode(state.url);
131
- const fragmentContainsCode = !!state.root && !!state.root.fragment && this.includesCode(`#${state.root.fragment}`);
132
- const hashRouting = this.location.prepareExternalUrl(state.url).indexOf("#") === 0;
133
- // Ensure code parameter is in fragment (and not in query parameter), or that hash hash routing is used
134
- if (urlContainsCode && (fragmentContainsCode || hashRouting)) {
135
- this.authService.getLogger().info("Guard - Hash contains known code response, stopping navigation.");
136
- // Path routing (navigate to current path without hash)
137
- if (currentPath.indexOf("#") > -1) {
138
- return of(this.parseUrl(this.location.path()));
139
- }
140
- // Hash routing (navigate to root path)
141
- return of(this.parseUrl(""));
142
- }
143
- }
144
- return of(true);
145
- }), catchError((error) => {
146
- this.authService.getLogger().error("Guard - error while logging in, unable to activate");
147
- this.authService.getLogger().errorPii(`Guard - error: ${error.message}`);
148
- /**
149
- * If a loginFailedRoute is set, checks to see if Angular 10+ is used and state is passed in before returning route
150
- * Apps using Angular 9 will receive of(false) in canLoad interface, as it does not support UrlTree return types
151
- */
152
- if (this.loginFailedRoute && parseInt(VERSION.major, 10) > 9 && state) {
153
- this.authService.getLogger().verbose("Guard - loginFailedRoute set, redirecting");
154
- return of(this.loginFailedRoute);
155
- }
156
- return of(false);
157
- }));
158
- }
159
- includesCode(path) {
160
- return (path.lastIndexOf("/code") > -1 &&
161
- path.lastIndexOf("/code") === path.length - "/code".length) || // path.endsWith("/code")
162
- path.indexOf("#code=") > -1 ||
163
- path.indexOf("&code=") > -1;
164
- }
165
- canActivate(route, state) {
166
- this.authService.getLogger().verbose("Guard - canActivate");
167
- return this.activateHelper(state);
168
- }
169
- canActivateChild(route, state) {
170
- this.authService.getLogger().verbose("Guard - canActivateChild");
171
- return this.activateHelper(state);
172
- }
173
- canLoad() {
174
- this.authService.getLogger().verbose("Guard - canLoad");
175
- // @ts-ignore
176
- return this.activateHelper();
177
- }
178
- }
179
- MsalGuard.decorators = [
180
- { type: Injectable }
181
- ];
182
- MsalGuard.ctorParameters = () => [
183
- { type: undefined, decorators: [{ type: Inject, args: [MSAL_GUARD_CONFIG,] }] },
184
- { type: MsalBroadcastService },
185
- { type: MsalService },
186
- { type: Location },
187
- { type: Router }
188
- ];
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBZ0csTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUF1RCxNQUFNLHFCQUFxQixDQUFDO0FBRW5LLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR2hFLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQ3VDLGVBQXVDLEVBQ2xFLG9CQUEwQyxFQUMxQyxXQUF3QixFQUN4QixRQUFrQixFQUNsQixNQUFjO1FBSmEsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ2xFLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFD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Q0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkseUJBQXlCO1lBQ3hGLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RCxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQzs7O1lBeE1KLFVBQVU7Ozs0Q0FLRixNQUFNLFNBQUMsaUJBQWlCO1lBUHhCLG9CQUFvQjtZQVJwQixXQUFXO1lBRVgsUUFBUTtZQUhzRixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBDYW5BY3RpdmF0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyU3RhdGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGVDaGlsZCwgQ2FuTG9hZCwgVXJsVHJlZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFZFUlNJT04gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25UeXBlLCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvciwgQnJvd3NlclV0aWxzLCBVcmxTdHJpbmcsIFBvcHVwUmVxdWVzdCwgUmVkaXJlY3RSZXF1ZXN0LCBBdXRoZW50aWNhdGlvblJlc3VsdCB9IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XHJcbmltcG9ydCB7IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9tc2FsLmd1YXJkLmNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBNU0FMX0dVQVJEX0NPTkZJRyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE1zYWxCcm9hZGNhc3RTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5icm9hZGNhc3Quc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTXNhbEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQsIENhbkxvYWQge1xyXG4gICAgcHJpdmF0ZSBsb2dpbkZhaWxlZFJvdXRlPzogVXJsVHJlZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KE1TQUxfR1VBUkRfQ09ORklHKSBwcml2YXRlIG1zYWxHdWFyZENvbmZpZzogTXNhbEd1YXJkQ29uZmlndXJhdGlvbixcclxuICAgICAgICBwcml2YXRlIG1zYWxCcm9hZGNhc3RTZXJ2aWNlOiBNc2FsQnJvYWRjYXN0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBNc2FsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXHJcbiAgICApIHsgXHJcbiAgICAgICAgLy8gU3Vic2NyaWJpbmcgc28gZXZlbnRzIGluIE1zYWxHdWFyZCB3aWxsIHNldCBpblByb2dyZXNzJCBvYnNlcnZhYmxlXHJcbiAgICAgICAgdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyB1cmwgc3RyaW5nIHRvIFVybFRyZWVcclxuICAgICAqIEBwYXJhbSB1cmwgXHJcbiAgICAgKi9cclxuICAgIHBhcnNlVXJsKHVybDogc3RyaW5nKTogVXJsVHJlZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnBhcnNlVXJsKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCdWlsZHMgdGhlIGFic29sdXRlIHVybCBmb3IgdGhlIGRlc3RpbmF0aW9uIHBhZ2VcclxuICAgICAqIEBwYXJhbSBwYXRoIFJlbGF0aXZlIHBhdGggb2YgcmVxdWVzdGVkIHBhZ2VcclxuICAgICAqIEByZXR1cm5zIEZ1bGwgZGVzdGluYXRpb24gdXJsXHJcbiAgICAgKi9cclxuICAgIGdldERlc3RpbmF0aW9uVXJsKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBnZXR0aW5nIGRlc3RpbmF0aW9uIHVybFwiKTtcclxuICAgICAgICAvLyBBYnNvbHV0ZSBiYXNlIHVybCBmb3IgdGhlIGFwcGxpY2F0aW9uIChkZWZhdWx0IHRvIG9yaWdpbiBpZiBiYXNlIGVsZW1lbnQgbm90IHByZXNlbnQpXHJcbiAgICAgICAgY29uc3QgYmFzZUVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJiYXNlXCIpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmxvY2F0aW9uLm5vcm1hbGl6ZShiYXNlRWxlbWVudHMubGVuZ3RoID8gYmFzZUVsZW1lbnRzWzBdLmhyZWYgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcclxuXHJcbiAgICAgICAgLy8gUGF0aCBvZiBwYWdlIChpbmNsdWRpbmcgaGFzaCwgaWYgdXNpbmcgaGFzaCByb3V0aW5nKVxyXG4gICAgICAgIGNvbnN0IHBhdGhVcmwgPSB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChwYXRoKTtcclxuXHJcbiAgICAgICAgLy8gSGFzaCBsb2NhdGlvbiBzdHJhdGVneVxyXG4gICAgICAgIGlmIChwYXRoVXJsLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gZGVzdGluYXRpb24gYnkgaGFzaCByb3V0aW5nXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtwYXRoVXJsfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHVzaW5nIHBhdGggbG9jYXRpb24gc3RyYXRlZ3ksIHBhdGhVcmwgd2lsbCBpbmNsdWRlIHRoZSByZWxhdGl2ZSBwb3J0aW9uIG9mIHRoZSBiYXNlIHBhdGggKGUuZy4gL2Jhc2UvcGFnZSkuXHJcbiAgICAgICAgICogU2luY2UgYmFzZVVybCBhbHNvIGluY2x1ZGVzIC9iYXNlLCBjYW4ganVzdCBjb25jYXRlbnRhdGUgYmFzZVVybCArIHBhdGhcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0ke3BhdGh9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVyYWN0aXZlbHkgcHJvbXB0IHRoZSB1c2VyIHRvIGxvZ2luXHJcbiAgICAgKiBAcGFyYW0gdXJsIFBhdGggb2YgdGhlIHJlcXVlc3RlZCBwYWdlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9naW5JbnRlcmFjdGl2ZWx5KHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgYXV0aFJlcXVlc3QgPSB0eXBlb2YgdGhpcy5tc2FsR3VhcmRDb25maWcuYXV0aFJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIlxyXG4gICAgICAgICAgICA/IHRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0KHRoaXMuYXV0aFNlcnZpY2UsIHN0YXRlKVxyXG4gICAgICAgICAgICA6IHsgLi4udGhpcy5tc2FsR3VhcmRDb25maWcuYXV0aFJlcXVlc3QgfTtcclxuICAgICAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUG9wdXApIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dnaW5nIGluIGJ5IHBvcHVwXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5sb2dpblBvcHVwKGF1dGhSZXF1ZXN0IGFzIFBvcHVwUmVxdWVzdClcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbG9naW4gYnkgcG9wdXAgc3VjY2Vzc2Z1bCwgY2FuIGFjdGl2YXRlLCBzZXR0aW5nIGFjdGl2ZSBhY2NvdW50XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQocmVzcG9uc2UuYWNjb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dnaW5nIGluIGJ5IHJlZGlyZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0U3RhcnRQYWdlID0gdGhpcy5nZXREZXN0aW5hdGlvblVybChzdGF0ZS51cmwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2luUmVkaXJlY3Qoe1xyXG4gICAgICAgICAgICByZWRpcmVjdFN0YXJ0UGFnZSxcclxuICAgICAgICAgICAgLi4uYXV0aFJlcXVlc3RcclxuICAgICAgICB9IGFzIFJlZGlyZWN0UmVxdWVzdClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gZmFsc2UpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgd2hpY2ggY2hlY2tzIGZvciB0aGUgY29ycmVjdCBpbnRlcmFjdGlvbiB0eXBlLCBwcmV2ZW50cyBwYWdlIHdpdGggR3VhcmQgdG8gYmUgc2V0IGFzIHJlaWRyZWN0LCBhbmQgY2FsbHMgaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWN0aXZhdGVIZWxwZXIoc3RhdGU/OiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFufFVybFRyZWU+IHtcclxuICAgICAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiYgdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKFwiaW52YWxpZF9pbnRlcmFjdGlvbl90eXBlXCIsIFwiSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgR3VhcmQuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCBvciBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgTXNhbEd1YXJkQ29uZmlndXJhdGlvblwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiTVNBTCBHdWFyZCBhY3RpdmF0ZWRcIik7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogSWYgYSBwYWdlIHdpdGggTVNBTCBHdWFyZCBpcyBzZXQgYXMgdGhlIHJlZGlyZWN0IGZvciBhY3F1aXJlVG9rZW5TaWxlbnQsXHJcbiAgICAgICAgICogc2hvcnQtY2lyY3VpdCB0byBwcmV2ZW50IHJlZGlyZWN0aW5nIG9yIHBvcHVwcy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBpZiAoVXJsU3RyaW5nLmhhc2hDb250YWluc0tub3duUHJvcGVydGllcyh3aW5kb3cubG9jYXRpb24uaGFzaCkgJiYgQnJvd3NlclV0aWxzLmlzSW5JZnJhbWUoKSAmJiAhdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRDb25maWd1cmF0aW9uKCkuc3lzdGVtLmFsbG93UmVkaXJlY3RJbklmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS53YXJuaW5nKFwiR3VhcmQgLSByZWRpcmVjdFVyaSBzZXQgdG8gcGFnZSB3aXRoIE1TQUwgR3VhcmQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIG5vdCBzZXQgcmVkaXJlY3RVcmkgdG8gYSBwYWdlIHRoYXQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuaW5mbyhcIkd1YXJkIC0gd2luZG93IGlzIHVuZGVmaW5lZCwgTVNBTCBkb2VzIG5vdCBzdXBwb3J0IHNlcnZlci1zaWRlIHRva2VuIGFjcXVpc2l0aW9uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBhIGxvZ2luRmFpbGVkUm91dGUgaXMgc2V0IGluIHRoZSBjb25maWcsIHNldCB0aGlzIGFzIHRoZSBsb2dpbkZhaWxlZFJvdXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMubXNhbEd1YXJkQ29uZmlnLmxvZ2luRmFpbGVkUm91dGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dpbkZhaWxlZFJvdXRlID0gdGhpcy5wYXJzZVVybCh0aGlzLm1zYWxHdWFyZENvbmZpZy5sb2dpbkZhaWxlZFJvdXRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENhcHR1cmUgY3VycmVudCBwYXRoIGJlZm9yZSBpdCBnZXRzIGNoYW5nZWQgYnkgaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlXHJcbiAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgodHJ1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmhhbmRsZVJlZGlyZWN0T2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIG5vIGFjY291bnRzIHJldHJpZXZlZCwgbG9nIGluIHJlcXVpcmVkIHRvIGFjdGl2YXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9naW5JbnRlcmFjdGl2ZWx5KHN0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBubyBhY2NvdW50cyByZXRyaWV2ZWQsIG5vIHN0YXRlLCBjYW5ub3QgbG9hZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gYXQgbGVhc3QgMSBhY2NvdW50IGV4aXN0cywgY2FuIGFjdGl2YXRlIG9yIGxvYWRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbmF2aWdhdGluZyB0aGUgYXBwIHRvIC8jY29kZT0gb3IgL2NvZGU9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFBhdGggcm91dGluZzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdGUudXJsOiAvI2NvZGU9Li4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnJvb3QuZnJhZ21lbnQ6IGNvZGU9Li4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICAgICAgICAgICAgICogSGFzaCByb3V0aW5nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZS51cmw6IC9jb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnJvb3QuZnJhZ21lbnQ6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybENvbnRhaW5zQ29kZTogYm9vbGVhbiA9IHRoaXMuaW5jbHVkZXNDb2RlKHN0YXRlLnVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50Q29udGFpbnNDb2RlOiBib29sZWFuID0gISFzdGF0ZS5yb290ICYmICEhc3RhdGUucm9vdC5mcmFnbWVudCAmJiB0aGlzLmluY2x1ZGVzQ29kZShgIyR7c3RhdGUucm9vdC5mcmFnbWVudH1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaFJvdXRpbmc6IGJvb2xlYW4gPSB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChzdGF0ZS51cmwpLmluZGV4T2YoXCIjXCIpID09PSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGNvZGUgcGFyYW1ldGVyIGlzIGluIGZyYWdtZW50IChhbmQgbm90IGluIHF1ZXJ5IHBhcmFtZXRlciksIG9yIHRoYXQgaGFzaCBoYXNoIHJvdXRpbmcgaXMgdXNlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsQ29udGFpbnNDb2RlICYmIChmcmFnbWVudENvbnRhaW5zQ29kZSB8fCBoYXNoUm91dGluZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuaW5mbyhcIkd1YXJkIC0gSGFzaCBjb250YWlucyBrbm93biBjb2RlIHJlc3BvbnNlLCBzdG9wcGluZyBuYXZpZ2F0aW9uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCByb3V0aW5nIChuYXZpZ2F0ZSB0byBjdXJyZW50IHBhdGggd2l0aG91dCBoYXNoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXRoLmluZGV4T2YoXCIjXCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybCh0aGlzLmxvY2F0aW9uLnBhdGgoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXNoIHJvdXRpbmcgKG5hdmlnYXRlIHRvIHJvb3QgcGF0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnBhcnNlVXJsKFwiXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvcihcIkd1YXJkIC0gZXJyb3Igd2hpbGUgbG9nZ2luZyBpbiwgdW5hYmxlIHRvIGFjdGl2YXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuZXJyb3JQaWkoYEd1YXJkIC0gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGxvZ2luRmFpbGVkUm91dGUgaXMgc2V0LCBjaGVja3MgdG8gc2VlIGlmIEFuZ3VsYXIgMTArIGlzIHVzZWQgYW5kIHN0YXRlIGlzIHBhc3NlZCBpbiBiZWZvcmUgcmV0dXJuaW5nIHJvdXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICogQXBwcyB1c2luZyBBbmd1bGFyIDkgd2lsbCByZWNlaXZlIG9mKGZhbHNlKSBpbiBjYW5Mb2FkIGludGVyZmFjZSwgYXMgaXQgZG9lcyBub3Qgc3VwcG9ydCBVcmxUcmVlIHJldHVybiB0eXBlc1xyXG4gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ2luRmFpbGVkUm91dGUgJiYgcGFyc2VJbnQoVkVSU0lPTi5tYWpvciwgMTApID4gOSAmJiBzdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2luRmFpbGVkUm91dGUgc2V0LCByZWRpcmVjdGluZ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMubG9naW5GYWlsZWRSb3V0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGluY2x1ZGVzQ29kZShwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKHBhdGgubGFzdEluZGV4T2YoXCIvY29kZVwiKSA+IC0xICYmXHJcbiAgICAgICAgICAgIHBhdGgubGFzdEluZGV4T2YoXCIvY29kZVwiKSA9PT0gcGF0aC5sZW5ndGggLSBcIi9jb2RlXCIubGVuZ3RoKSB8fCAvLyBwYXRoLmVuZHNXaXRoKFwiL2NvZGVcIilcclxuICAgICAgICAgICAgcGF0aC5pbmRleE9mKFwiI2NvZGU9XCIpID4gLTEgfHwgXHJcbiAgICAgICAgICAgIHBhdGguaW5kZXhPZihcIiZjb2RlPVwiKSA+IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbnxVcmxUcmVlPiB7XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBjYW5BY3RpdmF0ZVwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUhlbHBlcihzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuQWN0aXZhdGVDaGlsZChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xyXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gY2FuQWN0aXZhdGVDaGlsZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUhlbHBlcihzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuTG9hZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkxvYWRcIik7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlSGVscGVyKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -1,6 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- export {};
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5pbnRlcmNlcHRvci5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBIdHRwUmVxdWVzdCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBQb3B1cFJlcXVlc3QsIFJlZGlyZWN0UmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLCBTaWxlbnRSZXF1ZXN0IH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcclxuaW1wb3J0IHsgTXNhbFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBkZWNsYXJlIHR5cGUgTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgPSBPbWl0PFBvcHVwUmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFJlZGlyZWN0UmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFNpbGVudFJlcXVlc3QsIFwic2NvcGVzXCI+IDtcclxuXHJcbmV4cG9ydCB0eXBlIE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcclxuICAgIHByb3RlY3RlZFJlc291cmNlTWFwOiBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmd8UHJvdGVjdGVkUmVzb3VyY2VTY29wZXM+IHwgbnVsbD47XHJcbiAgICBhdXRoUmVxdWVzdD86IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0IHwgKChtc2FsU2VydmljZTogTXNhbFNlcnZpY2UsIHJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG9yaWdpbmFsQXV0aFJlcXVlc3Q6IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0KSA9PiBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBQcm90ZWN0ZWRSZXNvdXJjZVNjb3BlcyA9IHtcclxuICAgIGh0dHBNZXRob2Q6IHN0cmluZyxcclxuICAgIHNjb3BlczogQXJyYXk8c3RyaW5nPiB8IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIE1hdGNoaW5nUmVzb3VyY2VzID0ge1xyXG4gICAgYWJzb2x1dGVSZXNvdXJjZXM6IEFycmF5PHN0cmluZz4sXHJcbiAgICByZWxhdGl2ZVJlc291cmNlczogQXJyYXk8c3RyaW5nPlxyXG59O1xyXG4iXX0=
@@ -1,230 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { Location, DOCUMENT } from "@angular/common";
6
- import { EMPTY, of } from "rxjs";
7
- import { switchMap, catchError, take, filter } from "rxjs/operators";
8
- import { MsalService } from "./msal.service";
9
- import { BrowserConfigurationAuthError, InteractionStatus, InteractionType, StringUtils, UrlString } from "@azure/msal-browser";
10
- import { Injectable, Inject } from "@angular/core";
11
- import { MSAL_INTERCEPTOR_CONFIG } from "./constants";
12
- import { MsalBroadcastService } from "./msal.broadcast.service";
13
- export class MsalInterceptor {
14
- constructor(msalInterceptorConfig, authService, location, msalBroadcastService,
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
16
- document) {
17
- this.msalInterceptorConfig = msalInterceptorConfig;
18
- this.authService = authService;
19
- this.location = location;
20
- this.msalBroadcastService = msalBroadcastService;
21
- this._document = document;
22
- }
23
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
- intercept(req, next) {
25
- if (this.msalInterceptorConfig.interactionType !== InteractionType.Popup && this.msalInterceptorConfig.interactionType !== InteractionType.Redirect) {
26
- throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Interceptor. InteractionType.Popup, InteractionType.Redirect must be provided in the msalInterceptorConfiguration");
27
- }
28
- this.authService.getLogger().verbose("MSAL Interceptor activated");
29
- const scopes = this.getScopesForEndpoint(req.url, req.method);
30
- // If no scopes for endpoint, does not acquire token
31
- if (!scopes || scopes.length === 0) {
32
- this.authService.getLogger().verbose("Interceptor - no scopes for endpoint");
33
- return next.handle(req);
34
- }
35
- // Sets account as active account or first account
36
- let account;
37
- if (!!this.authService.instance.getActiveAccount()) {
38
- this.authService.getLogger().verbose("Interceptor - active account selected");
39
- account = this.authService.instance.getActiveAccount();
40
- }
41
- else {
42
- this.authService.getLogger().verbose("Interceptor - no active account, fallback to first account");
43
- account = this.authService.instance.getAllAccounts()[0];
44
- }
45
- const authRequest = typeof this.msalInterceptorConfig.authRequest === "function"
46
- ? this.msalInterceptorConfig.authRequest(this.authService, req, { account: account })
47
- : Object.assign(Object.assign({}, this.msalInterceptorConfig.authRequest), { account });
48
- this.authService.getLogger().info(`Interceptor - ${scopes.length} scopes found for endpoint`);
49
- this.authService.getLogger().infoPii(`Interceptor - [${scopes}] scopes found for ${req.url}`);
50
- return this.acquireToken(authRequest, scopes, account)
51
- .pipe(switchMap((result) => {
52
- this.authService.getLogger().verbose("Interceptor - setting authorization headers");
53
- const headers = req.headers
54
- .set("Authorization", `Bearer ${result.accessToken}`);
55
- const requestClone = req.clone({ headers });
56
- return next.handle(requestClone);
57
- }));
58
- }
59
- /**
60
- * Try to acquire token silently. Invoke interaction if acquireTokenSilent rejected with error or resolved with null access token
61
- * @param authRequest Request
62
- * @param scopes Array of scopes for the request
63
- * @param account Account
64
- * @returns Authentication result
65
- */
66
- acquireToken(authRequest, scopes, account) {
67
- // Note: For MSA accounts, include openid scope when calling acquireTokenSilent to return idToken
68
- return this.authService.acquireTokenSilent(Object.assign(Object.assign({}, authRequest), { scopes, account }))
69
- .pipe(catchError(() => {
70
- this.authService.getLogger().error("Interceptor - acquireTokenSilent rejected with error. Invoking interaction to resolve.");
71
- return this.msalBroadcastService.inProgress$
72
- .pipe(take(1), switchMap((status) => {
73
- if (status === InteractionStatus.None) {
74
- return this.acquireTokenInteractively(authRequest, scopes);
75
- }
76
- return this.msalBroadcastService.inProgress$
77
- .pipe(filter((status) => status === InteractionStatus.None), take(1), switchMap(() => this.acquireToken(authRequest, scopes, account)));
78
- }));
79
- }), switchMap((result) => {
80
- if (!result.accessToken) {
81
- this.authService.getLogger().error("Interceptor - acquireTokenSilent resolved with null access token. Known issue with B2C tenants, invoking interaction to resolve.");
82
- return this.msalBroadcastService.inProgress$
83
- .pipe(filter((status) => status === InteractionStatus.None), take(1), switchMap(() => this.acquireTokenInteractively(authRequest, scopes)));
84
- }
85
- return of(result);
86
- }));
87
- }
88
- /**
89
- * Invoke interaction for the given set of scopes
90
- * @param authRequest Request
91
- * @param scopes Array of scopes for the request
92
- * @returns Result from the interactive request
93
- */
94
- acquireTokenInteractively(authRequest, scopes) {
95
- if (this.msalInterceptorConfig.interactionType === InteractionType.Popup) {
96
- this.authService.getLogger().verbose("Interceptor - error acquiring token silently, acquiring by popup");
97
- return this.authService.acquireTokenPopup(Object.assign(Object.assign({}, authRequest), { scopes }));
98
- }
99
- this.authService.getLogger().verbose("Interceptor - error acquiring token silently, acquiring by redirect");
100
- const redirectStartPage = window.location.href;
101
- this.authService.acquireTokenRedirect(Object.assign(Object.assign({}, authRequest), { scopes, redirectStartPage }));
102
- return EMPTY;
103
- }
104
- /**
105
- * Looks up the scopes for the given endpoint from the protectedResourceMap
106
- * @param endpoint Url of the request
107
- * @param httpMethod Http method of the request
108
- * @returns Array of scopes, or null if not found
109
- *
110
- */
111
- getScopesForEndpoint(endpoint, httpMethod) {
112
- this.authService.getLogger().verbose("Interceptor - getting scopes for endpoint");
113
- // Ensures endpoints and protected resources compared are normalized
114
- const normalizedEndpoint = this.location.normalize(endpoint);
115
- const protectedResourcesArray = Array.from(this.msalInterceptorConfig.protectedResourceMap.keys());
116
- const matchingProtectedResources = this.matchResourcesToEndpoint(protectedResourcesArray, normalizedEndpoint);
117
- // Check absolute urls of resources first before checking relative to prevent incorrect matching where multiple resources have similar relative urls
118
- if (matchingProtectedResources.absoluteResources.length > 0) {
119
- return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources.absoluteResources, httpMethod);
120
- }
121
- else if (matchingProtectedResources.relativeResources.length > 0) {
122
- return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources.relativeResources, httpMethod);
123
- }
124
- return null;
125
- }
126
- /**
127
- * Finds resource endpoints that match request endpoint
128
- * @param protectedResourcesEndpoints
129
- * @param endpoint
130
- * @returns
131
- */
132
- matchResourcesToEndpoint(protectedResourcesEndpoints, endpoint) {
133
- const matchingResources = { absoluteResources: [], relativeResources: [] };
134
- protectedResourcesEndpoints.forEach(key => {
135
- // Normalizes and adds resource to matchingResources.absoluteResources if key matches endpoint. StringUtils.matchPattern accounts for wildcards
136
- const normalizedKey = this.location.normalize(key);
137
- if (StringUtils.matchPattern(normalizedKey, endpoint)) {
138
- matchingResources.absoluteResources.push(key);
139
- }
140
- // Get url components for relative urls
141
- const absoluteKey = this.getAbsoluteUrl(key);
142
- const keyComponents = new UrlString(absoluteKey).getUrlComponents();
143
- const absoluteEndpoint = this.getAbsoluteUrl(endpoint);
144
- const endpointComponents = new UrlString(absoluteEndpoint).getUrlComponents();
145
- // Normalized key should include query strings if applicable
146
- const relativeNormalizedKey = keyComponents.QueryString ? `${keyComponents.AbsolutePath}?${keyComponents.QueryString}` : this.location.normalize(keyComponents.AbsolutePath);
147
- // Add resource to matchingResources.relativeResources if same origin, relativeKey matches endpoint, and is not empty
148
- if (keyComponents.HostNameAndPort === endpointComponents.HostNameAndPort && StringUtils.matchPattern(relativeNormalizedKey, absoluteEndpoint) && relativeNormalizedKey !== "" && relativeNormalizedKey !== "/*") {
149
- matchingResources.relativeResources.push(key);
150
- }
151
- });
152
- return matchingResources;
153
- }
154
- /**
155
- * Transforms relative urls to absolute urls
156
- * @param url
157
- * @returns
158
- */
159
- getAbsoluteUrl(url) {
160
- const link = this._document.createElement("a");
161
- link.href = url;
162
- return link.href;
163
- }
164
- /**
165
- * Finds scopes from first matching endpoint with HTTP method that matches request
166
- * @param protectedResourceMap Protected resource map
167
- * @param endpointArray Array of resources that match request endpoint
168
- * @param httpMethod Http method of the request
169
- * @returns
170
- */
171
- matchScopesToEndpoint(protectedResourceMap, endpointArray, httpMethod) {
172
- const allMatchedScopes = [];
173
- // Check each matched endpoint for matching HttpMethod and scopes
174
- endpointArray.forEach(matchedEndpoint => {
175
- const scopesForEndpoint = [];
176
- const methodAndScopesArray = protectedResourceMap.get(matchedEndpoint);
177
- // Return if resource is unprotected
178
- if (methodAndScopesArray === null) {
179
- allMatchedScopes.push(null);
180
- return;
181
- }
182
- methodAndScopesArray.forEach(entry => {
183
- // Entry is either array of scopes or ProtectedResourceScopes object
184
- if (typeof entry === "string") {
185
- scopesForEndpoint.push(entry);
186
- }
187
- else {
188
- // Ensure methods being compared are normalized
189
- const normalizedRequestMethod = httpMethod.toLowerCase();
190
- const normalizedResourceMethod = entry.httpMethod.toLowerCase();
191
- // Method in protectedResourceMap matches request http method
192
- if (normalizedResourceMethod === normalizedRequestMethod) {
193
- // Validate if scopes comes null to unprotect the resource in a certain http method
194
- if (entry.scopes === null) {
195
- allMatchedScopes.push(null);
196
- }
197
- else {
198
- entry.scopes.forEach((scope) => {
199
- scopesForEndpoint.push(scope);
200
- });
201
- }
202
- }
203
- }
204
- });
205
- // Only add to all scopes if scopes for endpoint and method is found
206
- if (scopesForEndpoint.length > 0) {
207
- allMatchedScopes.push(scopesForEndpoint);
208
- }
209
- });
210
- if (allMatchedScopes.length > 0) {
211
- if (allMatchedScopes.length > 1) {
212
- this.authService.getLogger().warning("Interceptor - More than 1 matching scopes for endpoint found.");
213
- }
214
- // Returns scopes for first matching endpoint
215
- return allMatchedScopes[0];
216
- }
217
- return null;
218
- }
219
- }
220
- MsalInterceptor.decorators = [
221
- { type: Injectable }
222
- ];
223
- MsalInterceptor.ctorParameters = () => [
224
- { type: undefined, decorators: [{ type: Inject, args: [MSAL_INTERCEPTOR_CONFIG,] }] },
225
- { type: MsalService },
226
- { type: Location },
227
- { type: MsalBroadcastService },
228
- { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
229
- ];
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQVFILE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQXFDLDZCQUE2QixFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkssT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR2hFLE1BQU0sT0FBTyxlQUFlO0lBR3hCLFlBQzZDLHFCQUFtRCxFQUNwRixXQUF3QixFQUN4QixRQUFrQixFQUNsQixvQkFBMEM7SUFDbEQsaUhBQWlIO0lBQy9GLFFBQWM7UUFMUywwQkFBcUIsR0FBckIscUJBQXFCLENBQThCO1FBQ3BGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUlsRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQW9CLENBQUM7SUFDMUMsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUM5QyxJ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LGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbEMsQ0FBQyxDQUFDLENBQUM7eUJBQ047cUJBQ0o7aUJBQ0o7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILG9FQUFvRTtZQUNwRSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzVDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2FBQ3pHO1lBQ0QsNkNBQTZDO1lBQzdDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7WUE1UEosVUFBVTs7OzRDQUtGLE1BQU0sU0FBQyx1QkFBdUI7WUFaOUIsV0FBVztZQUhYLFFBQVE7WUFRUixvQkFBb0I7NENBWXBCLE1BQU0sU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gICAgSHR0cFJlcXVlc3QsXHJcbiAgICBIdHRwSGFuZGxlcixcclxuICAgIEh0dHBFdmVudCxcclxuICAgIEh0dHBJbnRlcmNlcHRvclxyXG59IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiwgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEVNUFRZLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgY2F0Y2hFcnJvciwgdGFrZSwgZmlsdGVyIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFjY291bnRJbmZvLCBBdXRoZW50aWNhdGlvblJlc3VsdCwgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IsIEludGVyYWN0aW9uU3RhdHVzLCBJbnRlcmFjdGlvblR5cGUsIFN0cmluZ1V0aWxzLCBVcmxTdHJpbmcgfSBmcm9tIFwiQGF6dXJlL21zYWwtYnJvd3NlclwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNU0FMX0lOVEVSQ0VQVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCwgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiwgUHJvdGVjdGVkUmVzb3VyY2VTY29wZXMsIE1hdGNoaW5nUmVzb3VyY2VzIH0gZnJvbSBcIi4vbXNhbC5pbnRlcmNlcHRvci5jb25maWdcIjtcclxuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNc2FsSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnQ/OiBEb2N1bWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KE1TQUxfSU5URVJDRVBUT1JfQ09ORklHKSBwcml2YXRlIG1zYWxJbnRlcmNlcHRvckNvbmZpZzogTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbixcclxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBNc2FsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgICAgICBwcml2YXRlIG1zYWxCcm9hZGNhc3RTZXJ2aWNlOiBNc2FsQnJvYWRjYXN0U2VydmljZSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50PzogYW55XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50IGFzIERvY3VtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgICAgICBpZiAodGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiYgdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKFwiaW52YWxpZF9pbnRlcmFjdGlvbl90eXBlXCIsIFwiSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgSW50ZXJjZXB0b3IuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIG1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJNU0FMIEludGVyY2VwdG9yIGFjdGl2YXRlZFwiKTtcclxuICAgICAgICBjb25zdCBzY29wZXMgPSB0aGlzLmdldFNjb3Blc0ZvckVuZHBvaW50KHJlcS51cmwsIHJlcS5tZXRob2QpO1xyXG5cclxuICAgICAgICAvLyBJZiBubyBzY29wZXMgZm9yIGVuZHBvaW50LCBkb2VzIG5vdCBhY3F1aXJlIHRva2VuXHJcbiAgICAgICAgaWYgKCFzY29wZXMgfHwgc2NvcGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJJbnRlcmNlcHRvciAtIG5vIHNjb3BlcyBmb3IgZW5kcG9pbnRcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0cyBhY2NvdW50IGFzIGFjdGl2ZSBhY2NvdW50IG9yIGZpcnN0IGFjY291bnRcclxuICAgICAgICBsZXQgYWNjb3VudDogQWNjb3VudEluZm87XHJcbiAgICAgICAgaWYgKCEhdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBY3RpdmVBY2NvdW50KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBhY3RpdmUgYWNjb3VudCBzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgYWNjb3VudCA9IHRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWN0aXZlQWNjb3VudCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gbm8gYWN0aXZlIGFjY291bnQsIGZhbGxiYWNrIHRvIGZpcnN0IGFjY291bnRcIik7XHJcbiAgICAgICAgICAgIGFjY291bnQgPSB0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFsbEFjY291bnRzKClbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhdXRoUmVxdWVzdCA9IHR5cGVvZiB0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5hdXRoUmVxdWVzdCA9PT0gXCJmdW5jdGlvblwiXHJcbiAgICAgICAgICAgID8gdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuYXV0aFJlcXVlc3QodGhpcy5hdXRoU2VydmljZSwgcmVxLCB7IGFjY291bnQ6IGFjY291bnQgfSlcclxuICAgICAgICAgICAgOiB7IC4uLnRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLmF1dGhSZXF1ZXN0LCBhY2NvdW50IH07XHJcblxyXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuaW5mbyhgSW50ZXJjZXB0b3IgLSAke3Njb3Blcy5sZW5ndGh9IHNjb3BlcyBmb3VuZCBmb3IgZW5kcG9pbnRgKTtcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmluZm9QaWkoYEludGVyY2VwdG9yIC0gWyR7c2NvcGVzfV0gc2NvcGVzIGZvdW5kIGZvciAke3JlcS51cmx9YCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbihhdXRoUmVxdWVzdCwgc2NvcGVzLCBhY2NvdW50KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgocmVzdWx0OiBBdXRoZW50aWNhdGlvblJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gc2V0dGluZyBhdXRob3JpemF0aW9uIGhlYWRlcnNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoXCJBdXRob3JpemF0aW9uXCIsIGBCZWFyZXIgJHtyZXN1bHQuYWNjZXNzVG9rZW59YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RDbG9uZSA9IHJlcS5jbG9uZSh7aGVhZGVyc30pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0Q2xvbmUpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyeSB0byBhY3F1aXJlIHRva2VuIHNpbGVudGx5LiBJbnZva2UgaW50ZXJhY3Rpb24gaWYgYWNxdWlyZVRva2VuU2lsZW50IHJlamVjdGVkIHdpdGggZXJyb3Igb3IgcmVzb2x2ZWQgd2l0aCBudWxsIGFjY2VzcyB0b2tlblxyXG4gICAgICogQHBhcmFtIGF1dGhSZXF1ZXN0IFJlcXVlc3RcclxuICAgICAqIEBwYXJhbSBzY29wZXMgQXJyYXkgb2Ygc2NvcGVzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIGFjY291bnQgQWNjb3VudFxyXG4gICAgICogQHJldHVybnMgQXV0aGVudGljYXRpb24gcmVzdWx0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWNxdWlyZVRva2VuKGF1dGhSZXF1ZXN0OiBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCwgc2NvcGVzOiBzdHJpbmdbXSwgYWNjb3VudDogQWNjb3VudEluZm8pOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0aW9uUmVzdWx0PiB7XHJcbiAgICAgICAgLy8gTm90ZTogRm9yIE1TQSBhY2NvdW50cywgaW5jbHVkZSBvcGVuaWQgc2NvcGUgd2hlbiBjYWxsaW5nIGFjcXVpcmVUb2tlblNpbGVudCB0byByZXR1cm4gaWRUb2tlblxyXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblNpbGVudCh7Li4uYXV0aFJlcXVlc3QsIHNjb3BlcywgYWNjb3VudCB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuZXJyb3IoXCJJbnRlcmNlcHRvciAtIGFjcXVpcmVUb2tlblNpbGVudCByZWplY3RlZCB3aXRoIGVycm9yLiBJbnZva2luZyBpbnRlcmFjdGlvbiB0byByZXNvbHZlLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHN0YXR1czogSW50ZXJhY3Rpb25TdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbkludGVyYWN0aXZlbHkoYXV0aFJlcXVlc3QsIHNjb3Blcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cykgPT4gc3RhdHVzID09PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5hY3F1aXJlVG9rZW4oYXV0aFJlcXVlc3QsIHNjb3BlcywgYWNjb3VudCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogQXV0aGVudGljYXRpb25SZXN1bHQpICA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvcihcIkludGVyY2VwdG9yIC0gYWNxdWlyZVRva2VuU2lsZW50IHJlc29sdmVkIHdpdGggbnVsbCBhY2Nlc3MgdG9rZW4uIEtub3duIGlzc3VlIHdpdGggQjJDIHRlbmFudHMsIGludm9raW5nIGludGVyYWN0aW9uIHRvIHJlc29sdmUuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChzdGF0dXM6IEludGVyYWN0aW9uU3RhdHVzKSA9PiBzdGF0dXMgPT09IEludGVyYWN0aW9uU3RhdHVzLk5vbmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYWNxdWlyZVRva2VuSW50ZXJhY3RpdmVseShhdXRoUmVxdWVzdCwgc2NvcGVzKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZSBpbnRlcmFjdGlvbiBmb3IgdGhlIGdpdmVuIHNldCBvZiBzY29wZXNcclxuICAgICAqIEBwYXJhbSBhdXRoUmVxdWVzdCBSZXF1ZXN0XHJcbiAgICAgKiBAcGFyYW0gc2NvcGVzIEFycmF5IG9mIHNjb3BlcyBmb3IgdGhlIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zIFJlc3VsdCBmcm9tIHRoZSBpbnRlcmFjdGl2ZSByZXF1ZXN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWNxdWlyZVRva2VuSW50ZXJhY3RpdmVseShhdXRoUmVxdWVzdDogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QsIHNjb3Blczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0aW9uUmVzdWx0PiB7XHJcbiAgICAgICAgaWYgKHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLmludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLlBvcHVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gZXJyb3IgYWNxdWlyaW5nIHRva2VuIHNpbGVudGx5LCBhY3F1aXJpbmcgYnkgcG9wdXBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblBvcHVwKHsgLi4uYXV0aFJlcXVlc3QsIHNjb3BlcyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBlcnJvciBhY3F1aXJpbmcgdG9rZW4gc2lsZW50bHksIGFjcXVpcmluZyBieSByZWRpcmVjdFwiKTtcclxuICAgICAgICBjb25zdCByZWRpcmVjdFN0YXJ0UGFnZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuYWNxdWlyZVRva2VuUmVkaXJlY3Qoey4uLmF1dGhSZXF1ZXN0LCBzY29wZXMsIHJlZGlyZWN0U3RhcnRQYWdlIH0pO1xyXG4gICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvb2tzIHVwIHRoZSBzY29wZXMgZm9yIHRoZSBnaXZlbiBlbmRwb2ludCBmcm9tIHRoZSBwcm90ZWN0ZWRSZXNvdXJjZU1hcFxyXG4gICAgICogQHBhcmFtIGVuZHBvaW50IFVybCBvZiB0aGUgcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIGh0dHBNZXRob2QgSHR0cCBtZXRob2Qgb2YgdGhlIHJlcXVlc3RcclxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIHNjb3Blcywgb3IgbnVsbCBpZiBub3QgZm91bmRcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0U2NvcGVzRm9yRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZywgaHR0cE1ldGhvZDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPnxudWxsIHtcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJJbnRlcmNlcHRvciAtIGdldHRpbmcgc2NvcGVzIGZvciBlbmRwb2ludFwiKTtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlcyBlbmRwb2ludHMgYW5kIHByb3RlY3RlZCByZXNvdXJjZXMgY29tcGFyZWQgYXJlIG5vcm1hbGl6ZWRcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkRW5kcG9pbnQgPSB0aGlzLmxvY2F0aW9uLm5vcm1hbGl6ZShlbmRwb2ludCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHByb3RlY3RlZFJlc291cmNlc0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5wcm90ZWN0ZWRSZXNvdXJjZU1hcC5rZXlzKCkpO1xyXG5cclxuICAgICAgICBjb25zdCBtYXRjaGluZ1Byb3RlY3RlZFJlc291cmNlcyA9IHRoaXMubWF0Y2hSZXNvdXJjZXNUb0VuZHBvaW50KHByb3RlY3RlZFJlc291cmNlc0FycmF5LCBub3JtYWxpemVkRW5kcG9pbnQpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBhYnNvbHV0ZSB1cmxzIG9mIHJlc291cmNlcyBmaXJzdCBiZWZvcmUgY2hlY2tpbmcgcmVsYXRpdmUgdG8gcHJldmVudCBpbmNvcnJlY3QgbWF0Y2hpbmcgd2hlcmUgbXVsdGlwbGUgcmVzb3VyY2VzIGhhdmUgc2ltaWxhciByZWxhdGl2ZSB1cmxzXHJcbiAgICAgICAgaWYgKG1hdGNoaW5nUHJvdGVjdGVkUmVzb3VyY2VzLmFic29sdXRlUmVzb3VyY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTY29wZXNUb0VuZHBvaW50KHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLnByb3RlY3RlZFJlc291cmNlTWFwLCBtYXRjaGluZ1Byb3RlY3RlZFJlc291cmNlcy5hYnNvbHV0ZVJlc291cmNlcywgaHR0cE1ldGhvZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaGluZ1Byb3RlY3RlZFJlc291cmNlcy5yZWxhdGl2ZVJlc291cmNlcy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTY29wZXNUb0VuZHBvaW50KHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLnByb3RlY3RlZFJlc291cmNlTWFwLCBtYXRjaGluZ1Byb3RlY3RlZFJlc291cmNlcy5yZWxhdGl2ZVJlc291cmNlcywgaHR0cE1ldGhvZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIHJlc291cmNlIGVuZHBvaW50cyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcclxuICAgICAqIEBwYXJhbSBwcm90ZWN0ZWRSZXNvdXJjZXNFbmRwb2ludHNcclxuICAgICAqIEBwYXJhbSBlbmRwb2ludFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBtYXRjaFJlc291cmNlc1RvRW5kcG9pbnQocHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzOiBzdHJpbmdbXSwgZW5kcG9pbnQ6IHN0cmluZyk6IE1hdGNoaW5nUmVzb3VyY2VzIHtcclxuICAgICAgICBjb25zdCBtYXRjaGluZ1Jlc291cmNlczogTWF0Y2hpbmdSZXNvdXJjZXMgPSB7YWJzb2x1dGVSZXNvdXJjZXM6IFtdLCByZWxhdGl2ZVJlc291cmNlczogW119O1xyXG5cclxuICAgICAgICBwcm90ZWN0ZWRSZXNvdXJjZXNFbmRwb2ludHMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemVzIGFuZCBhZGRzIHJlc291cmNlIHRvIG1hdGNoaW5nUmVzb3VyY2VzLmFic29sdXRlUmVzb3VyY2VzIGlmIGtleSBtYXRjaGVzIGVuZHBvaW50LiBTdHJpbmdVdGlscy5tYXRjaFBhdHRlcm4gYWNjb3VudHMgZm9yIHdpbGRjYXJkc1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoa2V5KTtcclxuICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLm1hdGNoUGF0dGVybihub3JtYWxpemVkS2V5LCBlbmRwb2ludCkpe1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdSZXNvdXJjZXMuYWJzb2x1dGVSZXNvdXJjZXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBHZXQgdXJsIGNvbXBvbmVudHMgZm9yIHJlbGF0aXZlIHVybHNcclxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVLZXkgPSB0aGlzLmdldEFic29sdXRlVXJsKGtleSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleUNvbXBvbmVudHMgPSBuZXcgVXJsU3RyaW5nKGFic29sdXRlS2V5KS5nZXRVcmxDb21wb25lbnRzKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlRW5kcG9pbnQgPSB0aGlzLmdldEFic29sdXRlVXJsKGVuZHBvaW50KTtcclxuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnRDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyhhYnNvbHV0ZUVuZHBvaW50KS5nZXRVcmxDb21wb25lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemVkIGtleSBzaG91bGQgaW5jbHVkZSBxdWVyeSBzdHJpbmdzIGlmIGFwcGxpY2FibGVcclxuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVOb3JtYWxpemVkS2V5ID0ga2V5Q29tcG9uZW50cy5RdWVyeVN0cmluZyA/IGAke2tleUNvbXBvbmVudHMuQWJzb2x1dGVQYXRofT8ke2tleUNvbXBvbmVudHMuUXVlcnlTdHJpbmd9YCA6IHRoaXMubG9jYXRpb24ubm9ybWFsaXplKGtleUNvbXBvbmVudHMuQWJzb2x1dGVQYXRoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFkZCByZXNvdXJjZSB0byBtYXRjaGluZ1Jlc291cmNlcy5yZWxhdGl2ZVJlc291cmNlcyBpZiBzYW1lIG9yaWdpbiwgcmVsYXRpdmVLZXkgbWF0Y2hlcyBlbmRwb2ludCwgYW5kIGlzIG5vdCBlbXB0eVxyXG4gICAgICAgICAgICBpZiAoa2V5Q29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgPT09IGVuZHBvaW50Q29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgJiYgU3RyaW5nVXRpbHMubWF0Y2hQYXR0ZXJuKHJlbGF0aXZlTm9ybWFsaXplZEtleSwgYWJzb2x1dGVFbmRwb2ludCkgJiYgcmVsYXRpdmVOb3JtYWxpemVkS2V5ICE9PSBcIlwiICYmIHJlbGF0aXZlTm9ybWFsaXplZEtleSAhPT0gXCIvKlwiKXtcclxuICAgICAgICAgICAgICAgIG1hdGNoaW5nUmVzb3VyY2VzLnJlbGF0aXZlUmVzb3VyY2VzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbWF0Y2hpbmdSZXNvdXJjZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm1zIHJlbGF0aXZlIHVybHMgdG8gYWJzb2x1dGUgdXJsc1xyXG4gICAgICogQHBhcmFtIHVybFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBYnNvbHV0ZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGxpbmsuaHJlZiA9IHVybDtcclxuICAgICAgICByZXR1cm4gbGluay5ocmVmO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgc2NvcGVzIGZyb20gZmlyc3QgbWF0Y2hpbmcgZW5kcG9pbnQgd2l0aCBIVFRQIG1ldGhvZCB0aGF0IG1hdGNoZXMgcmVxdWVzdFxyXG4gICAgICogQHBhcmFtIHByb3RlY3RlZFJlc291cmNlTWFwIFByb3RlY3RlZCByZXNvdXJjZSBtYXBcclxuICAgICAqIEBwYXJhbSBlbmRwb2ludEFycmF5IEFycmF5IG9mIHJlc291cmNlcyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcclxuICAgICAqIEBwYXJhbSBodHRwTWV0aG9kIEh0dHAgbWV0aG9kIG9mIHRoZSByZXF1ZXN0XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG1hdGNoU2NvcGVzVG9FbmRwb2ludChwcm90ZWN0ZWRSZXNvdXJjZU1hcDogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nfFByb3RlY3RlZFJlc291cmNlU2NvcGVzPiB8IG51bGw+LCBlbmRwb2ludEFycmF5OiBzdHJpbmdbXSwgaHR0cE1ldGhvZDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPnxudWxsIHtcclxuICAgICAgICBjb25zdCBhbGxNYXRjaGVkU2NvcGVzID0gW107XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGVhY2ggbWF0Y2hlZCBlbmRwb2ludCBmb3IgbWF0Y2hpbmcgSHR0cE1ldGhvZCBhbmQgc2NvcGVzXHJcbiAgICAgICAgZW5kcG9pbnRBcnJheS5mb3JFYWNoKG1hdGNoZWRFbmRwb2ludCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjb3Blc0ZvckVuZHBvaW50ID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZEFuZFNjb3Blc0FycmF5ID0gcHJvdGVjdGVkUmVzb3VyY2VNYXAuZ2V0KG1hdGNoZWRFbmRwb2ludCk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXR1cm4gaWYgcmVzb3VyY2UgaXMgdW5wcm90ZWN0ZWRcclxuICAgICAgICAgICAgaWYgKG1ldGhvZEFuZFNjb3Blc0FycmF5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxNYXRjaGVkU2NvcGVzLnB1c2gobnVsbCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG1ldGhvZEFuZFNjb3Blc0FycmF5LmZvckVhY2goZW50cnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gRW50cnkgaXMgZWl0aGVyIGFycmF5IG9mIHNjb3BlcyBvciBQcm90ZWN0ZWRSZXNvdXJjZVNjb3BlcyBvYmplY3RcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzY29wZXNGb3JFbmRwb2ludC5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIG1ldGhvZHMgYmVpbmcgY29tcGFyZWQgYXJlIG5vcm1hbGl6ZWRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdE1ldGhvZCA9IGh0dHBNZXRob2QudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUmVzb3VyY2VNZXRob2QgPSBlbnRyeS5odHRwTWV0aG9kLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTWV0aG9kIGluIHByb3RlY3RlZFJlc291cmNlTWFwIG1hdGNoZXMgcmVxdWVzdCBodHRwIG1ldGhvZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUmVzb3VyY2VNZXRob2QgPT09IG5vcm1hbGl6ZWRSZXF1ZXN0TWV0aG9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIGlmIHNjb3BlcyBjb21lcyBudWxsIHRvIHVucHJvdGVjdCB0aGUgcmVzb3VyY2UgaW4gYSBjZXJ0YWluIGh0dHAgbWV0aG9kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zY29wZXMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoZWRTY29wZXMucHVzaChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNjb3Blcy5mb3JFYWNoKChzY29wZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3Blc0ZvckVuZHBvaW50LnB1c2goc2NvcGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gT25seSBhZGQgdG8gYWxsIHNjb3BlcyBpZiBzY29wZXMgZm9yIGVuZHBvaW50IGFuZCBtZXRob2QgaXMgZm91bmRcclxuICAgICAgICAgICAgaWYgKHNjb3Blc0ZvckVuZHBvaW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGFsbE1hdGNoZWRTY29wZXMucHVzaChzY29wZXNGb3JFbmRwb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYWxsTWF0Y2hlZFNjb3Blcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLndhcm5pbmcoXCJJbnRlcmNlcHRvciAtIE1vcmUgdGhhbiAxIG1hdGNoaW5nIHNjb3BlcyBmb3IgZW5kcG9pbnQgZm91bmQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFJldHVybnMgc2NvcGVzIGZvciBmaXJzdCBtYXRjaGluZyBlbmRwb2ludFxyXG4gICAgICAgICAgICByZXR1cm4gYWxsTWF0Y2hlZFNjb3Blc1swXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=
@@ -1,46 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { NgModule } from "@angular/core";
6
- import { CommonModule } from "@angular/common";
7
- import { MsalGuard } from "./msal.guard";
8
- import { MsalBroadcastService } from "./msal.broadcast.service";
9
- import { MsalService } from "./msal.service";
10
- import { MSAL_INSTANCE, MSAL_GUARD_CONFIG, MSAL_INTERCEPTOR_CONFIG } from "./constants";
11
- import { MsalRedirectComponent } from "./msal.redirect.component";
12
- export class MsalModule {
13
- static forRoot(msalInstance, guardConfig, interceptorConfig) {
14
- return {
15
- ngModule: MsalModule,
16
- providers: [
17
- {
18
- provide: MSAL_INSTANCE,
19
- useValue: msalInstance
20
- },
21
- {
22
- provide: MSAL_GUARD_CONFIG,
23
- useValue: guardConfig
24
- },
25
- {
26
- provide: MSAL_INTERCEPTOR_CONFIG,
27
- useValue: interceptorConfig
28
- },
29
- MsalService
30
- ]
31
- };
32
- }
33
- }
34
- MsalModule.decorators = [
35
- { type: NgModule, args: [{
36
- declarations: [MsalRedirectComponent],
37
- imports: [
38
- CommonModule
39
- ],
40
- providers: [
41
- MsalGuard,
42
- MsalBroadcastService
43
- ]
44
- },] }
45
- ];
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSS9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUcsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFZbEUsTUFBTSxPQUFPLFVBQVU7SUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FDVixZQUFzQyxFQUN0QyxXQUFtQyxFQUNuQyxpQkFBK0M7UUFFL0MsT0FBTztZQUNILFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFNBQVMsRUFBRTtnQkFDUDtvQkFDSSxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLFlBQVk7aUJBQ3pCO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSxXQUFXO2lCQUN4QjtnQkFDRDtvQkFDSSxPQUFPLEVBQUUsdUJBQXVCO29CQUNoQyxRQUFRLEVBQUUsaUJBQWlCO2lCQUM5QjtnQkFDRCxXQUFXO2FBQ2Q7U0FDSixDQUFDO0lBQ04sQ0FBQzs7O1lBbENKLFFBQVEsU0FBQztnQkFDTixZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDckMsT0FBTyxFQUFFO29CQUNMLFlBQVk7aUJBQ2Y7Z0JBQ0QsU0FBUyxFQUFFO29CQUNQLFNBQVM7b0JBQ1Qsb0JBQW9CO2lCQUN2QjthQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgSVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcclxuaW1wb3J0IHsgTXNhbEd1YXJkQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL21zYWwuZ3VhcmQuY29uZmlnXCI7XHJcbmltcG9ydCB7IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9tc2FsLmludGVyY2VwdG9yLmNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBNc2FsR3VhcmQgfSBmcm9tIFwiLi9tc2FsLmd1YXJkXCI7XHJcbmltcG9ydCB7IE1zYWxCcm9hZGNhc3RTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5icm9hZGNhc3Quc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNU0FMX0lOU1RBTkNFICwgTVNBTF9HVUFSRF9DT05GSUcsIE1TQUxfSU5URVJDRVBUT1JfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IE1zYWxSZWRpcmVjdENvbXBvbmVudCB9IGZyb20gXCIuL21zYWwucmVkaXJlY3QuY29tcG9uZW50XCI7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBbTXNhbFJlZGlyZWN0Q29tcG9uZW50XSxcclxuICAgIGltcG9ydHM6IFtcclxuICAgICAgICBDb21tb25Nb2R1bGVcclxuICAgIF0sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBNc2FsR3VhcmQsXHJcbiAgICAgICAgTXNhbEJyb2FkY2FzdFNlcnZpY2VcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1zYWxNb2R1bGUge1xyXG4gICAgc3RhdGljIGZvclJvb3QoXHJcbiAgICAgICAgbXNhbEluc3RhbmNlOiBJUHVibGljQ2xpZW50QXBwbGljYXRpb24sXHJcbiAgICAgICAgZ3VhcmRDb25maWc6IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgaW50ZXJjZXB0b3JDb25maWc6IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cclxuICAgICk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TXNhbE1vZHVsZT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5nTW9kdWxlOiBNc2FsTW9kdWxlLFxyXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBNU0FMX0lOU1RBTkNFLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBtc2FsSW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTVNBTF9HVUFSRF9DT05GSUcsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGd1YXJkQ29uZmlnXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1TQUxfSU5URVJDRVBUT1JfQ09ORklHLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBpbnRlcmNlcHRvckNvbmZpZ1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIE1zYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=