@cccteam/ccc-lib 0.0.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 (47) hide show
  1. package/README.md +24 -0
  2. package/cccteam-ccc-lib-0.0.10.tgz +0 -0
  3. package/esm2022/cccteam-ccc-lib.mjs +5 -0
  4. package/esm2022/lib/auth/directives/has-permission.directive.mjs +44 -0
  5. package/esm2022/lib/auth/forms/ccc-field/ccc-field.component.mjs +77 -0
  6. package/esm2022/lib/auth/forms/form-helpers.mjs +34 -0
  7. package/esm2022/lib/auth/guards/authentication.guard.mjs +38 -0
  8. package/esm2022/lib/auth/guards/authorization.guard.mjs +17 -0
  9. package/esm2022/lib/auth/services/auth.service.mjs +49 -0
  10. package/esm2022/lib/auth/services/request-options.mjs +12 -0
  11. package/esm2022/lib/auth/state/auth.actions.mjs +64 -0
  12. package/esm2022/lib/auth/state/auth.state.mjs +105 -0
  13. package/esm2022/lib/types/base/tokens.mjs +7 -0
  14. package/esm2022/lib/types/notification-message.mjs +7 -0
  15. package/esm2022/lib/types/permissions.mjs +3 -0
  16. package/esm2022/lib/types/session-info.mjs +2 -0
  17. package/esm2022/lib/ui/components/alert/alert.component.mjs +41 -0
  18. package/esm2022/lib/ui/components/sidenav/sidenav.component.mjs +63 -0
  19. package/esm2022/lib/ui/interceptor/api.interceptor.mjs +43 -0
  20. package/esm2022/lib/ui/services/notification.service.mjs +50 -0
  21. package/esm2022/lib/ui/state/core.actions.mjs +49 -0
  22. package/esm2022/lib/ui/state/core.state.mjs +95 -0
  23. package/esm2022/public-api.mjs +34 -0
  24. package/fesm2022/cccteam-ccc-lib.mjs +739 -0
  25. package/fesm2022/cccteam-ccc-lib.mjs.map +1 -0
  26. package/index.d.ts +5 -0
  27. package/lib/auth/directives/has-permission.directive.d.ts +12 -0
  28. package/lib/auth/forms/ccc-field/ccc-field.component.d.ts +25 -0
  29. package/lib/auth/forms/form-helpers.d.ts +16 -0
  30. package/lib/auth/guards/authentication.guard.d.ts +3 -0
  31. package/lib/auth/guards/authorization.guard.d.ts +3 -0
  32. package/lib/auth/services/auth.service.d.ts +24 -0
  33. package/lib/auth/services/request-options.d.ts +8 -0
  34. package/lib/auth/state/auth.actions.d.ts +41 -0
  35. package/lib/auth/state/auth.state.d.ts +28 -0
  36. package/lib/types/base/tokens.d.ts +13 -0
  37. package/lib/types/notification-message.d.ts +18 -0
  38. package/lib/types/permissions.d.ts +15 -0
  39. package/lib/types/session-info.d.ts +9 -0
  40. package/lib/ui/components/alert/alert.component.d.ts +13 -0
  41. package/lib/ui/components/sidenav/sidenav.component.d.ts +31 -0
  42. package/lib/ui/interceptor/api.interceptor.d.ts +12 -0
  43. package/lib/ui/services/notification.service.d.ts +30 -0
  44. package/lib/ui/state/core.actions.d.ts +31 -0
  45. package/lib/ui/state/core.state.d.ts +29 -0
  46. package/package.json +29 -0
  47. package/public-api.d.ts +19 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # CccLib
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project ccc-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ccc-lib`.
8
+ > Note: Don't forget to add `--project ccc-lib` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build ccc-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build ccc-lib`, go to the dist folder `cd dist/ccc-lib` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test ccc-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
Binary file
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2NjdGVhbS1jY2MtbGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvY2NjdGVhbS1jY2MtbGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -0,0 +1,44 @@
1
+ import { Directive, Input, TemplateRef, ViewContainerRef, inject } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { Store } from '@ngxs/store';
4
+ import { Subject, catchError, combineLatest, map, of } from 'rxjs';
5
+ import { AuthState } from '../state/auth.state';
6
+ import * as i0 from "@angular/core";
7
+ export class HasPermissionDirective {
8
+ templateRef = inject((TemplateRef));
9
+ viewContainer = inject(ViewContainerRef);
10
+ store = inject(Store);
11
+ scope = new Subject();
12
+ set cccHasPermission(scope) {
13
+ this.scope.next(scope);
14
+ }
15
+ constructor() {
16
+ combineLatest({
17
+ permissionFn: this.store.select(AuthState.hasPermission),
18
+ scope: this.scope.asObservable(),
19
+ })
20
+ .pipe(takeUntilDestroyed(), map(({ permissionFn, scope }) => (scope !== undefined ? permissionFn(scope) : true)), catchError(() => of(false)))
21
+ .subscribe((result) => {
22
+ if (result) {
23
+ if (!this.viewContainer.get(0)) {
24
+ this.viewContainer.createEmbeddedView(this.templateRef);
25
+ }
26
+ }
27
+ else {
28
+ this.viewContainer.clear();
29
+ }
30
+ });
31
+ }
32
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: HasPermissionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
33
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: HasPermissionDirective, isStandalone: true, selector: "[cccHasPermission]", inputs: { cccHasPermission: "cccHasPermission" }, ngImport: i0 });
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: HasPermissionDirective, decorators: [{
36
+ type: Directive,
37
+ args: [{
38
+ selector: '[cccHasPermission]',
39
+ standalone: true,
40
+ }]
41
+ }], ctorParameters: () => [], propDecorators: { cccHasPermission: [{
42
+ type: Input
43
+ }] } });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLXBlcm1pc3Npb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL2F1dGgvZGlyZWN0aXZlcy9oYXMtcGVybWlzc2lvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFNaEQsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUEsV0FBb0IsQ0FBQSxDQUFDLENBQUM7SUFDM0MsYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFdEIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO0lBRS9DLElBQ0ksZ0JBQWdCLENBQUMsS0FBc0I7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEO1FBQ0UsYUFBYSxDQUFDO1lBQ1osWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFO1NBQ2pDLENBQUM7YUFDQyxJQUFJLENBQ0gsa0JBQWtCLEVBQUUsRUFDcEIsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNwRixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzVCO2FBQ0EsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO3VHQS9CVSxzQkFBc0I7MkZBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFKbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBU0ssZ0JBQWdCO3NCQURuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBjYXRjaEVycm9yLCBjb21iaW5lTGF0ZXN0LCBtYXAsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2NvcGUgfSBmcm9tICcuLi8uLi90eXBlcy9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBBdXRoU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9hdXRoLnN0YXRlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NjY0hhc1Blcm1pc3Npb25dJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgSGFzUGVybWlzc2lvbkRpcmVjdGl2ZSB7XG4gIHByaXZhdGUgdGVtcGxhdGVSZWYgPSBpbmplY3QoVGVtcGxhdGVSZWY8dW5rbm93bj4pO1xuICBwcml2YXRlIHZpZXdDb250YWluZXIgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG4gIHByaXZhdGUgc3RvcmUgPSBpbmplY3QoU3RvcmUpO1xuXG4gIHByaXZhdGUgc2NvcGUgPSBuZXcgU3ViamVjdDxQZXJtaXNzaW9uU2NvcGU+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IGNjY0hhc1Blcm1pc3Npb24oc2NvcGU6IFBlcm1pc3Npb25TY29wZSkge1xuICAgIHRoaXMuc2NvcGUubmV4dChzY29wZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb21iaW5lTGF0ZXN0KHtcbiAgICAgIHBlcm1pc3Npb25GbjogdGhpcy5zdG9yZS5zZWxlY3QoQXV0aFN0YXRlLmhhc1Blcm1pc3Npb24pLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUuYXNPYnNlcnZhYmxlKCksXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgbWFwKCh7IHBlcm1pc3Npb25Gbiwgc2NvcGUgfSkgPT4gKHNjb3BlICE9PSB1bmRlZmluZWQgPyBwZXJtaXNzaW9uRm4oc2NvcGUpIDogdHJ1ZSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGZhbHNlKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmICghdGhpcy52aWV3Q29udGFpbmVyLmdldCgwKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,77 @@
1
+ import { Component, computed, inject, input, signal } from '@angular/core';
2
+ import { MatFormFieldModule } from '@angular/material/form-field';
3
+ import { MatInputModule } from '@angular/material/input';
4
+ import { Store } from '@ngxs/store';
5
+ import { ReadPermission, UpdatePermission } from '../../../types/permissions';
6
+ import { AuthState } from '../../state/auth.state';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/material/form-field";
9
+ import * as i2 from "@angular/material/input";
10
+ export var InputMode;
11
+ (function (InputMode) {
12
+ InputMode["Read"] = "read";
13
+ InputMode["Edit"] = "edit";
14
+ })(InputMode || (InputMode = {}));
15
+ export class CccInputFieldComponent {
16
+ store = inject(Store);
17
+ className = input();
18
+ mode = input.required();
19
+ resource = input.required();
20
+ domain = input.required();
21
+ value = input.required();
22
+ name = input.required();
23
+ inputMode = InputMode;
24
+ canEdit = signal(false);
25
+ canEditSelector = false;
26
+ canRead = signal(false);
27
+ canReadSelector = false;
28
+ ngOnInit() {
29
+ this.canEditSelector = this.store.selectSnapshot(AuthState.hasPermission)({
30
+ resource: this.resource(),
31
+ permission: ReadPermission,
32
+ domain: this.domain(),
33
+ });
34
+ this.canReadSelector = this.store.selectSnapshot(AuthState.hasPermission)({
35
+ resource: this.resource(),
36
+ permission: UpdatePermission,
37
+ domain: this.domain(),
38
+ });
39
+ this.canRead = computed(() => {
40
+ const res = this.resource();
41
+ if (!res) {
42
+ return false;
43
+ }
44
+ if (AuthState.requiresPermission(this.resource(), ReadPermission)) {
45
+ return this.canReadSelector;
46
+ }
47
+ return false;
48
+ });
49
+ this.canEdit = computed(() => {
50
+ const res = this.resource();
51
+ if (!res) {
52
+ return false;
53
+ }
54
+ if (AuthState.requiresPermission(this.resource(), UpdatePermission)) {
55
+ return this.canEditSelector;
56
+ }
57
+ return false;
58
+ });
59
+ }
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CccInputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.7", type: CccInputFieldComponent, isStandalone: true, selector: "ccc-input-field", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null }, domain: { classPropertyName: "domain", publicName: "domain", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
62
+ <mat-form-field [class]="className()">
63
+ <mat-label>{{ name() }}</mat-label>
64
+ <input matInput [disabled]="mode() === inputMode.Edit && canEdit()" [value]="value()" />
65
+ </mat-form-field>
66
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] });
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CccInputFieldComponent, decorators: [{
69
+ type: Component,
70
+ args: [{ selector: 'ccc-input-field', standalone: true, imports: [MatFormFieldModule, MatInputModule], template: `
71
+ <mat-form-field [class]="className()">
72
+ <mat-label>{{ name() }}</mat-label>
73
+ <input matInput [disabled]="mode() === inputMode.Edit && canEdit()" [value]="value()" />
74
+ </mat-form-field>
75
+ ` }]
76
+ }] });
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2NjLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjYy1saWIvc3JjL2xpYi9hdXRoL2Zvcm1zL2NjYy1maWVsZC9jY2MtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBVSxjQUFjLEVBQVksZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFFbkQsTUFBTSxDQUFOLElBQVksU0FHWDtBQUhELFdBQVksU0FBUztJQUNuQiwwQkFBYSxDQUFBO0lBQ2IsMEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQWNELE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDcEIsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWEsQ0FBQztJQUNuQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBWSxDQUFDO0lBQ3RDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7SUFDbEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO0lBRWhDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFFdEIsT0FBTyxHQUFvQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUV4QixPQUFPLEdBQW9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN6QixVQUFVLEVBQUUsY0FBYztZQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN6QixVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1NBQ3RCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDOUIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUNwRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDOUIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3VHQWxEVSxzQkFBc0I7MkZBQXRCLHNCQUFzQixvekJBUnZCOzs7OztHQUtULHlFQU5TLGtCQUFrQiwwU0FBRSxjQUFjOzsyRkFTakMsc0JBQXNCO2tCQVpsQyxTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxZQUNuQzs7Ozs7R0FLVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIE9uSW5pdCwgc2lnbmFsLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IERvbWFpbiwgUmVhZFBlcm1pc3Npb24sIFJlc291cmNlLCBVcGRhdGVQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvcGVybWlzc2lvbnMnO1xuaW1wb3J0IHsgQXV0aFN0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvYXV0aC5zdGF0ZSc7XG5cbmV4cG9ydCBlbnVtIElucHV0TW9kZSB7XG4gIFJlYWQgPSAncmVhZCcsXG4gIEVkaXQgPSAnZWRpdCcsXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NjYy1pbnB1dC1maWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtNYXRGb3JtRmllbGRNb2R1bGUsIE1hdElucHV0TW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bWF0LWZvcm0tZmllbGQgW2NsYXNzXT1cImNsYXNzTmFtZSgpXCI+XG4gICAgICA8bWF0LWxhYmVsPnt7IG5hbWUoKSB9fTwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IG1hdElucHV0IFtkaXNhYmxlZF09XCJtb2RlKCkgPT09IGlucHV0TW9kZS5FZGl0ICYmIGNhbkVkaXQoKVwiIFt2YWx1ZV09XCJ2YWx1ZSgpXCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICBgLFxuICBzdHlsZVVybDogJy4vY2NjLWZpZWxkLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ2NjSW5wdXRGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHN0b3JlID0gaW5qZWN0KFN0b3JlKTtcbiAgY2xhc3NOYW1lID0gaW5wdXQoKTtcbiAgbW9kZSA9IGlucHV0LnJlcXVpcmVkPElucHV0TW9kZT4oKTtcbiAgcmVzb3VyY2UgPSBpbnB1dC5yZXF1aXJlZDxSZXNvdXJjZT4oKTtcbiAgZG9tYWluID0gaW5wdXQucmVxdWlyZWQ8RG9tYWluPigpO1xuICB2YWx1ZSA9IGlucHV0LnJlcXVpcmVkKCk7XG4gIG5hbWUgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG5cbiAgaW5wdXRNb2RlID0gSW5wdXRNb2RlO1xuXG4gIGNhbkVkaXQ6IFNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XG4gIGNhbkVkaXRTZWxlY3RvciA9IGZhbHNlO1xuXG4gIGNhblJlYWQ6IFNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XG4gIGNhblJlYWRTZWxlY3RvciA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2FuRWRpdFNlbGVjdG9yID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChBdXRoU3RhdGUuaGFzUGVybWlzc2lvbikoe1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSxcbiAgICAgIHBlcm1pc3Npb246IFJlYWRQZXJtaXNzaW9uLFxuICAgICAgZG9tYWluOiB0aGlzLmRvbWFpbigpLFxuICAgIH0pO1xuICAgIHRoaXMuY2FuUmVhZFNlbGVjdG9yID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChBdXRoU3RhdGUuaGFzUGVybWlzc2lvbikoe1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSxcbiAgICAgIHBlcm1pc3Npb246IFVwZGF0ZVBlcm1pc3Npb24sXG4gICAgICBkb21haW46IHRoaXMuZG9tYWluKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhblJlYWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgICBpZiAoIXJlcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoQXV0aFN0YXRlLnJlcXVpcmVzUGVybWlzc2lvbih0aGlzLnJlc291cmNlKCksIFJlYWRQZXJtaXNzaW9uKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5SZWFkU2VsZWN0b3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNhbkVkaXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgICBpZiAoIXJlcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoQXV0aFN0YXRlLnJlcXVpcmVzUGVybWlzc2lvbih0aGlzLnJlc291cmNlKCksIFVwZGF0ZVBlcm1pc3Npb24pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbkVkaXRTZWxlY3RvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,34 @@
1
+ import { isEqual } from 'lodash-es';
2
+ /**
3
+ * Accepts a FormGroup and compares it to an object to return the dirty form values
4
+ * as a sparse object
5
+ * @param form - FormGroup
6
+ * @param compareData - object to compare form values against
7
+ * @returns Partial<T>
8
+ * @example sparseFormData<UserCreate>(this.userForm, initUser)
9
+ */
10
+ export function sparseFormData(form, compareData) {
11
+ const sparseFormData = {};
12
+ for (const [key, control] of Object.entries(form.controls)) {
13
+ const controlValue = control.value;
14
+ const compareValue = compareData[key];
15
+ if (!isEqual(controlValue, compareValue)) {
16
+ sparseFormData[key] = controlValue;
17
+ }
18
+ }
19
+ return sparseFormData;
20
+ }
21
+ /**
22
+ * Accepts a FormArray and removes empty strings
23
+ * @param formArray - FormArray
24
+ * @returns FormArray
25
+ */
26
+ export function cleanStringFormArray(formArray) {
27
+ for (let i = formArray.controls.length - 1; i >= 0; i--) {
28
+ if (formArray.at(i).value === '') {
29
+ formArray.removeAt(i);
30
+ }
31
+ }
32
+ return formArray;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL2F1dGgvZm9ybXMvZm9ybS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUksSUFBZSxFQUFFLFdBQWM7SUFDL0QsTUFBTSxjQUFjLEdBQU0sRUFBTyxDQUFDO0lBRWxDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbkMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQWMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDekMsY0FBYyxDQUFDLEdBQWMsQ0FBQyxHQUFHLFlBQTBCLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFvQjtJQUN2RCxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDeEQsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbi8qKlxuICogQWNjZXB0cyBhIEZvcm1Hcm91cCBhbmQgY29tcGFyZXMgaXQgdG8gYW4gb2JqZWN0IHRvIHJldHVybiB0aGUgZGlydHkgZm9ybSB2YWx1ZXNcbiAqIGFzIGEgc3BhcnNlIG9iamVjdFxuICogQHBhcmFtIGZvcm0gLSBGb3JtR3JvdXBcbiAqIEBwYXJhbSBjb21wYXJlRGF0YSAtIG9iamVjdCB0byBjb21wYXJlIGZvcm0gdmFsdWVzIGFnYWluc3RcbiAqIEByZXR1cm5zIFBhcnRpYWw8VD5cbiAqIEBleGFtcGxlIHNwYXJzZUZvcm1EYXRhPFVzZXJDcmVhdGU+KHRoaXMudXNlckZvcm0sIGluaXRVc2VyKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlRm9ybURhdGE8VD4oZm9ybTogRm9ybUdyb3VwLCBjb21wYXJlRGF0YTogVCk6IFQge1xuICBjb25zdCBzcGFyc2VGb3JtRGF0YTogVCA9IHt9IGFzIFQ7XG5cbiAgZm9yIChjb25zdCBba2V5LCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgY29uc3QgY29tcGFyZVZhbHVlID0gY29tcGFyZURhdGFba2V5IGFzIGtleW9mIFRdO1xuXG4gICAgaWYgKCFpc0VxdWFsKGNvbnRyb2xWYWx1ZSwgY29tcGFyZVZhbHVlKSkge1xuICAgICAgc3BhcnNlRm9ybURhdGFba2V5IGFzIGtleW9mIFRdID0gY29udHJvbFZhbHVlIGFzIFRba2V5b2YgVF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNwYXJzZUZvcm1EYXRhO1xufVxuXG4vKipcbiAqIEFjY2VwdHMgYSBGb3JtQXJyYXkgYW5kIHJlbW92ZXMgZW1wdHkgc3RyaW5nc1xuICogQHBhcmFtIGZvcm1BcnJheSAtIEZvcm1BcnJheVxuICogQHJldHVybnMgRm9ybUFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZ0Zvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSk6IEZvcm1BcnJheSB7XG4gIGZvciAobGV0IGkgPSBmb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoZm9ybUFycmF5LmF0KGkpLnZhbHVlID09PSAnJykge1xuICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm9ybUFycmF5O1xufVxuIl19
@@ -0,0 +1,38 @@
1
+ import { inject } from '@angular/core';
2
+ import { Store } from '@ngxs/store';
3
+ import { of } from 'rxjs';
4
+ import { catchError, map, switchMap } from 'rxjs/operators';
5
+ import { BASE_URL } from '../../types/base/tokens';
6
+ import { AuthService } from '../services/auth.service';
7
+ import { AuthenticationGuardAction } from '../state/auth.actions';
8
+ import { AuthState } from '../state/auth.state';
9
+ export const AuthenticationGuard = (route, routerState) => {
10
+ const store = inject(Store);
11
+ const authService = inject(AuthService);
12
+ const baseUrl = inject(BASE_URL);
13
+ const authenticate = () => {
14
+ const url = routerState.url;
15
+ const absoluteUrl = baseUrl + (!url.toString().startsWith('/') ? '/' + url : url);
16
+ const encodedUrl = encodeURIComponent(absoluteUrl);
17
+ window.location.href = `${authService.loginRoute()}?returnUrl=${encodedUrl}`;
18
+ };
19
+ return store.select(AuthState.isAuthenticated).pipe(switchMap((authenticated) => {
20
+ if (authenticated) {
21
+ return of(authenticated);
22
+ }
23
+ // Handle uninitialized state (ie Browser reload)
24
+ return store.dispatch(AuthenticationGuardAction.CheckUserSession).pipe(switchMap(() => {
25
+ return store.select(AuthState.isAuthenticated);
26
+ }));
27
+ }), map((authenticated) => {
28
+ if (authenticated) {
29
+ return true;
30
+ }
31
+ authenticate();
32
+ return false;
33
+ }), catchError(() => {
34
+ authenticate();
35
+ return of(false);
36
+ }));
37
+ };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2MtbGliL3NyYy9saWIvYXV0aC9ndWFyZHMvYXV0aGVudGljYXRpb24uZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsS0FBNkIsRUFDN0IsV0FBZ0MsRUFDWCxFQUFFO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFeEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sWUFBWSxHQUFHLEdBQVMsRUFBRTtRQUM5QixNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQzVCLE1BQU0sV0FBVyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEYsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsVUFBVSxFQUFFLGNBQWMsVUFBVSxFQUFFLENBQUM7SUFDL0UsQ0FBQyxDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQ2pELFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1FBQzFCLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELGlEQUFpRDtRQUNqRCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQ3BFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUNwQixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELFlBQVksRUFBRSxDQUFDO1FBRWYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsWUFBWSxFQUFFLENBQUM7UUFFZixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQkFTRV9VUkwgfSBmcm9tICcuLi8uLi90eXBlcy9iYXNlL3Rva2Vucyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvbkd1YXJkQWN0aW9uIH0gZnJvbSAnLi4vc3RhdGUvYXV0aC5hY3Rpb25zJztcbmltcG9ydCB7IEF1dGhTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL2F1dGguc3RhdGUnO1xuXG5leHBvcnQgY29uc3QgQXV0aGVudGljYXRpb25HdWFyZCA9IChcbiAgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gIHJvdXRlclN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxuKTogT2JzZXJ2YWJsZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHN0b3JlID0gaW5qZWN0KFN0b3JlKTtcbiAgY29uc3QgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuXG4gIGNvbnN0IGJhc2VVcmwgPSBpbmplY3QoQkFTRV9VUkwpO1xuXG4gIGNvbnN0IGF1dGhlbnRpY2F0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB1cmwgPSByb3V0ZXJTdGF0ZS51cmw7XG4gICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsICsgKCF1cmwudG9TdHJpbmcoKS5zdGFydHNXaXRoKCcvJykgPyAnLycgKyB1cmwgOiB1cmwpO1xuICAgIGNvbnN0IGVuY29kZWRVcmwgPSBlbmNvZGVVUklDb21wb25lbnQoYWJzb2x1dGVVcmwpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7YXV0aFNlcnZpY2UubG9naW5Sb3V0ZSgpfT9yZXR1cm5Vcmw9JHtlbmNvZGVkVXJsfWA7XG4gIH07XG5cbiAgcmV0dXJuIHN0b3JlLnNlbGVjdChBdXRoU3RhdGUuaXNBdXRoZW50aWNhdGVkKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoYXV0aGVudGljYXRlZCkgPT4ge1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG9mKGF1dGhlbnRpY2F0ZWQpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHVuaW5pdGlhbGl6ZWQgc3RhdGUgKGllIEJyb3dzZXIgcmVsb2FkKVxuICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKEF1dGhlbnRpY2F0aW9uR3VhcmRBY3Rpb24uQ2hlY2tVc2VyU2Vzc2lvbikucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RvcmUuc2VsZWN0KEF1dGhTdGF0ZS5pc0F1dGhlbnRpY2F0ZWQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSksXG4gICAgbWFwKChhdXRoZW50aWNhdGVkKSA9PiB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgYXV0aGVudGljYXRlKCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KSxcbiAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgIGF1dGhlbnRpY2F0ZSgpO1xuXG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH0pLFxuICApO1xufTtcbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { inject } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { Store } from '@ngxs/store';
4
+ import { map } from 'rxjs';
5
+ import { AuthState } from '../state/auth.state';
6
+ export const AuthorizationGuard = (route) => {
7
+ const store = inject(Store);
8
+ const router = inject(Router);
9
+ return store.select(AuthState.hasPermission).pipe(map((permissionFn) => permissionFn(route.data['scope'])), map((hasPermission) => {
10
+ if (hasPermission) {
11
+ return true;
12
+ }
13
+ router.navigate(['/']);
14
+ return false;
15
+ }));
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjYy1saWIvc3JjL2xpYi9hdXRoL2d1YXJkcy9hdXRob3JpemF0aW9uLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUEwQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBNkIsRUFBdUIsRUFBRTtJQUN2RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUMvQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFDeEQsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDcEIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXV0aFN0YXRlIH0gZnJvbSAnLi4vc3RhdGUvYXV0aC5zdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBBdXRob3JpemF0aW9uR3VhcmQgPSAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qgc3RvcmUgPSBpbmplY3QoU3RvcmUpO1xuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcmV0dXJuIHN0b3JlLnNlbGVjdChBdXRoU3RhdGUuaGFzUGVybWlzc2lvbikucGlwZShcbiAgICBtYXAoKHBlcm1pc3Npb25GbikgPT4gcGVybWlzc2lvbkZuKHJvdXRlLmRhdGFbJ3Njb3BlJ10pKSxcbiAgICBtYXAoKGhhc1Blcm1pc3Npb24pID0+IHtcbiAgICAgIGlmIChoYXNQZXJtaXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcm91dGVyLm5hdmlnYXRlKFsnLyddKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KSxcbiAgKTtcbn07XG4iXX0=
@@ -0,0 +1,49 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { map } from 'rxjs';
3
+ import { API_URL } from '../../types/base/tokens';
4
+ import { errorOptions } from './request-options';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ const routes = {
8
+ login: (rootUrl) => `${rootUrl}/user/login`,
9
+ session: (rootUrl) => `${rootUrl}/user/session`,
10
+ };
11
+ export class AuthService {
12
+ http;
13
+ apiUrl;
14
+ constructor(http, apiUrl) {
15
+ this.http = http;
16
+ this.apiUrl = apiUrl;
17
+ }
18
+ /**
19
+ * Logs a user out.
20
+ *
21
+ * @returns Observable with a boolean indicating whether they were logged out.
22
+ */
23
+ logout() {
24
+ return this.http.delete(routes.session(this.apiUrl), errorOptions(false)).pipe(map(() => true));
25
+ }
26
+ /**
27
+ * Checks a user's session with the server.
28
+ *
29
+ * @returns Observable with the user session info
30
+ */
31
+ checkUserSession() {
32
+ return this.http.get(routes.session(this.apiUrl), errorOptions(false));
33
+ }
34
+ loginRoute() {
35
+ return routes.login(this.apiUrl);
36
+ }
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthService, deps: [{ token: i1.HttpClient }, { token: API_URL }], target: i0.ɵɵFactoryTarget.Injectable });
38
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthService, providedIn: 'root' });
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthService, decorators: [{
41
+ type: Injectable,
42
+ args: [{
43
+ providedIn: 'root',
44
+ }]
45
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
46
+ type: Inject,
47
+ args: [API_URL]
48
+ }] }] });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL2F1dGgvc2VydmljZXMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBRWpELE1BQU0sTUFBTSxHQUFHO0lBQ2IsS0FBSyxFQUFFLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FBQyxHQUFHLE9BQU8sYUFBYTtJQUMzRCxPQUFPLEVBQUUsQ0FBQyxPQUFlLEVBQVUsRUFBRSxDQUFDLEdBQUcsT0FBTyxlQUFlO0NBQ2hFLENBQUM7QUFLRixNQUFNLE9BQU8sV0FBVztJQUVaO0lBQ2lCO0lBRjNCLFlBQ1UsSUFBZ0IsRUFDQyxNQUFjO1FBRC9CLFNBQUksR0FBSixJQUFJLENBQVk7UUFDQyxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3RDLENBQUM7SUFFSjs7OztPQUlHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBYyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQzt1R0ExQlUsV0FBVyw0Q0FHWixPQUFPOzJHQUhOLFdBQVcsY0FGVixNQUFNOzsyRkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBSUksTUFBTTsyQkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBUElfVVJMIH0gZnJvbSAnLi4vLi4vdHlwZXMvYmFzZS90b2tlbnMnO1xuaW1wb3J0IHsgU2Vzc2lvbkluZm8gfSBmcm9tICcuLi8uLi90eXBlcy9zZXNzaW9uLWluZm8nO1xuaW1wb3J0IHsgZXJyb3JPcHRpb25zIH0gZnJvbSAnLi9yZXF1ZXN0LW9wdGlvbnMnO1xuXG5jb25zdCByb3V0ZXMgPSB7XG4gIGxvZ2luOiAocm9vdFVybDogc3RyaW5nKTogc3RyaW5nID0+IGAke3Jvb3RVcmx9L3VzZXIvbG9naW5gLFxuICBzZXNzaW9uOiAocm9vdFVybDogc3RyaW5nKTogc3RyaW5nID0+IGAke3Jvb3RVcmx9L3VzZXIvc2Vzc2lvbmAsXG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChBUElfVVJMKSBwcml2YXRlIGFwaVVybDogc3RyaW5nLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIExvZ3MgYSB1c2VyIG91dC5cbiAgICpcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSB3aXRoIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhleSB3ZXJlIGxvZ2dlZCBvdXQuXG4gICAqL1xuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUocm91dGVzLnNlc3Npb24odGhpcy5hcGlVcmwpLCBlcnJvck9wdGlvbnMoZmFsc2UpKS5waXBlKG1hcCgoKSA9PiB0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGEgdXNlcidzIHNlc3Npb24gd2l0aCB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHdpdGggdGhlIHVzZXIgc2Vzc2lvbiBpbmZvXG4gICAqL1xuICBjaGVja1VzZXJTZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvbkluZm8gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U2Vzc2lvbkluZm8+KHJvdXRlcy5zZXNzaW9uKHRoaXMuYXBpVXJsKSwgZXJyb3JPcHRpb25zKGZhbHNlKSk7XG4gIH1cblxuICBsb2dpblJvdXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvdXRlcy5sb2dpbih0aGlzLmFwaVVybCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { HttpContext, HttpContextToken } from '@angular/common/http';
2
+ export const CUSTOM_HTTP_REQUEST_OPTIONS = new HttpContextToken(() => ({
3
+ suppressGlobalError: false,
4
+ }));
5
+ export function errorOptions(suppressGlobalError) {
6
+ return {
7
+ context: new HttpContext().set(CUSTOM_HTTP_REQUEST_OPTIONS, {
8
+ suppressGlobalError: suppressGlobalError ?? false,
9
+ }),
10
+ };
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL2F1dGgvc2VydmljZXMvcmVxdWVzdC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU1yRSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLGdCQUFnQixDQUEyQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLG1CQUFtQixFQUFFLEtBQUs7Q0FDM0IsQ0FBQyxDQUFDLENBQUM7QUFFSixNQUFNLFVBQVUsWUFBWSxDQUFDLG1CQUF3QztJQUNuRSxPQUFPO1FBQ0wsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFO1lBQzFELG1CQUFtQixFQUFFLG1CQUFtQixJQUFJLEtBQUs7U0FDbEQsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENvbnRleHQsIEh0dHBDb250ZXh0VG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tSHR0cFJlcXVlc3RPcHRpb25zIHtcbiAgc3VwcHJlc3NHbG9iYWxFcnJvcjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IENVU1RPTV9IVFRQX1JFUVVFU1RfT1BUSU9OUyA9IG5ldyBIdHRwQ29udGV4dFRva2VuPEN1c3RvbUh0dHBSZXF1ZXN0T3B0aW9ucz4oKCkgPT4gKHtcbiAgc3VwcHJlc3NHbG9iYWxFcnJvcjogZmFsc2UsXG59KSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck9wdGlvbnMoc3VwcHJlc3NHbG9iYWxFcnJvcjogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHsgY29udGV4dDogSHR0cENvbnRleHQgfSB7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KENVU1RPTV9IVFRQX1JFUVVFU1RfT1BUSU9OUywge1xuICAgICAgc3VwcHJlc3NHbG9iYWxFcnJvcjogc3VwcHJlc3NHbG9iYWxFcnJvciA/PyBmYWxzZSxcbiAgICB9KSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,64 @@
1
+ /* eslint-disable @typescript-eslint/no-namespace */
2
+ // no-namespace rule is disabled because action hygiene prevents import pollution
3
+ export var AuthenticationGuardAction;
4
+ (function (AuthenticationGuardAction) {
5
+ class SetRedirectUrl {
6
+ redirectUrl;
7
+ static type = '[AuthenticationGuard] Set Redirect Url And Navigate To Login Page';
8
+ constructor(redirectUrl) {
9
+ this.redirectUrl = redirectUrl;
10
+ }
11
+ }
12
+ AuthenticationGuardAction.SetRedirectUrl = SetRedirectUrl;
13
+ class CheckUserSession {
14
+ static type = '[AuthenticationGuard] Check User Session';
15
+ }
16
+ AuthenticationGuardAction.CheckUserSession = CheckUserSession;
17
+ })(AuthenticationGuardAction || (AuthenticationGuardAction = {}));
18
+ export var LoginAction;
19
+ (function (LoginAction) {
20
+ class Logout {
21
+ static type = '[Login] Auto Logout';
22
+ }
23
+ LoginAction.Logout = Logout;
24
+ class SetRedirectUrl {
25
+ redirectUrl;
26
+ static type = '[Login] Set Redirect Url';
27
+ constructor(redirectUrl) {
28
+ this.redirectUrl = redirectUrl;
29
+ }
30
+ }
31
+ LoginAction.SetRedirectUrl = SetRedirectUrl;
32
+ class PublishError {
33
+ message;
34
+ static type = '[Login] Publish Error';
35
+ constructor(message) {
36
+ this.message = message;
37
+ }
38
+ }
39
+ LoginAction.PublishError = PublishError;
40
+ })(LoginAction || (LoginAction = {}));
41
+ export var AppAction;
42
+ (function (AppAction) {
43
+ class CheckUserSession {
44
+ static type = '[App] Check User Session';
45
+ }
46
+ AppAction.CheckUserSession = CheckUserSession;
47
+ class SetRedirectUrl {
48
+ redirectUrl;
49
+ static type = '[App] Set Redirect Url';
50
+ constructor(redirectUrl) {
51
+ this.redirectUrl = redirectUrl;
52
+ }
53
+ }
54
+ AppAction.SetRedirectUrl = SetRedirectUrl;
55
+ class SetNavIdentifier {
56
+ identifier;
57
+ static type = '[App] Set Nav Identifier';
58
+ constructor(identifier) {
59
+ this.identifier = identifier;
60
+ }
61
+ }
62
+ AppAction.SetNavIdentifier = SetNavIdentifier;
63
+ })(AppAction || (AppAction = {}));
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5hY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL2F1dGgvc3RhdGUvYXV0aC5hY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9EQUFvRDtBQUNwRCxpRkFBaUY7QUFJakYsTUFBTSxLQUFXLHlCQUF5QixDQVN6QztBQVRELFdBQWlCLHlCQUF5QjtJQUN4QyxNQUFhLGNBQWM7UUFFTjtRQURuQixNQUFNLENBQVUsSUFBSSxHQUFHLG1FQUFtRSxDQUFDO1FBQzNGLFlBQW1CLFdBQW1CO1lBQW5CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQUcsQ0FBQzs7SUFGL0Isd0NBQWMsaUJBRzFCLENBQUE7SUFFRCxNQUFhLGdCQUFnQjtRQUMzQixNQUFNLENBQVUsSUFBSSxHQUFHLDBDQUEwQyxDQUFDOztJQUR2RCwwQ0FBZ0IsbUJBRTVCLENBQUE7QUFDSCxDQUFDLEVBVGdCLHlCQUF5QixLQUF6Qix5QkFBeUIsUUFTekM7QUFFRCxNQUFNLEtBQVcsV0FBVyxDQWMzQjtBQWRELFdBQWlCLFdBQVc7SUFDMUIsTUFBYSxNQUFNO1FBQ2pCLE1BQU0sQ0FBVSxJQUFJLEdBQUcscUJBQXFCLENBQUM7O0lBRGxDLGtCQUFNLFNBRWxCLENBQUE7SUFFRCxNQUFhLGNBQWM7UUFFTjtRQURuQixNQUFNLENBQVUsSUFBSSxHQUFHLDBCQUEwQixDQUFDO1FBQ2xELFlBQW1CLFdBQW1CO1lBQW5CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQUcsQ0FBQzs7SUFGL0IsMEJBQWMsaUJBRzFCLENBQUE7SUFFRCxNQUFhLFlBQVk7UUFFSjtRQURuQixNQUFNLENBQVUsSUFBSSxHQUFHLHVCQUF1QixDQUFDO1FBQy9DLFlBQW1CLE9BQWtDO1lBQWxDLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQUcsQ0FBQzs7SUFGOUMsd0JBQVksZUFHeEIsQ0FBQTtBQUNILENBQUMsRUFkZ0IsV0FBVyxLQUFYLFdBQVcsUUFjM0I7QUFFRCxNQUFNLEtBQVcsU0FBUyxDQWN6QjtBQWRELFdBQWlCLFNBQVM7SUFDeEIsTUFBYSxnQkFBZ0I7UUFDM0IsTUFBTSxDQUFVLElBQUksR0FBRywwQkFBMEIsQ0FBQzs7SUFEdkMsMEJBQWdCLG1CQUU1QixDQUFBO0lBRUQsTUFBYSxjQUFjO1FBRU47UUFEbkIsTUFBTSxDQUFVLElBQUksR0FBRyx3QkFBd0IsQ0FBQztRQUNoRCxZQUFtQixXQUFtQjtZQUFuQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUFHLENBQUM7O0lBRi9CLHdCQUFjLGlCQUcxQixDQUFBO0lBRUQsTUFBYSxnQkFBZ0I7UUFFUjtRQURuQixNQUFNLENBQVUsSUFBSSxHQUFHLDBCQUEwQixDQUFDO1FBQ2xELFlBQW1CLFVBQWtCO1lBQWxCLGVBQVUsR0FBVixVQUFVLENBQVE7UUFBRyxDQUFDOztJQUY5QiwwQkFBZ0IsbUJBRzVCLENBQUE7QUFDSCxDQUFDLEVBZGdCLFNBQVMsS0FBVCxTQUFTLFFBY3pCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSAqL1xuLy8gbm8tbmFtZXNwYWNlIHJ1bGUgaXMgZGlzYWJsZWQgYmVjYXVzZSBhY3Rpb24gaHlnaWVuZSBwcmV2ZW50cyBpbXBvcnQgcG9sbHV0aW9uXG5cbmltcG9ydCB7IENyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9ub3RpZmljYXRpb24tbWVzc2FnZSc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXV0aGVudGljYXRpb25HdWFyZEFjdGlvbiB7XG4gIGV4cG9ydCBjbGFzcyBTZXRSZWRpcmVjdFVybCB7XG4gICAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0F1dGhlbnRpY2F0aW9uR3VhcmRdIFNldCBSZWRpcmVjdCBVcmwgQW5kIE5hdmlnYXRlIFRvIExvZ2luIFBhZ2UnO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWRpcmVjdFVybDogc3RyaW5nKSB7fVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIENoZWNrVXNlclNlc3Npb24ge1xuICAgIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tBdXRoZW50aWNhdGlvbkd1YXJkXSBDaGVjayBVc2VyIFNlc3Npb24nO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTG9naW5BY3Rpb24ge1xuICBleHBvcnQgY2xhc3MgTG9nb3V0IHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9ICdbTG9naW5dIEF1dG8gTG9nb3V0JztcbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBTZXRSZWRpcmVjdFVybCB7XG4gICAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0xvZ2luXSBTZXQgUmVkaXJlY3QgVXJsJztcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVkaXJlY3RVcmw6IHN0cmluZykge31cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBQdWJsaXNoRXJyb3Ige1xuICAgIHN0YXRpYyByZWFkb25seSB0eXBlID0gJ1tMb2dpbl0gUHVibGlzaCBFcnJvcic7XG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2U6IENyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2UpIHt9XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBcHBBY3Rpb24ge1xuICBleHBvcnQgY2xhc3MgQ2hlY2tVc2VyU2Vzc2lvbiB7XG4gICAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0FwcF0gQ2hlY2sgVXNlciBTZXNzaW9uJztcbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBTZXRSZWRpcmVjdFVybCB7XG4gICAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0FwcF0gU2V0IFJlZGlyZWN0IFVybCc7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZGlyZWN0VXJsOiBzdHJpbmcpIHt9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgU2V0TmF2SWRlbnRpZmllciB7XG4gICAgc3RhdGljIHJlYWRvbmx5IHR5cGUgPSAnW0FwcF0gU2V0IE5hdiBJZGVudGlmaWVyJztcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWRlbnRpZmllcjogc3RyaW5nKSB7fVxuICB9XG59XG4iXX0=
@@ -0,0 +1,105 @@
1
+ var AuthState_1;
2
+ import { __decorate } from "tslib";
3
+ import { inject, Injectable } from '@angular/core';
4
+ import { Action, Selector, State } from '@ngxs/store';
5
+ import { patch } from '@ngxs/store/operators';
6
+ import { cloneDeep } from 'lodash-es';
7
+ import { tap } from 'rxjs';
8
+ import { PERMISSION_REQUIRED } from '../../types/base/tokens';
9
+ import { ApiInterceptorAction } from '../../ui/state/core.actions';
10
+ import { AuthService } from '../services/auth.service';
11
+ import { AppAction, AuthenticationGuardAction, LoginAction } from './auth.actions';
12
+ import * as i0 from "@angular/core";
13
+ export const initState = {
14
+ authenticated: false,
15
+ redirectUrl: '',
16
+ sessionInfo: null,
17
+ };
18
+ let AuthState = class AuthState {
19
+ static { AuthState_1 = this; }
20
+ authService = inject(AuthService);
21
+ static permissionFn;
22
+ constructor() {
23
+ AuthState_1.initializePermissionFn();
24
+ }
25
+ static initializePermissionFn() {
26
+ if (!AuthState_1.permissionFn) {
27
+ AuthState_1.permissionFn = inject(PERMISSION_REQUIRED);
28
+ }
29
+ }
30
+ static hasPermission(state) {
31
+ return (scope) => {
32
+ if (!scope)
33
+ return true;
34
+ const resourcePermissions = state?.sessionInfo?.permissions?.[scope.domain]?.[scope.resource];
35
+ return Array.isArray(resourcePermissions) && resourcePermissions.includes(scope.permission);
36
+ };
37
+ }
38
+ static requiresPermission(resource, permission) {
39
+ if (!AuthState_1.permissionFn) {
40
+ throw new Error(`AuthState has not been initialized. Ensure AuthState is provided in your module or instantiated at least once.`);
41
+ }
42
+ return AuthState_1.permissionFn(resource, permission);
43
+ }
44
+ static isAuthenticated(state) {
45
+ return state?.authenticated;
46
+ }
47
+ static redirectUrl(state) {
48
+ return state?.redirectUrl;
49
+ }
50
+ checkUserSession(ctx) {
51
+ return this.authService.checkUserSession().pipe(tap((result) => ctx.setState(patch({
52
+ authenticated: !!result?.authenticated,
53
+ sessionInfo: result,
54
+ }))));
55
+ }
56
+ logout(ctx) {
57
+ const localStateCopy = cloneDeep(initState);
58
+ localStateCopy.redirectUrl = ctx.getState().redirectUrl;
59
+ return this.authService.logout().pipe(tap(() => {
60
+ ctx.setState(localStateCopy);
61
+ }));
62
+ }
63
+ setRedirectUrl(ctx, action) {
64
+ ctx.setState(patch({
65
+ redirectUrl: action.redirectUrl,
66
+ }));
67
+ return ctx.getState();
68
+ }
69
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
70
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthState });
71
+ };
72
+ __decorate([
73
+ Action([AppAction.CheckUserSession, AuthenticationGuardAction.CheckUserSession])
74
+ ], AuthState.prototype, "checkUserSession", null);
75
+ __decorate([
76
+ Action([LoginAction.Logout])
77
+ ], AuthState.prototype, "logout", null);
78
+ __decorate([
79
+ Action([
80
+ AppAction.SetRedirectUrl,
81
+ LoginAction.SetRedirectUrl,
82
+ AuthenticationGuardAction.SetRedirectUrl,
83
+ ApiInterceptorAction.SetRedirectUrl,
84
+ ])
85
+ ], AuthState.prototype, "setRedirectUrl", null);
86
+ __decorate([
87
+ Selector()
88
+ ], AuthState, "hasPermission", null);
89
+ __decorate([
90
+ Selector()
91
+ ], AuthState, "isAuthenticated", null);
92
+ __decorate([
93
+ Selector()
94
+ ], AuthState, "redirectUrl", null);
95
+ AuthState = AuthState_1 = __decorate([
96
+ State({
97
+ name: 'authState',
98
+ defaults: initState,
99
+ })
100
+ ], AuthState);
101
+ export { AuthState };
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthState, decorators: [{
103
+ type: Injectable
104
+ }], ctorParameters: () => [], propDecorators: { checkUserSession: [], logout: [], setRedirectUrl: [] } });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjYy1saWIvc3JjL2xpYi9hdXRoL3N0YXRlL2F1dGguc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWdCLE1BQU0sYUFBYSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBUW5GLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBbUI7SUFDdkMsYUFBYSxFQUFFLEtBQUs7SUFDcEIsV0FBVyxFQUFFLEVBQUU7SUFDZixXQUFXLEVBQUUsSUFBSTtDQUNsQixDQUFDO0FBT0ssSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFTOztJQUNaLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLFlBQVksQ0FBMEQ7SUFFckY7UUFDRSxXQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sTUFBTSxDQUFDLHNCQUFzQjtRQUNuQyxJQUFJLENBQUMsV0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVCLFdBQVMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFHTSxBQUFQLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBcUI7UUFDeEMsT0FBTyxDQUFDLEtBQXVCLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN4QixNQUFNLG1CQUFtQixHQUFHLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlGLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUYsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFrQixFQUFFLFVBQXNCO1FBQ2xFLElBQUksQ0FBQyxXQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYixnSEFBZ0gsQ0FDakgsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLFdBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFHTSxBQUFQLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBcUI7UUFDMUMsT0FBTyxLQUFLLEVBQUUsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFHTSxBQUFQLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBcUI7UUFDdEMsT0FBTyxLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFHRCxnQkFBZ0IsQ0FBQyxHQUFpQztRQUNoRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2IsR0FBRyxDQUFDLFFBQVEsQ0FDVixLQUFLLENBQUM7WUFDSixhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3RDLFdBQVcsRUFBRSxNQUFNO1NBQ3BCLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFHRCxNQUFNLENBQUMsR0FBaUM7UUFDdEMsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLGNBQWMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUNuQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQVFELGNBQWMsQ0FBQyxHQUFpQyxFQUFFLE1BQStCO1FBQy9FLEdBQUcsQ0FBQyxRQUFRLENBQ1YsS0FBSyxDQUFDO1lBQ0osV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1NBQ2hDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEIsQ0FBQzt1R0FoRlUsU0FBUzsyR0FBVCxTQUFTOztBQTJDcEI7SUFEQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpREFZaEY7QUFHRDtJQURDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQzt1Q0FTNUI7QUFRRDtJQU5DLE1BQU0sQ0FBQztRQUNOLFNBQVMsQ0FBQyxjQUFjO1FBQ3hCLFdBQVcsQ0FBQyxjQUFjO1FBQzFCLHlCQUF5QixDQUFDLGNBQWM7UUFDeEMsb0JBQW9CLENBQUMsY0FBYztLQUNwQyxDQUFDOytDQVFEO0FBakVNO0lBRE4sUUFBUSxFQUFFO29DQU9WO0FBWU07SUFETixRQUFRLEVBQUU7c0NBR1Y7QUFHTTtJQUROLFFBQVEsRUFBRTtrQ0FHVjtBQXhDVSxTQUFTO0lBTHJCLEtBQUssQ0FBaUI7UUFDckIsSUFBSSxFQUFFLFdBQVc7UUFDakIsUUFBUSxFQUFFLFNBQVM7S0FDcEIsQ0FBQztHQUVXLFNBQVMsQ0FpRnJCOzsyRkFqRlksU0FBUztrQkFEckIsVUFBVTt3REE0Q1QsZ0JBQWdCLE1BY2hCLE1BQU0sTUFnQk4sY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBTZWxlY3RvciwgU3RhdGUsIFN0YXRlQ29udGV4dCB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IHBhdGNoIH0gZnJvbSAnQG5neHMvc3RvcmUvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBFUk1JU1NJT05fUkVRVUlSRUQgfSBmcm9tICcuLi8uLi90eXBlcy9iYXNlL3Rva2Vucyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uLCBQZXJtaXNzaW9uU2NvcGUsIFJlc291cmNlIH0gZnJvbSAnLi4vLi4vdHlwZXMvcGVybWlzc2lvbnMnO1xuaW1wb3J0IHsgU2Vzc2lvbkluZm8gfSBmcm9tICcuLi8uLi90eXBlcy9zZXNzaW9uLWluZm8nO1xuaW1wb3J0IHsgQXBpSW50ZXJjZXB0b3JBY3Rpb24gfSBmcm9tICcuLi8uLi91aS9zdGF0ZS9jb3JlLmFjdGlvbnMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwQWN0aW9uLCBBdXRoZW50aWNhdGlvbkd1YXJkQWN0aW9uLCBMb2dpbkFjdGlvbiB9IGZyb20gJy4vYXV0aC5hY3Rpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RhdGVNb2RlbCB7XG4gIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIHJlZGlyZWN0VXJsOiBzdHJpbmc7XG4gIHNlc3Npb25JbmZvOiBTZXNzaW9uSW5mbyB8IG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCBpbml0U3RhdGU6IEF1dGhTdGF0ZU1vZGVsID0ge1xuICBhdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgcmVkaXJlY3RVcmw6ICcnLFxuICBzZXNzaW9uSW5mbzogbnVsbCxcbn07XG5cbkBTdGF0ZTxBdXRoU3RhdGVNb2RlbD4oe1xuICBuYW1lOiAnYXV0aFN0YXRlJyxcbiAgZGVmYXVsdHM6IGluaXRTdGF0ZSxcbn0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aFN0YXRlIHtcbiAgcHJpdmF0ZSBhdXRoU2VydmljZSA9IGluamVjdChBdXRoU2VydmljZSk7XG4gIHByaXZhdGUgc3RhdGljIHBlcm1pc3Npb25GbjogKHJlc291cmNlOiBSZXNvdXJjZSwgcGVybWlzc2lvbjogUGVybWlzc2lvbikgPT4gYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBBdXRoU3RhdGUuaW5pdGlhbGl6ZVBlcm1pc3Npb25GbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGlhbGl6ZVBlcm1pc3Npb25GbigpOiB2b2lkIHtcbiAgICBpZiAoIUF1dGhTdGF0ZS5wZXJtaXNzaW9uRm4pIHtcbiAgICAgIEF1dGhTdGF0ZS5wZXJtaXNzaW9uRm4gPSBpbmplY3QoUEVSTUlTU0lPTl9SRVFVSVJFRCk7XG4gICAgfVxuICB9XG5cbiAgQFNlbGVjdG9yKClcbiAgc3RhdGljIGhhc1Blcm1pc3Npb24oc3RhdGU6IEF1dGhTdGF0ZU1vZGVsKTogKHNjb3BlPzogUGVybWlzc2lvblNjb3BlKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gKHNjb3BlPzogUGVybWlzc2lvblNjb3BlKSA9PiB7XG4gICAgICBpZiAoIXNjb3BlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc291cmNlUGVybWlzc2lvbnMgPSBzdGF0ZT8uc2Vzc2lvbkluZm8/LnBlcm1pc3Npb25zPy5bc2NvcGUuZG9tYWluXT8uW3Njb3BlLnJlc291cmNlXTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlc291cmNlUGVybWlzc2lvbnMpICYmIHJlc291cmNlUGVybWlzc2lvbnMuaW5jbHVkZXMoc2NvcGUucGVybWlzc2lvbik7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyByZXF1aXJlc1Blcm1pc3Npb24ocmVzb3VyY2U6IFJlc291cmNlLCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFBdXRoU3RhdGUucGVybWlzc2lvbkZuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBdXRoU3RhdGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBFbnN1cmUgQXV0aFN0YXRlIGlzIHByb3ZpZGVkIGluIHlvdXIgbW9kdWxlIG9yIGluc3RhbnRpYXRlZCBhdCBsZWFzdCBvbmNlLmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gQXV0aFN0YXRlLnBlcm1pc3Npb25GbihyZXNvdXJjZSwgcGVybWlzc2lvbik7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgaXNBdXRoZW50aWNhdGVkKHN0YXRlOiBBdXRoU3RhdGVNb2RlbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0ZT8uYXV0aGVudGljYXRlZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyByZWRpcmVjdFVybChzdGF0ZTogQXV0aFN0YXRlTW9kZWwpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdGF0ZT8ucmVkaXJlY3RVcmw7XG4gIH1cblxuICBAQWN0aW9uKFtBcHBBY3Rpb24uQ2hlY2tVc2VyU2Vzc2lvbiwgQXV0aGVudGljYXRpb25HdWFyZEFjdGlvbi5DaGVja1VzZXJTZXNzaW9uXSlcbiAgY2hlY2tVc2VyU2Vzc2lvbihjdHg6IFN0YXRlQ29udGV4dDxBdXRoU3RhdGVNb2RlbD4pOiBPYnNlcnZhYmxlPFNlc3Npb25JbmZvIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmNoZWNrVXNlclNlc3Npb24oKS5waXBlKFxuICAgICAgdGFwKChyZXN1bHQpID0+XG4gICAgICAgIGN0eC5zZXRTdGF0ZShcbiAgICAgICAgICBwYXRjaCh7XG4gICAgICAgICAgICBhdXRoZW50aWNhdGVkOiAhIXJlc3VsdD8uYXV0aGVudGljYXRlZCxcbiAgICAgICAgICAgIHNlc3Npb25JbmZvOiByZXN1bHQsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBAQWN0aW9uKFtMb2dpbkFjdGlvbi5Mb2dvdXRdKVxuICBsb2dvdXQoY3R4OiBTdGF0ZUNvbnRleHQ8QXV0aFN0YXRlTW9kZWw+KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9jYWxTdGF0ZUNvcHkgPSBjbG9uZURlZXAoaW5pdFN0YXRlKTtcbiAgICBsb2NhbFN0YXRlQ29weS5yZWRpcmVjdFVybCA9IGN0eC5nZXRTdGF0ZSgpLnJlZGlyZWN0VXJsO1xuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmxvZ291dCgpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBjdHguc2V0U3RhdGUobG9jYWxTdGF0ZUNvcHkpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIEBBY3Rpb24oW1xuICAgIEFwcEFjdGlvbi5TZXRSZWRpcmVjdFVybCxcbiAgICBMb2dpbkFjdGlvbi5TZXRSZWRpcmVjdFVybCxcbiAgICBBdXRoZW50aWNhdGlvbkd1YXJkQWN0aW9uLlNldFJlZGlyZWN0VXJsLFxuICAgIEFwaUludGVyY2VwdG9yQWN0aW9uLlNldFJlZGlyZWN0VXJsLFxuICBdKVxuICBzZXRSZWRpcmVjdFVybChjdHg6IFN0YXRlQ29udGV4dDxBdXRoU3RhdGVNb2RlbD4sIGFjdGlvbjogeyByZWRpcmVjdFVybDogc3RyaW5nIH0pOiBBdXRoU3RhdGVNb2RlbCB7XG4gICAgY3R4LnNldFN0YXRlKFxuICAgICAgcGF0Y2goe1xuICAgICAgICByZWRpcmVjdFVybDogYWN0aW9uLnJlZGlyZWN0VXJsLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gY3R4LmdldFN0YXRlKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const BASE_URL = new InjectionToken('BASE_URL');
3
+ export const API_URL = new InjectionToken('API_URL');
4
+ export const PERMISSION_REQUIRED = new InjectionToken('PERMISSION_REQUIRED');
5
+ export const AVAILABLE_PERMISSIONS = new InjectionToken('AVAILABLE_PERMISSIONS');
6
+ export const AVAILABLE_DOMAINS = new InjectionToken('AVAILABLE_DOMAINS');
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL3R5cGVzL2Jhc2UvdG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFTLFVBQVUsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBUyxTQUFTLENBQUMsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FDbkQscUJBQXFCLENBQ3RCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsQ0FNcEQsdUJBQXVCLENBQUMsQ0FBQztBQUM1QixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FBMkIsbUJBQW1CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21haW4sIFBlcm1pc3Npb24sIFJlc291cmNlIH0gZnJvbSAnLi4vcGVybWlzc2lvbnMnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQkFTRV9VUkwnKTtcbmV4cG9ydCBjb25zdCBBUElfVVJMID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ0FQSV9VUkwnKTtcbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX1JFUVVJUkVEID0gbmV3IEluamVjdGlvblRva2VuPChyZXNvdXJjZTogUmVzb3VyY2UsIHBlcm1pc3Npb246IFBlcm1pc3Npb24pID0+IGJvb2xlYW4+KFxuICAnUEVSTUlTU0lPTl9SRVFVSVJFRCcsXG4pO1xuXG5leHBvcnQgY29uc3QgQVZBSUxBQkxFX1BFUk1JU1NJT05TID0gbmV3IEluamVjdGlvblRva2VuPHtcbiAgQ3JlYXRlOiBQZXJtaXNzaW9uO1xuICBEZWxldGU6IFBlcm1pc3Npb247XG4gIExpc3Q6IFBlcm1pc3Npb247XG4gIFJlYWQ6IFBlcm1pc3Npb247XG4gIFVwZGF0ZTogUGVybWlzc2lvbjtcbn0+KCdBVkFJTEFCTEVfUEVSTUlTU0lPTlMnKTtcbmV4cG9ydCBjb25zdCBBVkFJTEFCTEVfRE9NQUlOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxSZWNvcmQ8c3RyaW5nLCBEb21haW4+W10+KCdBVkFJTEFCTEVfRE9NQUlOUycpO1xuIl19
@@ -0,0 +1,7 @@
1
+ export var AlertLevel;
2
+ (function (AlertLevel) {
3
+ AlertLevel["ERROR"] = "warn";
4
+ AlertLevel["INFO"] = "accent";
5
+ AlertLevel["SUCCESS"] = "success";
6
+ })(AlertLevel || (AlertLevel = {}));
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLW1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2MtbGliL3NyYy9saWIvdHlwZXMvbm90aWZpY2F0aW9uLW1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksVUFJWDtBQUpELFdBQVksVUFBVTtJQUNwQiw0QkFBYyxDQUFBO0lBQ2QsNkJBQWUsQ0FBQTtJQUNmLGlDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFKVyxVQUFVLEtBQVYsVUFBVSxRQUlyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEFsZXJ0TGV2ZWwge1xuICBFUlJPUiA9ICd3YXJuJyxcbiAgSU5GTyA9ICdhY2NlbnQnLFxuICBTVUNDRVNTID0gJ3N1Y2Nlc3MnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2Uge1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBsaW5rOiBzdHJpbmc7XG4gIGxldmVsOiBBbGVydExldmVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbk1lc3NhZ2Uge1xuICBpZDogbnVtYmVyO1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBsaW5rOiBzdHJpbmc7XG4gIGxldmVsOiBBbGVydExldmVsO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export const ReadPermission = 'Read';
2
+ export const UpdatePermission = 'Update';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2MtbGliL3NyYy9saWIvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQW9CLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgQnJhbmQ8SywgVD4gPSBLICYgeyBfX2JyYW5kOiBUIH07XG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSBCcmFuZDxzdHJpbmcsICdQZXJtaXNzaW9uJz47XG5leHBvcnQgdHlwZSBSZXNvdXJjZSA9IEJyYW5kPHN0cmluZywgJ1Jlc291cmNlJz47XG5leHBvcnQgdHlwZSBEb21haW4gPSBCcmFuZDxzdHJpbmcsICdEb21haW4nPjtcbmV4cG9ydCB0eXBlIERvbWFpblBlcm1pc3Npb25zID0gUmVjb3JkPERvbWFpbiwgUmVjb3JkPFJlc291cmNlLCBSZWNvcmQ8UGVybWlzc2lvbiwgUGVybWlzc2lvbnM+Pj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvblNjb3BlIHtcbiAgcmVzb3VyY2U6IFJlc291cmNlO1xuICBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uO1xuICBkb21haW46IERvbWFpbjtcbn1cblxuZXhwb3J0IGNvbnN0IFJlYWRQZXJtaXNzaW9uID0gJ1JlYWQnIGFzIFBlcm1pc3Npb247XG5leHBvcnQgY29uc3QgVXBkYXRlUGVybWlzc2lvbiA9ICdVcGRhdGUnIGFzIFBlcm1pc3Npb247XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1pbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL3R5cGVzL3Nlc3Npb24taW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRG9tYWluUGVybWlzc2lvbnMgfSBmcm9tICcuL3Blcm1pc3Npb25zJztcblxuLyoqXG4gKiBTZXNzaW9uIEluZm9ybWF0aW9uIGZvciBhIGxvZ2dlZCBpbiB1c2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkluZm8ge1xuICBhdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICB1c2VybmFtZTogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogRG9tYWluUGVybWlzc2lvbnM7XG59XG4iXX0=