@bizdoc/core 2.3.16 → 2.3.18

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 (35) hide show
  1. package/assets/themes/brown.min.css +49 -42
  2. package/assets/themes/dark.min.css +47 -40
  3. package/assets/themes/deep-purple-light-blue.min.css +46 -44
  4. package/assets/themes/deep-purple-teal.min.css +46 -44
  5. package/assets/themes/default.min.css +46 -44
  6. package/assets/themes/green.min.css +49 -42
  7. package/assets/themes/indigo.min.css +49 -42
  8. package/assets/themes/syncfusion.min.css +90 -0
  9. package/esm2022/lib/admin/architecture/designer.component.mjs +3 -3
  10. package/esm2022/lib/admin/architecture/elements/cube.component.mjs +10 -9
  11. package/esm2022/lib/admin/form/workflow/role-node.component.mjs +3 -3
  12. package/esm2022/lib/admin/patterns/patterns.component.mjs +3 -3
  13. package/esm2022/lib/admin/profiler/outofoffice.component.mjs +3 -3
  14. package/esm2022/lib/app.component.mjs +5 -1
  15. package/esm2022/lib/compose/action/assign-action.component.mjs +3 -3
  16. package/esm2022/lib/compose/action/moveto-action.component.mjs +3 -3
  17. package/esm2022/lib/compose/action/return-action.component.mjs +3 -3
  18. package/esm2022/lib/core/animations.mjs +2 -4
  19. package/esm2022/lib/core/pipes/translate.pipe.mjs +2 -1
  20. package/esm2022/lib/core/translations.mjs +5 -4
  21. package/esm2022/lib/cube/grid/spreadsheet.component.mjs +16 -11
  22. package/esm2022/lib/cube/matrix/table.component.mjs +3 -3
  23. package/esm2022/lib/dashboard/dashboard.component.mjs +4 -4
  24. package/esm2022/lib/home/home.desktop.component.mjs +3 -3
  25. package/esm2022/lib/modules/grid.module.mjs +3 -3
  26. package/esm2022/lib/options/options.component.mjs +3 -3
  27. package/esm2022/lib/scheduler/schedule.component.mjs +3 -3
  28. package/fesm2022/bizdoc-core.mjs +62 -52
  29. package/fesm2022/bizdoc-core.mjs.map +1 -1
  30. package/lib/admin/architecture/elements/cube.component.d.ts +1 -1
  31. package/lib/core/animations.d.ts +1 -1
  32. package/lib/core/pipes/translate.pipe.d.ts +1 -0
  33. package/lib/core/translations.d.ts +4 -3
  34. package/lib/cube/grid/spreadsheet.component.d.ts +6 -1
  35. package/package.json +1 -1
@@ -80,7 +80,7 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
80
80
  r.jobInfo && r.jobInfo.nextExecution && this._schedule(r.jobInfo.nextExecution);
81
81
  });
82
82
  break;
83
- case 'edit':
83
+ default:
84
84
  this._form();
85
85
  break;
86
86
  }
@@ -93,10 +93,10 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
93
93
  }, ms + 600000);
94
94
  }
95
95
  _form() {
96
- this.datatypes = super._typegroups;
96
+ this.typegroups = super._typegroups;
97
97
  this.guides = this._ref.designer.guides;
98
98
  this.currencies = this._ref.designer.currencies;
99
- this.model.axes.forEach(a => {
99
+ this.model.axes?.forEach(a => {
100
100
  this.axes.push(this.newAxis(a), { emitEvent: false });
101
101
  });
102
102
  this.model.indices?.forEach(i => this.indices.push(this.newIndex(i), { emitEvent: false }));
@@ -109,12 +109,11 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
109
109
  v.indices = coerceArray(v.indices);
110
110
  this.views.push(this.newView(v), { emitEvent: false });
111
111
  });
112
- }
113
- complete() {
114
- this._form();
115
112
  if (!this.model.privileges)
116
113
  this.model.privileges = {};
117
114
  }
115
+ complete() {
116
+ }
118
117
  nameOf(axis) { return this.model.axes.filter(a => isArray(axis) ? axis.indexOf(a.name) > -1 : a.name === axis).join(', '); }
119
118
  newView(model) {
120
119
  const name = this._fb.control(model?.name, Validators.required), title = this._fb.control(model?.title, Validators.required), xAxis = this._fb.control(model?.xAxis, Validators.required), chartType = this._fb.control(model?.chartType || null), indicesChartType = this._fb.control(model?.indicesChartType || null), series = this._fb.control(model?.series), indices = this._fb.control(model?.indices), guide = this._fb.control(model?.guide), type = this._fb.control(model?.type || 'Chart');
@@ -155,6 +154,7 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
155
154
  indices,
156
155
  type,
157
156
  chartType,
157
+ guide,
158
158
  indicesChartType,
159
159
  filters: this._fb.group({}),
160
160
  privileges: this._fb.group({
@@ -166,6 +166,7 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
166
166
  switch (v) {
167
167
  case 'Spreadsheet':
168
168
  case 'Grid':
169
+ case 'Pivot':
169
170
  series.addValidators(Validators.required);
170
171
  chartType.disable({ emitEvent: false });
171
172
  break;
@@ -230,11 +231,11 @@ export class CubeDesignComponent extends DesignerTypeElementComponent {
230
231
  });
231
232
  }
232
233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CubeDesignComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SystemService }, { token: i3.PromptService }, { token: i0.ElementRef }, { token: DesignerRef }], target: i0.ɵɵFactoryTarget.Component }); }
233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CubeDesignComponent, selector: "ng-component", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<bizdoc-designer-element [form]=\"form\" [privileges]=\"true\" (continue)=\"complete()\" [view]=\"view\" (back)=\"view = null\" [context]=\"context\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <dl *ngIf=\"jobInfo\">\r\n <ng-container *ngIf=\"jobInfo.lastExecution\">\r\n <dt>{{'LastExecution'|translate}}</dt>\r\n <dd>{{jobInfo.lastExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.nextExecution\">\r\n <dt>{{'NextExecution'|translate}}</dt>\r\n <dd>{{jobInfo.nextExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.lastJobState\">\r\n <dt>{{'LastJobState'|translate}}</dt>\r\n <dd>\r\n <mat-icon *ngIf=\"jobInfo.error\" [bizdocTooltip]=\"jobInfo.error\">report</mat-icon>\r\n <span class=\"job-state\">{{jobInfo.lastJobState| translate}}</span>\r\n </dd>\r\n </ng-container>\r\n </dl>\r\n <div class=\"row start center\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n @if(model.axes?.length)\r\n {\r\n <mat-chip-set>\r\n @for(axis of model.axes || []; track axis){\r\n <mat-chip>{{axis.title}}</mat-chip>\r\n }\r\n @for(index of model.indices || []; track index){\r\n <mat-chip>{{index.title}}</mat-chip>\r\n }\r\n </mat-chip-set>\r\n }\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <p></p>\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <ng-container formGroupName=\"yAxis\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Currency\">{{'Currency'|translate}}</mat-option>\r\n <mat-option value=\"Number\">{{'Numeric'|translate}}</mat-option>\r\n <mat-option value=\"Count\">{{'Accumulative'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n <mat-form-field>\r\n <mat-label>{{'Currency'|translate}}</mat-label>\r\n <mat-select formControlName=\"currencyCode\" [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let c of currencies\" [value]=\"c.name\">{{c.title}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Axes-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Axes'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"axes\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Indices-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Indices'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Patterns'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Views-->\r\n <h2 class=\"row mat-h2\">\r\n {{'CubeViews'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'CubeView', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"views\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field>\r\n <mat-label>{{'Schedule'|translate}}</mat-label>\r\n <bizdoc-timespan-input formControlName=\"schedule\"></bizdoc-timespan-input>\r\n <mat-icon matSuffix>timer</mat-icon>\r\n <mat-hint></mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!--idx-->\r\n<ng-template #indexform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </div>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple [sortComparator]=\"sortComparator\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('series').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Series'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Pie\" [disabled]=\"form.get('series').value?.length>0\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\" [disabled]=\"form.get('series').value?.length>0\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\" [disabled]=\"form.get('series').value?.length>0\">{{'Pyramid'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Guide'|translate}}</mat-label>\r\n <mat-select formControlName=\"guide\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option *ngFor=\"let g of guides\" [value]=\"g.name\">{{g.title |localizedString}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </div>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of datatypes['_'].elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n <mat-optgroup *ngFor=\"let g of datatypes|sort: 'title'\" [label]=\"g.title\">\r\n <mat-option *ngFor=\"let t of g.elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n </mat-optgroup>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'|translate}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'|translate}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'OneMode'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Autocomplete'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'|translate}}</mat-checkbox></div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-mdc-radio-group p{margin-inline-start:8px}.mat-mdc-table{width:100%}.mat-mdc-table .mat-mdc-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}dl{width:100%;overflow:hidden;padding:0;margin:0}dt{padding:0;margin:0;clear:both}dd{float:left;padding:0;margin:0}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i5.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i5.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i9.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i16.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i17.TimespanInput, selector: "bizdoc-timespan-input", inputs: ["placeholder", "required", "disabled", "value"] }, { kind: "component", type: i18.DesignerPrivilegesComponent, selector: "bizdoc-designer-privileges", inputs: ["form"] }, { kind: "directive", type: i19.EditContentDirective, selector: "[bizdocEditContent]" }, { kind: "directive", type: i19.WidgetContentDirective, selector: "[bizdocContent]" }, { kind: "component", type: i20.DesignerCubeFilterComponent, selector: "bizdoc-designer-cube-filter", inputs: ["cube", "form"] }, { kind: "component", type: i19.DesignerItemComponent, selector: "bizdoc-designer-element", inputs: ["privileges", "icon", "form", "view", "context"], outputs: ["continue", "back", "save"] }, { kind: "pipe", type: i21.LocalizedStringPipe, name: "localizedString" }, { kind: "pipe", type: i22.TimeAgoPipe, name: "amTimeAgo" }, { kind: "pipe", type: i23.ArraySortPipe, name: "sort" }, { kind: "pipe", type: i24.TranslatePipe, name: "translate" }] }); }
234
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CubeDesignComponent, selector: "ng-component", viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<bizdoc-designer-element [form]=\"form\" [privileges]=\"true\" (continue)=\"complete()\" [view]=\"view\" (back)=\"view = null\" [context]=\"context\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <dl *ngIf=\"jobInfo\">\r\n <ng-container *ngIf=\"jobInfo.lastExecution\">\r\n <dt>{{'LastExecution'|translate}}</dt>\r\n <dd>{{jobInfo.lastExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.nextExecution\">\r\n <dt>{{'NextExecution'|translate}}</dt>\r\n <dd>{{jobInfo.nextExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.lastJobState\">\r\n <dt>{{'LastJobState'|translate}}</dt>\r\n <dd>\r\n <mat-icon *ngIf=\"jobInfo.error\" [bizdocTooltip]=\"jobInfo.error\">report</mat-icon>\r\n <span class=\"job-state\">{{jobInfo.lastJobState| translate}}</span>\r\n </dd>\r\n </ng-container>\r\n </dl>\r\n <div class=\"row start center\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n @if(model.axes?.length)\r\n {\r\n <mat-chip-set>\r\n @for(axis of model.axes; track axis){\r\n <mat-chip>{{axis.title}}</mat-chip>\r\n }\r\n @for(index of model.indices || []; track index){\r\n <mat-chip>{{index.title}}</mat-chip>\r\n }\r\n </mat-chip-set>\r\n }\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <p></p>\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <ng-container formGroupName=\"yAxis\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Currency\">{{'Currency'|translate}}</mat-option>\r\n <mat-option value=\"Number\">{{'Numeric'|translate}}</mat-option>\r\n <mat-option value=\"Count\">{{'Accumulative'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n <mat-form-field>\r\n <mat-label>{{'Currency'|translate}}</mat-label>\r\n <mat-select formControlName=\"currencyCode\" [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let c of currencies\" [value]=\"c.name\">{{c.title}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Axes-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Axes'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"axes\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Indices-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Indices'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Patterns'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Views-->\r\n <h2 class=\"row mat-h2\">\r\n {{'CubeViews'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'CubeView', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"views\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field>\r\n <mat-label>{{'Schedule'|translate}}</mat-label>\r\n <bizdoc-timespan-input formControlName=\"schedule\"></bizdoc-timespan-input>\r\n <mat-icon matSuffix>timer</mat-icon>\r\n <mat-hint></mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!--idx-->\r\n<ng-template #indexform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </div>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple [sortComparator]=\"sortComparator\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('series').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Series'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Pie\" [disabled]=\"form.get('series').value?.length>0\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\" [disabled]=\"form.get('series').value?.length>0\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\" [disabled]=\"form.get('series').value?.length>0\">{{'Pyramid'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Guide'|translate}}</mat-label>\r\n <mat-select formControlName=\"guide\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option *ngFor=\"let g of guides\" [value]=\"g.name\">{{g.title |localizedString}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </div>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of typegroups['_'].elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n <mat-optgroup *ngFor=\"let g of typegroups|sort: 'title'\" [label]=\"g.title\">\r\n <mat-option *ngFor=\"let t of g.elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n </mat-optgroup>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'|translate}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'|translate}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'OneMode'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Autocomplete'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'|translate}}</mat-checkbox></div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-mdc-radio-group p{margin-inline-start:8px}.mat-mdc-table{width:100%}.mat-mdc-table .mat-mdc-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}dl{width:100%;overflow:hidden;padding:0;margin:0}dt{padding:0;margin:0;clear:both}dd{float:left;padding:0;margin:0}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i5.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i5.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i9.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i16.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i17.TimespanInput, selector: "bizdoc-timespan-input", inputs: ["placeholder", "required", "disabled", "value"] }, { kind: "component", type: i18.DesignerPrivilegesComponent, selector: "bizdoc-designer-privileges", inputs: ["form"] }, { kind: "directive", type: i19.EditContentDirective, selector: "[bizdocEditContent]" }, { kind: "directive", type: i19.WidgetContentDirective, selector: "[bizdocContent]" }, { kind: "component", type: i20.DesignerCubeFilterComponent, selector: "bizdoc-designer-cube-filter", inputs: ["cube", "form"] }, { kind: "component", type: i19.DesignerItemComponent, selector: "bizdoc-designer-element", inputs: ["privileges", "icon", "form", "view", "context"], outputs: ["continue", "back", "save"] }, { kind: "pipe", type: i21.LocalizedStringPipe, name: "localizedString" }, { kind: "pipe", type: i22.TimeAgoPipe, name: "amTimeAgo" }, { kind: "pipe", type: i23.ArraySortPipe, name: "sort" }, { kind: "pipe", type: i24.TranslatePipe, name: "translate" }] }); }
234
235
  }
235
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CubeDesignComponent, decorators: [{
236
237
  type: Component,
237
- args: [{ template: "<bizdoc-designer-element [form]=\"form\" [privileges]=\"true\" (continue)=\"complete()\" [view]=\"view\" (back)=\"view = null\" [context]=\"context\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <dl *ngIf=\"jobInfo\">\r\n <ng-container *ngIf=\"jobInfo.lastExecution\">\r\n <dt>{{'LastExecution'|translate}}</dt>\r\n <dd>{{jobInfo.lastExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.nextExecution\">\r\n <dt>{{'NextExecution'|translate}}</dt>\r\n <dd>{{jobInfo.nextExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.lastJobState\">\r\n <dt>{{'LastJobState'|translate}}</dt>\r\n <dd>\r\n <mat-icon *ngIf=\"jobInfo.error\" [bizdocTooltip]=\"jobInfo.error\">report</mat-icon>\r\n <span class=\"job-state\">{{jobInfo.lastJobState| translate}}</span>\r\n </dd>\r\n </ng-container>\r\n </dl>\r\n <div class=\"row start center\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n @if(model.axes?.length)\r\n {\r\n <mat-chip-set>\r\n @for(axis of model.axes || []; track axis){\r\n <mat-chip>{{axis.title}}</mat-chip>\r\n }\r\n @for(index of model.indices || []; track index){\r\n <mat-chip>{{index.title}}</mat-chip>\r\n }\r\n </mat-chip-set>\r\n }\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <p></p>\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <ng-container formGroupName=\"yAxis\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Currency\">{{'Currency'|translate}}</mat-option>\r\n <mat-option value=\"Number\">{{'Numeric'|translate}}</mat-option>\r\n <mat-option value=\"Count\">{{'Accumulative'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n <mat-form-field>\r\n <mat-label>{{'Currency'|translate}}</mat-label>\r\n <mat-select formControlName=\"currencyCode\" [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let c of currencies\" [value]=\"c.name\">{{c.title}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Axes-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Axes'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"axes\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Indices-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Indices'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Patterns'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Views-->\r\n <h2 class=\"row mat-h2\">\r\n {{'CubeViews'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'CubeView', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"views\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field>\r\n <mat-label>{{'Schedule'|translate}}</mat-label>\r\n <bizdoc-timespan-input formControlName=\"schedule\"></bizdoc-timespan-input>\r\n <mat-icon matSuffix>timer</mat-icon>\r\n <mat-hint></mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!--idx-->\r\n<ng-template #indexform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </div>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple [sortComparator]=\"sortComparator\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('series').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Series'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Pie\" [disabled]=\"form.get('series').value?.length>0\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\" [disabled]=\"form.get('series').value?.length>0\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\" [disabled]=\"form.get('series').value?.length>0\">{{'Pyramid'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Guide'|translate}}</mat-label>\r\n <mat-select formControlName=\"guide\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option *ngFor=\"let g of guides\" [value]=\"g.name\">{{g.title |localizedString}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </div>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of datatypes['_'].elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n <mat-optgroup *ngFor=\"let g of datatypes|sort: 'title'\" [label]=\"g.title\">\r\n <mat-option *ngFor=\"let t of g.elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n </mat-optgroup>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'|translate}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'|translate}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'OneMode'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Autocomplete'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'|translate}}</mat-checkbox></div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-mdc-radio-group p{margin-inline-start:8px}.mat-mdc-table{width:100%}.mat-mdc-table .mat-mdc-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}dl{width:100%;overflow:hidden;padding:0;margin:0}dt{padding:0;margin:0;clear:both}dd{float:left;padding:0;margin:0}\n"] }]
238
+ args: [{ template: "<bizdoc-designer-element [form]=\"form\" [privileges]=\"true\" (continue)=\"complete()\" [view]=\"view\" (back)=\"view = null\" [context]=\"context\">\r\n <!-- widget -->\r\n <ng-template bizdocContent>\r\n <dl *ngIf=\"jobInfo\">\r\n <ng-container *ngIf=\"jobInfo.lastExecution\">\r\n <dt>{{'LastExecution'|translate}}</dt>\r\n <dd>{{jobInfo.lastExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.nextExecution\">\r\n <dt>{{'NextExecution'|translate}}</dt>\r\n <dd>{{jobInfo.nextExecution|amTimeAgo}}</dd>\r\n </ng-container>\r\n <ng-container *ngIf=\"jobInfo.lastJobState\">\r\n <dt>{{'LastJobState'|translate}}</dt>\r\n <dd>\r\n <mat-icon *ngIf=\"jobInfo.error\" [bizdocTooltip]=\"jobInfo.error\">report</mat-icon>\r\n <span class=\"job-state\">{{jobInfo.lastJobState| translate}}</span>\r\n </dd>\r\n </ng-container>\r\n </dl>\r\n <div class=\"row start center\">\r\n <button mat-stroked-button (click)=\"sync()\" [disabled]=\"model.draft || syncing\">\r\n <span> {{'Synchronize'|translate}}</span>\r\n </button>\r\n &nbsp;\r\n <mat-spinner *ngIf=\"syncing\" diameter=\"22\"></mat-spinner>\r\n </div>\r\n <div class=\"row\">\r\n @if(model.axes?.length)\r\n {\r\n <mat-chip-set>\r\n @for(axis of model.axes; track axis){\r\n <mat-chip>{{axis.title}}</mat-chip>\r\n }\r\n @for(index of model.indices || []; track index){\r\n <mat-chip>{{index.title}}</mat-chip>\r\n }\r\n </mat-chip-set>\r\n }\r\n </div>\r\n </ng-template>\r\n <!-- edit -->\r\n <ng-template bizdocEditContent>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-label>{{'SecurityLevel'|translate}}</mat-label>\r\n <mat-radio-group formControlName=\"scope\">\r\n <p></p>\r\n <mat-radio-button color=\"warn\">{{'Global'|translate}}</mat-radio-button>\r\n <p>{{'SecurityGlobalHelp'|translate}}</p>\r\n <mat-radio-button value=\"Positions\">{{'Positions'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPositionsHelp'|translate}}</p>\r\n <mat-radio-button value=\"Patterns\">{{'Patterns'|translate}}</mat-radio-button>\r\n <p>{{'SecurityPatternsHelp'|translate}}</p>\r\n </mat-radio-group>\r\n <ng-container formGroupName=\"yAxis\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Currency\">{{'Currency'|translate}}</mat-option>\r\n <mat-option value=\"Number\">{{'Numeric'|translate}}</mat-option>\r\n <mat-option value=\"Count\">{{'Accumulative'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n <mat-form-field>\r\n <mat-label>{{'Currency'|translate}}</mat-label>\r\n <mat-select formControlName=\"currencyCode\" [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let c of currencies\" [value]=\"c.name\">{{c.title}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Axes-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Axes'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(axes, newAxis(), 'Axis', axisform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"axes\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, axes)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let a of axes.controls; index as index\" [formGroup]=\"a\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{a.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(a, 'Axis', axisform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"axes.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Indices-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Indices'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(indices, newIndex(), 'Index', indexform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, indices)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let i of indices.controls; index as index\" [formGroup]=\"i\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{i.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(i, 'Index', indexform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"indices.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field *ngIf=\"indices.controls.length\">\r\n <mat-label>{{'AnomalyNotification'|translate}}</mat-label>\r\n <mat-select formControlName=\"anomaly\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Positions\">{{'Positions'|translate}}</mat-option>\r\n <mat-option value=\"Recipients\">{{'Everyone'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!--Patterns-->\r\n <h2 class=\"mat-h2 row\">\r\n {{'Patterns'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(patterns, newPattern(), 'Pattern', patternform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"indices\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, patterns)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let p of patterns.controls; index as index\" [formGroup]=\"p\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{p.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(p, 'Pattern', patternform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"patterns.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--Views-->\r\n <h2 class=\"row mat-h2\">\r\n {{'CubeViews'|translate}}\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"add(views, newView(), 'CubeView', viewform)\" [bizdocTooltip]=\"'Add'|translate\" type=\"button\"><mat-icon>add_circle_outline</mat-icon></button>\r\n </h2>\r\n <table formArrayName=\"views\" class=\"mat-mdc-table\" cdkDropList (cdkDropListDropped)=\"drop($event, views)\">\r\n <tr class=\"mat-mdc-row\" *ngFor=\"let v of views.controls; index as index\" [formGroup]=\"v\" cdkDrag>\r\n <td class=\"mat-mdc-cell\">\r\n <mat-icon cdkDragHandle>drag_indicator</mat-icon>\r\n </td>\r\n <td class=\"mat-mdc-cell flex\">\r\n {{v.get('title').value}}\r\n </td>\r\n <td class=\"mat-mdc-cell nowrap\">\r\n <button mat-icon-button (click)=\"edit(v, 'View', viewform)\" [bizdocTooltip]=\"'Edit'|translate\" type=\"button\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button (click)=\"views.removeAt(index)\" [bizdocTooltip]=\"'Remove'|translate\" type=\"button\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </tr>\r\n </table>\r\n <mat-form-field>\r\n <mat-label>{{'Schedule'|translate}}</mat-label>\r\n <bizdoc-timespan-input formControlName=\"schedule\"></bizdoc-timespan-input>\r\n <mat-icon matSuffix>timer</mat-icon>\r\n <mat-hint></mat-hint>\r\n </mat-form-field>\r\n </div>\r\n </ng-template>\r\n</bizdoc-designer-element>\r\n<!--idx-->\r\n<ng-template #indexform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n</ng-template>\r\n<!-- pattern-->\r\n<ng-template #patternform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter [cube]=\"model\" [form]=\"form.get('axes')\"></bizdoc-designer-cube-filter>\r\n <bizdoc-designer-privileges [form]=\"form\"></bizdoc-designer-privileges>\r\n </div>\r\n</ng-template>\r\n<!-- view -->\r\n<ng-template #viewform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Type'|translate}}</mat-label>\r\n <mat-select formControlName=\"type\">\r\n <mat-option value=\"Chart\">{{'Chart'|translate}}</mat-option>\r\n <mat-option value=\"Pivot\">{{'Pivot'|translate}}</mat-option>\r\n <mat-option value=\"Grid\">{{'Grid'|translate}}</mat-option>\r\n <mat-option value=\"Spreadsheet\">{{'Spreadsheet'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'XAxis'|translate}}</mat-label>\r\n <mat-select formControlName=\"xAxis\" required multiple [sortComparator]=\"sortComparator\">\r\n <mat-option *ngFor=\"let a of axes.controls\" [value]=\"a.get('name').value\">{{a.get('title').value || a.get('name').value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('xAxis').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('XAxis'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Series'|translate}}</mat-label>\r\n <mat-select formControlName=\"series\" multiple [sortComparator]=\"sortComparator\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"form.get('xAxis').value?.indexOf(a.get('name').value)<0\">{{a.get('title').value|| a.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('series').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Series'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Indices'|translate}}</mat-label>\r\n <mat-select formControlName=\"indices\" multiple>\r\n <ng-container *ngFor=\"let i of indices.controls\">\r\n <mat-option [value]=\"i.get('name').value\">{{i.get('title').value|| i.get('name').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'ChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"chartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Pie\" [disabled]=\"form.get('series').value?.length>0\">{{'Pie'|translate}}</mat-option>\r\n <mat-option value=\"Doughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'Doughnut'|translate}}</mat-option>\r\n <mat-option value=\"HalfDoughnut\" [disabled]=\"form.get('series').value?.length>0\">{{'HalfDoughnut'|translate}}</mat-option>\r\n <mat-option value=\"Funnel\" [disabled]=\"form.get('series').value?.length>0\">{{'Funnel'|translate}}</mat-option>\r\n <mat-option value=\"Pyramid\" [disabled]=\"form.get('series').value?.length>0\">{{'Pyramid'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"!form.get('series').value?.length\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"!form.get('series').value?.length\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'IndicesChartType'|translate}}</mat-label>\r\n <mat-select formControlName=\"indicesChartType\">\r\n <ng-container [ngSwitch]=\"form.get('type').value\">\r\n <ng-container *ngSwitchCase=\"'Chart'\">\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('indices').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Pivot'\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option value=\"Column\">{{'Column'|translate}}</mat-option>\r\n <mat-option value=\"Bar\">{{'Bar'|translate}}</mat-option>\r\n <mat-option value=\"Bubble\">{{'Bubble'|translate}}</mat-option>\r\n <mat-option value=\"Line\">{{'Line'|translate}}</mat-option>\r\n <mat-option value=\"Spline\">{{'Spline'|translate}}</mat-option>\r\n <mat-option value=\"SplineArea\">{{'SplineArea'|translate}}</mat-option>\r\n <mat-option value=\"Area\">{{'Area'|translate}}</mat-option>\r\n <mat-option value=\"Scatter\">{{'Scatter'|translate}}</mat-option>\r\n <mat-option value=\"Polar\">{{'Polar'|translate}}</mat-option>\r\n <mat-option value=\"Radar\">{{'Radar'|translate}}</mat-option>\r\n <mat-option value=\"StepLine\">{{'StepLine'|translate}}</mat-option>\r\n <mat-option value=\"StepArea\">{{'StepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar'|translate}}</mat-option>\r\n <mat-option value=\"StackingBar100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingBar100'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingArea100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingArea100'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn'|translate}}</mat-option>\r\n <mat-option value=\"StackingColumn100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingColumn100'|translate}}</mat-option>\r\n <mat-option value=\"StackingStepArea\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingStepArea'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine'|translate}}</mat-option>\r\n <mat-option value=\"StackingLine100\" [disabled]=\"form.get('series').value?.length<2\">{{'StackingLine100'|translate}}</mat-option>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'Guide'|translate}}</mat-label>\r\n <mat-select formControlName=\"guide\">\r\n <mat-option>{{'None'|translate}}</mat-option>\r\n <mat-option *ngFor=\"let g of guides\" [value]=\"g.name\">{{g.title |localizedString}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <bizdoc-designer-cube-filter *ngIf=\"cube\" [cube]=\"cube\" [form]=\"form.get('filters')\"></bizdoc-designer-cube-filter>\r\n </div>\r\n</ng-template>\r\n<!-- Axis -->\r\n<ng-template #axisform let-form>\r\n <div [formGroup]=\"form\" class=\"column\">\r\n <div class=\"row\">\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Title'|translate}}</mat-label>\r\n <input matInput formControlName=\"title\" required />\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Title'|translate)\"></mat-error>\r\n </mat-form-field>\r\n &nbsp;\r\n <mat-form-field class=\"flex\">\r\n <mat-label>{{'Name'|translate}}</mat-label>\r\n <input matInput formControlName=\"name\" required />\r\n <mat-error *ngIf=\"form.get('name').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('Name'|translate)\"></mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-form-field>\r\n <mat-label>{{'DataType'|translate}}</mat-label>\r\n <mat-select formControlName=\"dataType\" required>\r\n <mat-option *ngFor=\"let t of typegroups['_'].elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n <mat-optgroup *ngFor=\"let g of typegroups|sort: 'title'\" [label]=\"g.title\">\r\n <mat-option *ngFor=\"let t of g.elements|sort: 'title'\" [value]=\"t.name\">\r\n {{t.title}}\r\n </mat-option>\r\n </mat-optgroup>\r\n </mat-select>\r\n <mat-error *ngIf=\"form.get('title').hasError('required')\" [innerHTML]=\"'RequiredErr'|translate:('DataType'|translate)\"></mat-error>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"combination\">{{'Combination'|translate}}</mat-checkbox></div>\r\n <div><mat-checkbox formControlName=\"sensitive\">{{'Sensitive'|translate}}</mat-checkbox></div>\r\n <mat-form-field>\r\n <mat-label>{{'SelectionMode'|translate}}</mat-label>\r\n <mat-select formControlName=\"selectionMode\">\r\n <mat-option value=\"None\">{{'None'|translate}}</mat-option>\r\n <mat-option>{{'OneMode'|translate}}</mat-option>\r\n <mat-option value=\"Multiple\">{{'Multiple'|translate}}</mat-option>\r\n <mat-option value=\"Search\">{{'Autocomplete'|translate}}</mat-option>\r\n <mat-option value=\"Pattern\">{{'Pattern'|translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-label>{{'DescendentOf'|translate}}</mat-label>\r\n <mat-select formControlName=\"descendentOf\">\r\n <ng-container *ngFor=\"let a of axes.controls\">\r\n <mat-option [value]=\"a.get('name').value\" *ngIf=\"a!=form\">{{a.get('title').value}}</mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n <div><mat-checkbox formControlName=\"indexable\">{{'Indexable'|translate}}</mat-checkbox></div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host ::ng-deep form{min-width:350px}:host ::ng-deep .mat-mdc-radio-group p{margin-inline-start:8px}.mat-mdc-table{width:100%}.mat-mdc-table .mat-mdc-cell:last-child{width:80px}.flex{flex:1}table tr td:first-child{width:26px}dl{width:100%;overflow:hidden;padding:0;margin:0}dt{padding:0;margin:0;clear:both}dd{float:left;padding:0;margin:0}\n"] }]
238
239
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.SystemService }, { type: i3.PromptService }, { type: i0.ElementRef }, { type: i25.DesignerRef, decorators: [{
239
240
  type: Inject,
240
241
  args: [DesignerRef]
@@ -242,4 +243,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImpor
242
243
  type: ViewChild,
243
244
  args: ['element']
244
245
  }] } });
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ViZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2FyY2hpdGVjdHVyZS9lbGVtZW50cy9jdWJlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vYXJjaGl0ZWN0dXJlL2VsZW1lbnRzL2N1YmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQTBGLE1BQU0saUJBQWlCLENBQUM7QUFDbkosT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNMUIsTUFBTSxPQUFPLG1CQUFvQixTQUFRLDRCQUE0QjtJQTJCbkUsWUFBWSxFQUFlLEVBQ2pCLFFBQXVCLEVBQ3ZCLEdBQWtCLEVBQzFCLE9BQXdCLEVBQ0gsR0FBZ0I7UUFDckMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFKaEIsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixRQUFHLEdBQUgsR0FBRyxDQUFlO1FBNUJuQixVQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FB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a0JBSi9CLFNBQVM7OzswQkFtQ0wsTUFBTTsyQkFBQyxXQUFXO3lDQVJDLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2VyY2lvblwiO1xyXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvZnVuY3Rpb25zXCI7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9wcm9tcHQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kSm9iSW5mbywgU3lzdGVtU2VydmljZSB9IGZyb20gXCIuLi8uLi9zeXN0ZW0uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZXNpZ25lclR5cGVFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIi4uL2Rlc2lnbmVyLmJhc2VcIjtcclxuaW1wb3J0IHsgRGVzaWduZXJSZWYsIHByb2dyYW1OYW1lLCBFbGVtZW50SW5mbywgQ3ViZUF4aXNNb2RlbCwgQ3ViZVZpZXdNb2RlbCwgQ3ViZUluZGV4TW9kZWwsIFBhdHRlcm5Nb2RlbCwgRWxlbWVudEZhbWlseSB9IGZyb20gXCIuLi9kZWNsYXJhdGlvbnNcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnY3ViZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2N1YmUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3ViZURlc2lnbkNvbXBvbmVudCBleHRlbmRzIERlc2lnbmVyVHlwZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHJlYWRvbmx5IHZpZXdzID0gdGhpcy5fZmIuYXJyYXkoW10pO1xyXG4gIHJlYWRvbmx5IGF4ZXMgPSB0aGlzLl9mYi5hcnJheShbXSk7XHJcbiAgcmVhZG9ubHkgaW5kaWNlcyA9IHRoaXMuX2ZiLmFycmF5KFtdKTtcclxuICByZWFkb25seSBwYXR0ZXJucyA9IHRoaXMuX2ZiLmFycmF5KFtdKTtcclxuICBzb3J0Q29tcGFyYXRvciA9IChhLCBiKSA9PiAwO1xyXG4gIHJlYWRvbmx5IGZvcm0gPSB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICBzY2hlZHVsZTogbnVsbCxcclxuICAgIHBhdHRlcm5zOiB0aGlzLnBhdHRlcm5zLFxyXG4gICAgdmlld3M6IHRoaXMudmlld3MsXHJcbiAgICBheGVzOiB0aGlzLmF4ZXMsXHJcbiAgICBpbmRpY2VzOiB0aGlzLmluZGljZXMsXHJcbiAgICBzY29wZTogdGhpcy5fZmIuY29udHJvbChudWxsKSxcclxuICAgIGN1cnJlbmN5Q29kZTogbnVsbCxcclxuICAgIHlBeGlzOiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgIHRpdGxlOiBudWxsLFxyXG4gICAgICByZXNvdXJjZTogbnVsbCxcclxuICAgIH0pLFxyXG4gICAgYW5vbWFseTogdGhpcy5fZmIuY29udHJvbCgnUG9zaXRpb25zJyksXHJcbiAgfSwgeyAvKnZhbGlkYXRvcnM6IHRoaXMuX2N1YmVBeGVzVmFsaWRhdG9yKi8gfSk7XHJcbiAgam9iSW5mbzogQmFja2dyb3VuZEpvYkluZm87XHJcbiAgc3luY2luZyA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ2VsZW1lbnQnKSBlbGVtZW50OiBFbGVtZW50UmVmPGFueT47XHJcbiAgZGF0YXR5cGVzOiBFbGVtZW50RmFtaWx5W107XHJcbiAgY3VycmVuY2llczogRWxlbWVudEluZm88YW55PltdO1xyXG4gIGd1aWRlczogRWxlbWVudEluZm88YW55PltdO1xyXG4gIGNvbnN0cnVjdG9yKGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFN5c3RlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wczogUHJvbXB0U2VydmljZSxcclxuICAgIGVsZW1lbnQ6IEVsZW1lbnRSZWY8YW55PixcclxuICAgIEBJbmplY3QoRGVzaWduZXJSZWYpIHJlZjogRGVzaWduZXJSZWYpIHtcclxuICAgIHN1cGVyKGZiLCBlbGVtZW50LCByZWYpO1xyXG4gIH1cclxuICBzeW5jKCkge1xyXG4gICAgdGhpcy5zeW5jaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuX3NlcnZpY2Uuc3luY2hyaW5pemUodGhpcy5tb2RlbC5uYW1lKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBlID0+IHtcclxuICAgICAgICB0aGlzLmpvYkluZm8gPSBlO1xyXG4gICAgICAgIHRoaXMuX3NjaGVkdWxlKGUubmV4dEV4ZWN1dGlvbik7XHJcbiAgICAgICAgdGhpcy5zeW5jaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zeW5jaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcHMuZXJyb3IoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcclxuICAgICAgY2FzZSAnd2lkZ2V0JzpcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLmN1YmUodGhpcy5tb2RlbC5uYW1lKS5zdWJzY3JpYmUociA9PiB7XHJcbiAgICAgICAgICB0aGlzLmpvYkluZm8gPSByLmpvYkluZm87XHJcbiAgICAgICAgICByLmpvYkluZm8gJiYgci5qb2JJbmZvLm5leHRFeGVjdXRpb24gJiYgdGhpcy5fc2NoZWR1bGUoci5qb2JJbmZvLm5leHRFeGVjdXRpb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdlZGl0JzpcclxuICAgICAgICB0aGlzLl9mb3JtKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NjaGVkdWxlKGRhdGU6IERhdGUpIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgbXMgPSBkYXlqcyhkYXRlKS5kaWZmKCkudmFsdWVPZigpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgfSwgbXMgKyA2MDAwMDApO1xyXG4gIH1cclxuICBwcml2YXRlIF9mb3JtKCkge1xyXG4gICAgdGhpcy5kYXRhdHlwZXMgPSBzdXBlci5fdHlwZWdyb3VwcztcclxuICAgIHRoaXMuZ3VpZGVzID0gdGhpcy5fcmVmLmRlc2lnbmVyLmd1aWRlcztcclxuICAgIHRoaXMuY3VycmVuY2llcyA9IHRoaXMuX3JlZi5kZXNpZ25lci5jdXJyZW5jaWVzO1xyXG4gICAgdGhpcy5tb2RlbC5heGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgIHRoaXMuYXhlcy5wdXNoKHRoaXMubmV3QXhpcyhhKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1vZGVsLmluZGljZXM/LmZvckVhY2goaSA9PlxyXG4gICAgICB0aGlzLmluZGljZXMucHVzaCh0aGlzLm5ld0luZGV4KGkpLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICk7XHJcbiAgICB0aGlzLm1vZGVsLnBhdHRlcm5zPy5mb3JFYWNoKHAgPT5cclxuICAgICAgdGhpcy5wYXR0ZXJucy5wdXNoKHRoaXMubmV3UGF0dGVybihwKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICApO1xyXG4gICAgdGhpcy5tb2RlbC52aWV3cz8uZm9yRWFjaCh2ID0+IHtcclxuICAgICAgdi54QXhpcyA9IGNvZXJjZUFycmF5KHYueEF4aXMpO1xyXG4gICAgICBpZiAodi5zZXJpZXMpIHYuc2VyaWVzID0gY29lcmNlQXJyYXkodi5zZXJpZXMpO1xyXG4gICAgICBpZiAodi5pbmRpY2VzKSB2LmluZGljZXMgPSBjb2VyY2VBcnJheSh2LmluZGljZXMpO1xyXG4gICAgICB0aGlzLnZpZXdzLnB1c2godGhpcy5uZXdWaWV3KHYpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY29tcGxldGUoKSB7XHJcbiAgICB0aGlzLl9mb3JtKCk7XHJcbiAgICBpZiAoIXRoaXMubW9kZWwucHJpdmlsZWdlcykgdGhpcy5tb2RlbC5wcml2aWxlZ2VzID0ge307XHJcbiAgfVxyXG4gIG5hbWVPZihheGlzOiBzdHJpbmcgfCBzdHJpbmdbXSkgeyByZXR1cm4gdGhpcy5tb2RlbC5heGVzLmZpbHRlcihhID0+IGlzQXJyYXkoYXhpcykgPyBheGlzLmluZGV4T2YoYS5uYW1lKSA+IC0xIDogYS5uYW1lID09PSBheGlzKS5qb2luKCcsICcpIH1cclxuICBwcml2YXRlIG5ld1ZpZXcobW9kZWw/OiBDdWJlVmlld01vZGVsKTogYW55IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGl0bGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHhBeGlzID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8ueEF4aXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICBjaGFydFR5cGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5jaGFydFR5cGUgfHwgbnVsbCksXHJcbiAgICAgIGluZGljZXNDaGFydFR5cGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5pbmRpY2VzQ2hhcnRUeXBlIHx8IG51bGwpLFxyXG4gICAgICBzZXJpZXMgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5zZXJpZXMpLFxyXG4gICAgICBpbmRpY2VzID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8uaW5kaWNlcyksXHJcbiAgICAgIGd1aWRlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8uZ3VpZGUpLFxyXG4gICAgICB0eXBlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8udHlwZSB8fCAnQ2hhcnQnKTtcclxuICAgIGlmICghbW9kZWwgfHwgdGhpcy5tb2RlbC5kcmFmdCkgdGl0bGUudmFsdWVDaGFuZ2VzLlxyXG4gICAgICBzdWJzY3JpYmUodCA9PiBuYW1lLnNldFZhbHVlKHByb2dyYW1OYW1lKHQpKSk7XHJcbiAgICBpZiAoIW1vZGVsIHx8ICFtb2RlbC54QXhpcylcclxuICAgICAgc2VyaWVzLmRpc2FibGUoKTtcclxuICAgIHhBeGlzLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgIGlmICh2ICYmIHYubGVuZ3RoKSB7XHJcbiAgICAgICAgc2VyaWVzLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgaWYgKHNlcmllcy52YWx1ZSlcclxuICAgICAgICAgIHNlcmllcy5zZXRWYWx1ZSgodGhpcy5heGVzLmdldFJhd1ZhbHVlKCkgYXMgQ3ViZUF4aXNNb2RlbFtdKS5cclxuICAgICAgICAgICAgZmlsdGVyKGEgPT4gdi5pbmRleE9mKGEubmFtZSkgPCAwICYmIHNlcmllcy52YWx1ZS5pbmRleE9mKGEubmFtZSkgPiAtMSkuXHJcbiAgICAgICAgICAgIG1hcChhID0+IGEubmFtZSlcclxuICAgICAgICAgICAgLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlcmllcy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgIXRoaXMuZ3VpZGVzLmxlbmd0aCAmJiBndWlkZS5kaXNhYmxlKCk7XHJcbiAgICBpZiAoIXRoaXMuaW5kaWNlcy5sZW5ndGgpIHtcclxuICAgICAgaW5kaWNlcy5kaXNhYmxlKCk7XHJcbiAgICAgIGluZGljZXNDaGFydFR5cGUuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpbmRpY2VzLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChtb2RlbD8uaW5kaWNlcykpLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgaWYgKHYgJiYgdi5sZW5ndGgpXHJcbiAgICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgbmFtZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIGljb246IG1vZGVsPy5pY29uIHx8ICdpbnNpZ2h0cycsXHJcbiAgICAgIHhBeGlzLFxyXG4gICAgICBzZXJpZXMsXHJcbiAgICAgIGluZGljZXMsXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIGNoYXJ0VHlwZSxcclxuICAgICAgaW5kaWNlc0NoYXJ0VHlwZSxcclxuICAgICAgZmlsdGVyczogdGhpcy5fZmIuZ3JvdXAoe30pLFxyXG4gICAgICBwcml2aWxlZ2VzOiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgICAgcnVsZTogbnVsbCxcclxuICAgICAgICByb2xlczogdGhpcy5fZmIuY29udHJvbDxzdHJpbmdbXT4obnVsbCksXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy50eXBlKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHYpIHtcclxuICAgICAgICBjYXNlICdTcHJlYWRzaGVldCc6XHJcbiAgICAgICAgY2FzZSAnR3JpZCc6XHJcbiAgICAgICAgICBzZXJpZXMuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgIGNoYXJ0VHlwZS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBzZXJpZXMuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICBjaGFydFR5cGUuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gbW9kZWxcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIG5ld0F4aXMobW9kZWw/OiBDdWJlQXhpc01vZGVsKTogYW55IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGl0bGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICBpZiAoIW1vZGVsIHx8IHRoaXMubW9kZWwuZHJhZnQpIHRpdGxlLnZhbHVlQ2hhbmdlcy5cclxuICAgICAgc3Vic2NyaWJlKHQgPT4gbmFtZS5zZXRWYWx1ZShwcm9ncmFtTmFtZSh0KSkpO1xyXG4gICAgZWxzZSBuYW1lLmRpc2FibGUoKTtcclxuICAgIHJldHVybiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBkZXNjZW5kZW50T2Y6IG1vZGVsPy5kZXNjZW5kZW50T2YsXHJcbiAgICAgIHNlbGVjdGlvbk1vZGU6IG1vZGVsPy5zZWxlY3Rpb25Nb2RlLFxyXG4gICAgICBjb21iaW5hdGlvbjogbW9kZWw/LmNvbWJpbmF0aW9uLFxyXG4gICAgICBzZW5zaXRpdmU6IG1vZGVsPy5zZW5zaXRpdmUsXHJcbiAgICAgIGluZGV4YWJsZTogbW9kZWw/LmluZGV4YWJsZSAhPT0gZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5kYXRhVHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gbW9kZWxcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIG5ld0luZGV4KG1vZGVsPzogQ3ViZUluZGV4TW9kZWwpOiBhbnkge1xyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/Lm5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICB0aXRsZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LnRpdGxlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIGlmICghbW9kZWwgfHwgdGhpcy5tb2RlbC5kcmFmdCkgdGl0bGUudmFsdWVDaGFuZ2VzLlxyXG4gICAgICBzdWJzY3JpYmUodCA9PiBuYW1lLnNldFZhbHVlKHByb2dyYW1OYW1lKHQpKSk7XHJcbiAgICBlbHNlIG5hbWUuZGlzYWJsZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgbmFtZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIGFjY3VtdWxhdGU6IG1vZGVsPy5hY2N1bXVsYXRlLFxyXG4gICAgICBoaWRkZW46IG1vZGVsPy5oaWRkZW4sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmV3UGF0dGVybihtb2RlbD86IFBhdHRlcm5Nb2RlbCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBheGVzOiB0aGlzLl9mYi5ncm91cChtb2RlbD8uYXhlcyB8fCB7fSksXHJcbiAgICAgIHRpdGxlOiB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIGhpZGRlbjogbW9kZWw/LmhpZGRlbixcclxuICAgICAgcnVsZTogbW9kZWw/LnJ1bGUsXHJcbiAgICAgIHJvbGVzOiB0aGlzLl9mYi5jb250cm9sPHN0cmluZ1tdPihtb2RlbD8ucm9sZXMpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxiaXpkb2MtZGVzaWduZXItZWxlbWVudCBbZm9ybV09XCJmb3JtXCIgW3ByaXZpbGVnZXNdPVwidHJ1ZVwiIChjb250aW51ZSk9XCJjb21wbGV0ZSgpXCIgW3ZpZXddPVwidmlld1wiIChiYWNrKT1cInZpZXcgPSBudWxsXCIgW2NvbnRleHRdPVwiY29udGV4dFwiPlxyXG4gIDwhLS0gd2lkZ2V0IC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSBiaXpkb2NDb250ZW50PlxyXG4gICAgPGRsICpuZ0lmPVwiam9iSW5mb1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiam9iSW5mby5sYXN0RXhlY3V0aW9uXCI+XHJcbiAgICAgICAgPGR0Pnt7J0xhc3RFeGVjdXRpb24nfHRyYW5zbGF0ZX19PC9kdD5cclxuICAgICAgICA8ZGQ+e3tqb2JJbmZvLmxhc3RFeGVjdXRpb258YW1UaW1lQWdvfX08L2RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImpvYkluZm8ubmV4dEV4ZWN1dGlvblwiPlxyXG4gICAgICAgIDxkdD57eydOZXh0RXhlY3V0aW9uJ3x0cmFuc2xhdGV9fTwvZHQ+XHJcbiAgICAgICAgPGRkPnt7am9iSW5mby5uZXh0RXhlY3V0aW9ufGFtVGltZUFnb319PC9kZD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJqb2JJbmZvLmxhc3RKb2JTdGF0ZVwiPlxyXG4gICAgICAgIDxkdD57eydMYXN0Sm9iU3RhdGUnfHRyYW5zbGF0ZX19PC9kdD5cclxuICAgICAgICA8ZGQ+XHJcbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJqb2JJbmZvLmVycm9yXCIgW2JpemRvY1Rvb2x0aXBdPVwiam9iSW5mby5lcnJvclwiPnJlcG9ydDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImpvYi1zdGF0ZVwiPnt7am9iSW5mby5sYXN0Sm9iU3RhdGV8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kbD5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgc3RhcnQgY2VudGVyXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJzeW5jKClcIiBbZGlzYWJsZWRdPVwibW9kZWwuZHJhZnQgfHwgc3luY2luZ1wiPlxyXG4gICAgICAgIDxzcGFuPiB7eydTeW5jaHJvbml6ZSd8dHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAmbmJzcDtcclxuICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwic3luY2luZ1wiIGRpYW1ldGVyPVwiMjJcIj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgIEBpZihtb2RlbC5heGVzPy5sZW5ndGgpXHJcbiAgICAgIHtcclxuICAgICAgPG1hdC1jaGlwLXNldD5cclxuICAgICAgICBAZm9yKGF4aXMgb2YgbW9kZWwuYXhlcyB8fCBbXTsgdHJhY2sgYXhpcyl7XHJcbiAgICAgICAgPG1hdC1jaGlwPnt7YXhpcy50aXRsZX19PC9tYXQtY2hpcD5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGZvcihpbmRleCBvZiBtb2RlbC5pbmRpY2VzIHx8IFtdOyB0cmFjayBpbmRleCl7XHJcbiAgICAgICAgPG1hdC1jaGlwPnt7aW5kZXgudGl0bGV9fTwvbWF0LWNoaXA+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L21hdC1jaGlwLXNldD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8IS0tIGVkaXQgLS0+XHJcbiAgPG5nLXRlbXBsYXRlIGJpemRvY0VkaXRDb250ZW50PlxyXG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1NlY3VyaXR5TGV2ZWwnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgZm9ybUNvbnRyb2xOYW1lPVwic2NvcGVcIj5cclxuICAgICAgICA8cD48L3A+XHJcbiAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY29sb3I9XCJ3YXJuXCI+e3snR2xvYmFsJ3x0cmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICA8cD57eydTZWN1cml0eUdsb2JhbEhlbHAnfHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiUG9zaXRpb25zXCI+e3snUG9zaXRpb25zJ3x0cmFuc2xhdGV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICA8cD57eydTZWN1cml0eVBvc2l0aW9uc0hlbHAnfHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiUGF0dGVybnNcIj57eydQYXR0ZXJucyd8dHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgPHA+e3snU2VjdXJpdHlQYXR0ZXJuc0hlbHAnfHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgICAgPG5nLWNvbnRhaW5lciBmb3JtR3JvdXBOYW1lPVwieUF4aXNcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7J1R5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ3VycmVuY3lcIj57eydDdXJyZW5jeSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTnVtYmVyXCI+e3snTnVtZXJpYyd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ291bnRcIj57eydBY2N1bXVsYXRpdmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57eydDdXJyZW5jeSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW5jeUNvZGVcIiBbc29ydENvbXBhcmF0b3JdPVwic29ydENvbXBhcmF0b3JcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjIG9mIGN1cnJlbmNpZXNcIiBbdmFsdWVdPVwiYy5uYW1lXCI+e3tjLnRpdGxlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8IS0tQXhlcy0tPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtYXQtaDIgcm93XCI+XHJcbiAgICAgICAge3snQXhlcyd8dHJhbnNsYXRlfX1cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZChheGVzLCBuZXdBeGlzKCksICdBeGlzJywgYXhpc2Zvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICA8L2gyPlxyXG4gICAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImF4ZXNcIiBjbGFzcz1cIm1hdC1tZGMtdGFibGVcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50LCBheGVzKVwiPlxyXG4gICAgICAgIDx0ciBjbGFzcz1cIm1hdC1tZGMtcm93XCIgKm5nRm9yPVwibGV0IGEgb2YgYXhlcy5jb250cm9sczsgaW5kZXggYXMgaW5kZXhcIiBbZm9ybUdyb3VwXT1cImFcIiBjZGtEcmFnPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgZmxleFwiPlxyXG4gICAgICAgICAgICB7e2EuZ2V0KCd0aXRsZScpLnZhbHVlfX1cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgbm93cmFwXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KGEsICdBeGlzJywgYXhpc2Zvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJheGVzLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPCEtLUluZGljZXMtLT5cclxuICAgICAgPGgyIGNsYXNzPVwibWF0LWgyIHJvd1wiPlxyXG4gICAgICAgIHt7J0luZGljZXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQoaW5kaWNlcywgbmV3SW5kZXgoKSwgJ0luZGV4JywgaW5kZXhmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9oMj5cclxuICAgICAgPHRhYmxlIGZvcm1BcnJheU5hbWU9XCJpbmRpY2VzXCIgY2xhc3M9XCJtYXQtbWRjLXRhYmxlXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgaW5kaWNlcylcIj5cclxuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvd1wiICpuZ0Zvcj1cImxldCBpIG9mIGluZGljZXMuY29udHJvbHM7IGluZGV4IGFzIGluZGV4XCIgW2Zvcm1Hcm91cF09XCJpXCIgY2RrRHJhZz5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2RrRHJhZ0hhbmRsZT5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgICAge3tpLmdldCgndGl0bGUnKS52YWx1ZX19XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIG5vd3JhcFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZWRpdChpLCAnSW5kZXgnLCBpbmRleGZvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpbmRpY2VzLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiaW5kaWNlcy5jb250cm9scy5sZW5ndGhcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7J0Fub21hbHlOb3RpZmljYXRpb24nfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiYW5vbWFseVwiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJOb25lXCI+e3snTm9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvc2l0aW9uc1wiPnt7J1Bvc2l0aW9ucyd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJlY2lwaWVudHNcIj57eydFdmVyeW9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8IS0tUGF0dGVybnMtLT5cclxuICAgICAgPGgyIGNsYXNzPVwibWF0LWgyIHJvd1wiPlxyXG4gICAgICAgIHt7J1BhdHRlcm5zJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkKHBhdHRlcm5zLCBuZXdQYXR0ZXJuKCksICdQYXR0ZXJuJywgcGF0dGVybmZvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICA8L2gyPlxyXG4gICAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cImluZGljZXNcIiBjbGFzcz1cIm1hdC1tZGMtdGFibGVcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50LCBwYXR0ZXJucylcIj5cclxuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvd1wiICpuZ0Zvcj1cImxldCBwIG9mIHBhdHRlcm5zLmNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiIFtmb3JtR3JvdXBdPVwicFwiIGNka0RyYWc+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGxcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBmbGV4XCI+XHJcbiAgICAgICAgICAgIHt7cC5nZXQoJ3RpdGxlJykudmFsdWV9fVxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBub3dyYXBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImVkaXQocCwgJ1BhdHRlcm4nLCBwYXR0ZXJuZm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInRWRpdCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInBhdHRlcm5zLnJlbW92ZUF0KGluZGV4KVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPCEtLVZpZXdzLS0+XHJcbiAgICAgIDxoMiBjbGFzcz1cInJvdyBtYXQtaDJcIj5cclxuICAgICAgICB7eydDdWJlVmlld3MnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQodmlld3MsIG5ld1ZpZXcoKSwgJ0N1YmVWaWV3Jywgdmlld2Zvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0FkZCd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICA8L2gyPlxyXG4gICAgICA8dGFibGUgZm9ybUFycmF5TmFtZT1cInZpZXdzXCIgY2xhc3M9XCJtYXQtbWRjLXRhYmxlXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgdmlld3MpXCI+XHJcbiAgICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1yb3dcIiAqbmdGb3I9XCJsZXQgdiBvZiB2aWV3cy5jb250cm9sczsgaW5kZXggYXMgaW5kZXhcIiBbZm9ybUdyb3VwXT1cInZcIiBjZGtEcmFnPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgZmxleFwiPlxyXG4gICAgICAgICAgICB7e3YuZ2V0KCd0aXRsZScpLnZhbHVlfX1cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgbm93cmFwXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KHYsICdWaWV3Jywgdmlld2Zvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ2aWV3cy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7J1NjaGVkdWxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxiaXpkb2MtdGltZXNwYW4taW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwic2NoZWR1bGVcIj48L2JpemRvYy10aW1lc3Bhbi1pbnB1dD5cclxuICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4PnRpbWVyPC9tYXQtaWNvbj5cclxuICAgICAgICA8bWF0LWhpbnQ+PC9tYXQtaGludD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvYml6ZG9jLWRlc2lnbmVyLWVsZW1lbnQ+XHJcbjwhLS1pZHgtLT5cclxuPG5nLXRlbXBsYXRlICNpbmRleGZvcm0gbGV0LWZvcm0+XHJcbiAgPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImNvbHVtblwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1RpdGxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiByZXF1aXJlZCAvPlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignVGl0bGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAmbmJzcDtcclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydOYW1lJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgnbmFtZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ05hbWUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gcGF0dGVybi0tPlxyXG48bmctdGVtcGxhdGUgI3BhdHRlcm5mb3JtIGxldC1mb3JtPlxyXG4gIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydUaXRsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1RpdGxlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPGJpemRvYy1kZXNpZ25lci1jdWJlLWZpbHRlciBbY3ViZV09XCJtb2RlbFwiIFtmb3JtXT1cImZvcm0uZ2V0KCdheGVzJylcIj48L2JpemRvYy1kZXNpZ25lci1jdWJlLWZpbHRlcj5cclxuICAgIDxiaXpkb2MtZGVzaWduZXItcHJpdmlsZWdlcyBbZm9ybV09XCJmb3JtXCI+PC9iaXpkb2MtZGVzaWduZXItcHJpdmlsZWdlcz5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSB2aWV3IC0tPlxyXG48bmctdGVtcGxhdGUgI3ZpZXdmb3JtIGxldC1mb3JtPlxyXG4gIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydUaXRsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1RpdGxlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1R5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNoYXJ0XCI+e3snQ2hhcnQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGl2b3RcIj57eydQaXZvdCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHcmlkXCI+e3snR3JpZCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcHJlYWRzaGVldFwiPnt7J1NwcmVhZHNoZWV0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydYQXhpcyd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwieEF4aXNcIiByZXF1aXJlZCBtdWx0aXBsZSBbc29ydENvbXBhcmF0b3JdPVwic29ydENvbXBhcmF0b3JcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYSBvZiBheGVzLmNvbnRyb2xzXCIgW3ZhbHVlXT1cImEuZ2V0KCduYW1lJykudmFsdWVcIj57e2EuZ2V0KCd0aXRsZScpLnZhbHVlIHx8IGEuZ2V0KCduYW1lJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3hBeGlzJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignWEF4aXMnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snU2VyaWVzJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJzZXJpZXNcIiBtdWx0aXBsZSBbc29ydENvbXBhcmF0b3JdPVwic29ydENvbXBhcmF0b3JcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhIG9mIGF4ZXMuY29udHJvbHNcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJhLmdldCgnbmFtZScpLnZhbHVlXCIgKm5nSWY9XCJmb3JtLmdldCgneEF4aXMnKS52YWx1ZT8uaW5kZXhPZihhLmdldCgnbmFtZScpLnZhbHVlKTwwXCI+e3thLmdldCgndGl0bGUnKS52YWx1ZXx8IGEuZ2V0KCduYW1lJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3NlcmllcycpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1Nlcmllcyd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydJbmRpY2VzJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJpbmRpY2VzXCIgbXVsdGlwbGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaSBvZiBpbmRpY2VzLmNvbnRyb2xzXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaS5nZXQoJ25hbWUnKS52YWx1ZVwiPnt7aS5nZXQoJ3RpdGxlJykudmFsdWV8fCBpLmdldCgnbmFtZScpLnZhbHVlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snQ2hhcnRUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjaGFydFR5cGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmb3JtLmdldCgndHlwZScpLnZhbHVlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInQ2hhcnQnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGllXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPjBcIj57eydQaWUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkRvdWdobnV0XCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPjBcIj57eydEb3VnaG51dCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiSGFsZkRvdWdobnV0XCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPjBcIj57eydIYWxmRG91Z2hudXQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkZ1bm5lbFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aD4wXCI+e3snRnVubmVsJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQeXJhbWlkXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPjBcIj57eydQeXJhbWlkJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDb2x1bW5cIj57eydDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJhclwiPnt7J0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQnViYmxlXCI+e3snQnViYmxlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJMaW5lXCI+e3snTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lXCI+e3snU3BsaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJBcmVhXCI+e3snQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2NhdHRlclwiPnt7J1NjYXR0ZXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvbGFyXCI+e3snUG9sYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJhZGFyXCI+e3snUmFkYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBMaW5lXCI+e3snU3RlcExpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBBcmVhXCI+e3snU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZUFyZWFcIj57eydTcGxpbmVBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhclwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXIxMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdCYXIxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYTEwMFwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0FyZWExMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtbjEwMFwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0NvbHVtbjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdTdGVwQXJlYVwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmVcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdMaW5lMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1Bpdm90J1wiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbj57eydOb25lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDb2x1bW5cIj57eydDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJhclwiPnt7J0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQnViYmxlXCI+e3snQnViYmxlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJMaW5lXCI+e3snTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lXCI+e3snU3BsaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVBcmVhXCI+e3snU3BsaW5lQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQXJlYVwiPnt7J0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNjYXR0ZXJcIj57eydTY2F0dGVyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQb2xhclwiPnt7J1BvbGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSYWRhclwiPnt7J1JhZGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwTGluZVwiPnt7J1N0ZXBMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwQXJlYVwiPnt7J1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhclwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXIxMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdCYXIxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYTEwMFwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0FyZWExMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtbjEwMFwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0NvbHVtbjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdTdGVwQXJlYVwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmVcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdMaW5lMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0luZGljZXNDaGFydFR5cGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImluZGljZXNDaGFydFR5cGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmb3JtLmdldCgndHlwZScpLnZhbHVlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInQ2hhcnQnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ29sdW1uXCI+e3snQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCYXJcIj57eydCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJ1YmJsZVwiPnt7J0J1YmJsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTGluZVwiPnt7J0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lQXJlYVwiPnt7J1NwbGluZUFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFyZWFcIj57eydBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTY2F0dGVyXCI+e3snU2NhdHRlcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9sYXJcIj57eydQb2xhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUmFkYXJcIj57eydSYWRhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcExpbmVcIj57eydTdGVwTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcEFyZWFcIj57eydTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW5cIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ2luZGljZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW4xMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ2luZGljZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0NvbHVtbjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXJcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ2luZGljZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXIxMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ2luZGljZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0JhcjEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ2luZGljZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0xpbmUxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnaW5kaWNlcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhMTAwXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdBcmVhMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ1N0ZXBBcmVhXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidQaXZvdCdcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24+e3snTm9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ29sdW1uXCI+e3snQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCYXJcIj57eydCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJ1YmJsZVwiPnt7J0J1YmJsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTGluZVwiPnt7J0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lQXJlYVwiPnt7J1NwbGluZUFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFyZWFcIj57eydBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTY2F0dGVyXCI+e3snU2NhdHRlcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9sYXJcIj57eydQb2xhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUmFkYXJcIj57eydSYWRhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcExpbmVcIj57eydTdGVwTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcEFyZWFcIj57eydTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXJcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0JhcjEwMFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdCYXIxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYVwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWExMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQXJlYTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW5cIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtbjEwMFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nU3RlcEFyZWFcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZVwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmUxMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nTGluZTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydHdWlkZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZ3VpZGVcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbj57eydOb25lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZyBvZiBndWlkZXNcIiBbdmFsdWVdPVwiZy5uYW1lXCI+e3tnLnRpdGxlIHxsb2NhbGl6ZWRTdHJpbmd9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxiaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXIgKm5nSWY9XCJjdWJlXCIgW2N1YmVdPVwiY3ViZVwiIFtmb3JtXT1cImZvcm0uZ2V0KCdmaWx0ZXJzJylcIj48L2JpemRvYy1kZXNpZ25lci1jdWJlLWZpbHRlcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSBBeGlzIC0tPlxyXG48bmctdGVtcGxhdGUgI2F4aXNmb3JtIGxldC1mb3JtPlxyXG4gIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3snVGl0bGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignVGl0bGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgJm5ic3A7XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7J05hbWUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgnbmFtZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ05hbWUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0RhdGFUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXRhVHlwZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0IG9mIGRhdGF0eXBlc1snXyddLmVsZW1lbnRzfHNvcnQ6ICd0aXRsZSdcIiBbdmFsdWVdPVwidC5uYW1lXCI+XHJcbiAgICAgICAgICB7e3QudGl0bGV9fVxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGdyb3VwICpuZ0Zvcj1cImxldCBnIG9mIGRhdGF0eXBlc3xzb3J0OiAndGl0bGUnXCIgW2xhYmVsXT1cImcudGl0bGVcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0IG9mIGcuZWxlbWVudHN8c29ydDogJ3RpdGxlJ1wiIFt2YWx1ZV09XCJ0Lm5hbWVcIj5cclxuICAgICAgICAgICAge3t0LnRpdGxlfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1vcHRncm91cD5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignRGF0YVR5cGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8ZGl2PjxtYXQtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwiY29tYmluYXRpb25cIj57eydDb21iaW5hdGlvbid8dHJhbnNsYXRlfX08L21hdC1jaGVja2JveD48L2Rpdj5cclxuICAgIDxkaXY+PG1hdC1jaGVja2JveCBmb3JtQ29udHJvbE5hbWU9XCJzZW5zaXRpdmVcIj57eydTZW5zaXRpdmUnfHRyYW5zbGF0ZX19PC9tYXQtY2hlY2tib3g+PC9kaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snU2VsZWN0aW9uTW9kZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0aW9uTW9kZVwiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTm9uZVwiPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uPnt7J09uZU1vZGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTXVsdGlwbGVcIj57eydNdWx0aXBsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTZWFyY2hcIj57eydBdXRvY29tcGxldGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGF0dGVyblwiPnt7J1BhdHRlcm4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0Rlc2NlbmRlbnRPZid8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY2VuZGVudE9mXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYSBvZiBheGVzLmNvbnRyb2xzXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYS5nZXQoJ25hbWUnKS52YWx1ZVwiICpuZ0lmPVwiYSE9Zm9ybVwiPnt7YS5nZXQoJ3RpdGxlJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxkaXY+PG1hdC1jaGVja2JveCBmb3JtQ29udHJvbE5hbWU9XCJpbmRleGFibGVcIj57eydJbmRleGFibGUnfHRyYW5zbGF0ZX19PC9tYXQtY2hlY2tib3g+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ViZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2FkbWluL2FyY2hpdGVjdHVyZS9lbGVtZW50cy9jdWJlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vYXJjaGl0ZWN0dXJlL2VsZW1lbnRzL2N1YmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQTBGLE1BQU0saUJBQWlCLENBQUM7QUFDbkosT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNMUIsTUFBTSxPQUFPLG1CQUFvQixTQUFRLDRCQUE0QjtJQTJCbkUsWUFBWSxFQUFlLEVBQ2pCLFFBQXVCLEVBQ3ZCLEdBQWtCLEVBQzFCLE9BQXdCLEVBQ0gsR0FBZ0I7UUFDckMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFKaEIsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixRQUFHLEdBQUgsR0FBRyxDQUFlO1FBNUJuQixVQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FB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QVM7OzswQkFtQ0wsTUFBTTsyQkFBQyxXQUFXO3lDQVJDLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2VyY2lvblwiO1xyXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvZnVuY3Rpb25zXCI7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9wcm9tcHQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kSm9iSW5mbywgU3lzdGVtU2VydmljZSB9IGZyb20gXCIuLi8uLi9zeXN0ZW0uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZXNpZ25lclR5cGVFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIi4uL2Rlc2lnbmVyLmJhc2VcIjtcclxuaW1wb3J0IHsgRGVzaWduZXJSZWYsIHByb2dyYW1OYW1lLCBFbGVtZW50SW5mbywgQ3ViZUF4aXNNb2RlbCwgQ3ViZVZpZXdNb2RlbCwgQ3ViZUluZGV4TW9kZWwsIFBhdHRlcm5Nb2RlbCwgRWxlbWVudEZhbWlseSB9IGZyb20gXCIuLi9kZWNsYXJhdGlvbnNcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnY3ViZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2N1YmUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3ViZURlc2lnbkNvbXBvbmVudCBleHRlbmRzIERlc2lnbmVyVHlwZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHJlYWRvbmx5IHZpZXdzID0gdGhpcy5fZmIuYXJyYXkoW10pO1xyXG4gIHJlYWRvbmx5IGF4ZXMgPSB0aGlzLl9mYi5hcnJheShbXSk7XHJcbiAgcmVhZG9ubHkgaW5kaWNlcyA9IHRoaXMuX2ZiLmFycmF5KFtdKTtcclxuICByZWFkb25seSBwYXR0ZXJucyA9IHRoaXMuX2ZiLmFycmF5KFtdKTtcclxuICBzb3J0Q29tcGFyYXRvciA9IChhLCBiKSA9PiAwO1xyXG4gIHJlYWRvbmx5IGZvcm0gPSB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICBzY2hlZHVsZTogbnVsbCxcclxuICAgIHBhdHRlcm5zOiB0aGlzLnBhdHRlcm5zLFxyXG4gICAgdmlld3M6IHRoaXMudmlld3MsXHJcbiAgICBheGVzOiB0aGlzLmF4ZXMsXHJcbiAgICBpbmRpY2VzOiB0aGlzLmluZGljZXMsXHJcbiAgICBzY29wZTogdGhpcy5fZmIuY29udHJvbChudWxsKSxcclxuICAgIGN1cnJlbmN5Q29kZTogbnVsbCxcclxuICAgIHlBeGlzOiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgIHRpdGxlOiBudWxsLFxyXG4gICAgICByZXNvdXJjZTogbnVsbCxcclxuICAgIH0pLFxyXG4gICAgYW5vbWFseTogdGhpcy5fZmIuY29udHJvbCgnUG9zaXRpb25zJyksXHJcbiAgfSwgeyAvKnZhbGlkYXRvcnM6IHRoaXMuX2N1YmVBeGVzVmFsaWRhdG9yKi8gfSk7XHJcbiAgam9iSW5mbzogQmFja2dyb3VuZEpvYkluZm87XHJcbiAgc3luY2luZyA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ2VsZW1lbnQnKSBlbGVtZW50OiBFbGVtZW50UmVmPGFueT47XHJcbiAgdHlwZWdyb3VwczogRWxlbWVudEZhbWlseVtdO1xyXG4gIGN1cnJlbmNpZXM6IEVsZW1lbnRJbmZvPGFueT5bXTtcclxuICBndWlkZXM6IEVsZW1lbnRJbmZvPGFueT5bXTtcclxuICBjb25zdHJ1Y3RvcihmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcHM6IFByb21wdFNlcnZpY2UsXHJcbiAgICBlbGVtZW50OiBFbGVtZW50UmVmPGFueT4sXHJcbiAgICBASW5qZWN0KERlc2lnbmVyUmVmKSByZWY6IERlc2lnbmVyUmVmKSB7XHJcbiAgICBzdXBlcihmYiwgZWxlbWVudCwgcmVmKTtcclxuICB9XHJcbiAgc3luYygpIHtcclxuICAgIHRoaXMuc3luY2luZyA9IHRydWU7XHJcbiAgICB0aGlzLl9zZXJ2aWNlLnN5bmNocmluaXplKHRoaXMubW9kZWwubmFtZSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogZSA9PiB7XHJcbiAgICAgICAgdGhpcy5qb2JJbmZvID0gZTtcclxuICAgICAgICB0aGlzLl9zY2hlZHVsZShlLm5leHRFeGVjdXRpb24pO1xyXG4gICAgICAgIHRoaXMuc3luY2luZyA9IGZhbHNlO1xyXG4gICAgICB9LCBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3luY2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3BzLmVycm9yKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XHJcbiAgICAgIGNhc2UgJ3dpZGdldCc6XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5jdWJlKHRoaXMubW9kZWwubmFtZSkuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgICAgdGhpcy5qb2JJbmZvID0gci5qb2JJbmZvO1xyXG4gICAgICAgICAgci5qb2JJbmZvICYmIHIuam9iSW5mby5uZXh0RXhlY3V0aW9uICYmIHRoaXMuX3NjaGVkdWxlKHIuam9iSW5mby5uZXh0RXhlY3V0aW9uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLl9mb3JtKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NjaGVkdWxlKGRhdGU6IERhdGUpIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgbXMgPSBkYXlqcyhkYXRlKS5kaWZmKCkudmFsdWVPZigpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgfSwgbXMgKyA2MDAwMDApO1xyXG4gIH1cclxuICBwcml2YXRlIF9mb3JtKCkge1xyXG4gICAgdGhpcy50eXBlZ3JvdXBzID0gc3VwZXIuX3R5cGVncm91cHM7XHJcbiAgICB0aGlzLmd1aWRlcyA9IHRoaXMuX3JlZi5kZXNpZ25lci5ndWlkZXM7XHJcbiAgICB0aGlzLmN1cnJlbmNpZXMgPSB0aGlzLl9yZWYuZGVzaWduZXIuY3VycmVuY2llcztcclxuICAgIHRoaXMubW9kZWwuYXhlcz8uZm9yRWFjaChhID0+IHtcclxuICAgICAgdGhpcy5heGVzLnB1c2godGhpcy5uZXdBeGlzKGEpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kZWwuaW5kaWNlcz8uZm9yRWFjaChpID0+XHJcbiAgICAgIHRoaXMuaW5kaWNlcy5wdXNoKHRoaXMubmV3SW5kZXgoaSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMubW9kZWwucGF0dGVybnM/LmZvckVhY2gocCA9PlxyXG4gICAgICB0aGlzLnBhdHRlcm5zLnB1c2godGhpcy5uZXdQYXR0ZXJuKHApLCB7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICk7XHJcbiAgICB0aGlzLm1vZGVsLnZpZXdzPy5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICB2LnhBeGlzID0gY29lcmNlQXJyYXkodi54QXhpcyk7XHJcbiAgICAgIGlmICh2LnNlcmllcykgdi5zZXJpZXMgPSBjb2VyY2VBcnJheSh2LnNlcmllcyk7XHJcbiAgICAgIGlmICh2LmluZGljZXMpIHYuaW5kaWNlcyA9IGNvZXJjZUFycmF5KHYuaW5kaWNlcyk7XHJcbiAgICAgIHRoaXMudmlld3MucHVzaCh0aGlzLm5ld1ZpZXcodiksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCF0aGlzLm1vZGVsLnByaXZpbGVnZXMpIHRoaXMubW9kZWwucHJpdmlsZWdlcyA9IHt9O1xyXG4gIH1cclxuICBjb21wbGV0ZSgpIHtcclxuICB9XHJcbiAgbmFtZU9mKGF4aXM6IHN0cmluZyB8IHN0cmluZ1tdKSB7IHJldHVybiB0aGlzLm1vZGVsLmF4ZXMuZmlsdGVyKGEgPT4gaXNBcnJheShheGlzKSA/IGF4aXMuaW5kZXhPZihhLm5hbWUpID4gLTEgOiBhLm5hbWUgPT09IGF4aXMpLmpvaW4oJywgJykgfVxyXG4gIHByaXZhdGUgbmV3Vmlldyhtb2RlbD86IEN1YmVWaWV3TW9kZWwpOiBhbnkge1xyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/Lm5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICB0aXRsZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LnRpdGxlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgeEF4aXMgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy54QXhpcywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIGNoYXJ0VHlwZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LmNoYXJ0VHlwZSB8fCBudWxsKSxcclxuICAgICAgaW5kaWNlc0NoYXJ0VHlwZSA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LmluZGljZXNDaGFydFR5cGUgfHwgbnVsbCksXHJcbiAgICAgIHNlcmllcyA9IHRoaXMuX2ZiLmNvbnRyb2wobW9kZWw/LnNlcmllcyksXHJcbiAgICAgIGluZGljZXMgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5pbmRpY2VzKSxcclxuICAgICAgZ3VpZGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5ndWlkZSksXHJcbiAgICAgIHR5cGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50eXBlIHx8ICdDaGFydCcpO1xyXG4gICAgaWYgKCFtb2RlbCB8fCB0aGlzLm1vZGVsLmRyYWZ0KSB0aXRsZS52YWx1ZUNoYW5nZXMuXHJcbiAgICAgIHN1YnNjcmliZSh0ID0+IG5hbWUuc2V0VmFsdWUocHJvZ3JhbU5hbWUodCkpKTtcclxuICAgIGlmICghbW9kZWwgfHwgIW1vZGVsLnhBeGlzKVxyXG4gICAgICBzZXJpZXMuZGlzYWJsZSgpO1xyXG4gICAgeEF4aXMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgaWYgKHYgJiYgdi5sZW5ndGgpIHtcclxuICAgICAgICBzZXJpZXMuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBpZiAoc2VyaWVzLnZhbHVlKVxyXG4gICAgICAgICAgc2VyaWVzLnNldFZhbHVlKCh0aGlzLmF4ZXMuZ2V0UmF3VmFsdWUoKSBhcyBDdWJlQXhpc01vZGVsW10pLlxyXG4gICAgICAgICAgICBmaWx0ZXIoYSA9PiB2LmluZGV4T2YoYS5uYW1lKSA8IDAgJiYgc2VyaWVzLnZhbHVlLmluZGV4T2YoYS5uYW1lKSA+IC0xKS5cclxuICAgICAgICAgICAgbWFwKGEgPT4gYS5uYW1lKVxyXG4gICAgICAgICAgICAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc2VyaWVzLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgICAhdGhpcy5ndWlkZXMubGVuZ3RoICYmIGd1aWRlLmRpc2FibGUoKTtcclxuICAgIGlmICghdGhpcy5pbmRpY2VzLmxlbmd0aCkge1xyXG4gICAgICBpbmRpY2VzLmRpc2FibGUoKTtcclxuICAgICAgaW5kaWNlc0NoYXJ0VHlwZS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGluZGljZXMudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy5pbmRpY2VzKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBpZiAodiAmJiB2Lmxlbmd0aClcclxuICAgICAgICBpbmRpY2VzQ2hhcnRUeXBlLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpbmRpY2VzQ2hhcnRUeXBlLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgaWNvbjogbW9kZWw/Lmljb24gfHwgJ2luc2lnaHRzJyxcclxuICAgICAgeEF4aXMsXHJcbiAgICAgIHNlcmllcyxcclxuICAgICAgaW5kaWNlcyxcclxuICAgICAgdHlwZSxcclxuICAgICAgY2hhcnRUeXBlLFxyXG4gICAgICBndWlkZSxcclxuICAgICAgaW5kaWNlc0NoYXJ0VHlwZSxcclxuICAgICAgZmlsdGVyczogdGhpcy5fZmIuZ3JvdXAoe30pLFxyXG4gICAgICBwcml2aWxlZ2VzOiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgICAgcnVsZTogbnVsbCxcclxuICAgICAgICByb2xlczogdGhpcy5fZmIuY29udHJvbDxzdHJpbmdbXT4obnVsbCksXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG1vZGVsPy50eXBlKSkuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHYpIHtcclxuICAgICAgICBjYXNlICdTcHJlYWRzaGVldCc6XHJcbiAgICAgICAgY2FzZSAnR3JpZCc6XHJcbiAgICAgICAgY2FzZSAnUGl2b3QnOlxyXG4gICAgICAgICAgc2VyaWVzLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICBjaGFydFR5cGUuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgc2VyaWVzLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgY2hhcnRUeXBlLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBmb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG1vZGVsXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBuZXdBeGlzKG1vZGVsPzogQ3ViZUF4aXNNb2RlbCk6IGFueSB7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8ubmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgIHRpdGxlID0gdGhpcy5fZmIuY29udHJvbChtb2RlbD8udGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgaWYgKCFtb2RlbCB8fCB0aGlzLm1vZGVsLmRyYWZ0KSB0aXRsZS52YWx1ZUNoYW5nZXMuXHJcbiAgICAgIHN1YnNjcmliZSh0ID0+IG5hbWUuc2V0VmFsdWUocHJvZ3JhbU5hbWUodCkpKTtcclxuICAgIGVsc2UgbmFtZS5kaXNhYmxlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgZGVzY2VuZGVudE9mOiBtb2RlbD8uZGVzY2VuZGVudE9mLFxyXG4gICAgICBzZWxlY3Rpb25Nb2RlOiBtb2RlbD8uc2VsZWN0aW9uTW9kZSxcclxuICAgICAgY29tYmluYXRpb246IG1vZGVsPy5jb21iaW5hdGlvbixcclxuICAgICAgc2Vuc2l0aXZlOiBtb2RlbD8uc2Vuc2l0aXZlLFxyXG4gICAgICBpbmRleGFibGU6IG1vZGVsPy5pbmRleGFibGUgIT09IGZhbHNlLFxyXG4gICAgICBkYXRhVHlwZTogdGhpcy5fZmIuY29udHJvbChtb2RlbD8uZGF0YVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG1vZGVsXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBuZXdJbmRleChtb2RlbD86IEN1YmVJbmRleE1vZGVsKTogYW55IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgdGl0bGUgPSB0aGlzLl9mYi5jb250cm9sKG1vZGVsPy50aXRsZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICBpZiAoIW1vZGVsIHx8IHRoaXMubW9kZWwuZHJhZnQpIHRpdGxlLnZhbHVlQ2hhbmdlcy5cclxuICAgICAgc3Vic2NyaWJlKHQgPT4gbmFtZS5zZXRWYWx1ZShwcm9ncmFtTmFtZSh0KSkpO1xyXG4gICAgZWxzZSBuYW1lLmRpc2FibGUoKTtcclxuICAgIHJldHVybiB0aGlzLl9mYi5ncm91cCh7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICBhY2N1bXVsYXRlOiBtb2RlbD8uYWNjdW11bGF0ZSxcclxuICAgICAgaGlkZGVuOiBtb2RlbD8uaGlkZGVuLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5ld1BhdHRlcm4obW9kZWw/OiBQYXR0ZXJuTW9kZWwpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZiLmdyb3VwKHtcclxuICAgICAgYXhlczogdGhpcy5fZmIuZ3JvdXAobW9kZWw/LmF4ZXMgfHwge30pLFxyXG4gICAgICB0aXRsZTogdGhpcy5fZmIuY29udHJvbChtb2RlbD8udGl0bGUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICBoaWRkZW46IG1vZGVsPy5oaWRkZW4sXHJcbiAgICAgIHJ1bGU6IG1vZGVsPy5ydWxlLFxyXG4gICAgICByb2xlczogdGhpcy5fZmIuY29udHJvbDxzdHJpbmdbXT4obW9kZWw/LnJvbGVzKSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8Yml6ZG9jLWRlc2lnbmVyLWVsZW1lbnQgW2Zvcm1dPVwiZm9ybVwiIFtwcml2aWxlZ2VzXT1cInRydWVcIiAoY29udGludWUpPVwiY29tcGxldGUoKVwiIFt2aWV3XT1cInZpZXdcIiAoYmFjayk9XCJ2aWV3ID0gbnVsbFwiIFtjb250ZXh0XT1cImNvbnRleHRcIj5cclxuICA8IS0tIHdpZGdldCAtLT5cclxuICA8bmctdGVtcGxhdGUgYml6ZG9jQ29udGVudD5cclxuICAgIDxkbCAqbmdJZj1cImpvYkluZm9cIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImpvYkluZm8ubGFzdEV4ZWN1dGlvblwiPlxyXG4gICAgICAgIDxkdD57eydMYXN0RXhlY3V0aW9uJ3x0cmFuc2xhdGV9fTwvZHQ+XHJcbiAgICAgICAgPGRkPnt7am9iSW5mby5sYXN0RXhlY3V0aW9ufGFtVGltZUFnb319PC9kZD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJqb2JJbmZvLm5leHRFeGVjdXRpb25cIj5cclxuICAgICAgICA8ZHQ+e3snTmV4dEV4ZWN1dGlvbid8dHJhbnNsYXRlfX08L2R0PlxyXG4gICAgICAgIDxkZD57e2pvYkluZm8ubmV4dEV4ZWN1dGlvbnxhbVRpbWVBZ299fTwvZGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiam9iSW5mby5sYXN0Sm9iU3RhdGVcIj5cclxuICAgICAgICA8ZHQ+e3snTGFzdEpvYlN0YXRlJ3x0cmFuc2xhdGV9fTwvZHQ+XHJcbiAgICAgICAgPGRkPlxyXG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiam9iSW5mby5lcnJvclwiIFtiaXpkb2NUb29sdGlwXT1cImpvYkluZm8uZXJyb3JcIj5yZXBvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJqb2Itc3RhdGVcIj57e2pvYkluZm8ubGFzdEpvYlN0YXRlfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICA8L2RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGw+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IHN0YXJ0IGNlbnRlclwiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwic3luYygpXCIgW2Rpc2FibGVkXT1cIm1vZGVsLmRyYWZ0IHx8IHN5bmNpbmdcIj5cclxuICAgICAgICA8c3Bhbj4ge3snU3luY2hyb25pemUnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgJm5ic3A7XHJcbiAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cInN5bmNpbmdcIiBkaWFtZXRlcj1cIjIyXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICBAaWYobW9kZWwuYXhlcz8ubGVuZ3RoKVxyXG4gICAgICB7XHJcbiAgICAgIDxtYXQtY2hpcC1zZXQ+XHJcbiAgICAgICAgQGZvcihheGlzIG9mIG1vZGVsLmF4ZXM7IHRyYWNrIGF4aXMpe1xyXG4gICAgICAgIDxtYXQtY2hpcD57e2F4aXMudGl0bGV9fTwvbWF0LWNoaXA+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBmb3IoaW5kZXggb2YgbW9kZWwuaW5kaWNlcyB8fCBbXTsgdHJhY2sgaW5kZXgpe1xyXG4gICAgICAgIDxtYXQtY2hpcD57e2luZGV4LnRpdGxlfX08L21hdC1jaGlwPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtY2hpcC1zZXQ+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPCEtLSBlZGl0IC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSBiaXpkb2NFZGl0Q29udGVudD5cclxuICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydTZWN1cml0eUxldmVsJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInNjb3BlXCI+XHJcbiAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNvbG9yPVwid2FyblwiPnt7J0dsb2JhbCd8dHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgPHA+e3snU2VjdXJpdHlHbG9iYWxIZWxwJ3x0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlBvc2l0aW9uc1wiPnt7J1Bvc2l0aW9ucyd8dHJhbnNsYXRlfX08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgPHA+e3snU2VjdXJpdHlQb3NpdGlvbnNIZWxwJ3x0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlBhdHRlcm5zXCI+e3snUGF0dGVybnMnfHRyYW5zbGF0ZX19PC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgIDxwPnt7J1NlY3VyaXR5UGF0dGVybnNIZWxwJ3x0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgZm9ybUdyb3VwTmFtZT1cInlBeGlzXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57eydUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkN1cnJlbmN5XCI+e3snQ3VycmVuY3knfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIk51bWJlclwiPnt7J051bWVyaWMnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNvdW50XCI+e3snQWNjdW11bGF0aXZlJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3snQ3VycmVuY3knfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lDb2RlXCIgW3NvcnRDb21wYXJhdG9yXT1cInNvcnRDb21wYXJhdG9yXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjdXJyZW5jaWVzXCIgW3ZhbHVlXT1cImMubmFtZVwiPnt7Yy50aXRsZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPCEtLUF4ZXMtLT5cclxuICAgICAgPGgyIGNsYXNzPVwibWF0LWgyIHJvd1wiPlxyXG4gICAgICAgIHt7J0F4ZXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJhZGQoYXhlcywgbmV3QXhpcygpLCAnQXhpcycsIGF4aXNmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9oMj5cclxuICAgICAgPHRhYmxlIGZvcm1BcnJheU5hbWU9XCJheGVzXCIgY2xhc3M9XCJtYXQtbWRjLXRhYmxlXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgYXhlcylcIj5cclxuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvd1wiICpuZ0Zvcj1cImxldCBhIG9mIGF4ZXMuY29udHJvbHM7IGluZGV4IGFzIGluZGV4XCIgW2Zvcm1Hcm91cF09XCJhXCIgY2RrRHJhZz5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2RrRHJhZ0hhbmRsZT5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgICAge3thLmdldCgndGl0bGUnKS52YWx1ZX19XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIG5vd3JhcFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZWRpdChhLCAnQXhpcycsIGF4aXNmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFZGl0J3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYXhlcy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwhLS1JbmRpY2VzLS0+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1hdC1oMiByb3dcIj5cclxuICAgICAgICB7eydJbmRpY2VzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkKGluZGljZXMsIG5ld0luZGV4KCksICdJbmRleCcsIGluZGV4Zm9ybSlcIiBbYml6ZG9jVG9vbHRpcF09XCInQWRkJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDx0YWJsZSBmb3JtQXJyYXlOYW1lPVwiaW5kaWNlc1wiIGNsYXNzPVwibWF0LW1kYy10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGluZGljZXMpXCI+XHJcbiAgICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1yb3dcIiAqbmdGb3I9XCJsZXQgaSBvZiBpbmRpY2VzLmNvbnRyb2xzOyBpbmRleCBhcyBpbmRleFwiIFtmb3JtR3JvdXBdPVwiaVwiIGNka0RyYWc+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGxcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBmbGV4XCI+XHJcbiAgICAgICAgICAgIHt7aS5nZXQoJ3RpdGxlJykudmFsdWV9fVxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBub3dyYXBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImVkaXQoaSwgJ0luZGV4JywgaW5kZXhmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFZGl0J3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiaW5kaWNlcy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImluZGljZXMuY29udHJvbHMubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57eydBbm9tYWx5Tm90aWZpY2F0aW9uJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImFub21hbHlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTm9uZVwiPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQb3NpdGlvbnNcIj57eydQb3NpdGlvbnMnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSZWNpcGllbnRzXCI+e3snRXZlcnlvbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPCEtLVBhdHRlcm5zLS0+XHJcbiAgICAgIDxoMiBjbGFzcz1cIm1hdC1oMiByb3dcIj5cclxuICAgICAgICB7eydQYXR0ZXJucyd8dHJhbnNsYXRlfX1cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImFkZChwYXR0ZXJucywgbmV3UGF0dGVybigpLCAnUGF0dGVybicsIHBhdHRlcm5mb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9oMj5cclxuICAgICAgPHRhYmxlIGZvcm1BcnJheU5hbWU9XCJpbmRpY2VzXCIgY2xhc3M9XCJtYXQtbWRjLXRhYmxlXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgcGF0dGVybnMpXCI+XHJcbiAgICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1yb3dcIiAqbmdGb3I9XCJsZXQgcCBvZiBwYXR0ZXJucy5jb250cm9sczsgaW5kZXggYXMgaW5kZXhcIiBbZm9ybUdyb3VwXT1cInBcIiBjZGtEcmFnPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBjZGtEcmFnSGFuZGxlPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgZmxleFwiPlxyXG4gICAgICAgICAgICB7e3AuZ2V0KCd0aXRsZScpLnZhbHVlfX1cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgbm93cmFwXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJlZGl0KHAsICdQYXR0ZXJuJywgcGF0dGVybmZvcm0pXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0VkaXQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+ZWRpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwYXR0ZXJucy5yZW1vdmVBdChpbmRleClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVtb3ZlJ3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwhLS1WaWV3cy0tPlxyXG4gICAgICA8aDIgY2xhc3M9XCJyb3cgbWF0LWgyXCI+XHJcbiAgICAgICAge3snQ3ViZVZpZXdzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkKHZpZXdzLCBuZXdWaWV3KCksICdDdWJlVmlldycsIHZpZXdmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiIHR5cGU9XCJidXR0b25cIj48bWF0LWljb24+YWRkX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgICAgPC9oMj5cclxuICAgICAgPHRhYmxlIGZvcm1BcnJheU5hbWU9XCJ2aWV3c1wiIGNsYXNzPVwibWF0LW1kYy10YWJsZVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIHZpZXdzKVwiPlxyXG4gICAgICAgIDx0ciBjbGFzcz1cIm1hdC1tZGMtcm93XCIgKm5nRm9yPVwibGV0IHYgb2Ygdmlld3MuY29udHJvbHM7IGluZGV4IGFzIGluZGV4XCIgW2Zvcm1Hcm91cF09XCJ2XCIgY2RrRHJhZz5cclxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbFwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2RrRHJhZ0hhbmRsZT5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIGZsZXhcIj5cclxuICAgICAgICAgICAge3t2LmdldCgndGl0bGUnKS52YWx1ZX19XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIG5vd3JhcFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZWRpdCh2LCAnVmlldycsIHZpZXdmb3JtKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFZGl0J3x0cmFuc2xhdGVcIiB0eXBlPVwiYnV0dG9uXCI+PG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidmlld3MucmVtb3ZlQXQoaW5kZXgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1JlbW92ZSd8dHJhbnNsYXRlXCIgdHlwZT1cImJ1dHRvblwiPjxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57eydTY2hlZHVsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8Yml6ZG9jLXRpbWVzcGFuLWlucHV0IGZvcm1Db250cm9sTmFtZT1cInNjaGVkdWxlXCI+PC9iaXpkb2MtdGltZXNwYW4taW5wdXQ+XHJcbiAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeD50aW1lcjwvbWF0LWljb24+XHJcbiAgICAgICAgPG1hdC1oaW50PjwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2JpemRvYy1kZXNpZ25lci1lbGVtZW50PlxyXG48IS0taWR4LS0+XHJcbjxuZy10ZW1wbGF0ZSAjaW5kZXhmb3JtIGxldC1mb3JtPlxyXG4gIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eydUaXRsZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1RpdGxlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgJm5ic3A7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snTmFtZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiByZXF1aXJlZCAvPlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ25hbWUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdOYW1lJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48IS0tIHBhdHRlcm4tLT5cclxuPG5nLXRlbXBsYXRlICNwYXR0ZXJuZm9ybSBsZXQtZm9ybT5cclxuICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVGl0bGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdUaXRsZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxiaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXIgW2N1YmVdPVwibW9kZWxcIiBbZm9ybV09XCJmb3JtLmdldCgnYXhlcycpXCI+PC9iaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXI+XHJcbiAgICA8Yml6ZG9jLWRlc2lnbmVyLXByaXZpbGVnZXMgW2Zvcm1dPVwiZm9ybVwiPjwvYml6ZG9jLWRlc2lnbmVyLXByaXZpbGVnZXM+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gdmlldyAtLT5cclxuPG5nLXRlbXBsYXRlICN2aWV3Zm9ybSBsZXQtZm9ybT5cclxuICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snVGl0bGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmdldCgndGl0bGUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdUaXRsZSd8dHJhbnNsYXRlKVwiPjwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJDaGFydFwiPnt7J0NoYXJ0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBpdm90XCI+e3snUGl2b3QnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiR3JpZFwiPnt7J0dyaWQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3ByZWFkc2hlZXRcIj57eydTcHJlYWRzaGVldCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snWEF4aXMnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInhBeGlzXCIgcmVxdWlyZWQgbXVsdGlwbGUgW3NvcnRDb21wYXJhdG9yXT1cInNvcnRDb21wYXJhdG9yXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGEgb2YgYXhlcy5jb250cm9sc1wiIFt2YWx1ZV09XCJhLmdldCgnbmFtZScpLnZhbHVlXCI+e3thLmdldCgndGl0bGUnKS52YWx1ZSB8fCBhLmdldCgnbmFtZScpLnZhbHVlfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd4QXhpcycpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1hBeGlzJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J1Nlcmllcyd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic2VyaWVzXCIgbXVsdGlwbGUgW3NvcnRDb21wYXJhdG9yXT1cInNvcnRDb21wYXJhdG9yXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYSBvZiBheGVzLmNvbnRyb2xzXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYS5nZXQoJ25hbWUnKS52YWx1ZVwiICpuZ0lmPVwiZm9ybS5nZXQoJ3hBeGlzJykudmFsdWU/LmluZGV4T2YoYS5nZXQoJ25hbWUnKS52YWx1ZSk8MFwiPnt7YS5nZXQoJ3RpdGxlJykudmFsdWV8fCBhLmdldCgnbmFtZScpLnZhbHVlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCdzZXJpZXMnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdTZXJpZXMnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snSW5kaWNlcyd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiaW5kaWNlc1wiIG11bHRpcGxlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGkgb2YgaW5kaWNlcy5jb250cm9sc1wiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImkuZ2V0KCduYW1lJykudmFsdWVcIj57e2kuZ2V0KCd0aXRsZScpLnZhbHVlfHwgaS5nZXQoJ25hbWUnKS52YWx1ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0NoYXJ0VHlwZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY2hhcnRUeXBlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZm9ybS5nZXQoJ3R5cGUnKS52YWx1ZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0NoYXJ0J1wiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBpZVwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aD4wXCI+e3snUGllJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJEb3VnaG51dFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aD4wXCI+e3snRG91Z2hudXQnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkhhbGZEb3VnaG51dFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aD4wXCI+e3snSGFsZkRvdWdobnV0J3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJGdW5uZWxcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg+MFwiPnt7J0Z1bm5lbCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUHlyYW1pZFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aD4wXCI+e3snUHlyYW1pZCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ29sdW1uXCI+e3snQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCYXJcIj57eydCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJ1YmJsZVwiPnt7J0J1YmJsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTGluZVwiPnt7J0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQXJlYVwiPnt7J0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNjYXR0ZXJcIj57eydTY2F0dGVyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQb2xhclwiPnt7J1BvbGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSYWRhclwiPnt7J1JhZGFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwTGluZVwiPnt7J1N0ZXBMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGVwQXJlYVwiPnt7J1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVBcmVhXCI+e3snU3BsaW5lQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXJcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyMTAwXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWExMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdBcmVhMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtblwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW4xMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nU3RlcEFyZWFcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nTGluZTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidQaXZvdCdcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24+e3snTm9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQ29sdW1uXCI+e3snQ29sdW1uJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCYXJcIj57eydCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkJ1YmJsZVwiPnt7J0J1YmJsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTGluZVwiPnt7J0xpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZVwiPnt7J1NwbGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3BsaW5lQXJlYVwiPnt7J1NwbGluZUFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFyZWFcIj57eydBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTY2F0dGVyXCI+e3snU2NhdHRlcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUG9sYXJcIj57eydQb2xhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUmFkYXJcIj57eydSYWRhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcExpbmVcIj57eydTdGVwTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RlcEFyZWFcIj57eydTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXJcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyMTAwXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWExMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdBcmVhMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0NvbHVtblwiIFtkaXNhYmxlZF09XCIhZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGhcIj57eydTdGFja2luZ0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW4xMDBcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nU3RlcEFyZWFcIiBbZGlzYWJsZWRdPVwiIWZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoXCI+e3snU3RhY2tpbmdTdGVwQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnc2VyaWVzJykudmFsdWU/Lmxlbmd0aFwiPnt7J1N0YWNraW5nTGluZTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydJbmRpY2VzQ2hhcnRUeXBlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJpbmRpY2VzQ2hhcnRUeXBlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZm9ybS5nZXQoJ3R5cGUnKS52YWx1ZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0NoYXJ0J1wiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNvbHVtblwiPnt7J0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQmFyXCI+e3snQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCdWJibGVcIj57eydCdWJibGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkxpbmVcIj57eydMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVcIj57eydTcGxpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZUFyZWFcIj57eydTcGxpbmVBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJBcmVhXCI+e3snQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2NhdHRlclwiPnt7J1NjYXR0ZXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvbGFyXCI+e3snUG9sYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJhZGFyXCI+e3snUmFkYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBMaW5lXCI+e3snU3RlcExpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBBcmVhXCI+e3snU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdDb2x1bW4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uMTAwXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdDb2x1bW4xMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdCYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyMTAwXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdCYXIxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nTGluZVwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnaW5kaWNlcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdpbmRpY2VzJykudmFsdWU/Lmxlbmd0aDwyXCI+e3snU3RhY2tpbmdMaW5lMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ2luZGljZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0FyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQXJlYTEwMFwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnaW5kaWNlcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQXJlYTEwMCd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdTdGVwQXJlYVwiIFtkaXNhYmxlZF09XCJmb3JtLmdldCgnaW5kaWNlcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInUGl2b3QnXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkNvbHVtblwiPnt7J0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQmFyXCI+e3snQmFyJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJCdWJibGVcIj57eydCdWJibGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkxpbmVcIj57eydMaW5lJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTcGxpbmVcIj57eydTcGxpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNwbGluZUFyZWFcIj57eydTcGxpbmVBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJBcmVhXCI+e3snQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU2NhdHRlclwiPnt7J1NjYXR0ZXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlBvbGFyXCI+e3snUG9sYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlJhZGFyXCI+e3snUmFkYXInfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBMaW5lXCI+e3snU3RlcExpbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0ZXBBcmVhXCI+e3snU3RlcEFyZWEnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQmFyXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0Jhcid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdCYXIxMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQmFyMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0FyZWFcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQXJlYSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdBcmVhMTAwXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0FyZWExMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlN0YWNraW5nQ29sdW1uXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0NvbHVtbid8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdDb2x1bW4xMDBcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nQ29sdW1uMTAwJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ1N0ZXBBcmVhXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ1N0ZXBBcmVhJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTdGFja2luZ0xpbmVcIiBbZGlzYWJsZWRdPVwiZm9ybS5nZXQoJ3NlcmllcycpLnZhbHVlPy5sZW5ndGg8MlwiPnt7J1N0YWNraW5nTGluZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiU3RhY2tpbmdMaW5lMTAwXCIgW2Rpc2FibGVkXT1cImZvcm0uZ2V0KCdzZXJpZXMnKS52YWx1ZT8ubGVuZ3RoPDJcIj57eydTdGFja2luZ0xpbmUxMDAnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snR3VpZGUnfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImd1aWRlXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24+e3snTm9uZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGcgb2YgZ3VpZGVzXCIgW3ZhbHVlXT1cImcubmFtZVwiPnt7Zy50aXRsZSB8bG9jYWxpemVkU3RyaW5nfX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8Yml6ZG9jLWRlc2lnbmVyLWN1YmUtZmlsdGVyICpuZ0lmPVwiY3ViZVwiIFtjdWJlXT1cImN1YmVcIiBbZm9ybV09XCJmb3JtLmdldCgnZmlsdGVycycpXCI+PC9iaXpkb2MtZGVzaWduZXItY3ViZS1maWx0ZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gQXhpcyAtLT5cclxuPG5nLXRlbXBsYXRlICNheGlzZm9ybSBsZXQtZm9ybT5cclxuICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7J1RpdGxlJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uZ2V0KCd0aXRsZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgW2lubmVySFRNTF09XCInUmVxdWlyZWRFcnInfHRyYW5zbGF0ZTooJ1RpdGxlJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICZuYnNwO1xyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57eydOYW1lJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ25hbWUnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIFtpbm5lckhUTUxdPVwiJ1JlcXVpcmVkRXJyJ3x0cmFuc2xhdGU6KCdOYW1lJ3x0cmFuc2xhdGUpXCI+PC9tYXQtZXJyb3I+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD57eydEYXRhVHlwZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdCBvZiB0eXBlZ3JvdXBzWydfJ10uZWxlbWVudHN8c29ydDogJ3RpdGxlJ1wiIFt2YWx1ZV09XCJ0Lm5hbWVcIj5cclxuICAgICAgICAgIHt7dC50aXRsZX19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0Z3JvdXAgKm5nRm9yPVwibGV0IGcgb2YgdHlwZWdyb3Vwc3xzb3J0OiAndGl0bGUnXCIgW2xhYmVsXT1cImcudGl0bGVcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0IG9mIGcuZWxlbWVudHN8c29ydDogJ3RpdGxlJ1wiIFt2YWx1ZV09XCJ0Lm5hbWVcIj5cclxuICAgICAgICAgICAge3t0LnRpdGxlfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1vcHRncm91cD5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5nZXQoJ3RpdGxlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiBbaW5uZXJIVE1MXT1cIidSZXF1aXJlZEVycid8dHJhbnNsYXRlOignRGF0YVR5cGUnfHRyYW5zbGF0ZSlcIj48L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8ZGl2PjxtYXQtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwiY29tYmluYXRpb25cIj57eydDb21iaW5hdGlvbid8dHJhbnNsYXRlfX08L21hdC1jaGVja2JveD48L2Rpdj5cclxuICAgIDxkaXY+PG1hdC1jaGVja2JveCBmb3JtQ29udHJvbE5hbWU9XCJzZW5zaXRpdmVcIj57eydTZW5zaXRpdmUnfHRyYW5zbGF0ZX19PC9tYXQtY2hlY2tib3g+PC9kaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snU2VsZWN0aW9uTW9kZSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0aW9uTW9kZVwiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTm9uZVwiPnt7J05vbmUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uPnt7J09uZU1vZGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiTXVsdGlwbGVcIj57eydNdWx0aXBsZSd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJTZWFyY2hcIj57eydBdXRvY29tcGxldGUnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiUGF0dGVyblwiPnt7J1BhdHRlcm4nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7J0Rlc2NlbmRlbnRPZid8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY2VuZGVudE9mXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYSBvZiBheGVzLmNvbnRyb2xzXCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYS5nZXQoJ25hbWUnKS52YWx1ZVwiICpuZ0lmPVwiYSE9Zm9ybVwiPnt7YS5nZXQoJ3RpdGxlJykudmFsdWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxkaXY+PG1hdC1jaGVja2JveCBmb3JtQ29udHJvbE5hbWU9XCJpbmRleGFibGVcIj57eydJbmRleGFibGUnfHRyYW5zbGF0ZX19PC9tYXQtY2hlY2tib3g+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==