@lenne.tech/ng-base 13.17.0 → 13.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/base-cms/base-cms.module.d.ts +6 -6
  2. package/base-cms/interfaces/base-cms-module-config.interface.d.ts +6 -6
  3. package/base-cms/pages/base-cms/base-cms.component.d.ts +0 -7
  4. package/base-components/base-components.module.d.ts +6 -3
  5. package/base-components/components/model-form/model-form.component.d.ts +13 -2
  6. package/base-components/components/model-form-sub/model-form-sub.component.d.ts +26 -0
  7. package/base-components/components/model-table/model-table.component.d.ts +4 -3
  8. package/base-components/components/refence-input/refence-input.component.d.ts +23 -0
  9. package/base-components/components/upload-image/upload-image.component.d.ts +70 -0
  10. package/base-components/public-api.d.ts +3 -0
  11. package/base-prototype/base-prototype.module.d.ts +7 -6
  12. package/base-prototype/pages/profile/profile.component.d.ts +34 -0
  13. package/base-prototype/public-api.d.ts +1 -0
  14. package/esm2020/base-cms/base-cms.module.mjs +3 -4
  15. package/esm2020/base-cms/interfaces/base-cms-module-config.interface.mjs +1 -1
  16. package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +10 -24
  17. package/esm2020/base-components/base-components.module.mjs +15 -3
  18. package/esm2020/base-components/components/model-form/model-form.component.mjs +47 -12
  19. package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +48 -0
  20. package/esm2020/base-components/components/model-table/model-table.component.mjs +14 -10
  21. package/esm2020/base-components/components/refence-input/refence-input.component.mjs +61 -0
  22. package/esm2020/base-components/components/upload-image/upload-image.component.mjs +138 -0
  23. package/esm2020/base-components/public-api.mjs +4 -1
  24. package/esm2020/base-prototype/base-prototype.module.mjs +8 -4
  25. package/esm2020/base-prototype/pages/profile/profile.component.mjs +45 -0
  26. package/esm2020/base-prototype/public-api.mjs +2 -1
  27. package/esm2020/shared/classes/graphql-meta.class.mjs +14 -2
  28. package/esm2020/shared/classes/sort.class.mjs +47 -0
  29. package/esm2020/shared/directives/sort.directive.mjs +54 -0
  30. package/esm2020/shared/public-api.mjs +4 -1
  31. package/esm2020/shared/services/graphql.service.mjs +2 -2
  32. package/esm2020/shared/services/user.service.mjs +2 -1
  33. package/fesm2015/lenne.tech-ng-base-base-cms.mjs +16 -30
  34. package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +1 -1
  35. package/fesm2015/lenne.tech-ng-base-base-components.mjs +304 -21
  36. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -1
  37. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +49 -5
  38. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  39. package/fesm2015/lenne.tech-ng-base-shared.mjs +118 -4
  40. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +1 -1
  41. package/fesm2020/lenne.tech-ng-base-base-cms.mjs +11 -26
  42. package/fesm2020/lenne.tech-ng-base-base-cms.mjs.map +1 -1
  43. package/fesm2020/lenne.tech-ng-base-base-components.mjs +298 -18
  44. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -1
  45. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs +49 -5
  46. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  47. package/fesm2020/lenne.tech-ng-base-shared.mjs +115 -4
  48. package/fesm2020/lenne.tech-ng-base-shared.mjs.map +1 -1
  49. package/package.json +1 -1
  50. package/shared/classes/sort.class.d.ts +19 -0
  51. package/shared/directives/sort.directive.d.ts +14 -0
  52. package/shared/public-api.d.ts +2 -0
@@ -6,12 +6,12 @@ import * as i3 from "@angular/forms";
6
6
  import * as i4 from "./base-cms-routing.module";
7
7
  import * as i5 from "@lenne.tech/ng-base/base-components";
8
8
  export declare function CMSConfigFactory(): {
9
- tableFields: string[];
10
- excludedModels: string[];
11
- restrictedModels: {
12
- model: string;
13
- roles: string[];
14
- }[];
9
+ modelConfig: {
10
+ [key: string]: any;
11
+ };
12
+ fieldConfig: {
13
+ [key: string]: any;
14
+ };
15
15
  logging: boolean;
16
16
  branding: boolean;
17
17
  };
@@ -1,11 +1,11 @@
1
1
  import { InjectionToken } from '@angular/core';
2
2
  export interface BaseCMSModuleConfig {
3
- tableFields?: string[];
4
- excludedModels?: string[];
5
- restrictedModels?: {
6
- model: string;
7
- roles: string[];
8
- }[];
3
+ modelConfig?: {
4
+ [key: string]: any;
5
+ };
6
+ fieldConfig?: {
7
+ [key: string]: any;
8
+ };
9
9
  logging?: boolean;
10
10
  branding?: boolean;
11
11
  }
@@ -21,13 +21,6 @@ export declare class BaseCmsComponent implements OnInit {
21
21
  * @returns The types that are available to the user.
22
22
  */
23
23
  init(): Promise<GraphqlCrudType[]>;
24
- /**
25
- * It checks if the model is excluded or restricted
26
- *
27
- * @param model - The name of the model you want to check.
28
- * @returns A boolean value.
29
- */
30
- checkModelIsExcludedOrRestrcited(model: string): boolean;
31
24
  /**
32
25
  * If the model name is set and the types are set, then return the type that matches the model name
33
26
  *
@@ -10,10 +10,13 @@ import * as i8 from "./components/skeleton-loader/skeleton-loader.component";
10
10
  import * as i9 from "./components/breadcrumb/breadcrumb.component";
11
11
  import * as i10 from "./components/model-form/model-form.component";
12
12
  import * as i11 from "./components/model-table/model-table.component";
13
- import * as i12 from "@angular/forms";
14
- import * as i13 from "@angular/common";
13
+ import * as i12 from "./components/model-form-sub/model-form-sub.component";
14
+ import * as i13 from "./components/upload-image/upload-image.component";
15
+ import * as i14 from "./components/refence-input/refence-input.component";
16
+ import * as i15 from "@angular/forms";
17
+ import * as i16 from "@angular/common";
15
18
  export declare class BaseComponentsModule {
16
19
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseComponentsModule, never>;
17
- static ɵmod: i0.ɵɵNgModuleDeclaration<BaseComponentsModule, [typeof i1.InputComponent, typeof i2.SelectComponent, typeof i3.CheckboxComponent, typeof i4.TextareaComponent, typeof i5.ToastComponent, typeof i6.TagsComponent, typeof i7.LoadingBarComponent, typeof i8.SkeletonLoaderComponent, typeof i9.BreadcrumbComponent, typeof i10.ModelFormComponent, typeof i11.ModelTableComponent], [typeof i12.FormsModule, typeof i12.ReactiveFormsModule, typeof i13.CommonModule], [typeof i1.InputComponent, typeof i2.SelectComponent, typeof i3.CheckboxComponent, typeof i4.TextareaComponent, typeof i5.ToastComponent, typeof i6.TagsComponent, typeof i7.LoadingBarComponent, typeof i8.SkeletonLoaderComponent, typeof i9.BreadcrumbComponent, typeof i10.ModelFormComponent, typeof i11.ModelTableComponent]>;
20
+ static ɵmod: i0.ɵɵNgModuleDeclaration<BaseComponentsModule, [typeof i1.InputComponent, typeof i2.SelectComponent, typeof i3.CheckboxComponent, typeof i4.TextareaComponent, typeof i5.ToastComponent, typeof i6.TagsComponent, typeof i7.LoadingBarComponent, typeof i8.SkeletonLoaderComponent, typeof i9.BreadcrumbComponent, typeof i10.ModelFormComponent, typeof i11.ModelTableComponent, typeof i12.ModelFormSubComponent, typeof i13.UploadImageComponent, typeof i14.RefenceInputComponent], [typeof i15.FormsModule, typeof i15.ReactiveFormsModule, typeof i16.CommonModule], [typeof i1.InputComponent, typeof i2.SelectComponent, typeof i3.CheckboxComponent, typeof i4.TextareaComponent, typeof i5.ToastComponent, typeof i6.TagsComponent, typeof i7.LoadingBarComponent, typeof i8.SkeletonLoaderComponent, typeof i9.BreadcrumbComponent, typeof i10.ModelFormComponent, typeof i11.ModelTableComponent, typeof i12.ModelFormSubComponent, typeof i13.UploadImageComponent, typeof i14.RefenceInputComponent]>;
18
21
  static ɵinj: i0.ɵɵInjectorDeclaration<BaseComponentsModule>;
19
22
  }
@@ -8,9 +8,11 @@ export declare class ModelFormComponent implements OnInit, OnChanges {
8
8
  private graphQLService;
9
9
  private formsService;
10
10
  modelName: string;
11
+ label: string;
11
12
  id: string | null;
12
13
  delete: boolean;
13
14
  logging: boolean;
15
+ config: any;
14
16
  finished: EventEmitter<any>;
15
17
  meta: GraphQLMeta;
16
18
  form: FormGroup;
@@ -26,18 +28,27 @@ export declare class ModelFormComponent implements OnInit, OnChanges {
26
28
  * data, create the form, and if the value is present, patch the form with the value
27
29
  */
28
30
  init(): void;
31
+ getKeysFromSubObject(key: string): string[];
29
32
  /**
30
33
  * It takes an id, and then calls the graphQLService to get the object from the database
31
34
  *
32
35
  * @param id - The id of the object to be loaded
33
36
  */
34
37
  getObjectById(id: string): void;
38
+ /**
39
+ * It takes a GraphQL type collection and returns an array of strings and objects
40
+ *
41
+ * @param fields - IGraphQLTypeCollection - This is the object that is returned from the
42
+ * introspection query.
43
+ * @returns An array of strings and objects.
44
+ */
45
+ createRequestObject(fields: IGraphQLTypeCollection): any;
35
46
  /**
36
47
  * It takes a collection of GraphQL types and creates a form group with a form control for each type
37
48
  *
38
49
  * @param fields - IGraphQLTypeCollection
39
50
  */
40
- createForm(fields: IGraphQLTypeCollection): void;
51
+ createForm(fields: IGraphQLTypeCollection): FormGroup;
41
52
  /**
42
53
  * It calls the graphQLService to delete the object with the id of the object that is currently being edited
43
54
  */
@@ -63,5 +74,5 @@ export declare class ModelFormComponent implements OnInit, OnChanges {
63
74
  */
64
75
  submit(): void;
65
76
  static ɵfac: i0.ɵɵFactoryDeclaration<ModelFormComponent, never>;
66
- static ɵcmp: i0.ɵɵComponentDeclaration<ModelFormComponent, "base-model-form", never, { "modelName": "modelName"; "id": "id"; "delete": "delete"; "logging": "logging"; }, { "finished": "finished"; }, never, never>;
77
+ static ɵcmp: i0.ɵɵComponentDeclaration<ModelFormComponent, "base-model-form", never, { "modelName": "modelName"; "label": "label"; "id": "id"; "delete": "delete"; "logging": "logging"; "config": "config"; }, { "finished": "finished"; }, never, never>;
67
78
  }
@@ -0,0 +1,26 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { AbstractControl, FormControl } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ModelFormSubComponent implements OnInit {
5
+ fields: any;
6
+ form: any;
7
+ config: any;
8
+ keys: string[];
9
+ ngOnInit(): void;
10
+ /**
11
+ * It takes a string, capitalizes the first letter, and returns the new string
12
+ *
13
+ * @param value - The string that you want to capitalize the first letter of.
14
+ * @returns The first letter of the string is being capitalized and the rest of the string is being returned.
15
+ */
16
+ capitalizeFirstLetter(value: string): string;
17
+ /**
18
+ * It takes an AbstractControl and returns a FormControl
19
+ *
20
+ * @param control - AbstractControl | null | undefined
21
+ * @returns A FormControl
22
+ */
23
+ transformToControl(control: AbstractControl | null | undefined): FormControl;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<ModelFormSubComponent, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<ModelFormSubComponent, "base-model-form-sub", never, { "fields": "fields"; "form": "form"; "config": "config"; }, {}, never, never>;
26
+ }
@@ -10,10 +10,11 @@ export declare class ModelTableComponent implements OnInit, OnChanges {
10
10
  create: boolean;
11
11
  update: boolean;
12
12
  delete: boolean;
13
- logging: boolean;
14
- tableFields: string[];
13
+ config: any;
14
+ fieldConfig: any;
15
15
  idSelected: EventEmitter<string>;
16
16
  createModeChanged: EventEmitter<boolean>;
17
+ tableFields: string[];
17
18
  meta: GraphQLMeta;
18
19
  objects: any[];
19
20
  availableFields: string[];
@@ -52,5 +53,5 @@ export declare class ModelTableComponent implements OnInit, OnChanges {
52
53
  */
53
54
  capitalizeFirstLetter(value: string): string;
54
55
  static ɵfac: i0.ɵɵFactoryDeclaration<ModelTableComponent, never>;
55
- static ɵcmp: i0.ɵɵComponentDeclaration<ModelTableComponent, "base-model-table", never, { "modelName": "modelName"; "objectId": "objectId"; "createMode": "createMode"; "create": "create"; "update": "update"; "delete": "delete"; "logging": "logging"; "tableFields": "tableFields"; }, { "idSelected": "idSelected"; "createModeChanged": "createModeChanged"; }, never, never>;
56
+ static ɵcmp: i0.ɵɵComponentDeclaration<ModelTableComponent, "base-model-table", never, { "modelName": "modelName"; "objectId": "objectId"; "createMode": "createMode"; "create": "create"; "update": "update"; "delete": "delete"; "config": "config"; "fieldConfig": "fieldConfig"; }, { "idSelected": "idSelected"; "createModeChanged": "createModeChanged"; }, never, never>;
56
57
  }
@@ -0,0 +1,23 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { GraphQLService } from '@lenne.tech/ng-base/shared';
3
+ import * as i0 from "@angular/core";
4
+ export declare class RefenceInputComponent implements OnInit {
5
+ private graphQLService;
6
+ id: string;
7
+ name: string;
8
+ label?: string;
9
+ placeholder?: string;
10
+ autocomplete?: string;
11
+ tabIndex?: number;
12
+ control: any;
13
+ required: boolean;
14
+ method: string;
15
+ fields: string[];
16
+ valueField: string;
17
+ nameField: string;
18
+ objects: any[];
19
+ constructor(graphQLService: GraphQLService);
20
+ ngOnInit(): void;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<RefenceInputComponent, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<RefenceInputComponent, "base-refence-input", never, { "id": "id"; "name": "name"; "label": "label"; "placeholder": "placeholder"; "autocomplete": "autocomplete"; "tabIndex": "tabIndex"; "control": "control"; "required": "required"; "method": "method"; "fields": "fields"; "valueField": "valueField"; "nameField": "nameField"; }, {}, never, never>;
23
+ }
@@ -0,0 +1,70 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import * as i0 from "@angular/core";
3
+ export declare class UploadImageComponent {
4
+ private httpClient;
5
+ id: string;
6
+ name: string;
7
+ label?: string;
8
+ supportText: string;
9
+ required: boolean;
10
+ dragText: string;
11
+ validExtensions: string[];
12
+ control: any;
13
+ url: string;
14
+ uploadPath: string;
15
+ deletePath: string;
16
+ path: string;
17
+ dragActive: boolean;
18
+ selectedFile: File;
19
+ fileUrl: string;
20
+ constructor(httpClient: HttpClient);
21
+ /**
22
+ * The dragOver function is called when the user drags a file over the dropzone. It prevents the default action of the
23
+ * event, and sets the dragText to 'Release to Upload' and the dragActive to true
24
+ *
25
+ * @param event - any - This is the event that is triggered when the user drags a file over the dropzone.
26
+ */
27
+ dragOver(event: any): void;
28
+ /**
29
+ * When the user drags a file over the drop zone, the dragActive variable is set to true, which will change the color of
30
+ * the drop zone to green
31
+ *
32
+ * @param event - The event object that is passed to the dragLeave event.
33
+ */
34
+ dragLeave(event: any): void;
35
+ /**
36
+ * The function takes an event as a parameter, prevents the default action of the event, sets the URL of the image to the
37
+ * file that was dragged and dropped, sets the text of the drag and drop area to the default text, and sets the
38
+ * dragActive variable to false
39
+ *
40
+ * @param event - any - This is the event that is triggered when the user drags and drops a file.
41
+ */
42
+ drop(event: any): void;
43
+ /**
44
+ * It takes a file as an argument, checks if the file type is valid, and if it is, it creates a new FileReader object,
45
+ * sets the onload function to set the fileUrl to the result of the fileReader, sets the selectedFile to the file, and
46
+ * calls the upload function
47
+ *
48
+ * @param file - any - this is the file that is selected by the user.
49
+ */
50
+ setUrl(file: any): void;
51
+ /**
52
+ * The function takes an event as an argument, and then sets the url of the file to the first file in the event's
53
+ * target's files array
54
+ *
55
+ * @param event - any - The event that is triggered when the user selects a file.
56
+ */
57
+ selectFile(event: any): void;
58
+ /**
59
+ * We create a new FormData object, append the selected file to it, and then send it to the server
60
+ */
61
+ upload(): void;
62
+ /**
63
+ * It deletes the file from the server and sets the selectedFile and fileUrl to null
64
+ *
65
+ * @param [id] - The id of the file to delete.
66
+ */
67
+ deleteFile(id?: string): void;
68
+ static ɵfac: i0.ɵɵFactoryDeclaration<UploadImageComponent, never>;
69
+ static ɵcmp: i0.ɵɵComponentDeclaration<UploadImageComponent, "base-upload-image", never, { "id": "id"; "name": "name"; "label": "label"; "supportText": "supportText"; "required": "required"; "dragText": "dragText"; "validExtensions": "validExtensions"; "control": "control"; "url": "url"; "uploadPath": "uploadPath"; "deletePath": "deletePath"; "path": "path"; }, {}, never, never>;
70
+ }
@@ -13,3 +13,6 @@ export * from './components/skeleton-loader/skeleton-loader.component';
13
13
  export * from './components/breadcrumb/breadcrumb.component';
14
14
  export * from './components/model-form/model-form.component';
15
15
  export * from './components/model-table/model-table.component';
16
+ export * from './components/model-form-sub/model-form-sub.component';
17
+ export * from './components/upload-image/upload-image.component';
18
+ export * from './components/refence-input/refence-input.component';
@@ -2,13 +2,14 @@ import * as i0 from "@angular/core";
2
2
  import * as i1 from "./pages/login/login.component";
3
3
  import * as i2 from "./pages/register/register.component";
4
4
  import * as i3 from "./pages/forgot-password/forgot-password.component";
5
- import * as i4 from "@lenne.tech/ng-base";
6
- import * as i5 from "@angular/forms";
7
- import * as i6 from "@angular/router";
8
- import * as i7 from "@angular/common";
9
- import * as i8 from "@lenne.tech/ng-base/base-components";
5
+ import * as i4 from "./pages/profile/profile.component";
6
+ import * as i5 from "@lenne.tech/ng-base";
7
+ import * as i6 from "@angular/forms";
8
+ import * as i7 from "@angular/router";
9
+ import * as i8 from "@angular/common";
10
+ import * as i9 from "@lenne.tech/ng-base/base-components";
10
11
  export declare class BasePrototypeModule {
11
12
  static ɵfac: i0.ɵɵFactoryDeclaration<BasePrototypeModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<BasePrototypeModule, [typeof i1.LoginComponent, typeof i2.RegisterComponent, typeof i3.ForgotPasswordComponent], [typeof i4.BaseModule, typeof i5.FormsModule, typeof i6.RouterModule, typeof i5.ReactiveFormsModule, typeof i7.CommonModule, typeof i8.BaseComponentsModule], [typeof i1.LoginComponent, typeof i2.RegisterComponent, typeof i3.ForgotPasswordComponent]>;
13
+ static ɵmod: i0.ɵɵNgModuleDeclaration<BasePrototypeModule, [typeof i1.LoginComponent, typeof i2.RegisterComponent, typeof i3.ForgotPasswordComponent, typeof i4.ProfileComponent], [typeof i5.BaseModule, typeof i6.FormsModule, typeof i7.RouterModule, typeof i6.ReactiveFormsModule, typeof i8.CommonModule, typeof i9.BaseComponentsModule], [typeof i1.LoginComponent, typeof i2.RegisterComponent, typeof i3.ForgotPasswordComponent, typeof i4.ProfileComponent]>;
13
14
  static ɵinj: i0.ɵɵInjectorDeclaration<BasePrototypeModule>;
14
15
  }
@@ -0,0 +1,34 @@
1
+ import { AuthService, BasicUser } from '@lenne.tech/ng-base/shared';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ProfileComponent {
4
+ private authService;
5
+ config: any;
6
+ profileConfig: {
7
+ email: {
8
+ label: string;
9
+ placeholder: string;
10
+ };
11
+ firstName: {
12
+ label: string;
13
+ placeholder: string;
14
+ };
15
+ lastName: {
16
+ label: string;
17
+ placeholder: string;
18
+ };
19
+ roles: {
20
+ exclude: boolean;
21
+ };
22
+ username: {
23
+ label: string;
24
+ placeholder: string;
25
+ };
26
+ password: {
27
+ exclude: boolean;
28
+ };
29
+ };
30
+ currentUser: BasicUser;
31
+ constructor(authService: AuthService);
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<ProfileComponent, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<ProfileComponent, "base-profile", never, { "config": "config"; }, {}, never, never>;
34
+ }
@@ -5,3 +5,4 @@ export * from './base-prototype.module';
5
5
  export * from './pages/login/login.component';
6
6
  export * from './pages/register/register.component';
7
7
  export * from './pages/forgot-password/forgot-password.component';
8
+ export * from './pages/profile/profile.component';
@@ -8,9 +8,8 @@ import { BASE_CMS_MODULE_CONFIG } from './interfaces/base-cms-module-config.inte
8
8
  import * as i0 from "@angular/core";
9
9
  export function CMSConfigFactory() {
10
10
  return {
11
- tableFields: ['id', 'name', 'title', 'description', 'email', 'createdAt', 'updatedAt'],
12
- excludedModels: [],
13
- restrictedModels: [],
11
+ modelConfig: {},
12
+ fieldConfig: {},
14
13
  branding: true,
15
14
  logging: false,
16
15
  ...BaseCMSModule.config,
@@ -57,4 +56,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
57
56
  ],
58
57
  }]
59
58
  }] });
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNtcy9iYXNlLWNtcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLCtDQUErQyxDQUFDOztBQUU1RyxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU87UUFDTCxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUM7UUFDdEYsY0FBYyxFQUFFLEVBQUU7UUFDbEIsZ0JBQWdCLEVBQUUsRUFBRTtRQUNwQixRQUFRLEVBQUUsSUFBSTtRQUNkLE9BQU8sRUFBRSxLQUFLO1FBQ2QsR0FBRyxhQUFhLENBQUMsTUFBTTtLQUN4QixDQUFDO0FBQ0osQ0FBQztBQW1CRCxNQUFNLE9BQU8sYUFBYTs7MEdBQWIsYUFBYTsyR0FBYixhQUFhLGlCQVRULGdCQUFnQjtRQU43QixVQUFVO1FBQ1YsWUFBWTtRQUNaLG1CQUFtQjtRQUNuQixvQkFBb0I7UUFDcEIsb0JBQW9COzJHQVdYLGFBQWEsYUFQYjtRQUNUO1lBQ0UsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixVQUFVLEVBQUUsZ0JBQWdCO1NBQzdCO0tBQ0YsWUFkUTtZQUNQLFVBQVU7WUFDVixZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLG9CQUFvQjtZQUNwQixvQkFBb0I7U0FDckI7MkZBVVUsYUFBYTtrQkFqQnpCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3FCQUNyQjtvQkFDRCxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDaEMsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxzQkFBc0I7NEJBQy9CLFVBQVUsRUFBRSxnQkFBZ0I7eUJBQzdCO3FCQUNGO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmFzZUNtc0NvbXBvbmVudCB9IGZyb20gJy4vcGFnZXMvYmFzZS1jbXMvYmFzZS1jbXMuY29tcG9uZW50JztcbmltcG9ydCB7IEJhc2VDTVNSb3V0aW5nTW9kdWxlIH0gZnJvbSAnLi9iYXNlLWNtcy1yb3V0aW5nLm1vZHVsZSc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50c01vZHVsZSB9IGZyb20gJ0BsZW5uZS50ZWNoL25nLWJhc2UvYmFzZS1jb21wb25lbnRzJztcbmltcG9ydCB7IEJBU0VfQ01TX01PRFVMRV9DT05GSUcsIEJhc2VDTVNNb2R1bGVDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvYmFzZS1jbXMtbW9kdWxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gQ01TQ29uZmlnRmFjdG9yeSgpIHtcbiAgcmV0dXJuIHtcbiAgICB0YWJsZUZpZWxkczogWydpZCcsICduYW1lJywgJ3RpdGxlJywgJ2Rlc2NyaXB0aW9uJywgJ2VtYWlsJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXSxcbiAgICBleGNsdWRlZE1vZGVsczogW10sXG4gICAgcmVzdHJpY3RlZE1vZGVsczogW10sXG4gICAgYnJhbmRpbmc6IHRydWUsXG4gICAgbG9nZ2luZzogZmFsc2UsXG4gICAgLi4uQmFzZUNNU01vZHVsZS5jb25maWcsXG4gIH07XG59XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICAvLyBNb2R1bGVzXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgQmFzZUNNU1JvdXRpbmdNb2R1bGUsXG4gICAgQmFzZUNvbXBvbmVudHNNb2R1bGUsXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW0Jhc2VDbXNDb21wb25lbnRdLFxuICBleHBvcnRzOiBbXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQkFTRV9DTVNfTU9EVUxFX0NPTkZJRyxcbiAgICAgIHVzZUZhY3Rvcnk6IENNU0NvbmZpZ0ZhY3RvcnksXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQmFzZUNNU01vZHVsZSB7XG4gIHN0YXRpYyBjb25maWc6IEJhc2VDTVNNb2R1bGVDb25maWc7XG59XG4iXX0=
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNtcy9iYXNlLWNtcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLCtDQUErQyxDQUFDOztBQUU1RyxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU87UUFDTCxXQUFXLEVBQUUsRUFBRTtRQUNmLFdBQVcsRUFBRSxFQUFFO1FBQ2YsUUFBUSxFQUFFLElBQUk7UUFDZCxPQUFPLEVBQUUsS0FBSztRQUNkLEdBQUcsYUFBYSxDQUFDLE1BQU07S0FDeEIsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxPQUFPLGFBQWE7OzBHQUFiLGFBQWE7MkdBQWIsYUFBYSxpQkFUVCxnQkFBZ0I7UUFON0IsVUFBVTtRQUNWLFlBQVk7UUFDWixtQkFBbUI7UUFDbkIsb0JBQW9CO1FBQ3BCLG9CQUFvQjsyR0FXWCxhQUFhLGFBUGI7UUFDVDtZQUNFLE9BQU8sRUFBRSxzQkFBc0I7WUFDL0IsVUFBVSxFQUFFLGdCQUFnQjtTQUM3QjtLQUNGLFlBZFE7WUFDUCxVQUFVO1lBQ1YsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsb0JBQW9CO1NBQ3JCOzJGQVVVLGFBQWE7a0JBakJ6QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxVQUFVO3dCQUNWLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixvQkFBb0I7d0JBQ3BCLG9CQUFvQjtxQkFDckI7b0JBQ0QsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQ2hDLE9BQU8sRUFBRSxFQUFFO29CQUNYLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsc0JBQXNCOzRCQUMvQixVQUFVLEVBQUUsZ0JBQWdCO3lCQUM3QjtxQkFDRjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJhc2VDbXNDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL2Jhc2UtY21zL2Jhc2UtY21zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYXNlQ01TUm91dGluZ01vZHVsZSB9IGZyb20gJy4vYmFzZS1jbXMtcm91dGluZy5tb2R1bGUnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudHNNb2R1bGUgfSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBCQVNFX0NNU19NT0RVTEVfQ09ORklHLCBCYXNlQ01TTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Jhc2UtY21zLW1vZHVsZS1jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIENNU0NvbmZpZ0ZhY3RvcnkoKSB7XG4gIHJldHVybiB7XG4gICAgbW9kZWxDb25maWc6IHt9LFxuICAgIGZpZWxkQ29uZmlnOiB7fSxcbiAgICBicmFuZGluZzogdHJ1ZSxcbiAgICBsb2dnaW5nOiBmYWxzZSxcbiAgICAuLi5CYXNlQ01TTW9kdWxlLmNvbmZpZyxcbiAgfTtcbn1cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIC8vIE1vZHVsZXNcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBCYXNlQ01TUm91dGluZ01vZHVsZSxcbiAgICBCYXNlQ29tcG9uZW50c01vZHVsZSxcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbQmFzZUNtc0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBCQVNFX0NNU19NT0RVTEVfQ09ORklHLFxuICAgICAgdXNlRmFjdG9yeTogQ01TQ29uZmlnRmFjdG9yeSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBCYXNlQ01TTW9kdWxlIHtcbiAgc3RhdGljIGNvbmZpZzogQmFzZUNNU01vZHVsZUNvbmZpZztcbn1cbiJdfQ==
@@ -1,3 +1,3 @@
1
1
  import { InjectionToken } from '@angular/core';
2
2
  export const BASE_CMS_MODULE_CONFIG = new InjectionToken('BASE_CMS_MODULE_CONFIG');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMtbW9kdWxlLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY21zL2ludGVyZmFjZXMvYmFzZS1jbXMtbW9kdWxlLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVUvQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ01TTW9kdWxlQ29uZmlnIHtcbiAgdGFibGVGaWVsZHM/OiBzdHJpbmdbXTtcbiAgZXhjbHVkZWRNb2RlbHM/OiBzdHJpbmdbXTtcbiAgcmVzdHJpY3RlZE1vZGVscz86IHsgbW9kZWw6IHN0cmluZzsgcm9sZXM6IHN0cmluZ1tdIH1bXTtcbiAgbG9nZ2luZz86IGJvb2xlYW47XG4gIGJyYW5kaW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEJBU0VfQ01TX01PRFVMRV9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0JBU0VfQ01TX01PRFVMRV9DT05GSUcnKTtcbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMtbW9kdWxlLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY21zL2ludGVyZmFjZXMvYmFzZS1jbXMtbW9kdWxlLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVMvQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ01TTW9kdWxlQ29uZmlnIHtcbiAgbW9kZWxDb25maWc/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICBmaWVsZENvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIGxvZ2dpbmc/OiBib29sZWFuO1xuICBicmFuZGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBCQVNFX0NNU19NT0RVTEVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdCQVNFX0NNU19NT0RVTEVfQ09ORklHJyk7XG4iXX0=
@@ -16,7 +16,9 @@ export class BaseCmsComponent {
16
16
  this.types = [];
17
17
  this.route.params.subscribe((value) => {
18
18
  if (value['modelName']) {
19
- if (!this.checkModelIsExcludedOrRestrcited(value['modelName'])) {
19
+ const restricted = this.moduleConfig.modelConfig[value['modelName']]?.restricted;
20
+ const excluded = this.moduleConfig.modelConfig[value['modelName']]?.excluded;
21
+ if ((restricted !== null && !restricted) || (excluded !== null && !excluded)) {
20
22
  this.modelName = value['modelName'];
21
23
  }
22
24
  else {
@@ -48,20 +50,18 @@ export class BaseCmsComponent {
48
50
  if (this.route.snapshot?.params?.['id']) {
49
51
  this.id = this.route.snapshot?.params?.['id'];
50
52
  }
51
- const excludedModels = this.moduleConfig.excludedModels?.map((e) => e.toLowerCase());
52
53
  const types = meta.getTypes();
53
54
  // Check for excluded types
54
- const filteredTypes = types.filter((e) => !excludedModels?.includes(e.name.toLowerCase()));
55
+ const filteredTypes = types.filter((e) => !this.moduleConfig?.modelConfig[e.name.toLowerCase()]?.excluded);
55
56
  // Check for restricted types
56
57
  this.types = filteredTypes.filter((e) => {
57
- const foundRestrict = this.moduleConfig.restrictedModels?.find((v) => v.model.toLowerCase() === e.name.toLowerCase());
58
- if (foundRestrict) {
58
+ if (this.moduleConfig?.modelConfig[e.name.toLowerCase()]?.restricted) {
59
59
  if (!this.authService?.currentUser) {
60
60
  return false;
61
61
  }
62
62
  const user = this.authService?.currentUser;
63
63
  const mappedUser = BasicUser.map(user);
64
- return mappedUser?.hasAllRoles(foundRestrict.roles);
64
+ return mappedUser?.hasAllRoles(this.moduleConfig?.modelConfig[e.name.toLowerCase()]?.roles);
65
65
  }
66
66
  else {
67
67
  return true;
@@ -77,20 +77,6 @@ export class BaseCmsComponent {
77
77
  });
78
78
  });
79
79
  }
80
- /**
81
- * It checks if the model is excluded or restricted
82
- *
83
- * @param model - The name of the model you want to check.
84
- * @returns A boolean value.
85
- */
86
- checkModelIsExcludedOrRestrcited(model) {
87
- if (!model) {
88
- return false;
89
- }
90
- const excludedModels = this.moduleConfig.excludedModels?.map((e) => e.toLowerCase());
91
- return !!(excludedModels?.includes(model?.toLowerCase()) ||
92
- this.moduleConfig.restrictedModels?.find((e) => e.model.toLowerCase() === model.toLowerCase()));
93
- }
94
80
  /**
95
81
  * If the model name is set and the types are set, then return the type that matches the model name
96
82
  *
@@ -112,7 +98,7 @@ export class BaseCmsComponent {
112
98
  */
113
99
  onCreateModeChanged(createMode) {
114
100
  if (createMode) {
115
- this.router.navigate(['./' + 'new'], { relativeTo: this.route });
101
+ this.router.navigate(['./' + 'neu'], { relativeTo: this.route });
116
102
  }
117
103
  }
118
104
  /**
@@ -157,12 +143,12 @@ export class BaseCmsComponent {
157
143
  }
158
144
  }
159
145
  BaseCmsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: BaseCmsComponent, deps: [{ token: BASE_CMS_MODULE_CONFIG }, { token: i1.GraphQLMetaService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Component });
160
- BaseCmsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: BaseCmsComponent, selector: "app-base-cms", ngImport: i0, template: "<div class=\"main\">\n <div class=\"sidebar\">\n <div class=\"d-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a href=\"/\" class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\">\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + type?.name?.toLowerCase()\"\n [ngClass]=\"{ active: type?.name?.toLowerCase() === this.modelName?.toLowerCase() }\"\n >\n {{ type.name + 's' }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\">\n <div class=\"p-5\">\n <base-model-table\n [tableFields]=\"moduleConfig?.tableFields ?? ['name']\"\n [modelName]=\"modelName\"\n [logging]=\"moduleConfig?.logging\"\n [objectId]=\"id !== 'new' ? id : ''\"\n [createMode]=\"id === 'new'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex:1 0 22%;max-width:300px}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe}.nav-flush .nav-link{border-radius:0}\n"], components: [{ type: i3.ModelTableComponent, selector: "base-model-table", inputs: ["modelName", "objectId", "createMode", "create", "update", "delete", "logging", "tableFields"], outputs: ["idSelected", "createModeChanged"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
146
+ BaseCmsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: BaseCmsComponent, selector: "app-base-cms", ngImport: i0, template: "<div class=\"main\">\n <div class=\"sidebar\">\n <div class=\"d-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a href=\"/\" class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\">\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + type?.name?.toLowerCase()\"\n [ngClass]=\"{ active: type?.name?.toLowerCase() === this.modelName?.toLowerCase() }\"\n >\n {{\n moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.plural\n ? moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.plural\n : moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.label\n ? moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\">\n <div class=\"p-5\">\n <base-model-table\n [config]=\"moduleConfig?.modelConfig[modelName?.toLowerCase()]\"\n [fieldConfig]=\"moduleConfig?.fieldConfig[modelName?.toLowerCase()] || {}\"\n [modelName]=\"modelName\"\n [objectId]=\"id !== 'neu' ? id : ''\"\n [createMode]=\"id === 'neu'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex:1 0 22%;max-width:300px}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe}.nav-flush .nav-link{border-radius:0}\n"], components: [{ type: i3.ModelTableComponent, selector: "base-model-table", inputs: ["modelName", "objectId", "createMode", "create", "update", "delete", "config", "fieldConfig"], outputs: ["idSelected", "createModeChanged"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
161
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: BaseCmsComponent, decorators: [{
162
148
  type: Component,
163
- args: [{ selector: 'app-base-cms', template: "<div class=\"main\">\n <div class=\"sidebar\">\n <div class=\"d-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a href=\"/\" class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\">\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + type?.name?.toLowerCase()\"\n [ngClass]=\"{ active: type?.name?.toLowerCase() === this.modelName?.toLowerCase() }\"\n >\n {{ type.name + 's' }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\">\n <div class=\"p-5\">\n <base-model-table\n [tableFields]=\"moduleConfig?.tableFields ?? ['name']\"\n [modelName]=\"modelName\"\n [logging]=\"moduleConfig?.logging\"\n [objectId]=\"id !== 'new' ? id : ''\"\n [createMode]=\"id === 'new'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex:1 0 22%;max-width:300px}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe}.nav-flush .nav-link{border-radius:0}\n"] }]
149
+ args: [{ selector: 'app-base-cms', template: "<div class=\"main\">\n <div class=\"sidebar\">\n <div class=\"d-flex flex-column flex-shrink-0 p-3 h-100\">\n <ng-container *ngIf=\"moduleConfig.branding\">\n <a href=\"/\" class=\"d-flex flex-column align-items-start mb-3 mt-3 me-md-auto link-dark text-decoration-none\">\n <span class=\"d-block fs-4\"><b class=\"text-primary\">Base</b>CMS</span>\n <small class=\"fw-lighter\">The auto generated GraphQL CMS</small>\n </a>\n <hr />\n </ng-container>\n <ul class=\"nav nav-pills flex-column mb-auto\" *ngIf=\"types\">\n <li class=\"nav-item\" *ngFor=\"let type of types\">\n <a\n class=\"nav-link\"\n aria-current=\"page\"\n [routerLink]=\"(id ? '../../' : '../') + type?.name?.toLowerCase()\"\n [ngClass]=\"{ active: type?.name?.toLowerCase() === this.modelName?.toLowerCase() }\"\n >\n {{\n moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.plural\n ? moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.plural\n : moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.label\n ? moduleConfig?.modelConfig[type?.name?.toLowerCase()]?.label\n : type.name + 's'\n }}\n </a>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"sidebar-content\">\n <div class=\"p-5\">\n <base-model-table\n [config]=\"moduleConfig?.modelConfig[modelName?.toLowerCase()]\"\n [fieldConfig]=\"moduleConfig?.fieldConfig[modelName?.toLowerCase()] || {}\"\n [modelName]=\"modelName\"\n [objectId]=\"id !== 'neu' ? id : ''\"\n [createMode]=\"id === 'neu'\"\n (createModeChanged)=\"onCreateModeChanged($event)\"\n (idSelected)=\"idSelected($event)\"\n [create]=\"isCreatePossible()\"\n [update]=\"isUpdatePossible()\"\n [delete]=\"isDeletePossible()\"\n ></base-model-table>\n </div>\n </div>\n</div>\n", styles: [".active{color:var(--bs-primary)!important;background-color:rgba(var(--bs-primary-rgb),.2)!important;font-weight:700}.nav-link{color:var(--bs-body-color)}.sidebar{box-shadow:#7090b014 14px 17px 40px 4px;transition:all .2s linear 0s;z-index:99}.main{display:flex;flex-direction:row;overflow:hidden;height:100%}.main .sidebar{flex:1 0 22%;max-width:300px}.main .sidebar-content{flex-grow:999;overflow-y:auto;background-color:#f5f7fe}.nav-flush .nav-link{border-radius:0}\n"] }]
164
150
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
165
151
  type: Inject,
166
152
  args: [BASE_CMS_MODULE_CONFIG]
167
153
  }] }, { type: i1.GraphQLMetaService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i1.AuthService }]; } });
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNtcy9wYWdlcy9iYXNlLWNtcy9iYXNlLWNtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY21zL3BhZ2VzL2Jhc2UtY21zL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBZSxTQUFTLEVBQW9ELE1BQU0sNEJBQTRCLENBQUM7QUFFdEgsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLG1EQUFtRCxDQUFDOzs7Ozs7QUFPaEgsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUN5QyxZQUFpQyxFQUNoRSxrQkFBc0MsRUFDdEMsS0FBcUIsRUFDckIsTUFBYyxFQUNkLFdBQXdCO1FBSk8saUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2hFLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBUGxDLFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBUzVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFO29CQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDckM7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTt3QkFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUMxRixDQUFDLENBQUMsQ0FBQztpQkFDSjthQUNGO1lBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSTtRQUNGLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFFakIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDN0Q7Z0JBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0M7Z0JBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDckYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUU5QiwyQkFBMkI7Z0JBQzNCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFFM0YsNkJBQTZCO2dCQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQzVELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQ3RELENBQUM7b0JBRUYsSUFBSSxhQUFhLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRTs0QkFDbEMsT0FBTyxLQUFLLENBQUM7eUJBQ2Q7d0JBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7d0JBQzNDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBRXZDLE9BQU8sVUFBVSxFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3JEO3lCQUFNO3dCQUNMLE9BQU8sSUFBSSxDQUFDO3FCQUNiO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUU7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxRDtnQkFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVwQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQ0FBZ0MsQ0FBQyxLQUFhO1FBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNyRixPQUFPLENBQUMsQ0FBQyxDQUNQLGNBQWMsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUMvRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDdEY7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxVQUFtQjtRQUNyQyxJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0I7UUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQjtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsRUFBVTtRQUNuQixJQUFJLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQy9EO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQzs7NkdBN0tVLGdCQUFnQixrQkFPakIsc0JBQXNCO2lHQVByQixnQkFBZ0Isb0RDVjdCLHVsREEwQ0E7MkZEaENhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjOzswQkFXckIsTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSwgQmFzaWNVc2VyLCBHcmFwaHFsQ3J1ZFR5cGUsIEdyYXBoUUxNZXRhLCBHcmFwaFFMTWV0YVNlcnZpY2UgfSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJBU0VfQ01TX01PRFVMRV9DT05GSUcsIEJhc2VDTVNNb2R1bGVDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Jhc2UtY21zLW1vZHVsZS1jb25maWcuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtY21zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFzZS1jbXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQmFzZUNtc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIG1ldGE6IEdyYXBoUUxNZXRhO1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgdHlwZXM6IEdyYXBocWxDcnVkVHlwZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChCQVNFX0NNU19NT0RVTEVfQ09ORklHKSBwdWJsaWMgbW9kdWxlQ29uZmlnOiBCYXNlQ01TTW9kdWxlQ29uZmlnLFxuICAgIHByaXZhdGUgZ3JhcGhRTE1ldGFTZXJ2aWNlOiBHcmFwaFFMTWV0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZVxuICApIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWVbJ21vZGVsTmFtZSddKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja01vZGVsSXNFeGNsdWRlZE9yUmVzdHJjaXRlZCh2YWx1ZVsnbW9kZWxOYW1lJ10pKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbE5hbWUgPSB2YWx1ZVsnbW9kZWxOYW1lJ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbml0KCkudGhlbigodHlwZXM6IEdyYXBocWxDcnVkVHlwZVtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uLycgKyB0eXBlc1swXS5uYW1lLnRvTG93ZXJDYXNlKCldLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlWydpZCddKSB7XG4gICAgICAgIHRoaXMuaWQgPSB2YWx1ZVsnaWQnXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgR3JhcGhxbENydWRUeXBlIG9iamVjdHNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXQoKTogUHJvbWlzZTxHcmFwaHFsQ3J1ZFR5cGVbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdyYXBoUUxNZXRhU2VydmljZS5nZXRNZXRhKCkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydtb2RlbE5hbWUnXSkge1xuICAgICAgICAgIHRoaXMubW9kZWxOYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8ucGFyYW1zPy5bJ21vZGVsTmFtZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydpZCddKSB7XG4gICAgICAgICAgdGhpcy5pZCA9IHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydpZCddO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhjbHVkZWRNb2RlbHMgPSB0aGlzLm1vZHVsZUNvbmZpZy5leGNsdWRlZE1vZGVscz8ubWFwKChlKSA9PiBlLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCB0eXBlcyA9IG1ldGEuZ2V0VHlwZXMoKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXhjbHVkZWQgdHlwZXNcbiAgICAgICAgY29uc3QgZmlsdGVyZWRUeXBlcyA9IHR5cGVzLmZpbHRlcigoZSkgPT4gIWV4Y2x1ZGVkTW9kZWxzPy5pbmNsdWRlcyhlLm5hbWUudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciByZXN0cmljdGVkIHR5cGVzXG4gICAgICAgIHRoaXMudHlwZXMgPSBmaWx0ZXJlZFR5cGVzLmZpbHRlcigoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kUmVzdHJpY3QgPSB0aGlzLm1vZHVsZUNvbmZpZy5yZXN0cmljdGVkTW9kZWxzPy5maW5kKFxuICAgICAgICAgICAgKHYpID0+IHYubW9kZWwudG9Mb3dlckNhc2UoKSA9PT0gZS5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGZvdW5kUmVzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZT8uY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aFNlcnZpY2U/LmN1cnJlbnRVc2VyO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkVXNlciA9IEJhc2ljVXNlci5tYXAodXNlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXBwZWRVc2VyPy5oYXNBbGxSb2xlcyhmb3VuZFJlc3RyaWN0LnJvbGVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5tb2R1bGVDb25maWc/LmxvZ2dpbmcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQmFzZUNtc0NvbXBvbmVudDo6aW5pdC0+dHlwZXMnLCB0aGlzLnR5cGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUodGhpcy50eXBlcyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLycgKyB0aGlzLnR5cGVzWzBdLm5hbWUudG9Mb3dlckNhc2UoKV0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgY2hlY2tzIGlmIHRoZSBtb2RlbCBpcyBleGNsdWRlZCBvciByZXN0cmljdGVkXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB5b3Ugd2FudCB0byBjaGVjay5cbiAgICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlLlxuICAgKi9cbiAgY2hlY2tNb2RlbElzRXhjbHVkZWRPclJlc3RyY2l0ZWQobW9kZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZXhjbHVkZWRNb2RlbHMgPSB0aGlzLm1vZHVsZUNvbmZpZy5leGNsdWRlZE1vZGVscz8ubWFwKChlKSA9PiBlLnRvTG93ZXJDYXNlKCkpO1xuICAgIHJldHVybiAhIShcbiAgICAgIGV4Y2x1ZGVkTW9kZWxzPy5pbmNsdWRlcyhtb2RlbD8udG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgIHRoaXMubW9kdWxlQ29uZmlnLnJlc3RyaWN0ZWRNb2RlbHM/LmZpbmQoKGUpID0+IGUubW9kZWwudG9Mb3dlckNhc2UoKSA9PT0gbW9kZWwudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBtb2RlbCBuYW1lIGlzIHNldCBhbmQgdGhlIHR5cGVzIGFyZSBzZXQsIHRoZW4gcmV0dXJuIHRoZSB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUgbW9kZWwgbmFtZVxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBtb2RlbCBuYW1lLlxuICAgKi9cbiAgZ2V0VHlwZUJ5TW9kZWxOYW1lKCkge1xuICAgIGlmICh0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlcy5maW5kKChlKSA9PiBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5tb2RlbE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBjcmVhdGVNb2RlQ2hhbmdlZCBldmVudCBpcyBlbWl0dGVkLCBpZiB0aGUgY3JlYXRlTW9kZSBpcyB0cnVlLCBuYXZpZ2F0ZSB0byB0aGUgbmV3IHJvdXRlXG4gICAqXG4gICAqIEBwYXJhbSBjcmVhdGVNb2RlIC0gYm9vbGVhbiAtIFRoaXMgaXMgYSBib29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaXMgaW4gY3JlYXRlIG1vZGUgb3JcbiAgICogbm90LlxuICAgKi9cbiAgb25DcmVhdGVNb2RlQ2hhbmdlZChjcmVhdGVNb2RlOiBib29sZWFuKSB7XG4gICAgaWYgKGNyZWF0ZU1vZGUpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi8nICsgJ25ldyddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSB0eXBlIGV4aXN0cywgcmV0dXJuIHRoZSBjcmVhdGUgcHJvcGVydHkgb2YgdGhlIHR5cGUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzQ3JlYXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLmNyZWF0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBtb2RlbCBuYW1lIGlzIGZvdW5kIGluIHRoZSB0eXBlIG1hcCwgcmV0dXJuIHRoZSB1cGRhdGUgcHJvcGVydHkgb2YgdGhlIHR5cGUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzVXBkYXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLnVwZGF0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSB0eXBlIGlzIGRlZmluZWQsIHJldHVybiB0aGUgZGVsZXRlIHByb3BlcnR5IG9mIHRoZSB0eXBlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzRGVsZXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLmRlbGV0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpZCBpcyB0cnV0aHksIG5hdmlnYXRlIHRvIHRoZSBpZCwgb3RoZXJ3aXNlIG5hdmlnYXRlIHRvIHRoZSBwYXJlbnQgcm91dGVcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBzZWxlY3RlZCBpdGVtLlxuICAgKi9cbiAgaWRTZWxlY3RlZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4vJyArIGlkXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWluXCI+XG4gIDxkaXYgY2xhc3M9XCJzaWRlYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LXNocmluay0wIHAtMyBoLTEwMFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZHVsZUNvbmZpZy5icmFuZGluZ1wiPlxuICAgICAgICA8YSBocmVmPVwiL1wiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTMgbXQtMyBtZS1tZC1hdXRvIGxpbmstZGFyayB0ZXh0LWRlY29yYXRpb24tbm9uZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBmcy00XCI+PGIgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIj5CYXNlPC9iPkNNUzwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmdy1saWdodGVyXCI+VGhlIGF1dG8gZ2VuZXJhdGVkIEdyYXBoUUwgQ01TPC9zbWFsbD5cbiAgICAgICAgPC9hPlxuICAgICAgICA8aHIgLz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi1waWxscyBmbGV4LWNvbHVtbiBtYi1hdXRvXCIgKm5nSWY9XCJ0eXBlc1wiPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmtcIlxuICAgICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCIoaWQgPyAnLi4vLi4vJyA6ICcuLi8nKSArIHR5cGU/Lm5hbWU/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHR5cGU/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMubW9kZWxOYW1lPy50b0xvd2VyQ2FzZSgpIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHR5cGUubmFtZSArICdzJyB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzaWRlYmFyLWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicC01XCI+XG4gICAgICA8YmFzZS1tb2RlbC10YWJsZVxuICAgICAgICBbdGFibGVGaWVsZHNdPVwibW9kdWxlQ29uZmlnPy50YWJsZUZpZWxkcyA/PyBbJ25hbWUnXVwiXG4gICAgICAgIFttb2RlbE5hbWVdPVwibW9kZWxOYW1lXCJcbiAgICAgICAgW2xvZ2dpbmddPVwibW9kdWxlQ29uZmlnPy5sb2dnaW5nXCJcbiAgICAgICAgW29iamVjdElkXT1cImlkICE9PSAnbmV3JyA/IGlkIDogJydcIlxuICAgICAgICBbY3JlYXRlTW9kZV09XCJpZCA9PT0gJ25ldydcIlxuICAgICAgICAoY3JlYXRlTW9kZUNoYW5nZWQpPVwib25DcmVhdGVNb2RlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgKGlkU2VsZWN0ZWQpPVwiaWRTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgW2NyZWF0ZV09XCJpc0NyZWF0ZVBvc3NpYmxlKClcIlxuICAgICAgICBbdXBkYXRlXT1cImlzVXBkYXRlUG9zc2libGUoKVwiXG4gICAgICAgIFtkZWxldGVdPVwiaXNEZWxldGVQb3NzaWJsZSgpXCJcbiAgICAgID48L2Jhc2UtbW9kZWwtdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNtcy9wYWdlcy9iYXNlLWNtcy9iYXNlLWNtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY21zL3BhZ2VzL2Jhc2UtY21zL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBZSxTQUFTLEVBQW9ELE1BQU0sNEJBQTRCLENBQUM7QUFFdEgsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLG1EQUFtRCxDQUFDOzs7Ozs7QUFPaEgsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUN5QyxZQUFpQyxFQUNoRSxrQkFBc0MsRUFDdEMsS0FBcUIsRUFDckIsTUFBYyxFQUNkLFdBQXdCO1FBSk8saUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2hFLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBUGxDLFVBQUssR0FBc0IsRUFBRSxDQUFDO1FBUzVCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUM7Z0JBQ2pGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FB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REFnREE7MkZEdENhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjOzswQkFXckIsTUFBTTsyQkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSwgQmFzaWNVc2VyLCBHcmFwaHFsQ3J1ZFR5cGUsIEdyYXBoUUxNZXRhLCBHcmFwaFFMTWV0YVNlcnZpY2UgfSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJBU0VfQ01TX01PRFVMRV9DT05GSUcsIEJhc2VDTVNNb2R1bGVDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Jhc2UtY21zLW1vZHVsZS1jb25maWcuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtY21zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtY21zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFzZS1jbXMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQmFzZUNtc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIG1ldGE6IEdyYXBoUUxNZXRhO1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgdHlwZXM6IEdyYXBocWxDcnVkVHlwZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChCQVNFX0NNU19NT0RVTEVfQ09ORklHKSBwdWJsaWMgbW9kdWxlQ29uZmlnOiBCYXNlQ01TTW9kdWxlQ29uZmlnLFxuICAgIHByaXZhdGUgZ3JhcGhRTE1ldGFTZXJ2aWNlOiBHcmFwaFFMTWV0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZVxuICApIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWVbJ21vZGVsTmFtZSddKSB7XG4gICAgICAgIGNvbnN0IHJlc3RyaWN0ZWQgPSB0aGlzLm1vZHVsZUNvbmZpZy5tb2RlbENvbmZpZ1t2YWx1ZVsnbW9kZWxOYW1lJ11dPy5yZXN0cmljdGVkO1xuICAgICAgICBjb25zdCBleGNsdWRlZCA9IHRoaXMubW9kdWxlQ29uZmlnLm1vZGVsQ29uZmlnW3ZhbHVlWydtb2RlbE5hbWUnXV0/LmV4Y2x1ZGVkO1xuICAgICAgICBpZiAoKHJlc3RyaWN0ZWQgIT09IG51bGwgJiYgIXJlc3RyaWN0ZWQpIHx8IChleGNsdWRlZCAhPT0gbnVsbCAmJiAhZXhjbHVkZWQpKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbE5hbWUgPSB2YWx1ZVsnbW9kZWxOYW1lJ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbml0KCkudGhlbigodHlwZXM6IEdyYXBocWxDcnVkVHlwZVtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uLycgKyB0eXBlc1swXS5uYW1lLnRvTG93ZXJDYXNlKCldLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlWydpZCddKSB7XG4gICAgICAgIHRoaXMuaWQgPSB2YWx1ZVsnaWQnXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgR3JhcGhxbENydWRUeXBlIG9iamVjdHNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXQoKTogUHJvbWlzZTxHcmFwaHFsQ3J1ZFR5cGVbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdyYXBoUUxNZXRhU2VydmljZS5nZXRNZXRhKCkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydtb2RlbE5hbWUnXSkge1xuICAgICAgICAgIHRoaXMubW9kZWxOYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8ucGFyYW1zPy5bJ21vZGVsTmFtZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydpZCddKSB7XG4gICAgICAgICAgdGhpcy5pZCA9IHRoaXMucm91dGUuc25hcHNob3Q/LnBhcmFtcz8uWydpZCddO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBtZXRhLmdldFR5cGVzKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4Y2x1ZGVkIHR5cGVzXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkVHlwZXMgPSB0eXBlcy5maWx0ZXIoKGUpID0+ICF0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbZS5uYW1lLnRvTG93ZXJDYXNlKCldPy5leGNsdWRlZCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIHJlc3RyaWN0ZWQgdHlwZXNcbiAgICAgICAgdGhpcy50eXBlcyA9IGZpbHRlcmVkVHlwZXMuZmlsdGVyKChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1tlLm5hbWUudG9Mb3dlckNhc2UoKV0/LnJlc3RyaWN0ZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZT8uY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aFNlcnZpY2U/LmN1cnJlbnRVc2VyO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkVXNlciA9IEJhc2ljVXNlci5tYXAodXNlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXBwZWRVc2VyPy5oYXNBbGxSb2xlcyh0aGlzLm1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbZS5uYW1lLnRvTG93ZXJDYXNlKCldPy5yb2xlcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQ29uZmlnPy5sb2dnaW5nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Jhc2VDbXNDb21wb25lbnQ6OmluaXQtPnR5cGVzJywgdGhpcy50eXBlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKHRoaXMudHlwZXMpO1xuXG4gICAgICAgIGlmICghdGhpcy5tb2RlbE5hbWUgJiYgdGhpcy50eXBlcykge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi8nICsgdGhpcy50eXBlc1swXS5uYW1lLnRvTG93ZXJDYXNlKCldLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBtb2RlbCBuYW1lIGlzIHNldCBhbmQgdGhlIHR5cGVzIGFyZSBzZXQsIHRoZW4gcmV0dXJuIHRoZSB0eXBlIHRoYXQgbWF0Y2hlcyB0aGUgbW9kZWwgbmFtZVxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBtb2RlbCBuYW1lLlxuICAgKi9cbiAgZ2V0VHlwZUJ5TW9kZWxOYW1lKCkge1xuICAgIGlmICh0aGlzLm1vZGVsTmFtZSAmJiB0aGlzLnR5cGVzKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlcy5maW5kKChlKSA9PiBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5tb2RlbE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBjcmVhdGVNb2RlQ2hhbmdlZCBldmVudCBpcyBlbWl0dGVkLCBpZiB0aGUgY3JlYXRlTW9kZSBpcyB0cnVlLCBuYXZpZ2F0ZSB0byB0aGUgbmV3IHJvdXRlXG4gICAqXG4gICAqIEBwYXJhbSBjcmVhdGVNb2RlIC0gYm9vbGVhbiAtIFRoaXMgaXMgYSBib29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaXMgaW4gY3JlYXRlIG1vZGUgb3JcbiAgICogbm90LlxuICAgKi9cbiAgb25DcmVhdGVNb2RlQ2hhbmdlZChjcmVhdGVNb2RlOiBib29sZWFuKSB7XG4gICAgaWYgKGNyZWF0ZU1vZGUpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi8nICsgJ25ldSddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSB0eXBlIGV4aXN0cywgcmV0dXJuIHRoZSBjcmVhdGUgcHJvcGVydHkgb2YgdGhlIHR5cGUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzQ3JlYXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLmNyZWF0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBtb2RlbCBuYW1lIGlzIGZvdW5kIGluIHRoZSB0eXBlIG1hcCwgcmV0dXJuIHRoZSB1cGRhdGUgcHJvcGVydHkgb2YgdGhlIHR5cGUgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzVXBkYXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLnVwZGF0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSB0eXBlIGlzIGRlZmluZWQsIHJldHVybiB0aGUgZGVsZXRlIHByb3BlcnR5IG9mIHRoZSB0eXBlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIGlzRGVsZXRlUG9zc2libGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZUJ5TW9kZWxOYW1lKCk7XG4gICAgcmV0dXJuIHR5cGUgPyB0eXBlLmRlbGV0ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBpZCBpcyB0cnV0aHksIG5hdmlnYXRlIHRvIHRoZSBpZCwgb3RoZXJ3aXNlIG5hdmlnYXRlIHRvIHRoZSBwYXJlbnQgcm91dGVcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBzZWxlY3RlZCBpdGVtLlxuICAgKi9cbiAgaWRTZWxlY3RlZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4vJyArIGlkXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uJ10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWluXCI+XG4gIDxkaXYgY2xhc3M9XCJzaWRlYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LXNocmluay0wIHAtMyBoLTEwMFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZHVsZUNvbmZpZy5icmFuZGluZ1wiPlxuICAgICAgICA8YSBocmVmPVwiL1wiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTMgbXQtMyBtZS1tZC1hdXRvIGxpbmstZGFyayB0ZXh0LWRlY29yYXRpb24tbm9uZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBmcy00XCI+PGIgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIj5CYXNlPC9iPkNNUzwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmdy1saWdodGVyXCI+VGhlIGF1dG8gZ2VuZXJhdGVkIEdyYXBoUUwgQ01TPC9zbWFsbD5cbiAgICAgICAgPC9hPlxuICAgICAgICA8aHIgLz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi1waWxscyBmbGV4LWNvbHVtbiBtYi1hdXRvXCIgKm5nSWY9XCJ0eXBlc1wiPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmtcIlxuICAgICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCIoaWQgPyAnLi4vLi4vJyA6ICcuLi8nKSArIHR5cGU/Lm5hbWU/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHR5cGU/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMubW9kZWxOYW1lPy50b0xvd2VyQ2FzZSgpIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIG1vZHVsZUNvbmZpZz8ubW9kZWxDb25maWdbdHlwZT8ubmFtZT8udG9Mb3dlckNhc2UoKV0/LnBsdXJhbFxuICAgICAgICAgICAgICAgID8gbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1t0eXBlPy5uYW1lPy50b0xvd2VyQ2FzZSgpXT8ucGx1cmFsXG4gICAgICAgICAgICAgICAgOiBtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW3R5cGU/Lm5hbWU/LnRvTG93ZXJDYXNlKCldPy5sYWJlbFxuICAgICAgICAgICAgICAgID8gbW9kdWxlQ29uZmlnPy5tb2RlbENvbmZpZ1t0eXBlPy5uYW1lPy50b0xvd2VyQ2FzZSgpXT8ubGFiZWxcbiAgICAgICAgICAgICAgICA6IHR5cGUubmFtZSArICdzJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2lkZWJhci1jb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cInAtNVwiPlxuICAgICAgPGJhc2UtbW9kZWwtdGFibGVcbiAgICAgICAgW2NvbmZpZ109XCJtb2R1bGVDb25maWc/Lm1vZGVsQ29uZmlnW21vZGVsTmFtZT8udG9Mb3dlckNhc2UoKV1cIlxuICAgICAgICBbZmllbGRDb25maWddPVwibW9kdWxlQ29uZmlnPy5maWVsZENvbmZpZ1ttb2RlbE5hbWU/LnRvTG93ZXJDYXNlKCldIHx8IHt9XCJcbiAgICAgICAgW21vZGVsTmFtZV09XCJtb2RlbE5hbWVcIlxuICAgICAgICBbb2JqZWN0SWRdPVwiaWQgIT09ICduZXUnID8gaWQgOiAnJ1wiXG4gICAgICAgIFtjcmVhdGVNb2RlXT1cImlkID09PSAnbmV1J1wiXG4gICAgICAgIChjcmVhdGVNb2RlQ2hhbmdlZCk9XCJvbkNyZWF0ZU1vZGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoaWRTZWxlY3RlZCk9XCJpZFNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICBbY3JlYXRlXT1cImlzQ3JlYXRlUG9zc2libGUoKVwiXG4gICAgICAgIFt1cGRhdGVdPVwiaXNVcGRhdGVQb3NzaWJsZSgpXCJcbiAgICAgICAgW2RlbGV0ZV09XCJpc0RlbGV0ZVBvc3NpYmxlKClcIlxuICAgICAgPjwvYmFzZS1tb2RlbC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==