@provoly/dashboard 0.14.6 → 0.14.8

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 (77) hide show
  1. package/components/metadata-editor/metadata-editor.component.d.ts +3 -1
  2. package/dataset/components/dataset-detail/dataset-detail.component.d.ts +1 -0
  3. package/dataset/i18n/en.translations.d.ts +1 -0
  4. package/dataset/i18n/fr.translations.d.ts +1 -0
  5. package/dataset/style/_o-pry-dataset-detail.scss +7 -6
  6. package/dataset/style/_o-pry-dataset.scss +6 -3
  7. package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +1 -1
  8. package/esm2022/admin/components/admin-user/admin-user-select/admin-user-select.component.mjs +1 -1
  9. package/esm2022/components/metadata-editor/metadata-editor.component.mjs +30 -9
  10. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +6 -3
  11. package/esm2022/dataset/i18n/en.translations.mjs +2 -1
  12. package/esm2022/dataset/i18n/fr.translations.mjs +2 -1
  13. package/esm2022/dataset/style/css.component.mjs +2 -2
  14. package/esm2022/lib/core/i18n/en.translations.mjs +3 -2
  15. package/esm2022/lib/core/i18n/fr.translations.mjs +3 -2
  16. package/esm2022/lib/core/model/widget-map-manifest.interface.mjs +1 -1
  17. package/esm2022/lib/core/store/config/config.effects.mjs +3 -3
  18. package/esm2022/lib/core/store/data-source/data-source.effects.mjs +4 -4
  19. package/esm2022/lib/core/store/relation-types/relation-types.effects.mjs +3 -2
  20. package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +1 -1
  21. package/esm2022/lib/dashboard/components/dashboard.component.mjs +11 -8
  22. package/esm2022/lib/dashboard/components/widgets/widget-instanciator/widget-instanciator.component.mjs +2 -6
  23. package/esm2022/lib/dashboard/public-api.mjs +2 -2
  24. package/esm2022/lib/dashboard/store/dashboard.actions.mjs +6 -2
  25. package/esm2022/lib/dashboard/store/dashboard.effects.mjs +20 -13
  26. package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +11 -2
  27. package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +4 -2
  28. package/esm2022/lib/dashboard/store/manifest.service.mjs +11 -1
  29. package/esm2022/lib/dashboard/store/wms.service.mjs +54 -0
  30. package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +19 -3
  31. package/esm2022/presentation/presentation.module.mjs +8 -4
  32. package/esm2022/presentation/style/css.component.mjs +2 -2
  33. package/esm2022/restitution/components/restitution/restitution.component.mjs +1 -1
  34. package/esm2022/widgets/widget-map/component/widget-map-layer.service.mjs +2 -1
  35. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +34 -32
  36. package/esm2022/widgets/widget-map/pipe/widget-map-legend-url.pipe.mjs +3 -4
  37. package/esm2022/widgets/widget-map/public-api.mjs +1 -2
  38. package/esm2022/widgets/widget-map/utils/xml-utils.class.mjs +20 -1
  39. package/fesm2022/provoly-dashboard-admin.mjs +2 -2
  40. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  41. package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +29 -8
  42. package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
  43. package/fesm2022/provoly-dashboard-dataset.mjs +9 -4
  44. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  45. package/fesm2022/provoly-dashboard-presentation.mjs +26 -7
  46. package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
  47. package/fesm2022/provoly-dashboard-restitution.mjs +1 -1
  48. package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
  49. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +37 -76
  50. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  51. package/fesm2022/provoly-dashboard.mjs +110 -66
  52. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  53. package/lib/core/i18n/en.translations.d.ts +1 -0
  54. package/lib/core/i18n/fr.translations.d.ts +1 -0
  55. package/lib/core/model/widget-map-manifest.interface.d.ts +1 -0
  56. package/lib/dashboard/components/dashboard.component.d.ts +4 -4
  57. package/lib/dashboard/components/widgets/widget-instanciator/widget-instanciator.component.d.ts +1 -3
  58. package/lib/dashboard/public-api.d.ts +1 -1
  59. package/lib/dashboard/store/dashboard.actions.d.ts +31 -0
  60. package/lib/dashboard/store/dashboard.effects.d.ts +9 -3
  61. package/lib/dashboard/store/dashboard.reducers.d.ts +4 -0
  62. package/lib/dashboard/store/dashboard.selectors.d.ts +5 -0
  63. package/lib/dashboard/store/manifest.service.d.ts +2 -0
  64. package/{widgets/widget-map/component → lib/dashboard/store}/wms.service.d.ts +4 -4
  65. package/package.json +31 -31
  66. package/presentation/components/add-edit-presentation/add-edit-presentation.component.d.ts +3 -0
  67. package/presentation/presentation.module.d.ts +2 -1
  68. package/presentation/style/_o-pry-new-presentation.scss +18 -5
  69. package/schematics/ng-update/version-0-14/index.spec.js +0 -1
  70. package/schematics/ng-update/version-0-14/index.spec.js.map +1 -1
  71. package/widgets/widget-map/component/widget-map.component.d.ts +11 -8
  72. package/widgets/widget-map/pipe/widget-map-legend-url.pipe.d.ts +4 -3
  73. package/widgets/widget-map/public-api.d.ts +0 -1
  74. package/widgets/widget-map/utils/xml-utils.class.d.ts +1 -0
  75. package/esm2022/lib/dashboard/store/geocoding.service.mjs +0 -44
  76. package/esm2022/widgets/widget-map/component/wms.service.mjs +0 -67
  77. package/lib/dashboard/store/geocoding.service.d.ts +0 -56
@@ -15,6 +15,7 @@ export declare class PryMetadataEditorComponent extends SubscriptionnerDirective
15
15
  private store;
16
16
  private formBuilder;
17
17
  _metadata$: BehaviorSubject<(MetadataValue | MetadataUser)[]>;
18
+ _initialMetadataSelection$: BehaviorSubject<string>;
18
19
  form: FormGroup;
19
20
  isSubmitted: boolean;
20
21
  targetId: string;
@@ -25,6 +26,7 @@ export declare class PryMetadataEditorComponent extends SubscriptionnerDirective
25
26
  addMeta: EventEmitter<MetaEventType>;
26
27
  removeMeta: EventEmitter<MetaEventType>;
27
28
  set metadata(metadata: MetadataValue[] | MetadataUser[]);
29
+ set initialMetadataSelection(metadataName: string);
28
30
  constructor(store: Store, formBuilder: FormBuilder);
29
31
  onMetaChange(metadata: IMetadata): void;
30
32
  editMetadata(currentMetadata: MetadataValue | MetadataUser): void;
@@ -32,5 +34,5 @@ export declare class PryMetadataEditorComponent extends SubscriptionnerDirective
32
34
  removeMetadata(metadata: MetadataUser | MetadataValue): void;
33
35
  addDatasetMetadata(): void;
34
36
  static ɵfac: i0.ɵɵFactoryDeclaration<PryMetadataEditorComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<PryMetadataEditorComponent, "pry-metadata-editor", never, { "targetId": { "alias": "targetId"; "required": false; }; "editable": { "alias": "editable"; "required": false; }; "metadata": { "alias": "metadata"; "required": false; }; }, { "addMeta": "addMeta"; "removeMeta": "removeMeta"; }, never, never, false, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<PryMetadataEditorComponent, "pry-metadata-editor", never, { "targetId": { "alias": "targetId"; "required": false; }; "editable": { "alias": "editable"; "required": false; }; "metadata": { "alias": "metadata"; "required": false; }; "initialMetadataSelection": { "alias": "initialMetadataSelection"; "required": false; }; }, { "addMeta": "addMeta"; "removeMeta": "removeMeta"; }, never, never, false, never>;
36
38
  }
@@ -22,6 +22,7 @@ export declare class PryDatasetDetailComponent implements OnInit {
22
22
  constructor(store: Store);
23
23
  ngOnInit(): void;
24
24
  goBack(): void;
25
+ refresh(): void;
25
26
  goToConsult(version: DatasetVersion | undefined): void;
26
27
  switch(number: number): void;
27
28
  handleButtonAction(version: DatasetVersion): void;
@@ -13,6 +13,7 @@ export declare const enTranslations: {
13
13
  export: string;
14
14
  api: string;
15
15
  returnToList: string;
16
+ refresh: string;
16
17
  version: {
17
18
  title: string;
18
19
  INDEXING: string;
@@ -13,6 +13,7 @@ export declare const frTranslations: {
13
13
  export: string;
14
14
  api: string;
15
15
  returnToList: string;
16
+ refresh: string;
16
17
  version: {
17
18
  title: string;
18
19
  INDEXING: string;
@@ -26,13 +26,13 @@ pry-dataset-detail {
26
26
  height: 100%;
27
27
  }
28
28
 
29
- pry-icon {
30
- position: relative;
31
- top: toRem(5);
32
- }
33
-
34
29
  .table-container {
35
30
  flex: 1 1;
31
+
32
+ pry-icon {
33
+ position: relative;
34
+ top: toRem(5);
35
+ }
36
36
  }
37
37
 
38
38
  .state-button {
@@ -64,10 +64,11 @@ pry-dataset-detail {
64
64
  height: 100%;
65
65
  }
66
66
 
67
- .dataset-layout__content {
67
+ .o-dataset-layout__content {
68
68
  overflow:hidden;
69
69
  height: 100%;
70
70
  padding-left: 2rem;
71
+ padding-top: toRem(20);
71
72
  }
72
73
 
73
74
  td {
@@ -28,10 +28,13 @@
28
28
  box-sizing: border-box;
29
29
  }
30
30
  }
31
+
31
32
  .o-dataset-layout {
32
33
  overflow: hidden;
33
34
  height: 100%;
35
+
36
+ .o-manifest-layout__toolbox {
37
+ justify-content: flex-start;
38
+ }
34
39
  }
35
- .o-manifest-layout__content {
36
- padding-left: 2rem;
37
- }
40
+
@@ -87,7 +87,7 @@ export class AdminSelectDatasetComponent extends SubscriptionnerDirective {
87
87
  }));
88
88
  }
89
89
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: AdminSelectDatasetComponent, deps: [{ token: i1.Store }, { token: i2.Router }, { token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
90
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: AdminSelectDatasetComponent, selector: "pry-admin-select-dataset", usesInheritance: true, ngImport: i0, template: "<div\n *ngIf=\"selectedDataset$ | async as dataset\"\n [id]=\"'panel-dataset-' + dataset.id\"\n [attr.aria-labelledby]=\"'button-dataset-' + dataset.id\"\n class=\"o-panel\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 class=\"a-h3\">\n {{ '@pry.admin.metadata.details' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"datasetMetadata\" name=\"metadata.title\"></pry-tab>\n <pry-tab [templateRef]=\"datasetAssociations\" name=\"classes.associations\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #datasetMetadata>\n <pry-metadata-editor\n [targetId]=\"(selectedDataset$ | async)?.id ?? ''\"\n [editable]=\"(editable$ | async) ?? false\"\n [metadata]=\"(datasetMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addDatasetMetadata($event)\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #datasetAssociations>\n <div *ngIf=\"associations$ | async as associations\" class=\"o-tabs__panels__item__content\">\n <h4 class=\"a-h4\">{{ '@pry.admin.classes.associations' | i18n }}</h4>\n <pry-association [associations]=\"associations\"></pry-association>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TabGroupComponent, selector: "pry-tab-group", inputs: ["translationStringBase"] }, { kind: "component", type: i4.TabComponent, selector: "pry-tab", inputs: ["name", "templateRef", "index"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: ["targetId", "editable", "metadata"], outputs: ["addMeta", "removeMeta"] }, { kind: "component", type: i6.PryAssociationComponent, selector: "pry-association", inputs: ["associations"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }] }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: AdminSelectDatasetComponent, selector: "pry-admin-select-dataset", usesInheritance: true, ngImport: i0, template: "<div\n *ngIf=\"selectedDataset$ | async as dataset\"\n [id]=\"'panel-dataset-' + dataset.id\"\n [attr.aria-labelledby]=\"'button-dataset-' + dataset.id\"\n class=\"o-panel\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 class=\"a-h3\">\n {{ '@pry.admin.metadata.details' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"datasetMetadata\" name=\"metadata.title\"></pry-tab>\n <pry-tab [templateRef]=\"datasetAssociations\" name=\"classes.associations\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #datasetMetadata>\n <pry-metadata-editor\n [targetId]=\"(selectedDataset$ | async)?.id ?? ''\"\n [editable]=\"(editable$ | async) ?? false\"\n [metadata]=\"(datasetMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addDatasetMetadata($event)\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #datasetAssociations>\n <div *ngIf=\"associations$ | async as associations\" class=\"o-tabs__panels__item__content\">\n <h4 class=\"a-h4\">{{ '@pry.admin.classes.associations' | i18n }}</h4>\n <pry-association [associations]=\"associations\"></pry-association>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TabGroupComponent, selector: "pry-tab-group", inputs: ["translationStringBase"] }, { kind: "component", type: i4.TabComponent, selector: "pry-tab", inputs: ["name", "templateRef", "index"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: ["targetId", "editable", "metadata", "initialMetadataSelection"], outputs: ["addMeta", "removeMeta"] }, { kind: "component", type: i6.PryAssociationComponent, selector: "pry-association", inputs: ["associations"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }] }); }
91
91
  }
92
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: AdminSelectDatasetComponent, decorators: [{
93
93
  type: Component,
@@ -57,7 +57,7 @@ export class AdminUserSelectComponent {
57
57
  this.tab = number;
58
58
  }
59
59
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: AdminUserSelectComponent, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Component }); }
60
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: AdminUserSelectComponent, selector: "pry-admin-user-select", inputs: { profil: "profil" }, ngImport: i0, template: "<div\n *ngIf=\"selectedUser$ | async as user\"\n [id]=\"'panel-user-' + user.id\"\n [attr.aria-labelledby]=\"'button-user-' + user.id\"\n class=\"o-panel\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 [id]=\"'tab-title-' + compId\" class=\"a-h3\">\n {{ '@pry.admin.userInfo.info' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"userProfile\" name=\"userInfo.profile\"></pry-tab>\n <pry-tab [templateRef]=\"userDetails\" name=\"details\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #userProfile>\n <pry-metadata-editor\n [targetId]=\"(selectedUser$ | async)?.id ?? ''\"\n [editable]=\"(editable$ | async) ?? false\"\n [metadata]=\"(userMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addMetadataUser($event)\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #userDetails>\n <h4 class=\"a-h4\">{{ '@pry.admin.properties' | i18n }}</h4>\n <p class=\"a-p\">\n {{ '@pry.admin.userInfo.name' | i18n }} :\n <strong>{{ user?.name }}</strong>\n </p>\n <p class=\"a-p\">\n {{ '@pry.admin.userInfo.familyName' | i18n }} :\n <strong>{{ user.familyName }}</strong>\n </p>\n <p class=\"a-p\">\n {{ '@pry.admin.userInfo.email' | i18n }} :\n <strong>{{ user.email }}</strong>\n </p>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TabGroupComponent, selector: "pry-tab-group", inputs: ["translationStringBase"] }, { kind: "component", type: i3.TabComponent, selector: "pry-tab", inputs: ["name", "templateRef", "index"] }, { kind: "component", type: i3.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: ["targetId", "editable", "metadata"], outputs: ["addMeta", "removeMeta"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }] }); }
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: AdminUserSelectComponent, selector: "pry-admin-user-select", inputs: { profil: "profil" }, ngImport: i0, template: "<div\n *ngIf=\"selectedUser$ | async as user\"\n [id]=\"'panel-user-' + user.id\"\n [attr.aria-labelledby]=\"'button-user-' + user.id\"\n class=\"o-panel\"\n>\n <div class=\"o-panel__header\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" (click)=\"closePanel()\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.closePanel' | i18n }}</span>\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n\n <h3 [id]=\"'tab-title-' + compId\" class=\"a-h3\">\n {{ '@pry.admin.userInfo.info' | i18n }}\n </h3>\n </div>\n\n <pry-tab-group translationStringBase=\"@pry.admin.\">\n <pry-tab [templateRef]=\"userProfile\" name=\"userInfo.profile\"></pry-tab>\n <pry-tab [templateRef]=\"userDetails\" name=\"details\"></pry-tab>\n </pry-tab-group>\n\n <ng-template #userProfile>\n <pry-metadata-editor\n [targetId]=\"(selectedUser$ | async)?.id ?? ''\"\n [editable]=\"(editable$ | async) ?? false\"\n [metadata]=\"(userMetadata$ | async) ?? []\"\n (removeMeta)=\"removeMetadata($event)\"\n (addMeta)=\"addMetadataUser($event)\"\n ></pry-metadata-editor>\n </ng-template>\n\n <ng-template #userDetails>\n <h4 class=\"a-h4\">{{ '@pry.admin.properties' | i18n }}</h4>\n <p class=\"a-p\">\n {{ '@pry.admin.userInfo.name' | i18n }} :\n <strong>{{ user?.name }}</strong>\n </p>\n <p class=\"a-p\">\n {{ '@pry.admin.userInfo.familyName' | i18n }} :\n <strong>{{ user.familyName }}</strong>\n </p>\n <p class=\"a-p\">\n {{ '@pry.admin.userInfo.email' | i18n }} :\n <strong>{{ user.email }}</strong>\n </p>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TabGroupComponent, selector: "pry-tab-group", inputs: ["translationStringBase"] }, { kind: "component", type: i3.TabComponent, selector: "pry-tab", inputs: ["name", "templateRef", "index"] }, { kind: "component", type: i3.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: ["targetId", "editable", "metadata", "initialMetadataSelection"], outputs: ["addMeta", "removeMeta"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.I18nPipe, name: "i18n" }] }); }
61
61
  }
62
62
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: AdminUserSelectComponent, decorators: [{
63
63
  type: Component,
@@ -23,11 +23,15 @@ export class PryMetadataEditorComponent extends SubscriptionnerDirective {
23
23
  }
24
24
  this._metadata$.next(metadata);
25
25
  }
26
+ set initialMetadataSelection(metadataName) {
27
+ this._initialMetadataSelection$.next(metadataName);
28
+ }
26
29
  constructor(store, formBuilder) {
27
30
  super();
28
31
  this.store = store;
29
32
  this.formBuilder = formBuilder;
30
33
  this._metadata$ = new BehaviorSubject([]);
34
+ this._initialMetadataSelection$ = new BehaviorSubject('');
31
35
  this.isSubmitted = false;
32
36
  this.targetId = '';
33
37
  this.editable = false;
@@ -43,12 +47,27 @@ export class PryMetadataEditorComponent extends SubscriptionnerDirective {
43
47
  let datasetMetadataIds = metadata?.map((u) => this.type === 'meta' ? u.metadataDef.id : u.userProfile);
44
48
  return metaDefs.filter((meta) => !datasetMetadataIds?.includes(meta.id));
45
49
  }));
46
- this.subscriptions.add(this.availableMetadata$.subscribe((meta) => {
47
- this.form.patchValue({
48
- metadata: meta[0]
49
- });
50
- this.onMetaChange(meta[0]);
51
- this.form.patchValue({ value: '' });
50
+ this.subscriptions.add(combineLatest([
51
+ this.metadataDefs$,
52
+ this.availableMetadata$,
53
+ this._metadata$,
54
+ this._initialMetadataSelection$
55
+ ]).subscribe(([allMeta, availableMeta, inputMeta, initiallySelectedMeta]) => {
56
+ let initiallySelectedMetaAvailable = availableMeta.find((metadata) => metadata.name === initiallySelectedMeta);
57
+ if (!!initiallySelectedMetaAvailable) {
58
+ this.form.patchValue({
59
+ metadata: initiallySelectedMetaAvailable ?? availableMeta[0]
60
+ });
61
+ this.onMetaChange(initiallySelectedMetaAvailable ?? availableMeta[0]);
62
+ this.form.patchValue({ value: '' });
63
+ }
64
+ else {
65
+ this.store.dispatch(MetadataActions.isEditable({ editable: true }));
66
+ this.form.patchValue({
67
+ metadata: allMeta.find((metadata) => metadata.name === initiallySelectedMeta),
68
+ value: inputMeta.find((meta) => this.metaDefinition(meta).name === initiallySelectedMeta)?.value
69
+ });
70
+ }
52
71
  }));
53
72
  }
54
73
  onMetaChange(metadata) {
@@ -92,11 +111,11 @@ export class PryMetadataEditorComponent extends SubscriptionnerDirective {
92
111
  }
93
112
  }
94
113
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryMetadataEditorComponent, deps: [{ token: i1.Store }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
95
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: { targetId: "targetId", editable: "editable", metadata: "metadata" }, outputs: { addMeta: "addMeta", removeMeta: "removeMeta" }, usesInheritance: true, ngImport: i0, template: "<div *ngFor=\"let metadata of (_metadata$ | async) ?? []\">\n <div class=\"o-tabs__panel__content__actions\">\n <div class=\"o-tabs__panel__content__actions__text\">\n <span class=\"o-tabs__panel__content__actions__text__label\">{{ metaDefinition(metadata).name }} :</span>\n <span class=\"o-tabs__panel__content__actions__text__value\">{{ metadata.value }}</span>\n </div>\n\n <div class=\"o-tabs__panel__content__actions__buttons\">\n <ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.edit' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"edit-icon\"\n iconSvg=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"editMetadata(metadata)\"\n ></pry-icon>\n </button>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"delete-icon\"\n iconSvg=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"removeMetadata(metadata)\"\n ></pry-icon>\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n\n<ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <ng-container *ngIf=\"form.value.metadata\">\n <form class=\"o-form -border-top\" [formGroup]=\"form\" (ngSubmit)=\"addDatasetMetadata()\">\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.action.editProfil' | i18n }}</legend>\n\n <div class=\"m-form-label-field\">\n <label for=\"metadata\" id=\"metadata-label\" class=\"a-label\">Data</label>\n <pry-select\n id=\"metadata\"\n class=\"a-pry-select\"\n formControlName=\"metadata\"\n [items]=\"availableMetadata$ | async\"\n (ngModelChange)=\"onMetaChange($event)\"\n [isForm]=\"true\"\n [itemsAsOption]=\"true\"\n bindLabel=\"name\"\n [readonly]=\"editable\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('metadata')?.invalid ? 'metadata-label metadata-error' : 'metadata-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('metadata')?.invalid\"\n >\n </pry-select>\n <label\n *ngIf=\"isSubmitted && form.get('metadata')?.invalid\"\n id=\"metadata-error\"\n for=\"metadata\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'DATE'; else inputList\">\n <div class=\"m-form-label-field\">\n <label id=\"form_date-label\" for=\"form_date\" class=\"a-label\">\n {{ '@pry.action.selectDate' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"form_date\"\n type=\"date\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'form-date-label form-date-error' : 'form-date-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"form_date-error\"\n for=\"form_date\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n </ng-container>\n\n <ng-template #inputList>\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'LIST'; else inputText\">\n <div class=\"m-form-label-field\">\n <label id=\"list-label\" class=\"a-label\" for=\"list\">{{ '@pry.action.choiceInList' | i18n }}</label>\n <pry-select\n id=\"list\"\n class=\"a-pry-select\"\n formControlName=\"value\"\n [items]=\"form.value['metadata']['allowedValues']\"\n [isForm]=\"true\"\n aria-labelledby=\"list-label\"\n ></pry-select>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #inputText>\n <div class=\"m-form-label-field\">\n <label id=\"text-label\" class=\"a-label\" for=\"text\">\n {{ '@pry.action.text' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"text\"\n type=\"text\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'text-label text-error' : 'text-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"test-error\"\n for=\"text\"\n class=\"a-label a-label--help -error\"\n >\n <span *ngIf=\"form.get('value')?.hasError('required')\">{{ '@pry.admin.required' | i18n }}</span>\n <ng-container *ngIf=\"form.get('value')?.hasError('pattern')\">\n <span *ngIf=\"form.value['metadata']['type'] === 'DOUBLE'\">\n {{ '@pry.admin.environment.formatDouble' | i18n }}\n </span>\n <span *ngIf=\"form.value['metadata']['type'] === 'INTEGER'\">\n {{ '@pry.admin.environment.formatInt' | i18n }}\n </span>\n </ng-container>\n </label>\n </div>\n </ng-template>\n </fieldset>\n\n <div class=\"m-btn-group -end\">\n <button type=\"submit\" class=\"a-btn a-btn--primary\">\n {{ (editable ? '@pry.admin.userInfo.editMetadata' : '@pry.admin.userInfo.addMetadata') | i18n }}\n </button>\n </div>\n </form>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["labelTranslate", "baseTranslate", "translationFn", "translationFnArgs", "clearable", "multiple", "multipleClearRight", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "items", "itemsAsOption", "bindData", "bindValue", "bindLabel", "bindIcon", "iconSize", "templateLabel", "templateOption", "autocomplete"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }] }); }
114
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: PryMetadataEditorComponent, selector: "pry-metadata-editor", inputs: { targetId: "targetId", editable: "editable", metadata: "metadata", initialMetadataSelection: "initialMetadataSelection" }, outputs: { addMeta: "addMeta", removeMeta: "removeMeta" }, usesInheritance: true, ngImport: i0, template: "<div *ngFor=\"let metadata of (_metadata$ | async) ?? []\">\n <div class=\"o-tabs__panel__content__actions\">\n <div class=\"o-tabs__panel__content__actions__text\">\n <span class=\"o-tabs__panel__content__actions__text__label\">{{ metaDefinition(metadata).name }} :</span>\n <span class=\"o-tabs__panel__content__actions__text__value\">{{ metadata.value }}</span>\n </div>\n\n <div class=\"o-tabs__panel__content__actions__buttons\">\n <ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.edit' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"edit-icon\"\n iconSvg=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"editMetadata(metadata)\"\n ></pry-icon>\n </button>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"delete-icon\"\n iconSvg=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"removeMetadata(metadata)\"\n ></pry-icon>\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n\n<ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <ng-container *ngIf=\"form.value.metadata\">\n <form class=\"o-form -border-top\" [formGroup]=\"form\" (ngSubmit)=\"addDatasetMetadata()\">\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.action.editProfil' | i18n }}</legend>\n\n <div class=\"m-form-label-field\">\n <label for=\"metadata\" id=\"metadata-label\" class=\"a-label\">Data</label>\n <pry-select\n id=\"metadata\"\n class=\"a-pry-select\"\n formControlName=\"metadata\"\n [items]=\"availableMetadata$ | async\"\n (ngModelChange)=\"onMetaChange($event)\"\n [isForm]=\"true\"\n [itemsAsOption]=\"true\"\n bindLabel=\"name\"\n [readonly]=\"editable\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('metadata')?.invalid ? 'metadata-label metadata-error' : 'metadata-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('metadata')?.invalid\"\n >\n </pry-select>\n <label\n *ngIf=\"isSubmitted && form.get('metadata')?.invalid\"\n id=\"metadata-error\"\n for=\"metadata\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'DATE'; else inputList\">\n <div class=\"m-form-label-field\">\n <label id=\"form_date-label\" for=\"form_date\" class=\"a-label\">\n {{ '@pry.action.selectDate' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"form_date\"\n type=\"date\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'form-date-label form-date-error' : 'form-date-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"form_date-error\"\n for=\"form_date\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n </ng-container>\n\n <ng-template #inputList>\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'LIST'; else inputText\">\n <div class=\"m-form-label-field\">\n <label id=\"list-label\" class=\"a-label\" for=\"list\">{{ '@pry.action.choiceInList' | i18n }}</label>\n <pry-select\n id=\"list\"\n class=\"a-pry-select\"\n formControlName=\"value\"\n [items]=\"form.value['metadata']['allowedValues']\"\n [isForm]=\"true\"\n aria-labelledby=\"list-label\"\n ></pry-select>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #inputText>\n <div class=\"m-form-label-field\">\n <label id=\"text-label\" class=\"a-label\" for=\"text\">\n {{ '@pry.action.text' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"text\"\n type=\"text\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'text-label text-error' : 'text-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"test-error\"\n for=\"text\"\n class=\"a-label a-label--help -error\"\n >\n <span *ngIf=\"form.get('value')?.hasError('required')\">{{ '@pry.admin.required' | i18n }}</span>\n <ng-container *ngIf=\"form.get('value')?.hasError('pattern')\">\n <span *ngIf=\"form.value['metadata']['type'] === 'DOUBLE'\">\n {{ '@pry.admin.environment.formatDouble' | i18n }}\n </span>\n <span *ngIf=\"form.value['metadata']['type'] === 'INTEGER'\">\n {{ '@pry.admin.environment.formatInt' | i18n }}\n </span>\n </ng-container>\n </label>\n </div>\n </ng-template>\n </fieldset>\n\n <div class=\"m-btn-group -end\">\n <button type=\"submit\" class=\"a-btn a-btn--primary\">\n {{ (editable ? '@pry.action.editMetadata' : '@pry.action.addMetadata') | i18n }}\n </button>\n </div>\n </form>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.PryAccessDirective, selector: "[pryAccess]", inputs: ["pryAccess"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.PrySelectComponent, selector: "pry-select", inputs: ["labelTranslate", "baseTranslate", "translationFn", "translationFnArgs", "clearable", "multiple", "multipleClearRight", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "items", "itemsAsOption", "bindData", "bindValue", "bindLabel", "bindIcon", "iconSize", "templateLabel", "templateOption", "autocomplete"] }, { kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }] }); }
96
115
  }
97
116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryMetadataEditorComponent, decorators: [{
98
117
  type: Component,
99
- args: [{ selector: 'pry-metadata-editor', template: "<div *ngFor=\"let metadata of (_metadata$ | async) ?? []\">\n <div class=\"o-tabs__panel__content__actions\">\n <div class=\"o-tabs__panel__content__actions__text\">\n <span class=\"o-tabs__panel__content__actions__text__label\">{{ metaDefinition(metadata).name }} :</span>\n <span class=\"o-tabs__panel__content__actions__text__value\">{{ metadata.value }}</span>\n </div>\n\n <div class=\"o-tabs__panel__content__actions__buttons\">\n <ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.edit' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"edit-icon\"\n iconSvg=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"editMetadata(metadata)\"\n ></pry-icon>\n </button>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"delete-icon\"\n iconSvg=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"removeMetadata(metadata)\"\n ></pry-icon>\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n\n<ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <ng-container *ngIf=\"form.value.metadata\">\n <form class=\"o-form -border-top\" [formGroup]=\"form\" (ngSubmit)=\"addDatasetMetadata()\">\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.action.editProfil' | i18n }}</legend>\n\n <div class=\"m-form-label-field\">\n <label for=\"metadata\" id=\"metadata-label\" class=\"a-label\">Data</label>\n <pry-select\n id=\"metadata\"\n class=\"a-pry-select\"\n formControlName=\"metadata\"\n [items]=\"availableMetadata$ | async\"\n (ngModelChange)=\"onMetaChange($event)\"\n [isForm]=\"true\"\n [itemsAsOption]=\"true\"\n bindLabel=\"name\"\n [readonly]=\"editable\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('metadata')?.invalid ? 'metadata-label metadata-error' : 'metadata-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('metadata')?.invalid\"\n >\n </pry-select>\n <label\n *ngIf=\"isSubmitted && form.get('metadata')?.invalid\"\n id=\"metadata-error\"\n for=\"metadata\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'DATE'; else inputList\">\n <div class=\"m-form-label-field\">\n <label id=\"form_date-label\" for=\"form_date\" class=\"a-label\">\n {{ '@pry.action.selectDate' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"form_date\"\n type=\"date\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'form-date-label form-date-error' : 'form-date-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"form_date-error\"\n for=\"form_date\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n </ng-container>\n\n <ng-template #inputList>\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'LIST'; else inputText\">\n <div class=\"m-form-label-field\">\n <label id=\"list-label\" class=\"a-label\" for=\"list\">{{ '@pry.action.choiceInList' | i18n }}</label>\n <pry-select\n id=\"list\"\n class=\"a-pry-select\"\n formControlName=\"value\"\n [items]=\"form.value['metadata']['allowedValues']\"\n [isForm]=\"true\"\n aria-labelledby=\"list-label\"\n ></pry-select>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #inputText>\n <div class=\"m-form-label-field\">\n <label id=\"text-label\" class=\"a-label\" for=\"text\">\n {{ '@pry.action.text' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"text\"\n type=\"text\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'text-label text-error' : 'text-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"test-error\"\n for=\"text\"\n class=\"a-label a-label--help -error\"\n >\n <span *ngIf=\"form.get('value')?.hasError('required')\">{{ '@pry.admin.required' | i18n }}</span>\n <ng-container *ngIf=\"form.get('value')?.hasError('pattern')\">\n <span *ngIf=\"form.value['metadata']['type'] === 'DOUBLE'\">\n {{ '@pry.admin.environment.formatDouble' | i18n }}\n </span>\n <span *ngIf=\"form.value['metadata']['type'] === 'INTEGER'\">\n {{ '@pry.admin.environment.formatInt' | i18n }}\n </span>\n </ng-container>\n </label>\n </div>\n </ng-template>\n </fieldset>\n\n <div class=\"m-btn-group -end\">\n <button type=\"submit\" class=\"a-btn a-btn--primary\">\n {{ (editable ? '@pry.admin.userInfo.editMetadata' : '@pry.admin.userInfo.addMetadata') | i18n }}\n </button>\n </div>\n </form>\n </ng-container>\n</ng-container>\n" }]
118
+ args: [{ selector: 'pry-metadata-editor', template: "<div *ngFor=\"let metadata of (_metadata$ | async) ?? []\">\n <div class=\"o-tabs__panel__content__actions\">\n <div class=\"o-tabs__panel__content__actions__text\">\n <span class=\"o-tabs__panel__content__actions__text__label\">{{ metaDefinition(metadata).name }} :</span>\n <span class=\"o-tabs__panel__content__actions__text__value\">{{ metadata.value }}</span>\n </div>\n\n <div class=\"o-tabs__panel__content__actions__buttons\">\n <ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.edit' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"edit-icon\"\n iconSvg=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"editMetadata(metadata)\"\n ></pry-icon>\n </button>\n <button type=\"button\" class=\"a-btn a-btn--icon-only\" aria-pressed=\"false\">\n <span class=\"u-visually-hidden\">{{ '@pry.action.delete' | i18n }} {{ metaDefinition(metadata).name }}</span>\n <pry-icon\n class=\"delete-icon\"\n iconSvg=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"removeMetadata(metadata)\"\n ></pry-icon>\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n\n<ng-container *pryAccess=\"{ module: 'admin', page: 'dataset', action: 'write' }\">\n <ng-container *ngIf=\"form.value.metadata\">\n <form class=\"o-form -border-top\" [formGroup]=\"form\" (ngSubmit)=\"addDatasetMetadata()\">\n <fieldset>\n <legend class=\"u-visually-hidden\">{{ '@pry.action.editProfil' | i18n }}</legend>\n\n <div class=\"m-form-label-field\">\n <label for=\"metadata\" id=\"metadata-label\" class=\"a-label\">Data</label>\n <pry-select\n id=\"metadata\"\n class=\"a-pry-select\"\n formControlName=\"metadata\"\n [items]=\"availableMetadata$ | async\"\n (ngModelChange)=\"onMetaChange($event)\"\n [isForm]=\"true\"\n [itemsAsOption]=\"true\"\n bindLabel=\"name\"\n [readonly]=\"editable\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('metadata')?.invalid ? 'metadata-label metadata-error' : 'metadata-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('metadata')?.invalid\"\n >\n </pry-select>\n <label\n *ngIf=\"isSubmitted && form.get('metadata')?.invalid\"\n id=\"metadata-error\"\n for=\"metadata\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'DATE'; else inputList\">\n <div class=\"m-form-label-field\">\n <label id=\"form_date-label\" for=\"form_date\" class=\"a-label\">\n {{ '@pry.action.selectDate' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"form_date\"\n type=\"date\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'form-date-label form-date-error' : 'form-date-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"form_date-error\"\n for=\"form_date\"\n class=\"a-label a-label--help -error\"\n >\n {{ '@pry.admin.required' | i18n }}\n </label>\n </div>\n </ng-container>\n\n <ng-template #inputList>\n <ng-container *ngIf=\"form.value['metadata']['type'] === 'LIST'; else inputText\">\n <div class=\"m-form-label-field\">\n <label id=\"list-label\" class=\"a-label\" for=\"list\">{{ '@pry.action.choiceInList' | i18n }}</label>\n <pry-select\n id=\"list\"\n class=\"a-pry-select\"\n formControlName=\"value\"\n [items]=\"form.value['metadata']['allowedValues']\"\n [isForm]=\"true\"\n aria-labelledby=\"list-label\"\n ></pry-select>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #inputText>\n <div class=\"m-form-label-field\">\n <label id=\"text-label\" class=\"a-label\" for=\"text\">\n {{ '@pry.action.text' | i18n }} *\n <span class=\"u-visually-hidden\">({{ '@pry.admin.required' | i18n }})</span>\n </label>\n <input\n id=\"text\"\n type=\"text\"\n class=\"a-form-field\"\n formControlName=\"value\"\n [attr.aria-labelledby]=\"\n isSubmitted && form.get('value')?.invalid ? 'text-label text-error' : 'text-label'\n \"\n [attr.aria-invalid]=\"isSubmitted && form.get('value')?.invalid\"\n required\n />\n <label\n *ngIf=\"isSubmitted && form.get('value')?.invalid\"\n id=\"test-error\"\n for=\"text\"\n class=\"a-label a-label--help -error\"\n >\n <span *ngIf=\"form.get('value')?.hasError('required')\">{{ '@pry.admin.required' | i18n }}</span>\n <ng-container *ngIf=\"form.get('value')?.hasError('pattern')\">\n <span *ngIf=\"form.value['metadata']['type'] === 'DOUBLE'\">\n {{ '@pry.admin.environment.formatDouble' | i18n }}\n </span>\n <span *ngIf=\"form.value['metadata']['type'] === 'INTEGER'\">\n {{ '@pry.admin.environment.formatInt' | i18n }}\n </span>\n </ng-container>\n </label>\n </div>\n </ng-template>\n </fieldset>\n\n <div class=\"m-btn-group -end\">\n <button type=\"submit\" class=\"a-btn a-btn--primary\">\n {{ (editable ? '@pry.action.editMetadata' : '@pry.action.addMetadata') | i18n }}\n </button>\n </div>\n </form>\n </ng-container>\n</ng-container>\n" }]
100
119
  }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.FormBuilder }]; }, propDecorators: { targetId: [{
101
120
  type: Input
102
121
  }], editable: [{
@@ -107,5 +126,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImpor
107
126
  type: Output
108
127
  }], metadata: [{
109
128
  type: Input
129
+ }], initialMetadataSelection: [{
130
+ type: Input
110
131
  }] } });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL2NvbXBvbmVudHMvbWV0YWRhdGEtZWRpdG9yL21ldGFkYXRhLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9jb21wb25lbnRzL21ldGFkYXRhLWVkaXRvci9tZXRhZGF0YS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBMEMsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7QUFJOUQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsZUFBZSxDQUFDO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0FBSy9ELE1BQU0sT0FBTywwQkFBMkIsU0FBUSx3QkFBd0I7SUFZdEUsSUFBYSxRQUFRLENBQUMsUUFBMEM7UUFDOUQsYUFBYTtRQUNiLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO1FBQ3BGLElBQUksYUFBYSxFQUFF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QUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDaEIsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQ2hDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs4R0E5RlUsMEJBQTBCO2tHQUExQiwwQkFBMEIsMk5DaEJ2Qyxva05BNkpBOzsyRkQ3SWEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNFLHFCQUFxQjtzSEFPdEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFFTSxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IElNZXRhZGF0YSwgTWV0YWRhdGFVc2VyLCBNZXRhZGF0YVZhbHVlLCBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUgfSBmcm9tICdAcHJvdm9seS9kYXNoYm9hcmQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1ldGFkYXRhQWN0aW9ucyB9IGZyb20gJy4vc3RvcmUvbWV0YWRhdGEuYWN0aW9uJztcbmltcG9ydCB7IE1ldGFkYXRhU2VsZWN0b3JzIH0gZnJvbSAnLi9zdG9yZS9tZXRhZGF0YS5zZWxlY3Rvcic7XG5cbmV4cG9ydCB0eXBlIE1ldGFFdmVudFR5cGUgPSB7IGlkOiBzdHJpbmc7IG1ldGFkYXRhSWQ6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfTtcblxuZXhwb3J0IGNvbnN0IElOVEVHRVJfUkVHRVhQX1BBVFRFUk4gPSAnXlsrLV0/WzAtOV0qJCc7XG5leHBvcnQgY29uc3QgRE9VQkxFX1JFR0VYUF9QQVRURVJOID0gJ1srLV0/KFswLTldKlsuXSk/WzAtOV0rJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1tZXRhZGF0YS1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJ21ldGFkYXRhLWVkaXRvci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUHJ5TWV0YWRhdGFFZGl0b3JDb21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUge1xuICBfbWV0YWRhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoTWV0YWRhdGFWYWx1ZSB8IE1ldGFkYXRhVXNlcilbXT4oW10pO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIGlzU3VibWl0dGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhcmdldElkID0gJyc7XG4gIEBJbnB1dCgpIGVkaXRhYmxlID0gZmFsc2U7XG4gIG1ldGFkYXRhRGVmcyQ6IE9ic2VydmFibGU8SU1ldGFkYXRhW10+O1xuICBhdmFpbGFibGVNZXRhZGF0YSQ6IE9ic2VydmFibGU8SU1ldGFkYXRhW10+O1xuICB0eXBlOiAnbWV0YScgfCAndXNlcicgPSAnbWV0YSc7XG4gIEBPdXRwdXQoKSBhZGRNZXRhID0gbmV3IEV2ZW50RW1pdHRlcjxNZXRhRXZlbnRUeXBlPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlTWV0YSA9IG5ldyBFdmVudEVtaXR0ZXI8TWV0YUV2ZW50VHlwZT4oKTtcblxuICBASW5wdXQoKSBzZXQgbWV0YWRhdGEobWV0YWRhdGE6IE1ldGFkYXRhVmFsdWVbXSB8IE1ldGFkYXRhVXNlcltdKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGlzVXNlclByb2ZpbGUgPSBtZXRhZGF0YS5sZW5ndGggPj0gMSAmJiBtZXRhZGF0YVswXS51c2VyUHJvZmlsZSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChpc1VzZXJQcm9maWxlKSB7XG4gICAgICB0aGlzLnR5cGUgPSAndXNlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHlwZSA9ICdtZXRhJztcbiAgICB9XG4gICAgdGhpcy5fbWV0YWRhdGEkLm5leHQobWV0YWRhdGEpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogU3RvcmUsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgbWV0YWRhdGE6IFt7fSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHZhbHVlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oSU5URUdFUl9SRUdFWFBfUEFUVEVSTildXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tZXRhZGF0YURlZnMkID0gdGhpcy5zdG9yZS5zZWxlY3QoTWV0YWRhdGFTZWxlY3RvcnMubWV0YWRhdGEpO1xuICAgIHRoaXMuYXZhaWxhYmxlTWV0YWRhdGEkID0gY29tYmluZUxhdGVzdChbdGhpcy5fbWV0YWRhdGEkLCB0aGlzLm1ldGFkYXRhRGVmcyRdKS5waXBlKFxuICAgICAgbWFwKChbbWV0YWRhdGEsIG1ldGFEZWZzXSkgPT4ge1xuICAgICAgICBsZXQgZGF0YXNldE1ldGFkYXRhSWRzID0gbWV0YWRhdGE/Lm1hcCgodSkgPT5cbiAgICAgICAgICB0aGlzLnR5cGUgPT09ICdtZXRhJyA/ICh1IGFzIE1ldGFkYXRhVmFsdWUpLm1ldGFkYXRhRGVmLmlkIDogKHUgYXMgTWV0YWRhdGFVc2VyKS51c2VyUHJvZmlsZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWV0YURlZnMuZmlsdGVyKChtZXRhKSA9PiAhZGF0YXNldE1ldGFkYXRhSWRzPy5pbmNsdWRlcyhtZXRhLmlkKSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5hdmFpbGFibGVNZXRhZGF0YSQuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBtZXRhZGF0YTogbWV0YVswXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbk1ldGFDaGFuZ2UobWV0YVswXSk7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgdmFsdWU6ICcnIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb25NZXRhQ2hhbmdlKG1ldGFkYXRhOiBJTWV0YWRhdGEpIHtcbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnSU5URUdFUicpIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzWyd2YWx1ZSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybihJTlRFR0VSX1JFR0VYUF9QQVRURVJOKV0pO1xuICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS50eXBlID09PSAnRE9VQkxFJykge1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3ZhbHVlJ10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKERPVUJMRV9SRUdFWFBfUEFUVEVSTildKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1sndmFsdWUnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZWRpdE1ldGFkYXRhKGN1cnJlbnRNZXRhZGF0YTogTWV0YWRhdGFWYWx1ZSB8IE1ldGFkYXRhVXNlcikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goTWV0YWRhdGFBY3Rpb25zLmlzRWRpdGFibGUoeyBlZGl0YWJsZTogdHJ1ZSB9KSk7XG4gICAgbGV0IHZhbHVlID0gY3VycmVudE1ldGFkYXRhLnZhbHVlO1xuICAgIGxldCBkYXRhc2V0TWV0YWRhdGFEZWYgPSB0aGlzLm1ldGFEZWZpbml0aW9uKGN1cnJlbnRNZXRhZGF0YSk7XG5cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBtZXRhZGF0YTogZGF0YXNldE1ldGFkYXRhRGVmLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gICAgdGhpcy5vbk1ldGFDaGFuZ2UoZGF0YXNldE1ldGFkYXRhRGVmKTtcbiAgfVxuXG4gIG1ldGFEZWZpbml0aW9uKG1ldGFkYXRhOiBNZXRhZGF0YVVzZXIgfCBNZXRhZGF0YVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3VzZXInID8gKG1ldGFkYXRhIGFzIE1ldGFkYXRhVXNlcikudXNlclByb2ZpbGUgOiAobWV0YWRhdGEgYXMgTWV0YWRhdGFWYWx1ZSkubWV0YWRhdGFEZWY7XG4gIH1cblxuICByZW1vdmVNZXRhZGF0YShtZXRhZGF0YTogTWV0YWRhdGFVc2VyIHwgTWV0YWRhdGFWYWx1ZSkge1xuICAgIHRoaXMucmVtb3ZlTWV0YS5lbWl0KHsgaWQ6IHRoaXMudGFyZ2V0SWQsIG1ldGFkYXRhSWQ6IHRoaXMubWV0YURlZmluaXRpb24obWV0YWRhdGEpLmlkIH0pO1xuICB9XG5cbiAgYWRkRGF0YXNldE1ldGFkYXRhKCkge1xuICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRkTWV0YS5lbWl0KHtcbiAgICAgICAgaWQ6IHRoaXMudGFyZ2V0SWQsXG4gICAgICAgIG1ldGFkYXRhSWQ6IHRoaXMuZm9ybS52YWx1ZVsnbWV0YWRhdGEnXVsnaWQnXSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS52YWx1ZVsndmFsdWUnXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICpuZ0Zvcj1cImxldCBtZXRhZGF0YSBvZiAoX21ldGFkYXRhJCB8IGFzeW5jKSA/PyBbXVwiPlxuICA8ZGl2IGNsYXNzPVwiby10YWJzX19wYW5lbF9fY29udGVudF9fYWN0aW9uc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJvLXRhYnNfX3BhbmVsX19jb250ZW50X19hY3Rpb25zX190ZXh0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm8tdGFic19fcGFuZWxfX2NvbnRlbnRfX2FjdGlvbnNfX3RleHRfX2xhYmVsXCI+e3sgbWV0YURlZmluaXRpb24obWV0YWRhdGEpLm5hbWUgfX0gOjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiby10YWJzX19wYW5lbF9fY29udGVudF9fYWN0aW9uc19fdGV4dF9fdmFsdWVcIj57eyBtZXRhZGF0YS52YWx1ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJvLXRhYnNfX3BhbmVsX19jb250ZW50X19hY3Rpb25zX19idXR0b25zXCI+XG4gICAgICA8bmctY29udGFpbmVyICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2FkbWluJywgcGFnZTogJ2RhdGFzZXQnLCBhY3Rpb246ICd3cml0ZScgfVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIiBhcmlhLXByZXNzZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS5hY3Rpb24uZWRpdCcgfCBpMThuIH19IHt7IG1ldGFEZWZpbml0aW9uKG1ldGFkYXRhKS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgY2xhc3M9XCJlZGl0LWljb25cIlxuICAgICAgICAgICAgaWNvblN2Zz1cImVkaXRcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRNZXRhZGF0YShtZXRhZGF0YSlcIlxuICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLmRlbGV0ZScgfCBpMThuIH19IHt7IG1ldGFEZWZpbml0aW9uKG1ldGFkYXRhKS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgY2xhc3M9XCJkZWxldGUtaWNvblwiXG4gICAgICAgICAgICBpY29uU3ZnPVwiZGVsZXRlXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVNZXRhZGF0YShtZXRhZGF0YSlcIlxuICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpwcnlBY2Nlc3M9XCJ7IG1vZHVsZTogJ2FkbWluJywgcGFnZTogJ2RhdGFzZXQnLCBhY3Rpb246ICd3cml0ZScgfVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS52YWx1ZS5tZXRhZGF0YVwiPlxuICAgIDxmb3JtIGNsYXNzPVwiby1mb3JtIC1ib3JkZXItdG9wXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cImFkZERhdGFzZXRNZXRhZGF0YSgpXCI+XG4gICAgICA8ZmllbGRzZXQ+XG4gICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LmFjdGlvbi5lZGl0UHJvZmlsJyB8IGkxOG4gfX08L2xlZ2VuZD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1ldGFkYXRhXCIgaWQ9XCJtZXRhZGF0YS1sYWJlbFwiIGNsYXNzPVwiYS1sYWJlbFwiPkRhdGE8L2xhYmVsPlxuICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICBpZD1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYS1wcnktc2VsZWN0XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJhdmFpbGFibGVNZXRhZGF0YSQgfCBhc3luY1wiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1ldGFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaXNGb3JtXT1cInRydWVcIlxuICAgICAgICAgICAgW2l0ZW1zQXNPcHRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgICAgIGlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCdtZXRhZGF0YScpPy5pbnZhbGlkID8gJ21ldGFkYXRhLWxhYmVsIG1ldGFkYXRhLWVycm9yJyA6ICdtZXRhZGF0YS1sYWJlbCdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaXNTdWJtaXR0ZWQgJiYgZm9ybS5nZXQoJ21ldGFkYXRhJyk/LmludmFsaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAqbmdJZj1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCdtZXRhZGF0YScpPy5pbnZhbGlkXCJcbiAgICAgICAgICAgIGlkPVwibWV0YWRhdGEtZXJyb3JcIlxuICAgICAgICAgICAgZm9yPVwibWV0YWRhdGFcIlxuICAgICAgICAgICAgY2xhc3M9XCJhLWxhYmVsIGEtbGFiZWwtLWhlbHAgLWVycm9yXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnQHByeS5hZG1pbi5yZXF1aXJlZCcgfCBpMThuIH19XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0udmFsdWVbJ21ldGFkYXRhJ11bJ3R5cGUnXSA9PT0gJ0RBVEUnOyBlbHNlIGlucHV0TGlzdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBpZD1cImZvcm1fZGF0ZS1sYWJlbFwiIGZvcj1cImZvcm1fZGF0ZVwiIGNsYXNzPVwiYS1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAnQHByeS5hY3Rpb24uc2VsZWN0RGF0ZScgfCBpMThuIH19ICpcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPih7eyAnQHByeS5hZG1pbi5yZXF1aXJlZCcgfCBpMThuIH19KTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJmb3JtX2RhdGVcIlxuICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgICAgICAgaXNTdWJtaXR0ZWQgJiYgZm9ybS5nZXQoJ3ZhbHVlJyk/LmludmFsaWQgPyAnZm9ybS1kYXRlLWxhYmVsIGZvcm0tZGF0ZS1lcnJvcicgOiAnZm9ybS1kYXRlLWxhYmVsJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaXNTdWJtaXR0ZWQgJiYgZm9ybS5nZXQoJ3ZhbHVlJyk/LmludmFsaWRcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCd2YWx1ZScpPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgaWQ9XCJmb3JtX2RhdGUtZXJyb3JcIlxuICAgICAgICAgICAgICBmb3I9XCJmb3JtX2RhdGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImEtbGFiZWwgYS1sYWJlbC0taGVscCAtZXJyb3JcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnQHByeS5hZG1pbi5yZXF1aXJlZCcgfCBpMThuIH19XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2lucHV0TGlzdD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS52YWx1ZVsnbWV0YWRhdGEnXVsndHlwZSddID09PSAnTElTVCc7IGVsc2UgaW5wdXRUZXh0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBpZD1cImxpc3QtbGFiZWxcIiBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJsaXN0XCI+e3sgJ0BwcnkuYWN0aW9uLmNob2ljZUluTGlzdCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICBpZD1cImxpc3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1wcnktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZvcm0udmFsdWVbJ21ldGFkYXRhJ11bJ2FsbG93ZWRWYWx1ZXMnXVwiXG4gICAgICAgICAgICAgICAgW2lzRm9ybV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJsaXN0LWxhYmVsXCJcbiAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjaW5wdXRUZXh0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBpZD1cInRleHQtbGFiZWxcIiBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJ0ZXh0XCI+XG4gICAgICAgICAgICAgIHt7ICdAcHJ5LmFjdGlvbi50ZXh0JyB8IGkxOG4gfX0gKlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+KHt7ICdAcHJ5LmFkbWluLnJlcXVpcmVkJyB8IGkxOG4gfX0pPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInRleHRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgICAgICAgaXNTdWJtaXR0ZWQgJiYgZm9ybS5nZXQoJ3ZhbHVlJyk/LmludmFsaWQgPyAndGV4dC1sYWJlbCB0ZXh0LWVycm9yJyA6ICd0ZXh0LWxhYmVsJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaXNTdWJtaXR0ZWQgJiYgZm9ybS5nZXQoJ3ZhbHVlJyk/LmludmFsaWRcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCd2YWx1ZScpPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgaWQ9XCJ0ZXN0LWVycm9yXCJcbiAgICAgICAgICAgICAgZm9yPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1sYWJlbCBhLWxhYmVsLS1oZWxwIC1lcnJvclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybS5nZXQoJ3ZhbHVlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+e3sgJ0BwcnkuYWRtaW4ucmVxdWlyZWQnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0uZ2V0KCd2YWx1ZScpPy5oYXNFcnJvcigncGF0dGVybicpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtLnZhbHVlWydtZXRhZGF0YSddWyd0eXBlJ10gPT09ICdET1VCTEUnXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQHByeS5hZG1pbi5lbnZpcm9ubWVudC5mb3JtYXREb3VibGUnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm0udmFsdWVbJ21ldGFkYXRhJ11bJ3R5cGUnXSA9PT0gJ0lOVEVHRVInXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQHByeS5hZG1pbi5lbnZpcm9ubWVudC5mb3JtYXRJbnQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9maWVsZHNldD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwIC1lbmRcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiPlxuICAgICAgICAgIHt7IChlZGl0YWJsZSA/ICdAcHJ5LmFkbWluLnVzZXJJbmZvLmVkaXRNZXRhZGF0YScgOiAnQHByeS5hZG1pbi51c2VySW5mby5hZGRNZXRhZGF0YScpIHwgaTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL2NvbXBvbmVudHMvbWV0YWRhdGEtZWRpdG9yL21ldGFkYXRhLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9jb21wb25lbnRzL21ldGFkYXRhLWVkaXRvci9tZXRhZGF0YS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBMEMsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7QUFJOUQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsZUFBZSxDQUFDO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0FBSy9ELE1BQU0sT0FBTywwQkFBMkIsU0FBUSx3QkFBd0I7SUFhdEUsSUFBYSxRQUFRLENBQUMsUUFBMEM7UUFDOUQsYUFBYTtRQUNiLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO1FBQ3BGLElBQUksYUFBYSxFQUFF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LENBQUM7SUFDNUYsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoQixFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzdDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDaEMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzhHQWpIVSwwQkFBMEI7a0dBQTFCLDBCQUEwQixpUkNoQnZDLG9qTkE2SkE7OzJGRDdJYSwwQkFBMEI7a0JBSnRDLFNBQVM7K0JBQ0UscUJBQXFCO3NIQVF0QixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVNLFFBQVE7c0JBQXBCLEtBQUs7Z0JBV08sd0JBQXdCO3NCQUFwQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IElNZXRhZGF0YSwgTWV0YWRhdGFVc2VyLCBNZXRhZGF0YVZhbHVlLCBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUgfSBmcm9tICdAcHJvdm9seS9kYXNoYm9hcmQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1ldGFkYXRhQWN0aW9ucyB9IGZyb20gJy4vc3RvcmUvbWV0YWRhdGEuYWN0aW9uJztcbmltcG9ydCB7IE1ldGFkYXRhU2VsZWN0b3JzIH0gZnJvbSAnLi9zdG9yZS9tZXRhZGF0YS5zZWxlY3Rvcic7XG5cbmV4cG9ydCB0eXBlIE1ldGFFdmVudFR5cGUgPSB7IGlkOiBzdHJpbmc7IG1ldGFkYXRhSWQ6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfTtcblxuZXhwb3J0IGNvbnN0IElOVEVHRVJfUkVHRVhQX1BBVFRFUk4gPSAnXlsrLV0/WzAtOV0qJCc7XG5leHBvcnQgY29uc3QgRE9VQkxFX1JFR0VYUF9QQVRURVJOID0gJ1srLV0/KFswLTldKlsuXSk/WzAtOV0rJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1tZXRhZGF0YS1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJ21ldGFkYXRhLWVkaXRvci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUHJ5TWV0YWRhdGFFZGl0b3JDb21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUge1xuICBfbWV0YWRhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoTWV0YWRhdGFWYWx1ZSB8IE1ldGFkYXRhVXNlcilbXT4oW10pO1xuICBfaW5pdGlhbE1ldGFkYXRhU2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIGZvcm06IEZvcm1Hcm91cDtcbiAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgdGFyZ2V0SWQgPSAnJztcbiAgQElucHV0KCkgZWRpdGFibGUgPSBmYWxzZTtcbiAgbWV0YWRhdGFEZWZzJDogT2JzZXJ2YWJsZTxJTWV0YWRhdGFbXT47XG4gIGF2YWlsYWJsZU1ldGFkYXRhJDogT2JzZXJ2YWJsZTxJTWV0YWRhdGFbXT47XG4gIHR5cGU6ICdtZXRhJyB8ICd1c2VyJyA9ICdtZXRhJztcbiAgQE91dHB1dCgpIGFkZE1ldGEgPSBuZXcgRXZlbnRFbWl0dGVyPE1ldGFFdmVudFR5cGU+KCk7XG4gIEBPdXRwdXQoKSByZW1vdmVNZXRhID0gbmV3IEV2ZW50RW1pdHRlcjxNZXRhRXZlbnRUeXBlPigpO1xuXG4gIEBJbnB1dCgpIHNldCBtZXRhZGF0YShtZXRhZGF0YTogTWV0YWRhdGFWYWx1ZVtdIHwgTWV0YWRhdGFVc2VyW10pIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaXNVc2VyUHJvZmlsZSA9IG1ldGFkYXRhLmxlbmd0aCA+PSAxICYmIG1ldGFkYXRhWzBdLnVzZXJQcm9maWxlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzVXNlclByb2ZpbGUpIHtcbiAgICAgIHRoaXMudHlwZSA9ICd1c2VyJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50eXBlID0gJ21ldGEnO1xuICAgIH1cbiAgICB0aGlzLl9tZXRhZGF0YSQubmV4dChtZXRhZGF0YSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaW5pdGlhbE1ldGFkYXRhU2VsZWN0aW9uKG1ldGFkYXRhTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faW5pdGlhbE1ldGFkYXRhU2VsZWN0aW9uJC5uZXh0KG1ldGFkYXRhTmFtZSk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBTdG9yZSwgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBtZXRhZGF0YTogW3t9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgdmFsdWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybihJTlRFR0VSX1JFR0VYUF9QQVRURVJOKV1dXG4gICAgfSk7XG5cbiAgICB0aGlzLm1ldGFkYXRhRGVmcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChNZXRhZGF0YVNlbGVjdG9ycy5tZXRhZGF0YSk7XG4gICAgdGhpcy5hdmFpbGFibGVNZXRhZGF0YSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9tZXRhZGF0YSQsIHRoaXMubWV0YWRhdGFEZWZzJF0pLnBpcGUoXG4gICAgICBtYXAoKFttZXRhZGF0YSwgbWV0YURlZnNdKSA9PiB7XG4gICAgICAgIGxldCBkYXRhc2V0TWV0YWRhdGFJZHMgPSBtZXRhZGF0YT8ubWFwKCh1KSA9PlxuICAgICAgICAgIHRoaXMudHlwZSA9PT0gJ21ldGEnID8gKHUgYXMgTWV0YWRhdGFWYWx1ZSkubWV0YWRhdGFEZWYuaWQgOiAodSBhcyBNZXRhZGF0YVVzZXIpLnVzZXJQcm9maWxlXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtZXRhRGVmcy5maWx0ZXIoKG1ldGEpID0+ICFkYXRhc2V0TWV0YWRhdGFJZHM/LmluY2x1ZGVzKG1ldGEuaWQpKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZnMkLFxuICAgICAgICB0aGlzLmF2YWlsYWJsZU1ldGFkYXRhJCxcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEkLFxuICAgICAgICB0aGlzLl9pbml0aWFsTWV0YWRhdGFTZWxlY3Rpb24kXG4gICAgICBdKS5zdWJzY3JpYmUoKFthbGxNZXRhLCBhdmFpbGFibGVNZXRhLCBpbnB1dE1ldGEsIGluaXRpYWxseVNlbGVjdGVkTWV0YV0pID0+IHtcbiAgICAgICAgbGV0IGluaXRpYWxseVNlbGVjdGVkTWV0YUF2YWlsYWJsZSA9IGF2YWlsYWJsZU1ldGEuZmluZCgobWV0YWRhdGEpID0+IG1ldGFkYXRhLm5hbWUgPT09IGluaXRpYWxseVNlbGVjdGVkTWV0YSk7XG4gICAgICAgIGlmICghIWluaXRpYWxseVNlbGVjdGVkTWV0YUF2YWlsYWJsZSkge1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbml0aWFsbHlTZWxlY3RlZE1ldGFBdmFpbGFibGUgPz8gYXZhaWxhYmxlTWV0YVswXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMub25NZXRhQ2hhbmdlKGluaXRpYWxseVNlbGVjdGVkTWV0YUF2YWlsYWJsZSA/PyBhdmFpbGFibGVNZXRhWzBdKTtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IHZhbHVlOiAnJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKE1ldGFkYXRhQWN0aW9ucy5pc0VkaXRhYmxlKHsgZWRpdGFibGU6IHRydWUgfSkpO1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiBhbGxNZXRhLmZpbmQoKG1ldGFkYXRhKSA9PiBtZXRhZGF0YS5uYW1lID09PSBpbml0aWFsbHlTZWxlY3RlZE1ldGEpLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0TWV0YS5maW5kKChtZXRhKSA9PiB0aGlzLm1ldGFEZWZpbml0aW9uKG1ldGEpLm5hbWUgPT09IGluaXRpYWxseVNlbGVjdGVkTWV0YSk/LnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG9uTWV0YUNoYW5nZShtZXRhZGF0YTogSU1ldGFkYXRhKSB7XG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICBpZiAobWV0YWRhdGEudHlwZSA9PT0gJ0lOVEVHRVInKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1sndmFsdWUnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oSU5URUdFUl9SRUdFWFBfUEFUVEVSTildKTtcbiAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEudHlwZSA9PT0gJ0RPVUJMRScpIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzWyd2YWx1ZSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybihET1VCTEVfUkVHRVhQX1BBVFRFUk4pXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3ZhbHVlJ10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVkaXRNZXRhZGF0YShjdXJyZW50TWV0YWRhdGE6IE1ldGFkYXRhVmFsdWUgfCBNZXRhZGF0YVVzZXIpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKE1ldGFkYXRhQWN0aW9ucy5pc0VkaXRhYmxlKHsgZWRpdGFibGU6IHRydWUgfSkpO1xuICAgIGxldCB2YWx1ZSA9IGN1cnJlbnRNZXRhZGF0YS52YWx1ZTtcbiAgICBsZXQgZGF0YXNldE1ldGFkYXRhRGVmID0gdGhpcy5tZXRhRGVmaW5pdGlvbihjdXJyZW50TWV0YWRhdGEpO1xuXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgbWV0YWRhdGE6IGRhdGFzZXRNZXRhZGF0YURlZixcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICAgIHRoaXMub25NZXRhQ2hhbmdlKGRhdGFzZXRNZXRhZGF0YURlZik7XG4gIH1cblxuICBtZXRhRGVmaW5pdGlvbihtZXRhZGF0YTogTWV0YWRhdGFVc2VyIHwgTWV0YWRhdGFWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICd1c2VyJyA/IChtZXRhZGF0YSBhcyBNZXRhZGF0YVVzZXIpLnVzZXJQcm9maWxlIDogKG1ldGFkYXRhIGFzIE1ldGFkYXRhVmFsdWUpLm1ldGFkYXRhRGVmO1xuICB9XG5cbiAgcmVtb3ZlTWV0YWRhdGEobWV0YWRhdGE6IE1ldGFkYXRhVXNlciB8IE1ldGFkYXRhVmFsdWUpIHtcbiAgICB0aGlzLnJlbW92ZU1ldGEuZW1pdCh7IGlkOiB0aGlzLnRhcmdldElkLCBtZXRhZGF0YUlkOiB0aGlzLm1ldGFEZWZpbml0aW9uKG1ldGFkYXRhKS5pZCB9KTtcbiAgfVxuXG4gIGFkZERhdGFzZXRNZXRhZGF0YSgpIHtcbiAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLmlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmFkZE1ldGEuZW1pdCh7XG4gICAgICAgIGlkOiB0aGlzLnRhcmdldElkLFxuICAgICAgICBtZXRhZGF0YUlkOiB0aGlzLmZvcm0udmFsdWVbJ21ldGFkYXRhJ11bJ2lkJ10sXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm0udmFsdWVbJ3ZhbHVlJ11cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdGb3I9XCJsZXQgbWV0YWRhdGEgb2YgKF9tZXRhZGF0YSQgfCBhc3luYykgPz8gW11cIj5cbiAgPGRpdiBjbGFzcz1cIm8tdGFic19fcGFuZWxfX2NvbnRlbnRfX2FjdGlvbnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby10YWJzX19wYW5lbF9fY29udGVudF9fYWN0aW9uc19fdGV4dFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvLXRhYnNfX3BhbmVsX19jb250ZW50X19hY3Rpb25zX190ZXh0X19sYWJlbFwiPnt7IG1ldGFEZWZpbml0aW9uKG1ldGFkYXRhKS5uYW1lIH19IDo8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cIm8tdGFic19fcGFuZWxfX2NvbnRlbnRfX2FjdGlvbnNfX3RleHRfX3ZhbHVlXCI+e3sgbWV0YWRhdGEudmFsdWUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiby10YWJzX19wYW5lbF9fY29udGVudF9fYWN0aW9uc19fYnV0dG9uc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqcHJ5QWNjZXNzPVwieyBtb2R1bGU6ICdhZG1pbicsIHBhZ2U6ICdkYXRhc2V0JywgYWN0aW9uOiAnd3JpdGUnIH1cIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgYXJpYS1wcmVzc2VkPVwiZmFsc2VcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkuYWN0aW9uLmVkaXQnIHwgaTE4biB9fSB7eyBtZXRhRGVmaW5pdGlvbihtZXRhZGF0YSkubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1pY29uXCJcbiAgICAgICAgICAgIGljb25Tdmc9XCJlZGl0XCJcbiAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgIChjbGljayk9XCJlZGl0TWV0YWRhdGEobWV0YWRhdGEpXCJcbiAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiIGFyaWEtcHJlc3NlZD1cImZhbHNlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LmFjdGlvbi5kZWxldGUnIHwgaTE4biB9fSB7eyBtZXRhRGVmaW5pdGlvbihtZXRhZGF0YSkubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZGVsZXRlLWljb25cIlxuICAgICAgICAgICAgaWNvblN2Zz1cImRlbGV0ZVwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlTWV0YWRhdGEobWV0YWRhdGEpXCJcbiAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqcHJ5QWNjZXNzPVwieyBtb2R1bGU6ICdhZG1pbicsIHBhZ2U6ICdkYXRhc2V0JywgYWN0aW9uOiAnd3JpdGUnIH1cIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0udmFsdWUubWV0YWRhdGFcIj5cbiAgICA8Zm9ybSBjbGFzcz1cIm8tZm9ybSAtYm9yZGVyLXRvcFwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJhZGREYXRhc2V0TWV0YWRhdGEoKVwiPlxuICAgICAgPGZpZWxkc2V0PlxuICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS5hY3Rpb24uZWRpdFByb2ZpbCcgfCBpMThuIH19PC9sZWdlbmQ+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJtZXRhZGF0YVwiIGlkPVwibWV0YWRhdGEtbGFiZWxcIiBjbGFzcz1cImEtbGFiZWxcIj5EYXRhPC9sYWJlbD5cbiAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgaWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICBjbGFzcz1cImEtcHJ5LXNlbGVjdFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICBbaXRlbXNdPVwiYXZhaWxhYmxlTWV0YWRhdGEkIHwgYXN5bmNcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25NZXRhQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW2lzRm9ybV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtpdGVtc0FzT3B0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgICAgICBpc1N1Ym1pdHRlZCAmJiBmb3JtLmdldCgnbWV0YWRhdGEnKT8uaW52YWxpZCA/ICdtZXRhZGF0YS1sYWJlbCBtZXRhZGF0YS1lcnJvcicgOiAnbWV0YWRhdGEtbGFiZWwnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCdtZXRhZGF0YScpPy5pbnZhbGlkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9wcnktc2VsZWN0PlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgKm5nSWY9XCJpc1N1Ym1pdHRlZCAmJiBmb3JtLmdldCgnbWV0YWRhdGEnKT8uaW52YWxpZFwiXG4gICAgICAgICAgICBpZD1cIm1ldGFkYXRhLWVycm9yXCJcbiAgICAgICAgICAgIGZvcj1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYS1sYWJlbCBhLWxhYmVsLS1oZWxwIC1lcnJvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0BwcnkuYWRtaW4ucmVxdWlyZWQnIHwgaTE4biB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtLnZhbHVlWydtZXRhZGF0YSddWyd0eXBlJ10gPT09ICdEQVRFJzsgZWxzZSBpbnB1dExpc3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJmb3JtX2RhdGUtbGFiZWxcIiBmb3I9XCJmb3JtX2RhdGVcIiBjbGFzcz1cImEtbGFiZWxcIj5cbiAgICAgICAgICAgICAge3sgJ0BwcnkuYWN0aW9uLnNlbGVjdERhdGUnIHwgaTE4biB9fSAqXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj4oe3sgJ0BwcnkuYWRtaW4ucmVxdWlyZWQnIHwgaTE4biB9fSk8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwiZm9ybV9kYXRlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCd2YWx1ZScpPy5pbnZhbGlkID8gJ2Zvcm0tZGF0ZS1sYWJlbCBmb3JtLWRhdGUtZXJyb3InIDogJ2Zvcm0tZGF0ZS1sYWJlbCdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCd2YWx1ZScpPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1N1Ym1pdHRlZCAmJiBmb3JtLmdldCgndmFsdWUnKT8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIGlkPVwiZm9ybV9kYXRlLWVycm9yXCJcbiAgICAgICAgICAgICAgZm9yPVwiZm9ybV9kYXRlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhLWxhYmVsIGEtbGFiZWwtLWhlbHAgLWVycm9yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0BwcnkuYWRtaW4ucmVxdWlyZWQnIHwgaTE4biB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNpbnB1dExpc3Q+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0udmFsdWVbJ21ldGFkYXRhJ11bJ3R5cGUnXSA9PT0gJ0xJU1QnOyBlbHNlIGlucHV0VGV4dFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgaWQ9XCJsaXN0LWxhYmVsXCIgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibGlzdFwiPnt7ICdAcHJ5LmFjdGlvbi5jaG9pY2VJbkxpc3QnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgaWQ9XCJsaXN0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImEtcHJ5LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmb3JtLnZhbHVlWydtZXRhZGF0YSddWydhbGxvd2VkVmFsdWVzJ11cIlxuICAgICAgICAgICAgICAgIFtpc0Zvcm1dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwibGlzdC1sYWJlbFwiXG4gICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2lucHV0VGV4dD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgaWQ9XCJ0ZXh0LWxhYmVsXCIgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwidGV4dFwiPlxuICAgICAgICAgICAgICB7eyAnQHByeS5hY3Rpb24udGV4dCcgfCBpMThuIH19ICpcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPih7eyAnQHByeS5hZG1pbi5yZXF1aXJlZCcgfCBpMThuIH19KTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCd2YWx1ZScpPy5pbnZhbGlkID8gJ3RleHQtbGFiZWwgdGV4dC1lcnJvcicgOiAndGV4dC1sYWJlbCdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIGZvcm0uZ2V0KCd2YWx1ZScpPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1N1Ym1pdHRlZCAmJiBmb3JtLmdldCgndmFsdWUnKT8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIGlkPVwidGVzdC1lcnJvclwiXG4gICAgICAgICAgICAgIGZvcj1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImEtbGFiZWwgYS1sYWJlbC0taGVscCAtZXJyb3JcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm0uZ2V0KCd2YWx1ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPnt7ICdAcHJ5LmFkbWluLnJlcXVpcmVkJyB8IGkxOG4gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtLmdldCgndmFsdWUnKT8uaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybS52YWx1ZVsnbWV0YWRhdGEnXVsndHlwZSddID09PSAnRE9VQkxFJ1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0BwcnkuYWRtaW4uZW52aXJvbm1lbnQuZm9ybWF0RG91YmxlJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtLnZhbHVlWydtZXRhZGF0YSddWyd0eXBlJ10gPT09ICdJTlRFR0VSJ1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0BwcnkuYWRtaW4uZW52aXJvbm1lbnQuZm9ybWF0SW50JyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cCAtZW5kXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIj5cbiAgICAgICAgICB7eyAoZWRpdGFibGUgPyAnQHByeS5hY3Rpb24uZWRpdE1ldGFkYXRhJyA6ICdAcHJ5LmFjdGlvbi5hZGRNZXRhZGF0YScpIHwgaTE4biB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==