@igo2/auth 17.0.0-next.4 → 17.0.0-next.6

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 (44) hide show
  1. package/environment/environment.interface.d.ts +2 -2
  2. package/esm2022/environment/environment.interface.mjs +1 -1
  3. package/esm2022/form/auth-form.module.mjs +2 -24
  4. package/esm2022/form/public_api.mjs +1 -3
  5. package/esm2022/form/shared/index.mjs +1 -3
  6. package/esm2022/lib/auth.provider.mjs +22 -0
  7. package/esm2022/lib/shared/admin.guard.mjs +1 -1
  8. package/esm2022/lib/shared/auth-storage.interface.mjs +2 -0
  9. package/esm2022/lib/shared/auth-storage.service.mjs +100 -0
  10. package/esm2022/lib/shared/auth.guard.mjs +1 -1
  11. package/esm2022/lib/shared/auth.interceptor.mjs +1 -1
  12. package/esm2022/lib/shared/auth.interface.mjs +5 -2
  13. package/esm2022/lib/shared/auth.service.mjs +1 -1
  14. package/esm2022/lib/shared/index.mjs +12 -0
  15. package/esm2022/lib/shared/logged.guard.mjs +1 -1
  16. package/esm2022/lib/shared/profils.guard.mjs +1 -1
  17. package/esm2022/lib/shared/token.service.mjs +1 -1
  18. package/esm2022/microsoft/auth-microsoft/auth-microsoft.component.mjs +6 -6
  19. package/esm2022/microsoft/auth-microsoft.provider.mjs +43 -30
  20. package/esm2022/microsoft/auth-microsoftb2c/auth-microsoftb2c.component.mjs +6 -6
  21. package/esm2022/public_api.mjs +3 -10
  22. package/fesm2022/igo2-auth-form.mjs +9 -120
  23. package/fesm2022/igo2-auth-form.mjs.map +1 -1
  24. package/fesm2022/igo2-auth-microsoft.mjs +52 -38
  25. package/fesm2022/igo2-auth-microsoft.mjs.map +1 -1
  26. package/fesm2022/igo2-auth.mjs +225 -112
  27. package/fesm2022/igo2-auth.mjs.map +1 -1
  28. package/form/auth-form.module.d.ts +0 -2
  29. package/form/public_api.d.ts +0 -2
  30. package/form/shared/index.d.ts +0 -2
  31. package/lib/auth.provider.d.ts +3 -0
  32. package/{form → lib}/shared/auth-storage.service.d.ts +2 -1
  33. package/lib/shared/auth.interface.d.ts +8 -0
  34. package/lib/shared/index.d.ts +11 -0
  35. package/locale/en.auth.json +29 -29
  36. package/locale/fr.auth.json +33 -33
  37. package/microsoft/auth-microsoft/auth-microsoft.component.d.ts +2 -0
  38. package/microsoft/auth-microsoft.provider.d.ts +2 -23
  39. package/microsoft/auth-microsoftb2c/auth-microsoftb2c.component.d.ts +2 -0
  40. package/package.json +4 -3
  41. package/public_api.d.ts +2 -9
  42. package/esm2022/form/shared/auth-storage.interface.mjs +0 -2
  43. package/esm2022/form/shared/auth-storage.service.mjs +0 -98
  44. /package/{form → lib}/shared/auth-storage.interface.d.ts +0 -0
@@ -0,0 +1,11 @@
1
+ export * from './token.service';
2
+ export * from './token.interface';
3
+ export * from './auth.service';
4
+ export * from './auth-storage.service';
5
+ export * from './auth-storage.interface';
6
+ export * from './auth.interface';
7
+ export * from './auth.interceptor';
8
+ export * from './logged.guard';
9
+ export * from './auth.guard';
10
+ export * from './admin.guard';
11
+ export * from './profils.guard';
@@ -1,29 +1,29 @@
1
- {
2
- "igo": {
3
- "auth": {
4
- "accessAnonymous": "Public access",
5
- "connection": "Connection",
6
- "login": "Login",
7
- "password": "Password",
8
- "signOut": "Sign out",
9
- "user": "User",
10
- "welcome": "Welcome {{name}}!",
11
- "deconnection": "You are logged out.",
12
- "home": "Return to the home page",
13
- "error": {
14
- "Password expired": "Password expired",
15
- "Maximun logins exceeded": "Maximum logins exceeded",
16
- "Login lockout": "Maximum number of attempts exceeded. Your account is locked.",
17
- "Wrong password": "Wrong password",
18
- "Invalid username": "Invalid username",
19
- "Username or password invalid": "Username or password invalid"
20
- },
21
- "microsoft": {
22
- "login": "Sign in with Azure account"
23
- },
24
- "microsoftb2c": {
25
- "login": "Sign in"
26
- }
27
- }
28
- }
29
- }
1
+ {
2
+ "igo": {
3
+ "auth": {
4
+ "accessAnonymous": "Public access",
5
+ "connection": "Connection",
6
+ "login": "Login",
7
+ "password": "Password",
8
+ "signOut": "Sign out",
9
+ "user": "User",
10
+ "welcome": "Welcome {{name}}!",
11
+ "deconnection": "You are logged out.",
12
+ "home": "Return to the home page",
13
+ "error": {
14
+ "Password expired": "Password expired",
15
+ "Maximun logins exceeded": "Maximum logins exceeded",
16
+ "Login lockout": "Maximum number of attempts exceeded. Your account is locked.",
17
+ "Wrong password": "Wrong password",
18
+ "Invalid username": "Invalid username",
19
+ "Username or password invalid": "Username or password invalid"
20
+ },
21
+ "microsoft": {
22
+ "login": "Sign in with Azure account"
23
+ },
24
+ "microsoftb2c": {
25
+ "login": "Sign in"
26
+ }
27
+ }
28
+ }
29
+ }
@@ -1,33 +1,33 @@
1
- {
2
- "igo": {
3
- "auth": {
4
- "accessAnonymous": "Accès public",
5
- "connection": "Connexion",
6
- "login": "Se connecter",
7
- "password": "Mot de passe",
8
- "signOut": "Se déconnecter",
9
- "user": "Utilisateur",
10
- "welcome": "Bienvenue {{name}}!",
11
- "deconnection": "Vous êtes déconnecté",
12
- "home": "Retourner à la page d'accueil",
13
- "error": {
14
- "Password expired": "Votre mot de passe est expiré",
15
- "Maximun logins exceeded": "Nombre maximal de connexions dépassé",
16
- "Login lockout": "Nombre maximal d'essais dépassés. Votre compte est verrouillé.",
17
- "Wrong password": "Mot de passe incorrect",
18
- "Invalid username": "Utilisateur invalide",
19
- "Username or password invalid": "Utilisateur ou mot de passe invalide"
20
- },
21
- "google": {
22
- "login": "Se connecter avec Google",
23
- "logged": "Connecté avec Google"
24
- },
25
- "microsoft": {
26
- "login": "Se connecter avec compte Azure"
27
- },
28
- "microsoftb2c": {
29
- "login": "Se connecter"
30
- }
31
- }
32
- }
33
- }
1
+ {
2
+ "igo": {
3
+ "auth": {
4
+ "accessAnonymous": "Accès public",
5
+ "connection": "Connexion",
6
+ "login": "Se connecter",
7
+ "password": "Mot de passe",
8
+ "signOut": "Se déconnecter",
9
+ "user": "Utilisateur",
10
+ "welcome": "Bienvenue {{name}}!",
11
+ "deconnection": "Vous êtes déconnecté",
12
+ "home": "Retourner à la page d'accueil",
13
+ "error": {
14
+ "Password expired": "Votre mot de passe est expiré",
15
+ "Maximun logins exceeded": "Nombre maximal de connexions dépassé",
16
+ "Login lockout": "Nombre maximal d'essais dépassés. Votre compte est verrouillé.",
17
+ "Wrong password": "Mot de passe incorrect",
18
+ "Invalid username": "Utilisateur invalide",
19
+ "Username or password invalid": "Utilisateur ou mot de passe invalide"
20
+ },
21
+ "google": {
22
+ "login": "Se connecter avec Google",
23
+ "logged": "Connecté avec Google"
24
+ },
25
+ "microsoft": {
26
+ "login": "Se connecter avec compte Azure"
27
+ },
28
+ "microsoftb2c": {
29
+ "login": "Se connecter"
30
+ }
31
+ }
32
+ }
33
+ }
@@ -1,5 +1,6 @@
1
1
  import { ApplicationRef, EventEmitter } from '@angular/core';
2
2
  import { AuthService } from '@igo2/auth';
3
+ import { IconSvg } from '@igo2/common';
3
4
  import { ConfigService } from '@igo2/core/config';
4
5
  import { MsalService } from '@azure/msal-angular';
5
6
  import { MSPMsalGuardConfiguration } from '../shared/auth-microsoft.interface';
@@ -14,6 +15,7 @@ export declare class AuthMicrosoftComponent {
14
15
  private readonly _destroying$;
15
16
  login: EventEmitter<boolean>;
16
17
  private broadcastService;
18
+ svgIcon: IconSvg;
17
19
  constructor(authService: AuthService, config: ConfigService, appRef: ApplicationRef, msalService: MsalService, msalGuardConfig: MSPMsalGuardConfiguration[]);
18
20
  loginMicrosoft(): void;
19
21
  private checkAccount;
@@ -1,33 +1,12 @@
1
+ import { AuthFeature, AuthFeatureKind } from '@igo2/auth';
1
2
  import { ConfigService } from '@igo2/core/config';
2
- import { MsalService } from '@azure/msal-angular';
3
3
  import { PublicClientApplication } from '@azure/msal-browser';
4
4
  import { AuthMicrosoftComponent } from './auth-microsoft/auth-microsoft.component';
5
5
  import { AuthMicrosoftb2cComponent } from './auth-microsoftb2c/auth-microsoftb2c.component';
6
- import { MsalServiceb2c } from './auth-microsoftb2c/auth-msalServiceb2c.service';
7
6
  import { MSPMsalGuardConfiguration } from './shared/auth-microsoft.interface';
8
7
  export declare const AUTH_MICROSOFT_DIRECTIVES: readonly [typeof AuthMicrosoftComponent, typeof AuthMicrosoftb2cComponent];
9
8
  export declare function MSALConfigFactory(config: ConfigService): PublicClientApplication;
10
9
  export declare function MSALConfigFactoryb2c(config: ConfigService): PublicClientApplication;
11
10
  export declare function MSALAngularConfigFactory(config: ConfigService): MSPMsalGuardConfiguration;
12
11
  export declare function MSALAngularConfigFactoryb2c(config: ConfigService): MSPMsalGuardConfiguration;
13
- export declare function provideAuthMicrosoft(type?: string): (typeof MsalServiceb2c | {
14
- provide: import("@angular/core").InjectionToken<string>;
15
- useFactory: typeof MSALConfigFactoryb2c;
16
- deps: (typeof ConfigService)[];
17
- multi?: undefined;
18
- } | {
19
- provide: import("@angular/core").InjectionToken<string>;
20
- useFactory: typeof MSALAngularConfigFactoryb2c;
21
- deps: (typeof ConfigService)[];
22
- multi: boolean;
23
- })[] | (typeof MsalService | {
24
- provide: import("@angular/core").InjectionToken<string>;
25
- useFactory: typeof MSALConfigFactory;
26
- deps: (typeof ConfigService)[];
27
- multi?: undefined;
28
- } | {
29
- provide: import("@angular/core").InjectionToken<string>;
30
- useFactory: typeof MSALAngularConfigFactory;
31
- deps: (typeof ConfigService)[];
32
- multi: boolean;
33
- })[];
12
+ export declare function withMicrosoftSupport(type?: string): AuthFeature<AuthFeatureKind.Microsoft>;
@@ -1,5 +1,6 @@
1
1
  import { ApplicationRef, EventEmitter } from '@angular/core';
2
2
  import { AuthService } from '@igo2/auth';
3
+ import { IconSvg } from '@igo2/common';
3
4
  import { ConfigService } from '@igo2/core/config';
4
5
  import { MSPMsalGuardConfiguration } from '../shared/auth-microsoft.interface';
5
6
  import { MsalServiceb2c } from './auth-msalServiceb2c.service';
@@ -14,6 +15,7 @@ export declare class AuthMicrosoftb2cComponent {
14
15
  private readonly _destroying$;
15
16
  login: EventEmitter<boolean>;
16
17
  private broadcastService;
18
+ svgIcon: IconSvg;
17
19
  constructor(authService: AuthService, config: ConfigService, appRef: ApplicationRef, msalService: MsalServiceb2c, msalGuardConfig: MSPMsalGuardConfiguration[]);
18
20
  loginMicrosoftb2c(): void;
19
21
  private checkAccount;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igo2/auth",
3
- "version": "17.0.0-next.4",
3
+ "version": "17.0.0-next.6",
4
4
  "description": "IGO Library",
5
5
  "author": "IGO Community",
6
6
  "keywords": [
@@ -83,8 +83,9 @@
83
83
  "@angular/router": "^17.0.6",
84
84
  "@azure/msal-angular": "^3.0.4",
85
85
  "@azure/msal-browser": "^3.0.4",
86
- "@igo2/core": "^17.0.0-next.4",
87
- "@igo2/utils": "^17.0.0-next.4",
86
+ "@igo2/common": "^17.0.0-next.6",
87
+ "@igo2/core": "^17.0.0-next.6",
88
+ "@igo2/utils": "^17.0.0-next.6",
88
89
  "rxjs": "^7.8.0"
89
90
  },
90
91
  "engines": {
package/public_api.d.ts CHANGED
@@ -1,9 +1,2 @@
1
- export * from './lib/shared/auth.service';
2
- export * from './lib/shared/logged.guard';
3
- export * from './lib/shared/auth.guard';
4
- export * from './lib/shared/admin.guard';
5
- export * from './lib/shared/profils.guard';
6
- export * from './lib/shared/auth.interceptor';
7
- export * from './lib/shared/auth.interface';
8
- export * from './lib/shared/token.interface';
9
- export * from './lib/shared/token.service';
1
+ export * from './lib/auth.provider';
2
+ export * from './lib/shared';
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zdG9yYWdlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvZm9ybS9zcmMvc2hhcmVkL2F1dGgtc3RvcmFnZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0b3JhZ2VPcHRpb25zIH0gZnJvbSAnQGlnbzIvY29yZS9zdG9yYWdlJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RvcmFnZU9wdGlvbnMgZXh0ZW5kcyBTdG9yYWdlT3B0aW9ucyB7XG4gIHVybDogc3RyaW5nO1xufVxuIl19
@@ -1,98 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable } from '@angular/core';
3
- import { AuthService, TokenService } from '@igo2/auth';
4
- import { ConfigService } from '@igo2/core/config';
5
- import { BaseStorage, StorageScope } from '@igo2/core/storage';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@igo2/core/config";
8
- import * as i2 from "@angular/common/http";
9
- import * as i3 from "@igo2/auth";
10
- export class AuthStorageService extends BaseStorage {
11
- http;
12
- authService;
13
- tokenService;
14
- constructor(config, http, authService, tokenService) {
15
- super(config);
16
- this.http = http;
17
- this.authService = authService;
18
- this.tokenService = tokenService;
19
- this.authService.authenticate$.subscribe((isAuthenticated) => {
20
- if (isAuthenticated && this.options.url) {
21
- this.http
22
- .get(this.options.url)
23
- .subscribe((userIgo) => {
24
- if (userIgo && userIgo.preference) {
25
- for (const key of Object.keys(userIgo.preference)) {
26
- const value = userIgo.preference[key];
27
- super.set(key, value);
28
- }
29
- }
30
- });
31
- }
32
- });
33
- }
34
- set(key, value, scope = StorageScope.LOCAL) {
35
- if (scope === StorageScope.LOCAL &&
36
- this.authService.authenticated &&
37
- this.options.url) {
38
- const preference = {};
39
- preference[key] = value;
40
- this.http.patch(this.options.url, { preference }).subscribe();
41
- }
42
- super.set(key, value, scope);
43
- }
44
- remove(key, scope = StorageScope.LOCAL) {
45
- if (scope === StorageScope.LOCAL &&
46
- this.authService.authenticated &&
47
- this.options.url) {
48
- const preference = {};
49
- preference[key] = undefined;
50
- this.http.patch(this.options.url, { preference }).subscribe();
51
- }
52
- super.remove(key, scope);
53
- }
54
- clear(scope = StorageScope.LOCAL) {
55
- if (scope === StorageScope.LOCAL &&
56
- this.authService.authenticated &&
57
- this.options.url) {
58
- this.http
59
- .patch(this.options.url, { preference: {} }, {
60
- params: {
61
- mergePreference: 'false'
62
- }
63
- })
64
- .subscribe();
65
- }
66
- let token;
67
- if (scope === StorageScope.LOCAL) {
68
- token = this.tokenService.get();
69
- }
70
- super.clear(scope);
71
- if (token) {
72
- this.tokenService.set(token);
73
- }
74
- if (scope === StorageScope.LOCAL &&
75
- this.authService.authenticated &&
76
- this.options.url) {
77
- this.http
78
- .get(this.options.url)
79
- .subscribe((userIgo) => {
80
- if (userIgo && userIgo.preference) {
81
- for (const key of Object.keys(userIgo.preference)) {
82
- const value = userIgo.preference[key];
83
- super.set(key, value);
84
- }
85
- }
86
- });
87
- }
88
- }
89
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AuthStorageService, deps: [{ token: i1.ConfigService }, { token: i2.HttpClient }, { token: i3.AuthService }, { token: i3.TokenService }], target: i0.ɵɵFactoryTarget.Injectable });
90
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AuthStorageService, providedIn: 'root' });
91
- }
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AuthStorageService, decorators: [{
93
- type: Injectable,
94
- args: [{
95
- providedIn: 'root'
96
- }]
97
- }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.HttpClient }, { type: i3.AuthService }, { type: i3.TokenService }] });
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zdG9yYWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hdXRoL2Zvcm0vc3JjL3NoYXJlZC9hdXRoLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7QUFPL0QsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFdBQStCO0lBRzNEO0lBQ0E7SUFDQTtJQUpWLFlBQ0UsTUFBcUIsRUFDYixJQUFnQixFQUNoQixXQUF3QixFQUN4QixZQUEwQjtRQUVsQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFKTixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBSWxDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQzNELElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJO3FCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztxQkFDckIsU0FBUyxDQUFDLENBQUMsT0FBK0IsRUFBRSxFQUFFO29CQUM3QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ2xDLEtBQUss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aUJBQ04sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUNyQixTQUFTLENBQUMsQ0FBQyxPQUErQixFQUFFLEVBQUU7Z0JBQzdDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO3dCQUNsRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDeEIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQzt1R0FyR1Usa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7MkZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBUb2tlblNlcnZpY2UgfSBmcm9tICdAaWdvMi9hdXRoJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBCYXNlU3RvcmFnZSwgU3RvcmFnZVNjb3BlIH0gZnJvbSAnQGlnbzIvY29yZS9zdG9yYWdlJztcblxuaW1wb3J0IHsgQXV0aFN0b3JhZ2VPcHRpb25zIH0gZnJvbSAnLi9hdXRoLXN0b3JhZ2UuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFN0b3JhZ2VTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JhZ2U8QXV0aFN0b3JhZ2VPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZVxuICApIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5hdXRoU2VydmljZS5hdXRoZW50aWNhdGUkLnN1YnNjcmliZSgoaXNBdXRoZW50aWNhdGVkKSA9PiB7XG4gICAgICBpZiAoaXNBdXRoZW50aWNhdGVkICYmIHRoaXMub3B0aW9ucy51cmwpIHtcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLmdldCh0aGlzLm9wdGlvbnMudXJsKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHVzZXJJZ286IHsgcHJlZmVyZW5jZTogb2JqZWN0IH0pID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VySWdvICYmIHVzZXJJZ28ucHJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh1c2VySWdvLnByZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB1c2VySWdvLnByZWZlcmVuY2Vba2V5XTtcbiAgICAgICAgICAgICAgICBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldChcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgb2JqZWN0IHwgYm9vbGVhbiB8IG51bWJlcixcbiAgICBzY29wZTogU3RvcmFnZVNjb3BlID0gU3RvcmFnZVNjb3BlLkxPQ0FMXG4gICkge1xuICAgIGlmIChcbiAgICAgIHNjb3BlID09PSBTdG9yYWdlU2NvcGUuTE9DQUwgJiZcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuYXV0aGVudGljYXRlZCAmJlxuICAgICAgdGhpcy5vcHRpb25zLnVybFxuICAgICkge1xuICAgICAgY29uc3QgcHJlZmVyZW5jZSA9IHt9O1xuICAgICAgcHJlZmVyZW5jZVtrZXldID0gdmFsdWU7XG4gICAgICB0aGlzLmh0dHAucGF0Y2godGhpcy5vcHRpb25zLnVybCwgeyBwcmVmZXJlbmNlIH0pLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBzdXBlci5zZXQoa2V5LCB2YWx1ZSwgc2NvcGUpO1xuICB9XG5cbiAgcmVtb3ZlKGtleTogc3RyaW5nLCBzY29wZTogU3RvcmFnZVNjb3BlID0gU3RvcmFnZVNjb3BlLkxPQ0FMKSB7XG4gICAgaWYgKFxuICAgICAgc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCAmJlxuICAgICAgdGhpcy5hdXRoU2VydmljZS5hdXRoZW50aWNhdGVkICYmXG4gICAgICB0aGlzLm9wdGlvbnMudXJsXG4gICAgKSB7XG4gICAgICBjb25zdCBwcmVmZXJlbmNlID0ge307XG4gICAgICBwcmVmZXJlbmNlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmh0dHAucGF0Y2godGhpcy5vcHRpb25zLnVybCwgeyBwcmVmZXJlbmNlIH0pLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmUoa2V5LCBzY29wZSk7XG4gIH1cblxuICBjbGVhcihzY29wZTogU3RvcmFnZVNjb3BlID0gU3RvcmFnZVNjb3BlLkxPQ0FMKSB7XG4gICAgaWYgKFxuICAgICAgc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCAmJlxuICAgICAgdGhpcy5hdXRoU2VydmljZS5hdXRoZW50aWNhdGVkICYmXG4gICAgICB0aGlzLm9wdGlvbnMudXJsXG4gICAgKSB7XG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLnBhdGNoKFxuICAgICAgICAgIHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgeyBwcmVmZXJlbmNlOiB7fSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBtZXJnZVByZWZlcmVuY2U6ICdmYWxzZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGxldCB0b2tlbjogc3RyaW5nO1xuICAgIGlmIChzY29wZSA9PT0gU3RvcmFnZVNjb3BlLkxPQ0FMKSB7XG4gICAgICB0b2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpO1xuICAgIH1cblxuICAgIHN1cGVyLmNsZWFyKHNjb3BlKTtcblxuICAgIGlmICh0b2tlbikge1xuICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHRva2VuKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY29wZSA9PT0gU3RvcmFnZVNjb3BlLkxPQ0FMICYmXG4gICAgICB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZWQgJiZcbiAgICAgIHRoaXMub3B0aW9ucy51cmxcbiAgICApIHtcbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAuZ2V0KHRoaXMub3B0aW9ucy51cmwpXG4gICAgICAgIC5zdWJzY3JpYmUoKHVzZXJJZ286IHsgcHJlZmVyZW5jZTogb2JqZWN0IH0pID0+IHtcbiAgICAgICAgICBpZiAodXNlcklnbyAmJiB1c2VySWdvLnByZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHVzZXJJZ28ucHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB1c2VySWdvLnByZWZlcmVuY2Vba2V5XTtcbiAgICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=