imng-oidc-client 4.102.10

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 (62) hide show
  1. package/README.md +50 -0
  2. package/esm2020/imng-oidc-client.mjs +5 -0
  3. package/esm2020/index.mjs +24 -0
  4. package/esm2020/lib/+state/oidc-user.facade.mjs +28 -0
  5. package/esm2020/lib/+state/oidc-user.selectors.mjs +13 -0
  6. package/esm2020/lib/+state/oidc.actions.mjs +37 -0
  7. package/esm2020/lib/+state/oidc.effects.mjs +66 -0
  8. package/esm2020/lib/+state/oidc.facade.mjs +136 -0
  9. package/esm2020/lib/+state/oidc.reducer.mjs +93 -0
  10. package/esm2020/lib/+state/oidc.selectors.mjs +40 -0
  11. package/esm2020/lib/components/access-denied.component.mjs +14 -0
  12. package/esm2020/lib/components/logout-success.component.mjs +18 -0
  13. package/esm2020/lib/img-oidc-client-routing.module.mjs +44 -0
  14. package/esm2020/lib/imng-oidc-client.module.mjs +96 -0
  15. package/esm2020/lib/models/arguments.model.mjs +2 -0
  16. package/esm2020/lib/models/constants.mjs +17 -0
  17. package/esm2020/lib/models/oidc-client-config.mjs +3 -0
  18. package/esm2020/lib/models/oidc-library-config.mjs +3 -0
  19. package/esm2020/lib/models/oidc-user-profile.mjs +2 -0
  20. package/esm2020/lib/models/oidc-user.mjs +2 -0
  21. package/esm2020/lib/services/auth-guard.mjs +40 -0
  22. package/esm2020/lib/services/oidc.service.mjs +166 -0
  23. package/esm2020/lib/services/permissions.guard.mjs +22 -0
  24. package/esm2020/lib/services/token-interceptor.service.mjs +35 -0
  25. package/esm2020/lib/support/support.component.mjs +85 -0
  26. package/esm2020/lib/util/jwt-decoder.mjs +11 -0
  27. package/esm2020/lib/util/oidc-client-configurator.mjs +24 -0
  28. package/fesm2015/imng-oidc-client.mjs +844 -0
  29. package/fesm2015/imng-oidc-client.mjs.map +1 -0
  30. package/fesm2020/imng-oidc-client.mjs +907 -0
  31. package/fesm2020/imng-oidc-client.mjs.map +1 -0
  32. package/imng-oidc-client.d.ts +5 -0
  33. package/index.d.ts +23 -0
  34. package/lib/+state/oidc-user.facade.d.ts +16 -0
  35. package/lib/+state/oidc-user.selectors.d.ts +7 -0
  36. package/lib/+state/oidc.actions.d.ts +72 -0
  37. package/lib/+state/oidc.effects.d.ts +58 -0
  38. package/lib/+state/oidc.facade.d.ts +56 -0
  39. package/lib/+state/oidc.reducer.d.ts +22 -0
  40. package/lib/+state/oidc.selectors.d.ts +20 -0
  41. package/lib/components/access-denied.component.d.ts +5 -0
  42. package/lib/components/logout-success.component.d.ts +5 -0
  43. package/lib/img-oidc-client-routing.module.d.ts +12 -0
  44. package/lib/imng-oidc-client.module.d.ts +17 -0
  45. package/lib/models/arguments.model.d.ts +21 -0
  46. package/lib/models/constants.d.ts +14 -0
  47. package/lib/models/oidc-client-config.d.ts +12 -0
  48. package/lib/models/oidc-library-config.d.ts +12 -0
  49. package/lib/models/oidc-user-profile.d.ts +4 -0
  50. package/lib/models/oidc-user.d.ts +15 -0
  51. package/lib/services/auth-guard.d.ts +14 -0
  52. package/lib/services/oidc.service.d.ts +37 -0
  53. package/lib/services/permissions.guard.d.ts +12 -0
  54. package/lib/services/token-interceptor.service.d.ts +12 -0
  55. package/lib/support/support.component.d.ts +15 -0
  56. package/lib/util/jwt-decoder.d.ts +1 -0
  57. package/lib/util/oidc-client-configurator.d.ts +3 -0
  58. package/package.json +54 -0
  59. package/src/assets/callback.html +44 -0
  60. package/src/assets/oidc-client.rsa256.slim.min.js +3 -0
  61. package/src/assets/renew-callback.html +18 -0
  62. package/src/assets/signout-callback.html +29 -0
@@ -0,0 +1,85 @@
1
+ import { Component } from '@angular/core';
2
+ import { OidcFacade } from '../+state/oidc.facade';
3
+ import { OidcUserFacade } from '../+state/oidc-user.facade';
4
+ import { map } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../+state/oidc.facade";
7
+ import * as i2 from "../+state/oidc-user.facade";
8
+ import * as i3 from "@angular/common";
9
+ export class SupportComponent {
10
+ constructor(facade, oidcUserFacade) {
11
+ this.facade = facade;
12
+ this.oidcUserFacade = oidcUserFacade;
13
+ this.profileValue$ = this.oidcUserFacade.profile$.pipe(map((x) => Object.keys(x).map((propertyKey) => ({
14
+ key: propertyKey,
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ value: x[propertyKey], //NOSONAR
17
+ }))));
18
+ }
19
+ }
20
+ SupportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SupportComponent, deps: [{ token: i1.OidcFacade }, { token: i2.OidcUserFacade }], target: i0.ɵɵFactoryTarget.Component });
21
+ SupportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SupportComponent, selector: "imng-support", ngImport: i0, template: `<div class="container pt-5 mt-5">
22
+ <div class="row h3 text-center">
23
+ <div class="col-md-12 text-center">OIDC Support</div>
24
+ </div>
25
+ <div class="row">
26
+ <div class="col-md-3">Audiences</div>
27
+ <div class="col-md-8">
28
+ <span *ngFor="let item of facade.audiences$ | async; last as isLast">
29
+ {{ item }} <br *ngIf="!isLast" />
30
+ </span>
31
+ </div>
32
+ </div>
33
+ <div class="row">
34
+ <div class="col-md-3">Permissions</div>
35
+ <div class="col-md-8">
36
+ <span *ngFor="let item of facade.permissions$ | async; last as isLast">
37
+ {{ item }} <br *ngIf="!isLast" />
38
+ </span>
39
+ </div>
40
+ </div>
41
+ <div class="row">
42
+ <div class="col-md-3">Expires</div>
43
+ <div class="col-md-8">{{ facade.expiresAt$ | async }}</div>
44
+ </div>
45
+ <div class="row" *ngFor="let item of profileValue$ | async">
46
+ <div class="col-md-3">{{ item.key }}</div>
47
+ <div class="col-md-8">{{ item.value }}</div>
48
+ </div>
49
+ </div> `, isInline: true, directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i3.AsyncPipe } });
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SupportComponent, decorators: [{
51
+ type: Component,
52
+ args: [{
53
+ selector: 'imng-support',
54
+ template: `<div class="container pt-5 mt-5">
55
+ <div class="row h3 text-center">
56
+ <div class="col-md-12 text-center">OIDC Support</div>
57
+ </div>
58
+ <div class="row">
59
+ <div class="col-md-3">Audiences</div>
60
+ <div class="col-md-8">
61
+ <span *ngFor="let item of facade.audiences$ | async; last as isLast">
62
+ {{ item }} <br *ngIf="!isLast" />
63
+ </span>
64
+ </div>
65
+ </div>
66
+ <div class="row">
67
+ <div class="col-md-3">Permissions</div>
68
+ <div class="col-md-8">
69
+ <span *ngFor="let item of facade.permissions$ | async; last as isLast">
70
+ {{ item }} <br *ngIf="!isLast" />
71
+ </span>
72
+ </div>
73
+ </div>
74
+ <div class="row">
75
+ <div class="col-md-3">Expires</div>
76
+ <div class="col-md-8">{{ facade.expiresAt$ | async }}</div>
77
+ </div>
78
+ <div class="row" *ngFor="let item of profileValue$ | async">
79
+ <div class="col-md-3">{{ item.key }}</div>
80
+ <div class="col-md-8">{{ item.value }}</div>
81
+ </div>
82
+ </div> `,
83
+ }]
84
+ }], ctorParameters: function () { return [{ type: i1.OidcFacade }, { type: i2.OidcUserFacade }]; } });
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2ltbmctb2lkYy1jbGllbnQvc3JjL2xpYi9zdXBwb3J0L3N1cHBvcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBa0NyQyxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQ2tCLE1BQWtCLEVBQ2xCLGNBQThCO1FBRDlCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBRTlDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNwRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLDhEQUE4RDtZQUM5RCxLQUFLLEVBQUcsQ0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVM7U0FDMUMsQ0FBQyxDQUFDLENBQ0osQ0FDRixDQUFDO0lBQ0osQ0FBQzs7NkdBZlUsZ0JBQWdCO2lHQUFoQixnQkFBZ0Isb0RBOUJqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztVQTRCRjsyRkFFRyxnQkFBZ0I7a0JBaEM1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7VUE0QkY7aUJBQ1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9pZGNGYWNhZGUgfSBmcm9tICcuLi8rc3RhdGUvb2lkYy5mYWNhZGUnO1xuaW1wb3J0IHsgT2lkY1VzZXJGYWNhZGUgfSBmcm9tICcuLi8rc3RhdGUvb2lkYy11c2VyLmZhY2FkZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltbmctc3VwcG9ydCcsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNvbnRhaW5lciBwdC01IG10LTVcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IGgzIHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHRleHQtY2VudGVyXCI+T0lEQyBTdXBwb3J0PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+QXVkaWVuY2VzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmFjYWRlLmF1ZGllbmNlcyQgfCBhc3luYzsgbGFzdCBhcyBpc0xhc3RcIj5cbiAgICAgICAgICB7eyBpdGVtIH19IDxiciAqbmdJZj1cIiFpc0xhc3RcIiAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5QZXJtaXNzaW9uczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC04XCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZhY2FkZS5wZXJtaXNzaW9ucyQgfCBhc3luYzsgbGFzdCBhcyBpc0xhc3RcIj5cbiAgICAgICAgICB7eyBpdGVtIH19IDxiciAqbmdJZj1cIiFpc0xhc3RcIiAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5FeHBpcmVzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj57eyBmYWNhZGUuZXhwaXJlc0F0JCB8IGFzeW5jIH19PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHByb2ZpbGVWYWx1ZSQgfCBhc3luY1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+e3sgaXRlbS5rZXkgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPnt7IGl0ZW0udmFsdWUgfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+IGAsXG59KVxuZXhwb3J0IGNsYXNzIFN1cHBvcnRDb21wb25lbnQge1xuICBwdWJsaWMgcHJvZmlsZVZhbHVlJDogT2JzZXJ2YWJsZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyB9W10+O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmFjYWRlOiBPaWRjRmFjYWRlLFxuICAgIHB1YmxpYyByZWFkb25seSBvaWRjVXNlckZhY2FkZTogT2lkY1VzZXJGYWNhZGVcbiAgKSB7XG4gICAgdGhpcy5wcm9maWxlVmFsdWUkID0gdGhpcy5vaWRjVXNlckZhY2FkZS5wcm9maWxlJC5waXBlKFxuICAgICAgbWFwKCh4KSA9PlxuICAgICAgICBPYmplY3Qua2V5cyh4KS5tYXAoKHByb3BlcnR5S2V5KSA9PiAoe1xuICAgICAgICAgIGtleTogcHJvcGVydHlLZXksXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICB2YWx1ZTogKHggYXMgYW55KVtwcm9wZXJ0eUtleV0sIC8vTk9TT05BUlxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ export function jwtDecoder(rawToken) {
2
+ const splits = rawToken?.split('.');
3
+ if (splits?.length > 1) {
4
+ const payload = splits[1];
5
+ return JSON.parse(window.atob(payload));
6
+ }
7
+ else {
8
+ return null;
9
+ }
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LWRlY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2ltbmctb2lkYy1jbGllbnQvc3JjL2xpYi91dGlsL2p3dC1kZWNvZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxVQUFVLENBQU8sUUFBZ0I7SUFDL0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxJQUFJLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBUyxDQUFDO0tBQ2pEO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBqd3REZWNvZGVyPFRZUEU+KHJhd1Rva2VuOiBzdHJpbmcpOiBUWVBFIHwgbnVsbCB7XG4gIGNvbnN0IHNwbGl0cyA9IHJhd1Rva2VuPy5zcGxpdCgnLicpO1xuICBpZiAoc3BsaXRzPy5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHNwbGl0c1sxXTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh3aW5kb3cuYXRvYihwYXlsb2FkKSkgYXMgVFlQRTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
@@ -0,0 +1,24 @@
1
+ import { isNullOrUndefined } from 'imng-nrsrx-client-utils';
2
+ export function oidcConfigurator(oidcClientConfig, document) {
3
+ return {
4
+ oidc_config: {
5
+ authority: oidcClientConfig.authority,
6
+ client_id: oidcClientConfig.client_id,
7
+ extraQueryParams: { audience: oidcClientConfig.audience },
8
+ redirect_uri: `${document.location.origin}/callback.html`,
9
+ response_type: oidcClientConfig.response_type || 'id_token token',
10
+ scope: oidcClientConfig.scope || 'openid profile offline_access email',
11
+ post_logout_redirect_uri: `${document.location.origin}/signout-callback.html`,
12
+ silent_redirect_uri: `${document.location.origin}/renew-callback.html`,
13
+ automaticSilentRenew: isNullOrUndefined(oidcClientConfig.automaticSilentRenew)
14
+ ? true
15
+ : oidcClientConfig.automaticSilentRenew,
16
+ metadataUrl: `${oidcClientConfig.authority}/.well-known/openid-configuration`,
17
+ },
18
+ getUserMetadata: oidcClientConfig.getUserMetadata,
19
+ useCallbackFlag: isNullOrUndefined(oidcClientConfig.useCallbackFlag)
20
+ ? true
21
+ : oidcClientConfig.useCallbackFlag,
22
+ };
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2lkYy1jbGllbnQtY29uZmlndXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pbW5nLW9pZGMtY2xpZW50L3NyYy9saWIvdXRpbC9vaWRjLWNsaWVudC1jb25maWd1cmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJNUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixnQkFBa0MsRUFDbEMsUUFBa0I7SUFFbEIsT0FBTztRQUNMLFdBQVcsRUFBRTtZQUNYLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO1lBQ3JDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO1lBQ3JDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUN6RCxZQUFZLEVBQUUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sZ0JBQWdCO1lBQ3pELGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxhQUFhLElBQUksZ0JBQWdCO1lBQ2pFLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLElBQUkscUNBQXFDO1lBQ3RFLHdCQUF3QixFQUFFLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLHdCQUF3QjtZQUM3RSxtQkFBbUIsRUFBRSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxzQkFBc0I7WUFDdEUsb0JBQW9CLEVBQ2xCLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO2dCQUN0RCxDQUFDLENBQUMsSUFBSTtnQkFDTixDQUFDLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CO1lBQzNDLFdBQVcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsbUNBQW1DO1NBQzlFO1FBQ0QsZUFBZSxFQUFFLGdCQUFnQixDQUFDLGVBQWU7UUFDakQsZUFBZSxFQUNiLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUEwQjtLQUNsRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnaW1uZy1ucnNyeC1jbGllbnQtdXRpbHMnO1xuaW1wb3J0IHsgT2lkY0NsaWVudENvbmZpZyB9IGZyb20gJy4uL21vZGVscy9vaWRjLWNsaWVudC1jb25maWcnO1xuaW1wb3J0IHsgT2lkY0xpYnJhcnlDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvb2lkYy1saWJyYXJ5LWNvbmZpZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvaWRjQ29uZmlndXJhdG9yKFxuICBvaWRjQ2xpZW50Q29uZmlnOiBPaWRjQ2xpZW50Q29uZmlnLFxuICBkb2N1bWVudDogRG9jdW1lbnRcbik6IE9pZGNMaWJyYXJ5Q29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBvaWRjX2NvbmZpZzoge1xuICAgICAgYXV0aG9yaXR5OiBvaWRjQ2xpZW50Q29uZmlnLmF1dGhvcml0eSxcbiAgICAgIGNsaWVudF9pZDogb2lkY0NsaWVudENvbmZpZy5jbGllbnRfaWQsXG4gICAgICBleHRyYVF1ZXJ5UGFyYW1zOiB7IGF1ZGllbmNlOiBvaWRjQ2xpZW50Q29uZmlnLmF1ZGllbmNlIH0sXG4gICAgICByZWRpcmVjdF91cmk6IGAke2RvY3VtZW50LmxvY2F0aW9uLm9yaWdpbn0vY2FsbGJhY2suaHRtbGAsXG4gICAgICByZXNwb25zZV90eXBlOiBvaWRjQ2xpZW50Q29uZmlnLnJlc3BvbnNlX3R5cGUgfHwgJ2lkX3Rva2VuIHRva2VuJyxcbiAgICAgIHNjb3BlOiBvaWRjQ2xpZW50Q29uZmlnLnNjb3BlIHx8ICdvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCcsXG4gICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk6IGAke2RvY3VtZW50LmxvY2F0aW9uLm9yaWdpbn0vc2lnbm91dC1jYWxsYmFjay5odG1sYCxcbiAgICAgIHNpbGVudF9yZWRpcmVjdF91cmk6IGAke2RvY3VtZW50LmxvY2F0aW9uLm9yaWdpbn0vcmVuZXctY2FsbGJhY2suaHRtbGAsXG4gICAgICBhdXRvbWF0aWNTaWxlbnRSZW5ldzpcbiAgICAgICAgaXNOdWxsT3JVbmRlZmluZWQob2lkY0NsaWVudENvbmZpZy5hdXRvbWF0aWNTaWxlbnRSZW5ldylcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IG9pZGNDbGllbnRDb25maWcuYXV0b21hdGljU2lsZW50UmVuZXcsXG4gICAgICBtZXRhZGF0YVVybDogYCR7b2lkY0NsaWVudENvbmZpZy5hdXRob3JpdHl9Ly53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uYCxcbiAgICB9LFxuICAgIGdldFVzZXJNZXRhZGF0YTogb2lkY0NsaWVudENvbmZpZy5nZXRVc2VyTWV0YWRhdGEsXG4gICAgdXNlQ2FsbGJhY2tGbGFnOlxuICAgICAgaXNOdWxsT3JVbmRlZmluZWQob2lkY0NsaWVudENvbmZpZy51c2VDYWxsYmFja0ZsYWcpXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IG9pZGNDbGllbnRDb25maWcudXNlQ2FsbGJhY2tGbGFnIGFzIGJvb2xlYW4sXG4gIH07XG59XG4iXX0=