@azure/msal-angular 3.0.23 → 3.0.24

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.
@@ -1,218 +1,218 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { Injectable, Inject } from "@angular/core";
6
- import { InteractionType, BrowserConfigurationAuthError, BrowserUtils, UrlString, } from "@azure/msal-browser";
7
- import { of } from "rxjs";
8
- import { concatMap, catchError, map } from "rxjs/operators";
9
- import { MSAL_GUARD_CONFIG } from "./constants";
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./msal.broadcast.service";
12
- import * as i2 from "./msal.service";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "@angular/router";
15
- export class MsalGuard {
16
- constructor(msalGuardConfig, msalBroadcastService, authService, location, router) {
17
- this.msalGuardConfig = msalGuardConfig;
18
- this.msalBroadcastService = msalBroadcastService;
19
- this.authService = authService;
20
- this.location = location;
21
- this.router = router;
22
- // Subscribing so events in MsalGuard will set inProgress$ observable
23
- this.msalBroadcastService.inProgress$.subscribe();
24
- }
25
- /**
26
- * Parses url string to UrlTree
27
- * @param url
28
- */
29
- parseUrl(url) {
30
- return this.router.parseUrl(url);
31
- }
32
- /**
33
- * Builds the absolute url for the destination page
34
- * @param path Relative path of requested page
35
- * @returns Full destination url
36
- */
37
- getDestinationUrl(path) {
38
- this.authService.getLogger().verbose("Guard - getting destination url");
39
- // Absolute base url for the application (default to origin if base element not present)
40
- const baseElements = document.getElementsByTagName("base");
41
- const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);
42
- // Path of page (including hash, if using hash routing)
43
- const pathUrl = this.location.prepareExternalUrl(path);
44
- // Hash location strategy
45
- if (pathUrl.startsWith("#")) {
46
- this.authService
47
- .getLogger()
48
- .verbose("Guard - destination by hash routing");
49
- return `${baseUrl}/${pathUrl}`;
50
- }
51
- /*
52
- * If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).
53
- * Since baseUrl also includes /base, can just concatentate baseUrl + path
54
- */
55
- return `${baseUrl}${path}`;
56
- }
57
- /**
58
- * Interactively prompt the user to login
59
- * @param url Path of the requested page
60
- */
61
- loginInteractively(state) {
62
- const authRequest = typeof this.msalGuardConfig.authRequest === "function"
63
- ? this.msalGuardConfig.authRequest(this.authService, state)
64
- : { ...this.msalGuardConfig.authRequest };
65
- if (this.msalGuardConfig.interactionType === InteractionType.Popup) {
66
- this.authService.getLogger().verbose("Guard - logging in by popup");
67
- return this.authService.loginPopup(authRequest).pipe(map((response) => {
68
- this.authService
69
- .getLogger()
70
- .verbose("Guard - login by popup successful, can activate, setting active account");
71
- this.authService.instance.setActiveAccount(response.account);
72
- return true;
73
- }));
74
- }
75
- this.authService.getLogger().verbose("Guard - logging in by redirect");
76
- const redirectStartPage = this.getDestinationUrl(state.url);
77
- return this.authService
78
- .loginRedirect({
79
- redirectStartPage,
80
- ...authRequest,
81
- })
82
- .pipe(map(() => false));
83
- }
84
- /**
85
- * Helper which checks for the correct interaction type, prevents page with Guard to be set as redirect, and calls handleRedirectObservable
86
- * @param state
87
- */
88
- activateHelper(state) {
89
- if (this.msalGuardConfig.interactionType !== InteractionType.Popup &&
90
- this.msalGuardConfig.interactionType !== InteractionType.Redirect) {
91
- throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Guard. InteractionType.Popup or InteractionType.Redirect must be provided in the MsalGuardConfiguration");
92
- }
93
- this.authService.getLogger().verbose("MSAL Guard activated");
94
- /*
95
- * If a page with MSAL Guard is set as the redirect for acquireTokenSilent,
96
- * short-circuit to prevent redirecting or popups.
97
- */
98
- if (typeof window !== "undefined") {
99
- if (UrlString.hashContainsKnownProperties(window.location.hash) &&
100
- BrowserUtils.isInIframe() &&
101
- !this.authService.instance.getConfiguration().system
102
- .allowRedirectInIframe) {
103
- this.authService
104
- .getLogger()
105
- .warning("Guard - redirectUri set to page with MSAL Guard. It is recommended to not set redirectUri to a page that requires authentication.");
106
- return of(false);
107
- }
108
- }
109
- else {
110
- this.authService
111
- .getLogger()
112
- .info("Guard - window is undefined, MSAL does not support server-side token acquisition");
113
- return of(true);
114
- }
115
- /**
116
- * If a loginFailedRoute is set in the config, set this as the loginFailedRoute
117
- */
118
- if (this.msalGuardConfig.loginFailedRoute) {
119
- this.loginFailedRoute = this.parseUrl(this.msalGuardConfig.loginFailedRoute);
120
- }
121
- // Capture current path before it gets changed by handleRedirectObservable
122
- const currentPath = this.location.path(true);
123
- return this.authService.initialize().pipe(concatMap(() => {
124
- return this.authService.handleRedirectObservable();
125
- }), concatMap(() => {
126
- if (!this.authService.instance.getAllAccounts().length) {
127
- if (state) {
128
- this.authService
129
- .getLogger()
130
- .verbose("Guard - no accounts retrieved, log in required to activate");
131
- return this.loginInteractively(state);
132
- }
133
- this.authService
134
- .getLogger()
135
- .verbose("Guard - no accounts retrieved, no state, cannot load");
136
- return of(false);
137
- }
138
- this.authService
139
- .getLogger()
140
- .verbose("Guard - at least 1 account exists, can activate or load");
141
- // Prevent navigating the app to /#code= or /code=
142
- if (state) {
143
- /*
144
- * Path routing:
145
- * state.url: /#code=...
146
- * state.root.fragment: code=...
147
- */
148
- /*
149
- * Hash routing:
150
- * state.url: /code
151
- * state.root.fragment: null
152
- */
153
- const urlContainsCode = this.includesCode(state.url);
154
- const fragmentContainsCode = !!state.root &&
155
- !!state.root.fragment &&
156
- this.includesCode(`#${state.root.fragment}`);
157
- const hashRouting = this.location.prepareExternalUrl(state.url).indexOf("#") === 0;
158
- // Ensure code parameter is in fragment (and not in query parameter), or that hash hash routing is used
159
- if (urlContainsCode && (fragmentContainsCode || hashRouting)) {
160
- this.authService
161
- .getLogger()
162
- .info("Guard - Hash contains known code response, stopping navigation.");
163
- // Path routing (navigate to current path without hash)
164
- if (currentPath.indexOf("#") > -1) {
165
- return of(this.parseUrl(this.location.path()));
166
- }
167
- // Hash routing (navigate to root path)
168
- return of(this.parseUrl(""));
169
- }
170
- }
171
- return of(true);
172
- }), catchError((error) => {
173
- this.authService
174
- .getLogger()
175
- .error("Guard - error while logging in, unable to activate");
176
- this.authService
177
- .getLogger()
178
- .errorPii(`Guard - error: ${error.message}`);
179
- /**
180
- * If a loginFailedRoute is set, checks to see if state is passed before returning route
181
- */
182
- if (this.loginFailedRoute && state) {
183
- this.authService
184
- .getLogger()
185
- .verbose("Guard - loginFailedRoute set, redirecting");
186
- return of(this.loginFailedRoute);
187
- }
188
- return of(false);
189
- }));
190
- }
191
- includesCode(path) {
192
- return ((path.lastIndexOf("/code") > -1 &&
193
- path.lastIndexOf("/code") === path.length - "/code".length) || // path.endsWith("/code")
194
- path.indexOf("#code=") > -1 ||
195
- path.indexOf("&code=") > -1);
196
- }
197
- canActivate(route, state) {
198
- this.authService.getLogger().verbose("Guard - canActivate");
199
- return this.activateHelper(state);
200
- }
201
- canActivateChild(route, state) {
202
- this.authService.getLogger().verbose("Guard - canActivateChild");
203
- return this.activateHelper(state);
204
- }
205
- canMatch() {
206
- this.authService.getLogger().verbose("Guard - canLoad");
207
- return this.activateHelper();
208
- }
209
- }
210
- MsalGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalGuard, deps: [{ token: MSAL_GUARD_CONFIG }, { token: i1.MsalBroadcastService }, { token: i2.MsalService }, { token: i3.Location }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Injectable });
211
- MsalGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalGuard });
212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalGuard, decorators: [{
213
- type: Injectable
214
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
215
- type: Inject,
216
- args: [MSAL_GUARD_CONFIG]
217
- }] }, { type: i1.MsalBroadcastService }, { type: i2.MsalService }, { type: i3.Location }, { type: i4.Router }]; } });
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Injectable, Inject } from "@angular/core";
6
+ import { InteractionType, BrowserConfigurationAuthError, BrowserUtils, UrlString, } from "@azure/msal-browser";
7
+ import { of } from "rxjs";
8
+ import { concatMap, catchError, map } from "rxjs/operators";
9
+ import { MSAL_GUARD_CONFIG } from "./constants";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./msal.broadcast.service";
12
+ import * as i2 from "./msal.service";
13
+ import * as i3 from "@angular/common";
14
+ import * as i4 from "@angular/router";
15
+ export class MsalGuard {
16
+ constructor(msalGuardConfig, msalBroadcastService, authService, location, router) {
17
+ this.msalGuardConfig = msalGuardConfig;
18
+ this.msalBroadcastService = msalBroadcastService;
19
+ this.authService = authService;
20
+ this.location = location;
21
+ this.router = router;
22
+ // Subscribing so events in MsalGuard will set inProgress$ observable
23
+ this.msalBroadcastService.inProgress$.subscribe();
24
+ }
25
+ /**
26
+ * Parses url string to UrlTree
27
+ * @param url
28
+ */
29
+ parseUrl(url) {
30
+ return this.router.parseUrl(url);
31
+ }
32
+ /**
33
+ * Builds the absolute url for the destination page
34
+ * @param path Relative path of requested page
35
+ * @returns Full destination url
36
+ */
37
+ getDestinationUrl(path) {
38
+ this.authService.getLogger().verbose("Guard - getting destination url");
39
+ // Absolute base url for the application (default to origin if base element not present)
40
+ const baseElements = document.getElementsByTagName("base");
41
+ const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);
42
+ // Path of page (including hash, if using hash routing)
43
+ const pathUrl = this.location.prepareExternalUrl(path);
44
+ // Hash location strategy
45
+ if (pathUrl.startsWith("#")) {
46
+ this.authService
47
+ .getLogger()
48
+ .verbose("Guard - destination by hash routing");
49
+ return `${baseUrl}/${pathUrl}`;
50
+ }
51
+ /*
52
+ * If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).
53
+ * Since baseUrl also includes /base, can just concatentate baseUrl + path
54
+ */
55
+ return `${baseUrl}${path}`;
56
+ }
57
+ /**
58
+ * Interactively prompt the user to login
59
+ * @param url Path of the requested page
60
+ */
61
+ loginInteractively(state) {
62
+ const authRequest = typeof this.msalGuardConfig.authRequest === "function"
63
+ ? this.msalGuardConfig.authRequest(this.authService, state)
64
+ : { ...this.msalGuardConfig.authRequest };
65
+ if (this.msalGuardConfig.interactionType === InteractionType.Popup) {
66
+ this.authService.getLogger().verbose("Guard - logging in by popup");
67
+ return this.authService.loginPopup(authRequest).pipe(map((response) => {
68
+ this.authService
69
+ .getLogger()
70
+ .verbose("Guard - login by popup successful, can activate, setting active account");
71
+ this.authService.instance.setActiveAccount(response.account);
72
+ return true;
73
+ }));
74
+ }
75
+ this.authService.getLogger().verbose("Guard - logging in by redirect");
76
+ const redirectStartPage = this.getDestinationUrl(state.url);
77
+ return this.authService
78
+ .loginRedirect({
79
+ redirectStartPage,
80
+ ...authRequest,
81
+ })
82
+ .pipe(map(() => false));
83
+ }
84
+ /**
85
+ * Helper which checks for the correct interaction type, prevents page with Guard to be set as redirect, and calls handleRedirectObservable
86
+ * @param state
87
+ */
88
+ activateHelper(state) {
89
+ if (this.msalGuardConfig.interactionType !== InteractionType.Popup &&
90
+ this.msalGuardConfig.interactionType !== InteractionType.Redirect) {
91
+ throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Guard. InteractionType.Popup or InteractionType.Redirect must be provided in the MsalGuardConfiguration");
92
+ }
93
+ this.authService.getLogger().verbose("MSAL Guard activated");
94
+ /*
95
+ * If a page with MSAL Guard is set as the redirect for acquireTokenSilent,
96
+ * short-circuit to prevent redirecting or popups.
97
+ */
98
+ if (typeof window !== "undefined") {
99
+ if (UrlString.hashContainsKnownProperties(window.location.hash) &&
100
+ BrowserUtils.isInIframe() &&
101
+ !this.authService.instance.getConfiguration().system
102
+ .allowRedirectInIframe) {
103
+ this.authService
104
+ .getLogger()
105
+ .warning("Guard - redirectUri set to page with MSAL Guard. It is recommended to not set redirectUri to a page that requires authentication.");
106
+ return of(false);
107
+ }
108
+ }
109
+ else {
110
+ this.authService
111
+ .getLogger()
112
+ .info("Guard - window is undefined, MSAL does not support server-side token acquisition");
113
+ return of(true);
114
+ }
115
+ /**
116
+ * If a loginFailedRoute is set in the config, set this as the loginFailedRoute
117
+ */
118
+ if (this.msalGuardConfig.loginFailedRoute) {
119
+ this.loginFailedRoute = this.parseUrl(this.msalGuardConfig.loginFailedRoute);
120
+ }
121
+ // Capture current path before it gets changed by handleRedirectObservable
122
+ const currentPath = this.location.path(true);
123
+ return this.authService.initialize().pipe(concatMap(() => {
124
+ return this.authService.handleRedirectObservable();
125
+ }), concatMap(() => {
126
+ if (!this.authService.instance.getAllAccounts().length) {
127
+ if (state) {
128
+ this.authService
129
+ .getLogger()
130
+ .verbose("Guard - no accounts retrieved, log in required to activate");
131
+ return this.loginInteractively(state);
132
+ }
133
+ this.authService
134
+ .getLogger()
135
+ .verbose("Guard - no accounts retrieved, no state, cannot load");
136
+ return of(false);
137
+ }
138
+ this.authService
139
+ .getLogger()
140
+ .verbose("Guard - at least 1 account exists, can activate or load");
141
+ // Prevent navigating the app to /#code= or /code=
142
+ if (state) {
143
+ /*
144
+ * Path routing:
145
+ * state.url: /#code=...
146
+ * state.root.fragment: code=...
147
+ */
148
+ /*
149
+ * Hash routing:
150
+ * state.url: /code
151
+ * state.root.fragment: null
152
+ */
153
+ const urlContainsCode = this.includesCode(state.url);
154
+ const fragmentContainsCode = !!state.root &&
155
+ !!state.root.fragment &&
156
+ this.includesCode(`#${state.root.fragment}`);
157
+ const hashRouting = this.location.prepareExternalUrl(state.url).indexOf("#") === 0;
158
+ // Ensure code parameter is in fragment (and not in query parameter), or that hash hash routing is used
159
+ if (urlContainsCode && (fragmentContainsCode || hashRouting)) {
160
+ this.authService
161
+ .getLogger()
162
+ .info("Guard - Hash contains known code response, stopping navigation.");
163
+ // Path routing (navigate to current path without hash)
164
+ if (currentPath.indexOf("#") > -1) {
165
+ return of(this.parseUrl(this.location.path()));
166
+ }
167
+ // Hash routing (navigate to root path)
168
+ return of(this.parseUrl(""));
169
+ }
170
+ }
171
+ return of(true);
172
+ }), catchError((error) => {
173
+ this.authService
174
+ .getLogger()
175
+ .error("Guard - error while logging in, unable to activate");
176
+ this.authService
177
+ .getLogger()
178
+ .errorPii(`Guard - error: ${error.message}`);
179
+ /**
180
+ * If a loginFailedRoute is set, checks to see if state is passed before returning route
181
+ */
182
+ if (this.loginFailedRoute && state) {
183
+ this.authService
184
+ .getLogger()
185
+ .verbose("Guard - loginFailedRoute set, redirecting");
186
+ return of(this.loginFailedRoute);
187
+ }
188
+ return of(false);
189
+ }));
190
+ }
191
+ includesCode(path) {
192
+ return ((path.lastIndexOf("/code") > -1 &&
193
+ path.lastIndexOf("/code") === path.length - "/code".length) || // path.endsWith("/code")
194
+ path.indexOf("#code=") > -1 ||
195
+ path.indexOf("&code=") > -1);
196
+ }
197
+ canActivate(route, state) {
198
+ this.authService.getLogger().verbose("Guard - canActivate");
199
+ return this.activateHelper(state);
200
+ }
201
+ canActivateChild(route, state) {
202
+ this.authService.getLogger().verbose("Guard - canActivateChild");
203
+ return this.activateHelper(state);
204
+ }
205
+ canMatch() {
206
+ this.authService.getLogger().verbose("Guard - canLoad");
207
+ return this.activateHelper();
208
+ }
209
+ }
210
+ MsalGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalGuard, deps: [{ token: MSAL_GUARD_CONFIG }, { token: i1.MsalBroadcastService }, { token: i2.MsalService }, { token: i3.Location }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Injectable });
211
+ MsalGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalGuard });
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalGuard, decorators: [{
213
+ type: Injectable
214
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
215
+ type: Inject,
216
+ args: [MSAL_GUARD_CONFIG]
217
+ }] }, { type: i1.MsalBroadcastService }, { type: i2.MsalService }, { type: i3.Location }, { type: i4.Router }]; } });
218
218
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUW5ELE9BQU8sRUFDTCxlQUFlLEVBQ2YsNkJBQTZCLEVBQzdCLFlBQVksRUFDWixTQUFTLEdBSVYsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7O0FBR2hELE1BQU0sT0FBTyxTQUFTO0lBR3BCLFlBQ3FDLGVBQXVDLEVBQ2xFLG9CQUEwQyxFQUMxQyxXQUF3QixFQUN4QixRQUFrQixFQUNsQixNQUFjO1FBSmEsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ2xFLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FB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LHlCQUF5QjtZQUMxRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FDVCxLQUE2QixFQUM3QixLQUEwQjtRQUUxQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCLENBQ2QsS0FBNkIsRUFDN0IsS0FBMEI7UUFFMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUM7O3VHQWxRVSxTQUFTLGtCQUlWLGlCQUFpQjsyR0FKaEIsU0FBUzs0RkFBVCxTQUFTO2tCQURyQixVQUFVOzswQkFLTixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxuICBVcmxUcmVlLFxuICBSb3V0ZXIsXG59IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7XG4gIEludGVyYWN0aW9uVHlwZSxcbiAgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IsXG4gIEJyb3dzZXJVdGlscyxcbiAgVXJsU3RyaW5nLFxuICBQb3B1cFJlcXVlc3QsXG4gIFJlZGlyZWN0UmVxdWVzdCxcbiAgQXV0aGVudGljYXRpb25SZXN1bHQsXG59IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBjb25jYXRNYXAsIGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgTXNhbFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLnNlcnZpY2VcIjtcbmltcG9ydCB7IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9tc2FsLmd1YXJkLmNvbmZpZ1wiO1xuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBNU0FMX0dVQVJEX0NPTkZJRyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTXNhbEd1YXJkIHtcbiAgcHJpdmF0ZSBsb2dpbkZhaWxlZFJvdXRlPzogVXJsVHJlZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1TQUxfR1VBUkRfQ09ORklHKSBwcml2YXRlIG1zYWxHdWFyZENvbmZpZzogTXNhbEd1YXJkQ29uZmlndXJhdGlvbixcbiAgICBwcml2YXRlIG1zYWxCcm9hZGNhc3RTZXJ2aWNlOiBNc2FsQnJvYWRjYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBNc2FsU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge1xuICAgIC8vIFN1YnNjcmliaW5nIHNvIGV2ZW50cyBpbiBNc2FsR3VhcmQgd2lsbCBzZXQgaW5Qcm9ncmVzcyQgb2JzZXJ2YWJsZVxuICAgIHRoaXMubXNhbEJyb2FkY2FzdFNlcnZpY2UuaW5Qcm9ncmVzcyQuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHVybCBzdHJpbmcgdG8gVXJsVHJlZVxuICAgKiBAcGFyYW0gdXJsXG4gICAqL1xuICBwYXJzZVVybCh1cmw6IHN0cmluZyk6IFVybFRyZWUge1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5wYXJzZVVybCh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYWJzb2x1dGUgdXJsIGZvciB0aGUgZGVzdGluYXRpb24gcGFnZVxuICAgKiBAcGFyYW0gcGF0aCBSZWxhdGl2ZSBwYXRoIG9mIHJlcXVlc3RlZCBwYWdlXG4gICAqIEByZXR1cm5zIEZ1bGwgZGVzdGluYXRpb24gdXJsXG4gICAqL1xuICBnZXREZXN0aW5hdGlvblVybChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gZ2V0dGluZyBkZXN0aW5hdGlvbiB1cmxcIik7XG4gICAgLy8gQWJzb2x1dGUgYmFzZSB1cmwgZm9yIHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCB0byBvcmlnaW4gaWYgYmFzZSBlbGVtZW50IG5vdCBwcmVzZW50KVxuICAgIGNvbnN0IGJhc2VFbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYmFzZVwiKTtcbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoXG4gICAgICBiYXNlRWxlbWVudHMubGVuZ3RoID8gYmFzZUVsZW1lbnRzWzBdLmhyZWYgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luXG4gICAgKTtcblxuICAgIC8vIFBhdGggb2YgcGFnZSAoaW5jbHVkaW5nIGhhc2gsIGlmIHVzaW5nIGhhc2ggcm91dGluZylcbiAgICBjb25zdCBwYXRoVXJsID0gdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCk7XG5cbiAgICAvLyBIYXNoIGxvY2F0aW9uIHN0cmF0ZWd5XG4gICAgaWYgKHBhdGhVcmwuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgIC52ZXJib3NlKFwiR3VhcmQgLSBkZXN0aW5hdGlvbiBieSBoYXNoIHJvdXRpbmdcIik7XG4gICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtwYXRoVXJsfWA7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBJZiB1c2luZyBwYXRoIGxvY2F0aW9uIHN0cmF0ZWd5LCBwYXRoVXJsIHdpbGwgaW5jbHVkZSB0aGUgcmVsYXRpdmUgcG9ydGlvbiBvZiB0aGUgYmFzZSBwYXRoIChlLmcuIC9iYXNlL3BhZ2UpLlxuICAgICAqIFNpbmNlIGJhc2VVcmwgYWxzbyBpbmNsdWRlcyAvYmFzZSwgY2FuIGp1c3QgY29uY2F0ZW50YXRlIGJhc2VVcmwgKyBwYXRoXG4gICAgICovXG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9JHtwYXRofWA7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJhY3RpdmVseSBwcm9tcHQgdGhlIHVzZXIgdG8gbG9naW5cbiAgICogQHBhcmFtIHVybCBQYXRoIG9mIHRoZSByZXF1ZXN0ZWQgcGFnZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dpbkludGVyYWN0aXZlbHkoc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdXRoUmVxdWVzdCA9XG4gICAgICB0eXBlb2YgdGhpcy5tc2FsR3VhcmRDb25maWcuYXV0aFJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0KHRoaXMuYXV0aFNlcnZpY2UsIHN0YXRlKVxuICAgICAgICA6IHsgLi4udGhpcy5tc2FsR3VhcmRDb25maWcuYXV0aFJlcXVlc3QgfTtcbiAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUG9wdXApIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbG9nZ2luZyBpbiBieSBwb3B1cFwiKTtcbiAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2luUG9wdXAoYXV0aFJlcXVlc3QgYXMgUG9wdXBSZXF1ZXN0KS5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBBdXRoZW50aWNhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgLnZlcmJvc2UoXG4gICAgICAgICAgICAgIFwiR3VhcmQgLSBsb2dpbiBieSBwb3B1cCBzdWNjZXNzZnVsLCBjYW4gYWN0aXZhdGUsIHNldHRpbmcgYWN0aXZlIGFjY291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQocmVzcG9uc2UuYWNjb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbG9nZ2luZyBpbiBieSByZWRpcmVjdFwiKTtcbiAgICBjb25zdCByZWRpcmVjdFN0YXJ0UGFnZSA9IHRoaXMuZ2V0RGVzdGluYXRpb25Vcmwoc3RhdGUudXJsKTtcbiAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZVxuICAgICAgLmxvZ2luUmVkaXJlY3Qoe1xuICAgICAgICByZWRpcmVjdFN0YXJ0UGFnZSxcbiAgICAgICAgLi4uYXV0aFJlcXVlc3QsXG4gICAgICB9IGFzIFJlZGlyZWN0UmVxdWVzdClcbiAgICAgIC5waXBlKG1hcCgoKSA9PiBmYWxzZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIHR5cGUsIHByZXZlbnRzIHBhZ2Ugd2l0aCBHdWFyZCB0byBiZSBzZXQgYXMgcmVkaXJlY3QsIGFuZCBjYWxscyBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcbiAgICogQHBhcmFtIHN0YXRlXG4gICAqL1xuICBwcml2YXRlIGFjdGl2YXRlSGVscGVyKFxuICAgIHN0YXRlPzogUm91dGVyU3RhdGVTbmFwc2hvdFxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiZcbiAgICAgIHRoaXMubXNhbEd1YXJkQ29uZmlnLmludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IoXG4gICAgICAgIFwiaW52YWxpZF9pbnRlcmFjdGlvbl90eXBlXCIsXG4gICAgICAgIFwiSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgR3VhcmQuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCBvciBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgTXNhbEd1YXJkQ29uZmlndXJhdGlvblwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJNU0FMIEd1YXJkIGFjdGl2YXRlZFwiKTtcblxuICAgIC8qXG4gICAgICogSWYgYSBwYWdlIHdpdGggTVNBTCBHdWFyZCBpcyBzZXQgYXMgdGhlIHJlZGlyZWN0IGZvciBhY3F1aXJlVG9rZW5TaWxlbnQsXG4gICAgICogc2hvcnQtY2lyY3VpdCB0byBwcmV2ZW50IHJlZGlyZWN0aW5nIG9yIHBvcHVwcy5cbiAgICAgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKFxuICAgICAgICBVcmxTdHJpbmcuaGFzaENvbnRhaW5zS25vd25Qcm9wZXJ0aWVzKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSAmJlxuICAgICAgICBCcm93c2VyVXRpbHMuaXNJbklmcmFtZSgpICYmXG4gICAgICAgICF0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldENvbmZpZ3VyYXRpb24oKS5zeXN0ZW1cbiAgICAgICAgICAuYWxsb3dSZWRpcmVjdEluSWZyYW1lXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgIC53YXJuaW5nKFxuICAgICAgICAgICAgXCJHdWFyZCAtIHJlZGlyZWN0VXJpIHNldCB0byBwYWdlIHdpdGggTVNBTCBHdWFyZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbm90IHNldCByZWRpcmVjdFVyaSB0byBhIHBhZ2UgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgIC5pbmZvKFxuICAgICAgICAgIFwiR3VhcmQgLSB3aW5kb3cgaXMgdW5kZWZpbmVkLCBNU0FMIGRvZXMgbm90IHN1cHBvcnQgc2VydmVyLXNpZGUgdG9rZW4gYWNxdWlzaXRpb25cIlxuICAgICAgICApO1xuICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQgaW4gdGhlIGNvbmZpZywgc2V0IHRoaXMgYXMgdGhlIGxvZ2luRmFpbGVkUm91dGVcbiAgICAgKi9cbiAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcubG9naW5GYWlsZWRSb3V0ZSkge1xuICAgICAgdGhpcy5sb2dpbkZhaWxlZFJvdXRlID0gdGhpcy5wYXJzZVVybChcbiAgICAgICAgdGhpcy5tc2FsR3VhcmRDb25maWcubG9naW5GYWlsZWRSb3V0ZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIGN1cnJlbnQgcGF0aCBiZWZvcmUgaXQgZ2V0cyBjaGFuZ2VkIGJ5IGhhbmRsZVJlZGlyZWN0T2JzZXJ2YWJsZVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5sb2NhdGlvbi5wYXRoKHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaW5pdGlhbGl6ZSgpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5oYW5kbGVSZWRpcmVjdE9ic2VydmFibGUoKTtcbiAgICAgIH0pLFxuICAgICAgY29uY2F0TWFwKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFsbEFjY291bnRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAudmVyYm9zZShcbiAgICAgICAgICAgICAgICBcIkd1YXJkIC0gbm8gYWNjb3VudHMgcmV0cmlldmVkLCBsb2cgaW4gcmVxdWlyZWQgdG8gYWN0aXZhdGVcIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9naW5JbnRlcmFjdGl2ZWx5KHN0YXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAudmVyYm9zZShcIkd1YXJkIC0gbm8gYWNjb3VudHMgcmV0cmlldmVkLCBubyBzdGF0ZSwgY2Fubm90IGxvYWRcIik7XG4gICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAudmVyYm9zZShcIkd1YXJkIC0gYXQgbGVhc3QgMSBhY2NvdW50IGV4aXN0cywgY2FuIGFjdGl2YXRlIG9yIGxvYWRcIik7XG5cbiAgICAgICAgLy8gUHJldmVudCBuYXZpZ2F0aW5nIHRoZSBhcHAgdG8gLyNjb2RlPSBvciAvY29kZT1cbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBQYXRoIHJvdXRpbmc6XG4gICAgICAgICAgICogc3RhdGUudXJsOiAvI2NvZGU9Li4uXG4gICAgICAgICAgICogc3RhdGUucm9vdC5mcmFnbWVudDogY29kZT0uLi5cbiAgICAgICAgICAgKi9cblxuICAgICAgICAgIC8qXG4gICAgICAgICAgICogSGFzaCByb3V0aW5nOlxuICAgICAgICAgICAqIHN0YXRlLnVybDogL2NvZGVcbiAgICAgICAgICAgKiBzdGF0ZS5yb290LmZyYWdtZW50OiBudWxsXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgdXJsQ29udGFpbnNDb2RlOiBib29sZWFuID0gdGhpcy5pbmNsdWRlc0NvZGUoc3RhdGUudXJsKTtcbiAgICAgICAgICBjb25zdCBmcmFnbWVudENvbnRhaW5zQ29kZTogYm9vbGVhbiA9XG4gICAgICAgICAgICAhIXN0YXRlLnJvb3QgJiZcbiAgICAgICAgICAgICEhc3RhdGUucm9vdC5mcmFnbWVudCAmJlxuICAgICAgICAgICAgdGhpcy5pbmNsdWRlc0NvZGUoYCMke3N0YXRlLnJvb3QuZnJhZ21lbnR9YCk7XG4gICAgICAgICAgY29uc3QgaGFzaFJvdXRpbmc6IGJvb2xlYW4gPVxuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwoc3RhdGUudXJsKS5pbmRleE9mKFwiI1wiKSA9PT0gMDtcblxuICAgICAgICAgIC8vIEVuc3VyZSBjb2RlIHBhcmFtZXRlciBpcyBpbiBmcmFnbWVudCAoYW5kIG5vdCBpbiBxdWVyeSBwYXJhbWV0ZXIpLCBvciB0aGF0IGhhc2ggaGFzaCByb3V0aW5nIGlzIHVzZWRcbiAgICAgICAgICBpZiAodXJsQ29udGFpbnNDb2RlICYmIChmcmFnbWVudENvbnRhaW5zQ29kZSB8fCBoYXNoUm91dGluZykpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAgIC5pbmZvKFxuICAgICAgICAgICAgICAgIFwiR3VhcmQgLSBIYXNoIGNvbnRhaW5zIGtub3duIGNvZGUgcmVzcG9uc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24uXCJcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUGF0aCByb3V0aW5nIChuYXZpZ2F0ZSB0byBjdXJyZW50IHBhdGggd2l0aG91dCBoYXNoKVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXRoLmluZGV4T2YoXCIjXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMucGFyc2VVcmwodGhpcy5sb2NhdGlvbi5wYXRoKCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFzaCByb3V0aW5nIChuYXZpZ2F0ZSB0byByb290IHBhdGgpXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybChcIlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgIC5lcnJvcihcIkd1YXJkIC0gZXJyb3Igd2hpbGUgbG9nZ2luZyBpbiwgdW5hYmxlIHRvIGFjdGl2YXRlXCIpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgLmVycm9yUGlpKGBHdWFyZCAtIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBhIGxvZ2luRmFpbGVkUm91dGUgaXMgc2V0LCBjaGVja3MgdG8gc2VlIGlmIHN0YXRlIGlzIHBhc3NlZCBiZWZvcmUgcmV0dXJuaW5nIHJvdXRlXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5sb2dpbkZhaWxlZFJvdXRlICYmIHN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAudmVyYm9zZShcIkd1YXJkIC0gbG9naW5GYWlsZWRSb3V0ZSBzZXQsIHJlZGlyZWN0aW5nXCIpO1xuICAgICAgICAgIHJldHVybiBvZih0aGlzLmxvZ2luRmFpbGVkUm91dGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBpbmNsdWRlc0NvZGUocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIChwYXRoLmxhc3RJbmRleE9mKFwiL2NvZGVcIikgPiAtMSAmJlxuICAgICAgICBwYXRoLmxhc3RJbmRleE9mKFwiL2NvZGVcIikgPT09IHBhdGgubGVuZ3RoIC0gXCIvY29kZVwiLmxlbmd0aCkgfHwgLy8gcGF0aC5lbmRzV2l0aChcIi9jb2RlXCIpXG4gICAgICBwYXRoLmluZGV4T2YoXCIjY29kZT1cIikgPiAtMSB8fFxuICAgICAgcGF0aC5pbmRleE9mKFwiJmNvZGU9XCIpID4gLTFcbiAgICApO1xuICB9XG5cbiAgY2FuQWN0aXZhdGUoXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICAgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3RcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gY2FuQWN0aXZhdGVcIik7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVIZWxwZXIoc3RhdGUpO1xuICB9XG5cbiAgY2FuQWN0aXZhdGVDaGlsZChcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdFxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBjYW5BY3RpdmF0ZUNoaWxkXCIpO1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRlSGVscGVyKHN0YXRlKTtcbiAgfVxuXG4gIGNhbk1hdGNoKCk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkxvYWRcIik7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVIZWxwZXIoKTtcbiAgfVxufVxuIl19
@@ -1,6 +1,6 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- export {};
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export {};
6
6
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5pbnRlcmNlcHRvci5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHsgSHR0cFJlcXVlc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7XG4gIFBvcHVwUmVxdWVzdCxcbiAgUmVkaXJlY3RSZXF1ZXN0LFxuICBJbnRlcmFjdGlvblR5cGUsXG4gIFNpbGVudFJlcXVlc3QsXG59IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0ID1cbiAgfCBPbWl0PFBvcHVwUmVxdWVzdCwgXCJzY29wZXNcIj5cbiAgfCBPbWl0PFJlZGlyZWN0UmVxdWVzdCwgXCJzY29wZXNcIj5cbiAgfCBPbWl0PFNpbGVudFJlcXVlc3QsIFwic2NvcGVzXCI+O1xuXG5leHBvcnQgdHlwZSBNc2FsSW50ZXJjZXB0b3JDb25maWd1cmF0aW9uID0ge1xuICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcbiAgcHJvdGVjdGVkUmVzb3VyY2VNYXA6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgQXJyYXk8c3RyaW5nIHwgUHJvdGVjdGVkUmVzb3VyY2VTY29wZXM+IHwgbnVsbFxuICA+O1xuICBhdXRoUmVxdWVzdD86XG4gICAgfCBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdFxuICAgIHwgKChcbiAgICAgICAgbXNhbFNlcnZpY2U6IE1zYWxTZXJ2aWNlLFxuICAgICAgICByZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LFxuICAgICAgICBvcmlnaW5hbEF1dGhSZXF1ZXN0OiBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdFxuICAgICAgKSA9PiBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCk7XG59O1xuXG5leHBvcnQgdHlwZSBQcm90ZWN0ZWRSZXNvdXJjZVNjb3BlcyA9IHtcbiAgaHR0cE1ldGhvZDogc3RyaW5nO1xuICBzY29wZXM6IEFycmF5PHN0cmluZz4gfCBudWxsO1xufTtcbiJdfQ==