@azure/msal-angular 3.0.0-beta.1 → 3.0.0

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 (87) hide show
  1. package/.beachballrc +3 -0
  2. package/.editorconfig +16 -0
  3. package/CHANGELOG.json +1418 -0
  4. package/CHANGELOG.md +520 -0
  5. package/FAQ.md +175 -0
  6. package/LICENSE +20 -20
  7. package/README.md +157 -157
  8. package/angular.json +51 -0
  9. package/docs/angular-universal.md +60 -0
  10. package/docs/configuration.md +525 -0
  11. package/docs/errors.md +89 -0
  12. package/docs/events.md +262 -0
  13. package/docs/initialization.md +206 -0
  14. package/docs/known-issues.md +19 -0
  15. package/docs/logging.md +47 -0
  16. package/docs/msal-guard.md +208 -0
  17. package/docs/msal-interceptor.md +160 -0
  18. package/docs/multi-tenant.md +90 -0
  19. package/docs/performance.md +50 -0
  20. package/docs/public-apis.md +29 -0
  21. package/docs/redirects.md +214 -0
  22. package/docs/security.md +4 -0
  23. package/docs/ssosilent.md +84 -0
  24. package/docs/v0-v1-upgrade-guide.md +61 -0
  25. package/docs/v1-v2-upgrade-guide.md +70 -0
  26. package/docs/v2-v3-upgrade-guide.md +41 -0
  27. package/karma.conf.js +43 -0
  28. package/ng-package.json +7 -0
  29. package/package.json +55 -30
  30. package/src/IMsalService.ts +31 -0
  31. package/src/constants.ts +20 -0
  32. package/src/msal.broadcast.config.ts +8 -0
  33. package/src/msal.broadcast.service.spec.ts +456 -0
  34. package/src/msal.broadcast.service.ts +74 -0
  35. package/src/msal.guard.config.ts +27 -0
  36. package/src/msal.guard.spec.ts +525 -0
  37. package/src/msal.guard.ts +290 -0
  38. package/src/msal.interceptor.config.ts +44 -0
  39. package/src/msal.interceptor.spec.ts +1125 -0
  40. package/src/msal.interceptor.ts +390 -0
  41. package/src/msal.module.ts +51 -0
  42. package/src/msal.navigation.client.spec.ts +95 -0
  43. package/src/msal.navigation.client.ts +57 -0
  44. package/src/msal.redirect.component.spec.ts +63 -0
  45. package/src/msal.redirect.component.ts +26 -0
  46. package/src/msal.service.spec.ts +452 -0
  47. package/src/msal.service.ts +97 -0
  48. package/src/packageMetadata.ts +3 -0
  49. package/{public-api.d.ts → src/public-api.ts} +35 -17
  50. package/src/test.ts +19 -0
  51. package/tsconfig.json +25 -0
  52. package/tsconfig.lib.json +27 -0
  53. package/tsconfig.lib.prod.json +10 -0
  54. package/tsconfig.spec.json +17 -0
  55. package/IMsalService.d.ts +0 -15
  56. package/constants.d.ts +0 -5
  57. package/esm2020/IMsalService.mjs +0 -6
  58. package/esm2020/azure-msal-angular.mjs +0 -5
  59. package/esm2020/constants.mjs +0 -10
  60. package/esm2020/msal.broadcast.config.mjs +0 -6
  61. package/esm2020/msal.broadcast.service.mjs +0 -57
  62. package/esm2020/msal.guard.config.mjs +0 -6
  63. package/esm2020/msal.guard.mjs +0 -218
  64. package/esm2020/msal.interceptor.config.mjs +0 -6
  65. package/esm2020/msal.interceptor.mjs +0 -270
  66. package/esm2020/msal.module.mjs +0 -46
  67. package/esm2020/msal.navigation.client.mjs +0 -51
  68. package/esm2020/msal.redirect.component.mjs +0 -31
  69. package/esm2020/msal.service.mjs +0 -81
  70. package/esm2020/packageMetadata.mjs +0 -4
  71. package/esm2020/public-api.mjs +0 -18
  72. package/fesm2015/azure-msal-angular.mjs +0 -736
  73. package/fesm2015/azure-msal-angular.mjs.map +0 -1
  74. package/fesm2020/azure-msal-angular.mjs +0 -732
  75. package/fesm2020/azure-msal-angular.mjs.map +0 -1
  76. package/index.d.ts +0 -5
  77. package/msal.broadcast.config.d.ts +0 -3
  78. package/msal.broadcast.service.d.ts +0 -17
  79. package/msal.guard.config.d.ts +0 -9
  80. package/msal.guard.d.ts +0 -43
  81. package/msal.interceptor.config.d.ts +0 -17
  82. package/msal.interceptor.d.ts +0 -63
  83. package/msal.module.d.ts +0 -13
  84. package/msal.navigation.client.d.ts +0 -19
  85. package/msal.redirect.component.d.ts +0 -15
  86. package/msal.service.d.ts +0 -31
  87. package/packageMetadata.d.ts +0 -2
@@ -0,0 +1,17 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "./out-tsc/spec",
6
+ "types": [
7
+ "jasmine"
8
+ ]
9
+ },
10
+ "files": [
11
+ "src/test.ts"
12
+ ],
13
+ "include": [
14
+ "**/*.spec.ts",
15
+ "**/*.d.ts"
16
+ ]
17
+ }
package/IMsalService.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import { EndSessionRequest, AuthorizationUrlRequest, AuthenticationResult, PopupRequest, RedirectRequest, SilentRequest, Logger } from '@azure/msal-browser';
2
- import { Observable } from 'rxjs';
3
- export interface IMsalService {
4
- initialize(): Observable<void>;
5
- acquireTokenPopup(request: PopupRequest): Observable<AuthenticationResult>;
6
- acquireTokenRedirect(request: RedirectRequest): Observable<void>;
7
- acquireTokenSilent(silentRequest: SilentRequest): Observable<AuthenticationResult>;
8
- handleRedirectObservable(): Observable<AuthenticationResult | null>;
9
- loginPopup(request?: PopupRequest): Observable<AuthenticationResult>;
10
- loginRedirect(request?: RedirectRequest): Observable<void>;
11
- logout(logoutRequest?: EndSessionRequest): Observable<void>;
12
- ssoSilent(request: AuthorizationUrlRequest): Observable<AuthenticationResult>;
13
- getLogger(): Logger;
14
- setLogger(logger: Logger): void;
15
- }
package/constants.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export declare const MSAL_INSTANCE: InjectionToken<string>;
3
- export declare const MSAL_GUARD_CONFIG: InjectionToken<string>;
4
- export declare const MSAL_INTERCEPTOR_CONFIG: InjectionToken<string>;
5
- export declare const MSAL_BROADCAST_CONFIG: InjectionToken<string>;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSU1zYWxTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0lNc2FsU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kU2Vzc2lvblJlcXVlc3QsXG4gIEF1dGhvcml6YXRpb25VcmxSZXF1ZXN0LFxuICBBdXRoZW50aWNhdGlvblJlc3VsdCxcbiAgUG9wdXBSZXF1ZXN0LFxuICBSZWRpcmVjdFJlcXVlc3QsXG4gIFNpbGVudFJlcXVlc3QsXG4gIExvZ2dlcixcbn0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1zYWxTZXJ2aWNlIHtcbiAgaW5pdGlhbGl6ZSgpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICBhY3F1aXJlVG9rZW5Qb3B1cChyZXF1ZXN0OiBQb3B1cFJlcXVlc3QpOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0aW9uUmVzdWx0PjtcbiAgYWNxdWlyZVRva2VuUmVkaXJlY3QocmVxdWVzdDogUmVkaXJlY3RSZXF1ZXN0KTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgYWNxdWlyZVRva2VuU2lsZW50KFxuICAgIHNpbGVudFJlcXVlc3Q6IFNpbGVudFJlcXVlc3RcbiAgKTogT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGlvblJlc3VsdD47XG4gIGhhbmRsZVJlZGlyZWN0T2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0aW9uUmVzdWx0IHwgbnVsbD47XG4gIGxvZ2luUG9wdXAocmVxdWVzdD86IFBvcHVwUmVxdWVzdCk6IE9ic2VydmFibGU8QXV0aGVudGljYXRpb25SZXN1bHQ+O1xuICBsb2dpblJlZGlyZWN0KHJlcXVlc3Q/OiBSZWRpcmVjdFJlcXVlc3QpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICBsb2dvdXQobG9nb3V0UmVxdWVzdD86IEVuZFNlc3Npb25SZXF1ZXN0KTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgc3NvU2lsZW50KHJlcXVlc3Q6IEF1dGhvcml6YXRpb25VcmxSZXF1ZXN0KTogT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGlvblJlc3VsdD47XG4gIGdldExvZ2dlcigpOiBMb2dnZXI7XG4gIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlcik6IHZvaWQ7XG59XG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp1cmUtbXNhbC1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dXJlLW1zYWwtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,10 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { InjectionToken } from '@angular/core';
6
- export const MSAL_INSTANCE = new InjectionToken('MSAL_INSTANCE');
7
- export const MSAL_GUARD_CONFIG = new InjectionToken('MSAL_GUARD_CONFIG');
8
- export const MSAL_INTERCEPTOR_CONFIG = new InjectionToken('MSAL_INTERCEPTOR_CONFIG');
9
- export const MSAL_BROADCAST_CONFIG = new InjectionToken('MSAL_BROADCAST_CONFIG');
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBUyxlQUFlLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FDakQsbUJBQW1CLENBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLGNBQWMsQ0FDdkQseUJBQXlCLENBQzFCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsQ0FDckQsdUJBQXVCLENBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IE1TQUxfSU5TVEFOQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignTVNBTF9JTlNUQU5DRScpO1xuXG5leHBvcnQgY29uc3QgTVNBTF9HVUFSRF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcbiAgJ01TQUxfR1VBUkRfQ09ORklHJ1xuKTtcblxuZXhwb3J0IGNvbnN0IE1TQUxfSU5URVJDRVBUT1JfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXG4gICdNU0FMX0lOVEVSQ0VQVE9SX0NPTkZJRydcbik7XG5cbmV4cG9ydCBjb25zdCBNU0FMX0JST0FEQ0FTVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPihcbiAgJ01TQUxfQlJPQURDQVNUX0NPTkZJRydcbik7XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5icm9hZGNhc3QuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21zYWwuYnJvYWRjYXN0LmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IHR5cGUgTXNhbEJyb2FkY2FzdENvbmZpZ3VyYXRpb24gPSB7XG4gIGV2ZW50c1RvUmVwbGF5OiBudW1iZXI7XG59O1xuIl19
@@ -1,57 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { Inject, Injectable, Optional } from '@angular/core';
6
- import { EventMessageUtils, InteractionStatus, } from '@azure/msal-browser';
7
- import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';
8
- import { MSAL_BROADCAST_CONFIG, MSAL_INSTANCE } from './constants';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./msal.service";
11
- export class MsalBroadcastService {
12
- constructor(msalInstance, authService, msalBroadcastConfig) {
13
- this.msalInstance = msalInstance;
14
- this.authService = authService;
15
- this.msalBroadcastConfig = msalBroadcastConfig;
16
- // Make _msalSubject a ReplaySubject if configured to replay past events
17
- if (this.msalBroadcastConfig &&
18
- this.msalBroadcastConfig.eventsToReplay > 0) {
19
- this.authService
20
- .getLogger()
21
- .verbose(`BroadcastService - eventsToReplay set on BroadcastConfig, replaying the last ${this.msalBroadcastConfig.eventsToReplay} events`);
22
- this._msalSubject = new ReplaySubject(this.msalBroadcastConfig.eventsToReplay);
23
- }
24
- else {
25
- // Defaults to _msalSubject being a Subject
26
- this._msalSubject = new Subject();
27
- }
28
- this.msalSubject$ = this._msalSubject.asObservable();
29
- // InProgress as BehaviorSubject so most recent inProgress state will be available upon subscription
30
- this._inProgress = new BehaviorSubject(InteractionStatus.Startup);
31
- this.inProgress$ = this._inProgress.asObservable();
32
- this.msalInstance.addEventCallback((message) => {
33
- this._msalSubject.next(message);
34
- const status = EventMessageUtils.getInteractionStatusFromEvent(message, this._inProgress.value);
35
- if (status !== null) {
36
- this.authService
37
- .getLogger()
38
- .verbose(`BroadcastService - ${message.eventType} results in setting inProgress from ${this._inProgress.value} to ${status}`);
39
- this._inProgress.next(status);
40
- }
41
- });
42
- }
43
- }
44
- MsalBroadcastService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: MsalBroadcastService, deps: [{ token: MSAL_INSTANCE }, { token: i1.MsalService }, { token: MSAL_BROADCAST_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
45
- MsalBroadcastService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: MsalBroadcastService });
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: MsalBroadcastService, decorators: [{
47
- type: Injectable
48
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
49
- type: Inject,
50
- args: [MSAL_INSTANCE]
51
- }] }, { type: i1.MsalService }, { type: undefined, decorators: [{
52
- type: Optional
53
- }, {
54
- type: Inject,
55
- args: [MSAL_BROADCAST_CONFIG]
56
- }] }]; } });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5icm9hZGNhc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBRUwsaUJBQWlCLEVBRWpCLGlCQUFpQixHQUNsQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUczRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7QUFHbkUsTUFBTSxPQUFPLG9CQUFvQjtJQU0vQixZQUNpQyxZQUFzQyxFQUM3RCxXQUF3QixFQUd4QixtQkFBZ0Q7UUFKekIsaUJBQVksR0FBWixZQUFZLENBQTBCO1FBQzdELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBR3hCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNkI7UUFFeEQsd0VBQXdFO1FBQ3hFLElBQ0UsSUFBSSxDQUFDLG1CQUFtQjtZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxHQUFHLENBQUMsRUFDM0M7WUFDQSxJQUFJLENBQUMsV0FBVztpQkFDYixTQUFTLEVBQUU7aUJBQ1gsT0FBTyxDQUNOLGdGQUFnRixJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxTQUFTLENBQ2pJLENBQUM7WUFDSixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksYUFBYSxDQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUN4QyxDQUFDO1NBQ0g7YUFBTTtZQUNMLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1NBQ2pEO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXJELG9HQUFvRztRQUNwRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksZUFBZSxDQUNwQyxpQkFBaUIsQ0FBQyxPQUFPLENBQzFCLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQXFCLEVBQUUsRUFBRTtZQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FDNUQsT0FBTyxFQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUN2QixDQUFDO1lBQ0YsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUNuQixJQUFJLENBQUMsV0FBVztxQkFDYixTQUFTLEVBQUU7cUJBQ1gsT0FBTyxDQUNOLHNCQUFzQixPQUFPLENBQUMsU0FBUyx1Q0FBdUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLE9BQU8sTUFBTSxFQUFFLENBQ3BILENBQUM7Z0JBQ0osSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2lIQXREVSxvQkFBb0Isa0JBT3JCLGFBQWEsd0NBR2IscUJBQXFCO3FIQVZwQixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVTs7MEJBUU4sTUFBTTsyQkFBQyxhQUFhOzswQkFFcEIsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRXZlbnRNZXNzYWdlLFxuICBFdmVudE1lc3NhZ2VVdGlscyxcbiAgSVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLFxuICBJbnRlcmFjdGlvblN0YXR1cyxcbn0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSAnLi9tc2FsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL21zYWwuYnJvYWRjYXN0LmNvbmZpZyc7XG5pbXBvcnQgeyBNU0FMX0JST0FEQ0FTVF9DT05GSUcsIE1TQUxfSU5TVEFOQ0UgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNc2FsQnJvYWRjYXN0U2VydmljZSB7XG4gIHByaXZhdGUgX21zYWxTdWJqZWN0OiBTdWJqZWN0PEV2ZW50TWVzc2FnZT47XG4gIHB1YmxpYyBtc2FsU3ViamVjdCQ6IE9ic2VydmFibGU8RXZlbnRNZXNzYWdlPjtcbiAgcHJpdmF0ZSBfaW5Qcm9ncmVzczogQmVoYXZpb3JTdWJqZWN0PEludGVyYWN0aW9uU3RhdHVzPjtcbiAgcHVibGljIGluUHJvZ3Jlc3MkOiBPYnNlcnZhYmxlPEludGVyYWN0aW9uU3RhdHVzPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1TQUxfSU5TVEFOQ0UpIHByaXZhdGUgbXNhbEluc3RhbmNlOiBJUHVibGljQ2xpZW50QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTXNhbFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1TQUxfQlJPQURDQVNUX0NPTkZJRylcbiAgICBwcml2YXRlIG1zYWxCcm9hZGNhc3RDb25maWc/OiBNc2FsQnJvYWRjYXN0Q29uZmlndXJhdGlvblxuICApIHtcbiAgICAvLyBNYWtlIF9tc2FsU3ViamVjdCBhIFJlcGxheVN1YmplY3QgaWYgY29uZmlndXJlZCB0byByZXBsYXkgcGFzdCBldmVudHNcbiAgICBpZiAoXG4gICAgICB0aGlzLm1zYWxCcm9hZGNhc3RDb25maWcgJiZcbiAgICAgIHRoaXMubXNhbEJyb2FkY2FzdENvbmZpZy5ldmVudHNUb1JlcGxheSA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgIC52ZXJib3NlKFxuICAgICAgICAgIGBCcm9hZGNhc3RTZXJ2aWNlIC0gZXZlbnRzVG9SZXBsYXkgc2V0IG9uIEJyb2FkY2FzdENvbmZpZywgcmVwbGF5aW5nIHRoZSBsYXN0ICR7dGhpcy5tc2FsQnJvYWRjYXN0Q29uZmlnLmV2ZW50c1RvUmVwbGF5fSBldmVudHNgXG4gICAgICAgICk7XG4gICAgICB0aGlzLl9tc2FsU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PEV2ZW50TWVzc2FnZT4oXG4gICAgICAgIHRoaXMubXNhbEJyb2FkY2FzdENvbmZpZy5ldmVudHNUb1JlcGxheVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdHMgdG8gX21zYWxTdWJqZWN0IGJlaW5nIGEgU3ViamVjdFxuICAgICAgdGhpcy5fbXNhbFN1YmplY3QgPSBuZXcgU3ViamVjdDxFdmVudE1lc3NhZ2U+KCk7XG4gICAgfVxuXG4gICAgdGhpcy5tc2FsU3ViamVjdCQgPSB0aGlzLl9tc2FsU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIEluUHJvZ3Jlc3MgYXMgQmVoYXZpb3JTdWJqZWN0IHNvIG1vc3QgcmVjZW50IGluUHJvZ3Jlc3Mgc3RhdGUgd2lsbCBiZSBhdmFpbGFibGUgdXBvbiBzdWJzY3JpcHRpb25cbiAgICB0aGlzLl9pblByb2dyZXNzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcmFjdGlvblN0YXR1cz4oXG4gICAgICBJbnRlcmFjdGlvblN0YXR1cy5TdGFydHVwXG4gICAgKTtcbiAgICB0aGlzLmluUHJvZ3Jlc3MkID0gdGhpcy5faW5Qcm9ncmVzcy5hc09ic2VydmFibGUoKTtcblxuICAgIHRoaXMubXNhbEluc3RhbmNlLmFkZEV2ZW50Q2FsbGJhY2soKG1lc3NhZ2U6IEV2ZW50TWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5fbXNhbFN1YmplY3QubmV4dChtZXNzYWdlKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IEV2ZW50TWVzc2FnZVV0aWxzLmdldEludGVyYWN0aW9uU3RhdHVzRnJvbUV2ZW50KFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICB0aGlzLl9pblByb2dyZXNzLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKHN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgLnZlcmJvc2UoXG4gICAgICAgICAgICBgQnJvYWRjYXN0U2VydmljZSAtICR7bWVzc2FnZS5ldmVudFR5cGV9IHJlc3VsdHMgaW4gc2V0dGluZyBpblByb2dyZXNzIGZyb20gJHt0aGlzLl9pblByb2dyZXNzLnZhbHVlfSB0byAke3N0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5faW5Qcm9ncmVzcy5uZXh0KHN0YXR1cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5ndWFyZC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgUG9wdXBSZXF1ZXN0LFxuICBSZWRpcmVjdFJlcXVlc3QsXG4gIEludGVyYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gJy4vbXNhbC5zZXJ2aWNlJztcblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBNc2FsR3VhcmRBdXRoUmVxdWVzdCA9XG4gIHwgUGFydGlhbDxQb3B1cFJlcXVlc3Q+XG4gIHwgUGFydGlhbDxPbWl0PFJlZGlyZWN0UmVxdWVzdCwgJ3JlZGlyZWN0U3RhcnRQYWdlJz4+O1xuXG5leHBvcnQgdHlwZSBNc2FsR3VhcmRDb25maWd1cmF0aW9uID0ge1xuICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcbiAgYXV0aFJlcXVlc3Q/OlxuICAgIHwgTXNhbEd1YXJkQXV0aFJlcXVlc3RcbiAgICB8ICgoXG4gICAgICAgIGF1dGhTZXJ2aWNlOiBNc2FsU2VydmljZSxcbiAgICAgICAgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3RcbiAgICAgICkgPT4gTXNhbEd1YXJkQXV0aFJlcXVlc3QpO1xuICBsb2dpbkZhaWxlZFJvdXRlPzogc3RyaW5nO1xufTtcbiJdfQ==
@@ -1,218 +0,0 @@
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.7", 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.7", ngImport: i0, type: MsalGuard });
212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", 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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUW5ELE9BQU8sRUFDTCxlQUFlLEVBQ2YsNkJBQTZCLEVBQzdCLFlBQVksRUFDWixTQUFTLEdBSVYsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7O0FBR2hELE1BQU0sT0FBTyxTQUFTO0lBR3BCLFlBQ3FDLGVBQXVDLEVBQ2xFLG9CQUEwQyxFQUMxQyxXQUF3QixFQUN4QixRQUFrQixFQUNsQixNQUFjO1FBSmEsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ2xFLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FB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LHlCQUF5QjtZQUMxRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FDVCxLQUE2QixFQUM3QixLQUEwQjtRQUUxQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCLENBQ2QsS0FBNkIsRUFDN0IsS0FBMEI7UUFFMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUM7O3NHQWxRVSxTQUFTLGtCQUlWLGlCQUFpQjswR0FKaEIsU0FBUzsyRkFBVCxTQUFTO2tCQURyQixVQUFVOzswQkFLTixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXG4gIFVybFRyZWUsXG4gIFJvdXRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEludGVyYWN0aW9uVHlwZSxcbiAgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IsXG4gIEJyb3dzZXJVdGlscyxcbiAgVXJsU3RyaW5nLFxuICBQb3B1cFJlcXVlc3QsXG4gIFJlZGlyZWN0UmVxdWVzdCxcbiAgQXV0aGVudGljYXRpb25SZXN1bHQsXG59IGZyb20gJ0BhenVyZS9tc2FsLWJyb3dzZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbmNhdE1hcCwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTXNhbFNlcnZpY2UgfSBmcm9tICcuL21zYWwuc2VydmljZSc7XG5pbXBvcnQgeyBNc2FsR3VhcmRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9tc2FsLmd1YXJkLmNvbmZpZyc7XG5pbXBvcnQgeyBNc2FsQnJvYWRjYXN0U2VydmljZSB9IGZyb20gJy4vbXNhbC5icm9hZGNhc3Quc2VydmljZSc7XG5pbXBvcnQgeyBNU0FMX0dVQVJEX0NPTkZJRyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1zYWxHdWFyZCB7XG4gIHByaXZhdGUgbG9naW5GYWlsZWRSb3V0ZT86IFVybFRyZWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNU0FMX0dVQVJEX0NPTkZJRykgcHJpdmF0ZSBtc2FsR3VhcmRDb25maWc6IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24sXG4gICAgcHJpdmF0ZSBtc2FsQnJvYWRjYXN0U2VydmljZTogTXNhbEJyb2FkY2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTXNhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICAvLyBTdWJzY3JpYmluZyBzbyBldmVudHMgaW4gTXNhbEd1YXJkIHdpbGwgc2V0IGluUHJvZ3Jlc3MkIG9ic2VydmFibGVcbiAgICB0aGlzLm1zYWxCcm9hZGNhc3RTZXJ2aWNlLmluUHJvZ3Jlc3MkLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB1cmwgc3RyaW5nIHRvIFVybFRyZWVcbiAgICogQHBhcmFtIHVybFxuICAgKi9cbiAgcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBVcmxUcmVlIHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIucGFyc2VVcmwodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGFic29sdXRlIHVybCBmb3IgdGhlIGRlc3RpbmF0aW9uIHBhZ2VcbiAgICogQHBhcmFtIHBhdGggUmVsYXRpdmUgcGF0aCBvZiByZXF1ZXN0ZWQgcGFnZVxuICAgKiBAcmV0dXJucyBGdWxsIGRlc3RpbmF0aW9uIHVybFxuICAgKi9cbiAgZ2V0RGVzdGluYXRpb25VcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoJ0d1YXJkIC0gZ2V0dGluZyBkZXN0aW5hdGlvbiB1cmwnKTtcbiAgICAvLyBBYnNvbHV0ZSBiYXNlIHVybCBmb3IgdGhlIGFwcGxpY2F0aW9uIChkZWZhdWx0IHRvIG9yaWdpbiBpZiBiYXNlIGVsZW1lbnQgbm90IHByZXNlbnQpXG4gICAgY29uc3QgYmFzZUVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Jhc2UnKTtcbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoXG4gICAgICBiYXNlRWxlbWVudHMubGVuZ3RoID8gYmFzZUVsZW1lbnRzWzBdLmhyZWYgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luXG4gICAgKTtcblxuICAgIC8vIFBhdGggb2YgcGFnZSAoaW5jbHVkaW5nIGhhc2gsIGlmIHVzaW5nIGhhc2ggcm91dGluZylcbiAgICBjb25zdCBwYXRoVXJsID0gdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCk7XG5cbiAgICAvLyBIYXNoIGxvY2F0aW9uIHN0cmF0ZWd5XG4gICAgaWYgKHBhdGhVcmwuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAudmVyYm9zZSgnR3VhcmQgLSBkZXN0aW5hdGlvbiBieSBoYXNoIHJvdXRpbmcnKTtcbiAgICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3BhdGhVcmx9YDtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIElmIHVzaW5nIHBhdGggbG9jYXRpb24gc3RyYXRlZ3ksIHBhdGhVcmwgd2lsbCBpbmNsdWRlIHRoZSByZWxhdGl2ZSBwb3J0aW9uIG9mIHRoZSBiYXNlIHBhdGggKGUuZy4gL2Jhc2UvcGFnZSkuXG4gICAgICogU2luY2UgYmFzZVVybCBhbHNvIGluY2x1ZGVzIC9iYXNlLCBjYW4ganVzdCBjb25jYXRlbnRhdGUgYmFzZVVybCArIHBhdGhcbiAgICAgKi9cbiAgICByZXR1cm4gYCR7YmFzZVVybH0ke3BhdGh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcmFjdGl2ZWx5IHByb21wdCB0aGUgdXNlciB0byBsb2dpblxuICAgKiBAcGFyYW0gdXJsIFBhdGggb2YgdGhlIHJlcXVlc3RlZCBwYWdlXG4gICAqL1xuICBwcml2YXRlIGxvZ2luSW50ZXJhY3RpdmVseShzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF1dGhSZXF1ZXN0ID1cbiAgICAgIHR5cGVvZiB0aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0KHRoaXMuYXV0aFNlcnZpY2UsIHN0YXRlKVxuICAgICAgICA6IHsgLi4udGhpcy5tc2FsR3VhcmRDb25maWcuYXV0aFJlcXVlc3QgfTtcbiAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUG9wdXApIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZSgnR3VhcmQgLSBsb2dnaW5nIGluIGJ5IHBvcHVwJyk7XG4gICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5sb2dpblBvcHVwKGF1dGhSZXF1ZXN0IGFzIFBvcHVwUmVxdWVzdCkucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgIC52ZXJib3NlKFxuICAgICAgICAgICAgICAnR3VhcmQgLSBsb2dpbiBieSBwb3B1cCBzdWNjZXNzZnVsLCBjYW4gYWN0aXZhdGUsIHNldHRpbmcgYWN0aXZlIGFjY291bnQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChyZXNwb25zZS5hY2NvdW50KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKCdHdWFyZCAtIGxvZ2dpbmcgaW4gYnkgcmVkaXJlY3QnKTtcbiAgICBjb25zdCByZWRpcmVjdFN0YXJ0UGFnZSA9IHRoaXMuZ2V0RGVzdGluYXRpb25Vcmwoc3RhdGUudXJsKTtcbiAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZVxuICAgICAgLmxvZ2luUmVkaXJlY3Qoe1xuICAgICAgICByZWRpcmVjdFN0YXJ0UGFnZSxcbiAgICAgICAgLi4uYXV0aFJlcXVlc3QsXG4gICAgICB9IGFzIFJlZGlyZWN0UmVxdWVzdClcbiAgICAgIC5waXBlKG1hcCgoKSA9PiBmYWxzZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIHR5cGUsIHByZXZlbnRzIHBhZ2Ugd2l0aCBHdWFyZCB0byBiZSBzZXQgYXMgcmVkaXJlY3QsIGFuZCBjYWxscyBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcbiAgICogQHBhcmFtIHN0YXRlXG4gICAqL1xuICBwcml2YXRlIGFjdGl2YXRlSGVscGVyKFxuICAgIHN0YXRlPzogUm91dGVyU3RhdGVTbmFwc2hvdFxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiZcbiAgICAgIHRoaXMubXNhbEd1YXJkQ29uZmlnLmludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IoXG4gICAgICAgICdpbnZhbGlkX2ludGVyYWN0aW9uX3R5cGUnLFxuICAgICAgICAnSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgR3VhcmQuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCBvciBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgTXNhbEd1YXJkQ29uZmlndXJhdGlvbidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZSgnTVNBTCBHdWFyZCBhY3RpdmF0ZWQnKTtcblxuICAgIC8qXG4gICAgICogSWYgYSBwYWdlIHdpdGggTVNBTCBHdWFyZCBpcyBzZXQgYXMgdGhlIHJlZGlyZWN0IGZvciBhY3F1aXJlVG9rZW5TaWxlbnQsXG4gICAgICogc2hvcnQtY2lyY3VpdCB0byBwcmV2ZW50IHJlZGlyZWN0aW5nIG9yIHBvcHVwcy5cbiAgICAgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgVXJsU3RyaW5nLmhhc2hDb250YWluc0tub3duUHJvcGVydGllcyh3aW5kb3cubG9jYXRpb24uaGFzaCkgJiZcbiAgICAgICAgQnJvd3NlclV0aWxzLmlzSW5JZnJhbWUoKSAmJlxuICAgICAgICAhdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRDb25maWd1cmF0aW9uKCkuc3lzdGVtXG4gICAgICAgICAgLmFsbG93UmVkaXJlY3RJbklmcmFtZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAud2FybmluZyhcbiAgICAgICAgICAgICdHdWFyZCAtIHJlZGlyZWN0VXJpIHNldCB0byBwYWdlIHdpdGggTVNBTCBHdWFyZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbm90IHNldCByZWRpcmVjdFVyaSB0byBhIHBhZ2UgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4nXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgLmluZm8oXG4gICAgICAgICAgJ0d1YXJkIC0gd2luZG93IGlzIHVuZGVmaW5lZCwgTVNBTCBkb2VzIG5vdCBzdXBwb3J0IHNlcnZlci1zaWRlIHRva2VuIGFjcXVpc2l0aW9uJ1xuICAgICAgICApO1xuICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQgaW4gdGhlIGNvbmZpZywgc2V0IHRoaXMgYXMgdGhlIGxvZ2luRmFpbGVkUm91dGVcbiAgICAgKi9cbiAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcubG9naW5GYWlsZWRSb3V0ZSkge1xuICAgICAgdGhpcy5sb2dpbkZhaWxlZFJvdXRlID0gdGhpcy5wYXJzZVVybChcbiAgICAgICAgdGhpcy5tc2FsR3VhcmRDb25maWcubG9naW5GYWlsZWRSb3V0ZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIGN1cnJlbnQgcGF0aCBiZWZvcmUgaXQgZ2V0cyBjaGFuZ2VkIGJ5IGhhbmRsZVJlZGlyZWN0T2JzZXJ2YWJsZVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5sb2NhdGlvbi5wYXRoKHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaW5pdGlhbGl6ZSgpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5oYW5kbGVSZWRpcmVjdE9ic2VydmFibGUoKTtcbiAgICAgIH0pLFxuICAgICAgY29uY2F0TWFwKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFsbEFjY291bnRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAudmVyYm9zZShcbiAgICAgICAgICAgICAgICAnR3VhcmQgLSBubyBhY2NvdW50cyByZXRyaWV2ZWQsIGxvZyBpbiByZXF1aXJlZCB0byBhY3RpdmF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvZ2luSW50ZXJhY3RpdmVseShzdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgLnZlcmJvc2UoJ0d1YXJkIC0gbm8gYWNjb3VudHMgcmV0cmlldmVkLCBubyBzdGF0ZSwgY2Fubm90IGxvYWQnKTtcbiAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgIC52ZXJib3NlKCdHdWFyZCAtIGF0IGxlYXN0IDEgYWNjb3VudCBleGlzdHMsIGNhbiBhY3RpdmF0ZSBvciBsb2FkJyk7XG5cbiAgICAgICAgLy8gUHJldmVudCBuYXZpZ2F0aW5nIHRoZSBhcHAgdG8gLyNjb2RlPSBvciAvY29kZT1cbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBQYXRoIHJvdXRpbmc6XG4gICAgICAgICAgICogc3RhdGUudXJsOiAvI2NvZGU9Li4uXG4gICAgICAgICAgICogc3RhdGUucm9vdC5mcmFnbWVudDogY29kZT0uLi5cbiAgICAgICAgICAgKi9cblxuICAgICAgICAgIC8qXG4gICAgICAgICAgICogSGFzaCByb3V0aW5nOlxuICAgICAgICAgICAqIHN0YXRlLnVybDogL2NvZGVcbiAgICAgICAgICAgKiBzdGF0ZS5yb290LmZyYWdtZW50OiBudWxsXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgdXJsQ29udGFpbnNDb2RlOiBib29sZWFuID0gdGhpcy5pbmNsdWRlc0NvZGUoc3RhdGUudXJsKTtcbiAgICAgICAgICBjb25zdCBmcmFnbWVudENvbnRhaW5zQ29kZTogYm9vbGVhbiA9XG4gICAgICAgICAgICAhIXN0YXRlLnJvb3QgJiZcbiAgICAgICAgICAgICEhc3RhdGUucm9vdC5mcmFnbWVudCAmJlxuICAgICAgICAgICAgdGhpcy5pbmNsdWRlc0NvZGUoYCMke3N0YXRlLnJvb3QuZnJhZ21lbnR9YCk7XG4gICAgICAgICAgY29uc3QgaGFzaFJvdXRpbmc6IGJvb2xlYW4gPVxuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwoc3RhdGUudXJsKS5pbmRleE9mKCcjJykgPT09IDA7XG5cbiAgICAgICAgICAvLyBFbnN1cmUgY29kZSBwYXJhbWV0ZXIgaXMgaW4gZnJhZ21lbnQgKGFuZCBub3QgaW4gcXVlcnkgcGFyYW1ldGVyKSwgb3IgdGhhdCBoYXNoIGhhc2ggcm91dGluZyBpcyB1c2VkXG4gICAgICAgICAgaWYgKHVybENvbnRhaW5zQ29kZSAmJiAoZnJhZ21lbnRDb250YWluc0NvZGUgfHwgaGFzaFJvdXRpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAuaW5mbyhcbiAgICAgICAgICAgICAgICAnR3VhcmQgLSBIYXNoIGNvbnRhaW5zIGtub3duIGNvZGUgcmVzcG9uc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24uJ1xuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBQYXRoIHJvdXRpbmcgKG5hdmlnYXRlIHRvIGN1cnJlbnQgcGF0aCB3aXRob3V0IGhhc2gpXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhdGguaW5kZXhPZignIycpID4gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMucGFyc2VVcmwodGhpcy5sb2NhdGlvbi5wYXRoKCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFzaCByb3V0aW5nIChuYXZpZ2F0ZSB0byByb290IHBhdGgpXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybCgnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAuZXJyb3IoJ0d1YXJkIC0gZXJyb3Igd2hpbGUgbG9nZ2luZyBpbiwgdW5hYmxlIHRvIGFjdGl2YXRlJyk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAuZXJyb3JQaWkoYEd1YXJkIC0gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQsIGNoZWNrcyB0byBzZWUgaWYgc3RhdGUgaXMgcGFzc2VkIGJlZm9yZSByZXR1cm5pbmcgcm91dGVcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmxvZ2luRmFpbGVkUm91dGUgJiYgc3RhdGUpIHtcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgIC52ZXJib3NlKCdHdWFyZCAtIGxvZ2luRmFpbGVkUm91dGUgc2V0LCByZWRpcmVjdGluZycpO1xuICAgICAgICAgIHJldHVybiBvZih0aGlzLmxvZ2luRmFpbGVkUm91dGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBpbmNsdWRlc0NvZGUocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIChwYXRoLmxhc3RJbmRleE9mKCcvY29kZScpID4gLTEgJiZcbiAgICAgICAgcGF0aC5sYXN0SW5kZXhPZignL2NvZGUnKSA9PT0gcGF0aC5sZW5ndGggLSAnL2NvZGUnLmxlbmd0aCkgfHwgLy8gcGF0aC5lbmRzV2l0aChcIi9jb2RlXCIpXG4gICAgICBwYXRoLmluZGV4T2YoJyNjb2RlPScpID4gLTEgfHxcbiAgICAgIHBhdGguaW5kZXhPZignJmNvZGU9JykgPiAtMVxuICAgICk7XG4gIH1cblxuICBjYW5BY3RpdmF0ZShcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdFxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKCdHdWFyZCAtIGNhbkFjdGl2YXRlJyk7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVIZWxwZXIoc3RhdGUpO1xuICB9XG5cbiAgY2FuQWN0aXZhdGVDaGlsZChcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdFxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKCdHdWFyZCAtIGNhbkFjdGl2YXRlQ2hpbGQnKTtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUhlbHBlcihzdGF0ZSk7XG4gIH1cblxuICBjYW5NYXRjaCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB7XG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKCdHdWFyZCAtIGNhbkxvYWQnKTtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUhlbHBlcigpO1xuICB9XG59XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5pbnRlcmNlcHRvci5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHsgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBQb3B1cFJlcXVlc3QsXG4gIFJlZGlyZWN0UmVxdWVzdCxcbiAgSW50ZXJhY3Rpb25UeXBlLFxuICBTaWxlbnRSZXF1ZXN0LFxufSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSAnLi9tc2FsLnNlcnZpY2UnO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0ID1cbiAgfCBPbWl0PFBvcHVwUmVxdWVzdCwgJ3Njb3Blcyc+XG4gIHwgT21pdDxSZWRpcmVjdFJlcXVlc3QsICdzY29wZXMnPlxuICB8IE9taXQ8U2lsZW50UmVxdWVzdCwgJ3Njb3Blcyc+O1xuXG5leHBvcnQgdHlwZSBNc2FsSW50ZXJjZXB0b3JDb25maWd1cmF0aW9uID0ge1xuICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcbiAgcHJvdGVjdGVkUmVzb3VyY2VNYXA6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgQXJyYXk8c3RyaW5nIHwgUHJvdGVjdGVkUmVzb3VyY2VTY29wZXM+IHwgbnVsbFxuICA+O1xuICBhdXRoUmVxdWVzdD86XG4gICAgfCBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdFxuICAgIHwgKChcbiAgICAgICAgbXNhbFNlcnZpY2U6IE1zYWxTZXJ2aWNlLFxuICAgICAgICByZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LFxuICAgICAgICBvcmlnaW5hbEF1dGhSZXF1ZXN0OiBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdFxuICAgICAgKSA9PiBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCk7XG59O1xuXG5leHBvcnQgdHlwZSBQcm90ZWN0ZWRSZXNvdXJjZVNjb3BlcyA9IHtcbiAgaHR0cE1ldGhvZDogc3RyaW5nO1xuICBzY29wZXM6IEFycmF5PHN0cmluZz4gfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgTWF0Y2hpbmdSZXNvdXJjZXMgPSB7XG4gIGFic29sdXRlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+O1xuICByZWxhdGl2ZVJlc291cmNlczogQXJyYXk8c3RyaW5nPjtcbn07XG4iXX0=