@provoly/dashboard 1.1.1 → 1.1.3

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 (89) hide show
  1. package/dataset/components/dataset-detail/dataset-detail.component.d.ts +1 -0
  2. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +4 -3
  3. package/esm2022/lib/core/components/share/access-rights-share/access-rights-share.component.mjs +127 -0
  4. package/esm2022/lib/core/components/share/group-share/group-share.component.mjs +1 -1
  5. package/esm2022/lib/core/components/share/legacy-share/share.component.mjs +83 -0
  6. package/esm2022/lib/core/components/share/share.module.mjs +9 -7
  7. package/esm2022/lib/core/components/share/share.utils.mjs +46 -1
  8. package/esm2022/lib/core/i18n/en.translations.mjs +15 -7
  9. package/esm2022/lib/core/i18n/fr.translations.mjs +16 -7
  10. package/esm2022/lib/core/model/manifest.interface.mjs +1 -1
  11. package/esm2022/lib/core/model/widget-aggregated-chart-manifest.interface.mjs +1 -1
  12. package/esm2022/lib/core/public-api.mjs +3 -2
  13. package/esm2022/lib/core/store/aggregation/backend-aggregation.service.mjs +8 -12
  14. package/esm2022/lib/core/store/aggregation/frontend-aggregation/aggregation-utils.class.mjs +5 -11
  15. package/esm2022/lib/core/store/aggregation/frontend-aggregation/frontend-aggregation.service.mjs +6 -6
  16. package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +4 -2
  17. package/esm2022/lib/dashboard/store/dashboard.actions.mjs +1 -1
  18. package/esm2022/lib/dashboard/store/dashboard.effects.mjs +2 -2
  19. package/esm2022/lib/dashboard/store/manifest.service.mjs +3 -3
  20. package/esm2022/presentation/components/presentation.component.mjs +13 -25
  21. package/esm2022/toolbox/components/save-view/save-view.component.mjs +8 -8
  22. package/esm2022/toolbox/components/share/share.component.mjs +9 -15
  23. package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +42 -87
  24. package/esm2022/widgets/widget-aggregated-chart/i18n/en.translations.mjs +2 -1
  25. package/esm2022/widgets/widget-aggregated-chart/i18n/fr.translations.mjs +3 -5
  26. package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +2 -2
  27. package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +2 -2
  28. package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +2 -2
  29. package/esm2022/widgets/widget-iframe/component/widget-iframe.component.mjs +2 -2
  30. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +5 -5
  31. package/esm2022/widgets/widget-map/interaction/tooltip-manager.class.mjs +2 -2
  32. package/esm2022/widgets/widget-map/style/css.component.mjs +2 -2
  33. package/esm2022/widgets/widget-table/component/widget-table.component.mjs +2 -2
  34. package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +2 -2
  35. package/fesm2022/provoly-dashboard-dataset.mjs +3 -2
  36. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  37. package/fesm2022/provoly-dashboard-presentation.mjs +12 -24
  38. package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
  39. package/fesm2022/provoly-dashboard-toolbox.mjs +15 -21
  40. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  41. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +45 -91
  42. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
  43. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +1 -1
  44. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
  45. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +1 -1
  46. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
  47. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +1 -1
  48. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
  49. package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs +1 -1
  50. package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs.map +1 -1
  51. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +7 -7
  52. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  53. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +1 -1
  54. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
  55. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +1 -1
  56. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
  57. package/fesm2022/provoly-dashboard.mjs +214 -48
  58. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  59. package/lib/core/components/share/access-rights-share/access-rights-share.component.d.ts +47 -0
  60. package/lib/core/components/share/{share.component.d.ts → legacy-share/share.component.d.ts} +1 -1
  61. package/lib/core/components/share/share.module.d.ts +10 -8
  62. package/lib/core/components/share/share.utils.d.ts +18 -0
  63. package/lib/core/i18n/en.translations.d.ts +12 -4
  64. package/lib/core/i18n/fr.translations.d.ts +13 -4
  65. package/lib/core/model/manifest.interface.d.ts +3 -1
  66. package/lib/core/model/widget-aggregated-chart-manifest.interface.d.ts +3 -12
  67. package/lib/core/public-api.d.ts +2 -1
  68. package/lib/core/store/aggregation/frontend-aggregation/aggregation-utils.class.d.ts +4 -4
  69. package/lib/core/store/aggregation/frontend-aggregation/frontend-aggregation.service.d.ts +2 -2
  70. package/lib/dashboard/components/widgets/header/widget-header.component.d.ts +3 -1
  71. package/lib/dashboard/store/dashboard.actions.d.ts +6 -2
  72. package/lib/dashboard/store/manifest.service.d.ts +3 -1
  73. package/package.json +31 -31
  74. package/presentation/components/presentation.component.d.ts +7 -7
  75. package/styles/components/_o-access-rights-share.scss +73 -0
  76. package/styles/components/_o-pry-admin-classes-customize.scss +4 -4
  77. package/styles/main.scss +1 -0
  78. package/styles-theme/components-theme/_o-widget.theme.scss +0 -14
  79. package/toolbox/components/save-view/save-view.component.d.ts +6 -2
  80. package/toolbox/components/share/share.component.d.ts +6 -4
  81. package/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.d.ts +9 -7
  82. package/widgets/widget-aggregated-chart/i18n/en.translations.d.ts +1 -0
  83. package/widgets/widget-aggregated-chart/i18n/fr.translations.d.ts +2 -4
  84. package/widgets/widget-iframe/component/widget-iframe.component.d.ts +3 -1
  85. package/widgets/widget-map/component/widget-map.component.d.ts +3 -1
  86. package/widgets/widget-map/style/_m-layer-legend.scss +1 -4
  87. package/widgets/widget-table/component/widget-table.component.d.ts +3 -1
  88. package/widgets/widget-tile/component/widget-tile.component.d.ts +3 -1
  89. package/esm2022/lib/core/components/share/share.component.mjs +0 -83
@@ -11,20 +11,22 @@ export declare class ShareComponent extends ToolboxActionComponent {
11
11
  presentation?: ManifestDescription;
12
12
  modalOpened: boolean;
13
13
  overlayRef?: OverlayRef;
14
- accessGroups: string[];
14
+ accessRightsByGroup: {
15
+ [key: string]: string[];
16
+ };
15
17
  template: TemplateRef<any>;
16
18
  disableShareRadios$: Observable<{
17
19
  [key in PryVisibilityType]: boolean;
18
20
  }>;
19
21
  allowedShareGroups$: Observable<string[]>;
20
- shareRadioValue$: BehaviorSubject<PryVisibilityType | undefined>;
21
22
  disableShareButton$: BehaviorSubject<boolean>;
22
23
  constructor(store: Store, overlay: Overlay, viewContainerRef: ViewContainerRef);
23
24
  trigger(): void;
24
25
  toggleModal(): void;
25
26
  validate(): void;
26
- updateAccessGroups($event: string[]): void;
27
- updateVisibility($event: PryVisibilityType): void;
27
+ updateAccessRights($event: {
28
+ [key: string]: string[];
29
+ }): void;
28
30
  updateDisableButtonValue(): void;
29
31
  static ɵfac: i0.ɵɵFactoryDeclaration<ShareComponent, never>;
30
32
  static ɵcmp: i0.ɵɵComponentDeclaration<ShareComponent, "pry-share-pres", never, {}, {}, never, never, false, never>;
@@ -6,6 +6,7 @@ import { View } from 'vega';
6
6
  import { TopLevelSpec } from 'vega-lite';
7
7
  import { PrySchemeService } from '@provoly/dashboard/components/scheme-picker';
8
8
  import * as i0 from "@angular/core";
9
+ export declare const CHART_INTERVAL_STEP = 3;
9
10
  export declare class WidgetAggregatedChartComponent extends DataWidgetComponent implements AfterViewInit {
10
11
  private translateService;
11
12
  private aggregationService;
@@ -39,7 +40,9 @@ export declare class WidgetAggregatedChartComponent extends DataWidgetComponent
39
40
  data: any;
40
41
  operation: any;
41
42
  }>;
42
- WIDGET_HEADER_HEIGHT: number;
43
+ WIDGET_HEADER_HEIGHT: {
44
+ value: number;
45
+ };
43
46
  GraphType: typeof GraphType;
44
47
  Operation: typeof Operation;
45
48
  isChartValid$: Observable<boolean>;
@@ -104,11 +107,9 @@ export declare class WidgetAggregatedChartComponent extends DataWidgetComponent
104
107
  changeOrdinateLabel($event: any): void;
105
108
  changeKeep0Abscissa($event: any): void;
106
109
  changeKeep0Ordinate($event: any): void;
107
- limitElements($event: any): void;
108
- changeLimit($event: any): void;
109
- changeLimitOthers($event: any): void;
110
- changeLimitOrder($event: any): void;
111
- changeTimeLimit($event: any): void;
110
+ enableIntervals($event: any): void;
111
+ changeInterval($event: any): void;
112
+ changeTimeInterval($event: any): void;
112
113
  toggleLegend($event: any): void;
113
114
  toggleTooltip($event: any): void;
114
115
  toggleGroupBy($event: any): void;
@@ -124,7 +125,7 @@ export declare class WidgetAggregatedChartComponent extends DataWidgetComponent
124
125
  changeSortValue($event: 'key' | 'value'): void;
125
126
  changeSortDirection($event: 'asc' | 'desc'): void;
126
127
  toggleLimitItems($event: boolean): void;
127
- changeLimitItemsValue($event: number | null): void;
128
+ changeLimitValue($event: number | null): void;
128
129
  toImage(): Promise<string>;
129
130
  changeCircleColorScheme($event: any): void;
130
131
  changeBaseColor($event: any): void;
@@ -142,6 +143,7 @@ export declare class WidgetAggregatedChartComponent extends DataWidgetComponent
142
143
  labelAngle?: undefined;
143
144
  };
144
145
  getAbscissaType(abscissaVegaType: VegaType, hasSort: boolean): VegaType;
146
+ isTimeInterval(abscissaInterval: string | number): boolean;
145
147
  static ɵfac: i0.ɵɵFactoryDeclaration<WidgetAggregatedChartComponent, never>;
146
148
  static ɵcmp: i0.ɵɵComponentDeclaration<WidgetAggregatedChartComponent, "pry-widget-aggregated-chart", never, {}, {}, never, never, false, never>;
147
149
  }
@@ -68,6 +68,7 @@ export declare const enTranslations: {
68
68
  stacked: string;
69
69
  noData: string;
70
70
  aggNoResult: string;
71
+ interval: string;
71
72
  scheme: {
72
73
  accent: string;
73
74
  set2: string;
@@ -53,11 +53,9 @@ export declare const frTranslations: {
53
53
  origin: string;
54
54
  limit: string;
55
55
  limitMaxNb: string;
56
- asc: string;
57
- desc: string;
56
+ interval: string;
58
57
  timeInterval: string;
59
- others: string;
60
- order: string;
58
+ specifyInterval: string;
61
59
  groupBy: string;
62
60
  groupAttr: string;
63
61
  colorScheme: string;
@@ -12,7 +12,9 @@ export declare class WidgetIframeComponent extends BaseWidgetComponent {
12
12
  src$: Observable<SafeResourceUrl | undefined>;
13
13
  height$: Observable<number>;
14
14
  optionsCopy: IframeWidgetOptions;
15
- WIDGET_HEADER_HEIGHT: number;
15
+ WIDGET_HEADER_HEIGHT: {
16
+ value: number;
17
+ };
16
18
  iframe?: ElementRef;
17
19
  constructor(store: Store<any>, domSanitizer: DomSanitizer, iframeMessagingService: IframeMessagingService, el: ElementRef);
18
20
  changeSrc($event: Event): void;
@@ -52,7 +52,9 @@ export declare class WidgetMapComponent extends DataWidgetComponent implements A
52
52
  identifier: string;
53
53
  label: string;
54
54
  }[]>;
55
- WIDGET_HEADER_HEIGHT: number;
55
+ WIDGET_HEADER_HEIGHT: {
56
+ value: number;
57
+ };
56
58
  i: number;
57
59
  itemStyles$: Observable<{
58
60
  [id: string]: {
@@ -92,6 +92,7 @@
92
92
 
93
93
  &__title {
94
94
  align-items: flex-start;
95
+ word-break: break-word;
95
96
  }
96
97
 
97
98
  &--radios {
@@ -102,10 +103,6 @@
102
103
  input {
103
104
  margin-top: toRem(3);
104
105
  }
105
-
106
- .a-label {
107
- margin-left: toRem(5)
108
- }
109
106
  }
110
107
  }
111
108
 
@@ -22,7 +22,9 @@ export declare class WidgetTableComponent extends DataWidgetComponent {
22
22
  Array: ArrayConstructor;
23
23
  currentClasses: string[];
24
24
  selectedIds: string[];
25
- WIDGET_HEADER_HEIGHT: number;
25
+ WIDGET_HEADER_HEIGHT: {
26
+ value: number;
27
+ };
26
28
  private classes$;
27
29
  properties$: Observable<{
28
30
  label: string;
@@ -26,7 +26,9 @@ export declare class WidgetTileComponent extends DataWidgetComponent {
26
26
  };
27
27
  classes$: Observable<Class[]>;
28
28
  optionsCopy: TileWidgetOptions;
29
- WIDGET_HEADER_HEIGHT: number;
29
+ WIDGET_HEADER_HEIGHT: {
30
+ value: number;
31
+ };
30
32
  propertiesToDisplay$: Observable<{
31
33
  [p: string]: {
32
34
  label: string;
@@ -1,83 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, forwardRef, Input } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import equal from 'fast-deep-equal/es6';
4
- import { PryVisibilityType } from './share.model';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "../select/select.component";
9
- import * as i4 from "../../i18n/i18n.pipe";
10
- export class PryShareComponent {
11
- constructor(_cd) {
12
- this._cd = _cd;
13
- this._onChange = (_) => { };
14
- this._onTouched = () => { };
15
- this._disabled = false;
16
- this.PryVisibilityType = PryVisibilityType;
17
- this.labelProperty = 'label';
18
- this.valueProperty = 'value';
19
- this.users$ = null;
20
- this.visibilityTypes = [];
21
- }
22
- ngOnInit() {
23
- this.visibilityTypes = Object.keys(PryVisibilityType)
24
- .filter((x) => !(parseInt(x) >= 0))
25
- .filter((x) => (!this.users$ ? x !== PryVisibilityType.RESTRICTED : true))
26
- .map((label) => ({ label: label.toLowerCase(), value: label, icon: `${label.toLowerCase()}` }));
27
- }
28
- registerOnChange(fn) {
29
- this._onChange = fn;
30
- }
31
- registerOnTouched(fn) {
32
- this._onTouched = fn;
33
- }
34
- setDisabledState(isDisabled) {
35
- this._disabled = isDisabled;
36
- this._cd.markForCheck();
37
- }
38
- writeValueUsers(obj) {
39
- if (!equal(this.value?.users, obj)) {
40
- this.writeValue({ type: this.value?.type, users: obj });
41
- }
42
- }
43
- writeValueType(type) {
44
- if (this.value?.type !== type) {
45
- this.writeValue({ type, users: this.value?.users });
46
- }
47
- }
48
- writeValue(obj) {
49
- if (!equal(this.value, obj)) {
50
- this.value = obj;
51
- this._onChange(this.value);
52
- this._onTouched();
53
- this._cd.markForCheck();
54
- }
55
- }
56
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PryShareComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
57
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: PryShareComponent, selector: "pry-share", inputs: { value: "value", labelProperty: "labelProperty", valueProperty: "valueProperty", users$: "users$" }, providers: [
58
- {
59
- provide: NG_VALUE_ACCESSOR,
60
- useExisting: forwardRef(() => PryShareComponent),
61
- multi: true
62
- }
63
- ], ngImport: i0, template: "<div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"share_type\">{{ '@pry.share.type' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"writeValueType($event)\"\n [items]=\"visibilityTypes\"\n [ngModel]=\"value?.type\"\n [disabled]=\"_disabled\"\n i18nPrefix=\"@pry.share.\"\n bindValue=\"value\"\n bindLabel=\"label\"\n id=\"share_type\"\n bindIcon=\"icon\"\n [iconSize]=\"[21, 18]\"\n ></pry-select>\n</div>\n\n<ng-container *ngIf=\"value?.type === PryVisibilityType.RESTRICTED\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"users\">{{ '@pry.share.users' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"writeValueUsers($event)\"\n [items]=\"users$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n [ngModel]=\"value?.users\"\n [disabled]=\"_disabled\"\n [bindLabel]=\"labelProperty\"\n [bindValue]=\"valueProperty\"\n [autocomplete]=\"true\"\n id=\"users\"\n ></pry-select>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.I18nPipe, name: "i18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
64
- }
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PryShareComponent, decorators: [{
66
- type: Component,
67
- args: [{ selector: 'pry-share', providers: [
68
- {
69
- provide: NG_VALUE_ACCESSOR,
70
- useExisting: forwardRef(() => PryShareComponent),
71
- multi: true
72
- }
73
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"share_type\">{{ '@pry.share.type' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"writeValueType($event)\"\n [items]=\"visibilityTypes\"\n [ngModel]=\"value?.type\"\n [disabled]=\"_disabled\"\n i18nPrefix=\"@pry.share.\"\n bindValue=\"value\"\n bindLabel=\"label\"\n id=\"share_type\"\n bindIcon=\"icon\"\n [iconSize]=\"[21, 18]\"\n ></pry-select>\n</div>\n\n<ng-container *ngIf=\"value?.type === PryVisibilityType.RESTRICTED\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"users\">{{ '@pry.share.users' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"writeValueUsers($event)\"\n [items]=\"users$ | async\"\n [multiple]=\"true\"\n [closeOnSelect]=\"false\"\n [ngModel]=\"value?.users\"\n [disabled]=\"_disabled\"\n [bindLabel]=\"labelProperty\"\n [bindValue]=\"valueProperty\"\n [autocomplete]=\"true\"\n id=\"users\"\n ></pry-select>\n </div>\n</ng-container>\n" }]
74
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { value: [{
75
- type: Input
76
- }], labelProperty: [{
77
- type: Input
78
- }], valueProperty: [{
79
- type: Input
80
- }], users$: [{
81
- type: Input
82
- }] } });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvbGliL2NvcmUvY29tcG9uZW50cy9zaGFyZS9zaGFyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC9saWIvY29yZS9jb21wb25lbnRzL3NoYXJlL3NoYXJlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxNQUFNLHFCQUFxQixDQUFDO0FBRXhDLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQWNqRSxNQUFNLE9BQU8saUJBQWlCO0lBVzVCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBVmxDLGNBQVMsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQzNCLGVBQVUsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixzQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUU3QixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUN4QixrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUN4QixXQUFNLEdBQTZCLElBQUksQ0FBQztRQUNqRCxvQkFBZSxHQUFxRCxFQUFFLENBQUM7SUFFMUIsQ0FBQztJQUU5QyxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ2xE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dHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbC9lczYnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJ5VmlzaWJpbGl0eSwgUHJ5VmlzaWJpbGl0eVR5cGUgfSBmcm9tICcuL3NoYXJlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHJ5LXNoYXJlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NoYXJlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQcnlTaGFyZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUHJ5U2hhcmVDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge307XG4gIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBQcnlWaXNpYmlsaXR5VHlwZSA9IFByeVZpc2liaWxpdHlUeXBlO1xuICBASW5wdXQoKSB2YWx1ZT86IFByeVZpc2liaWxpdHk7XG4gIEBJbnB1dCgpIGxhYmVsUHJvcGVydHkgPSAnbGFiZWwnO1xuICBASW5wdXQoKSB2YWx1ZVByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgQElucHV0KCkgdXNlcnMkOiBPYnNlcnZhYmxlPGFueVtdPiB8IG51bGwgPSBudWxsO1xuICB2aXNpYmlsaXR5VHlwZXM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgaWNvbjogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2liaWxpdHlUeXBlcyA9IE9iamVjdC5rZXlzKFByeVZpc2liaWxpdHlUeXBlKVxuICAgICAgLmZpbHRlcigoeCkgPT4gIShwYXJzZUludCh4KSA+PSAwKSlcbiAgICAgIC5maWx0ZXIoKHgpID0+ICghdGhpcy51c2VycyQgPyB4ICE9PSBQcnlWaXNpYmlsaXR5VHlwZS5SRVNUUklDVEVEIDogdHJ1ZSkpXG4gICAgICAubWFwKChsYWJlbCkgPT4gKHsgbGFiZWw6IGxhYmVsLnRvTG93ZXJDYXNlKCksIHZhbHVlOiBsYWJlbCwgaWNvbjogYCR7bGFiZWwudG9Mb3dlckNhc2UoKX1gIH0pKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlVXNlcnMob2JqOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghZXF1YWwodGhpcy52YWx1ZT8udXNlcnMsIG9iaikpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh7IHR5cGU6IHRoaXMudmFsdWU/LnR5cGUsIHVzZXJzOiBvYmogfSk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZVR5cGUodHlwZTogUHJ5VmlzaWJpbGl0eVR5cGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZT8udHlwZSAhPT0gdHlwZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHsgdHlwZSwgdXNlcnM6IHRoaXMudmFsdWU/LnVzZXJzIH0pO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpIHtcbiAgICBpZiAoIWVxdWFsKHRoaXMudmFsdWUsIG9iaikpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzaGFyZV90eXBlXCI+e3sgJ0Bwcnkuc2hhcmUudHlwZScgfCBpMThuIH19PC9sYWJlbD5cbiAgPHByeS1zZWxlY3RcbiAgICAobmdNb2RlbENoYW5nZSk9XCJ3cml0ZVZhbHVlVHlwZSgkZXZlbnQpXCJcbiAgICBbaXRlbXNdPVwidmlzaWJpbGl0eVR5cGVzXCJcbiAgICBbbmdNb2RlbF09XCJ2YWx1ZT8udHlwZVwiXG4gICAgW2Rpc2FibGVkXT1cIl9kaXNhYmxlZFwiXG4gICAgaTE4blByZWZpeD1cIkBwcnkuc2hhcmUuXCJcbiAgICBiaW5kVmFsdWU9XCJ2YWx1ZVwiXG4gICAgYmluZExhYmVsPVwibGFiZWxcIlxuICAgIGlkPVwic2hhcmVfdHlwZVwiXG4gICAgYmluZEljb249XCJpY29uXCJcbiAgICBbaWNvblNpemVdPVwiWzIxLCAxOF1cIlxuICA+PC9wcnktc2VsZWN0PlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2YWx1ZT8udHlwZSA9PT0gUHJ5VmlzaWJpbGl0eVR5cGUuUkVTVFJJQ1RFRFwiPlxuICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInVzZXJzXCI+e3sgJ0Bwcnkuc2hhcmUudXNlcnMnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgPHByeS1zZWxlY3RcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIndyaXRlVmFsdWVVc2VycygkZXZlbnQpXCJcbiAgICAgIFtpdGVtc109XCJ1c2VycyQgfCBhc3luY1wiXG4gICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICBbY2xvc2VPblNlbGVjdF09XCJmYWxzZVwiXG4gICAgICBbbmdNb2RlbF09XCJ2YWx1ZT8udXNlcnNcIlxuICAgICAgW2Rpc2FibGVkXT1cIl9kaXNhYmxlZFwiXG4gICAgICBbYmluZExhYmVsXT1cImxhYmVsUHJvcGVydHlcIlxuICAgICAgW2JpbmRWYWx1ZV09XCJ2YWx1ZVByb3BlcnR5XCJcbiAgICAgIFthdXRvY29tcGxldGVdPVwidHJ1ZVwiXG4gICAgICBpZD1cInVzZXJzXCJcbiAgICA+PC9wcnktc2VsZWN0PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19