@seniorsistemas/exclusion-process-component 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -377,18 +377,36 @@
377
377
  return LogicalDeleteService;
378
378
  }());
379
379
 
380
+ var EXCLUSION_PROCESS_STATUS_BADGE = [
381
+ {
382
+ enumValue: EnumExclusionProcessStatus.ERROR,
383
+ color: angularComponents.EnumBadgeColors.RED
384
+ },
385
+ {
386
+ enumValue: EnumExclusionProcessStatus.PENDING,
387
+ color: angularComponents.EnumBadgeColors.YELLOW
388
+ },
389
+ {
390
+ enumValue: EnumExclusionProcessStatus.PROCESSING,
391
+ color: angularComponents.EnumBadgeColors.BLUE
392
+ },
393
+ {
394
+ enumValue: EnumExclusionProcessStatus.SUCCESS,
395
+ color: angularComponents.EnumBadgeColors.GREEN
396
+ }
397
+ ];
380
398
  var ExclusionDetailsComponent = /** @class */ (function () {
381
- function ExclusionDetailsComponent(router, route, translate, logicalDeleteService, projectConfigs) {
382
- this.router = router;
399
+ function ExclusionDetailsComponent(route, translate, logicalDeleteService, projectConfigs) {
383
400
  this.route = route;
384
401
  this.translate = translate;
385
402
  this.logicalDeleteService = logicalDeleteService;
386
403
  this.projectConfigs = projectConfigs;
387
- this._entityName = "";
404
+ this.expandedRows = {};
388
405
  this._isVisible = false;
389
406
  this._isLoading = false;
390
- this._processSummaryData = [];
391
- this._processSummaryColumns = [];
407
+ this._processGroupData = [];
408
+ this._processGroupColumns = [];
409
+ this._processStepColumns = [];
392
410
  this.ngUnsubscribe = new rxjs.Subject();
393
411
  }
394
412
  Object.defineProperty(ExclusionDetailsComponent.prototype, "isVisible", {
@@ -405,16 +423,23 @@
405
423
  enumerable: true,
406
424
  configurable: true
407
425
  });
408
- Object.defineProperty(ExclusionDetailsComponent.prototype, "processSummaryData", {
426
+ Object.defineProperty(ExclusionDetailsComponent.prototype, "processGroupData", {
409
427
  get: function () {
410
- return this._processSummaryData;
428
+ return this._processGroupData;
411
429
  },
412
430
  enumerable: true,
413
431
  configurable: true
414
432
  });
415
- Object.defineProperty(ExclusionDetailsComponent.prototype, "processSummaryColumns", {
433
+ Object.defineProperty(ExclusionDetailsComponent.prototype, "processGroupColumns", {
416
434
  get: function () {
417
- return this._processSummaryColumns;
435
+ return this._processGroupColumns;
436
+ },
437
+ enumerable: true,
438
+ configurable: true
439
+ });
440
+ Object.defineProperty(ExclusionDetailsComponent.prototype, "processStepColumns", {
441
+ get: function () {
442
+ return this._processStepColumns;
418
443
  },
419
444
  enumerable: true,
420
445
  configurable: true
@@ -426,7 +451,8 @@
426
451
  .subscribe(function (data) {
427
452
  _this.locale = data.localeConfig;
428
453
  });
429
- this._processSummaryColumns = this.getSummaryColumns();
454
+ this._processGroupColumns = this.getGroupColumns();
455
+ this._processStepColumns = this.getStepColumns();
430
456
  };
431
457
  ExclusionDetailsComponent.prototype.ngOnDestroy = function () {
432
458
  this.ngUnsubscribe.next();
@@ -435,9 +461,8 @@
435
461
  };
436
462
  ExclusionDetailsComponent.prototype.showDetails = function (details) {
437
463
  this._exclusionDetails = details;
438
- this._entityName = details.entityName;
439
464
  this._isVisible = true;
440
- this._processSummaryData = [];
465
+ this._processGroupData = [];
441
466
  this.processDetails = null;
442
467
  this.entityDescription = details.entityDescription;
443
468
  this.loadProcessDetails(details);
@@ -449,17 +474,9 @@
449
474
  ExclusionDetailsComponent.prototype.closeDetails = function () {
450
475
  this._isVisible = false;
451
476
  this._exclusionDetails = null;
452
- this._processSummaryData = [];
477
+ this._processGroupData = [];
453
478
  this.disconnectWebSocket();
454
479
  };
455
- ExclusionDetailsComponent.prototype.openExclusions = function () {
456
- this.closeDetails();
457
- this.router.navigate(["exclusions-list", this._entityName], {
458
- queryParams: {
459
- entityDescription: this.entityDescription
460
- }
461
- });
462
- };
463
480
  ExclusionDetailsComponent.prototype.getRecordDescription = function () {
464
481
  var _a;
465
482
  if (!((_a = this.processDetails) === null || _a === void 0 ? void 0 : _a.description)) {
@@ -509,15 +526,15 @@
509
526
  ExclusionDetailsComponent.prototype.getEmptyStateDescription = function () {
510
527
  return this.translate.instant(this.projectConfigs.getTranslationPrefix() + ".logical_delete_empty_state_description");
511
528
  };
512
- ExclusionDetailsComponent.prototype.getSummaryColumns = function () {
529
+ ExclusionDetailsComponent.prototype.getGroupColumns = function () {
513
530
  return [
514
531
  {
515
532
  field: "description",
516
533
  attributes: ["description"],
517
- header: this.translate.instant(this.projectConfigs.getTranslationPrefix() + ".logical_delete_description"),
534
+ header: this.translate.instant(this.projectConfigs.getTranslationPrefix() + ".logical_delete_group"),
518
535
  type: angularComponents.EnumColumnFieldType.STRING,
519
536
  style: {
520
- width: "300px"
537
+ width: "340px"
521
538
  }
522
539
  },
523
540
  {
@@ -530,24 +547,32 @@
530
547
  width: "100px"
531
548
  },
532
549
  tooltip: this.getColumnStatusTooltip,
533
- badgeConfigs: [
534
- {
535
- enumValue: EnumExclusionProcessStatus.ERROR,
536
- color: angularComponents.EnumBadgeColors.RED
537
- },
538
- {
539
- enumValue: EnumExclusionProcessStatus.PENDING,
540
- color: angularComponents.EnumBadgeColors.YELLOW
541
- },
542
- {
543
- enumValue: EnumExclusionProcessStatus.PROCESSING,
544
- color: angularComponents.EnumBadgeColors.BLUE
545
- },
546
- {
547
- enumValue: EnumExclusionProcessStatus.SUCCESS,
548
- color: angularComponents.EnumBadgeColors.GREEN
549
- }
550
- ]
550
+ badgeConfigs: EXCLUSION_PROCESS_STATUS_BADGE
551
+ }
552
+ ];
553
+ };
554
+ ExclusionDetailsComponent.prototype.getStepColumns = function () {
555
+ return [
556
+ {
557
+ field: "description",
558
+ attributes: ["description"],
559
+ header: this.translate.instant(this.projectConfigs.getTranslationPrefix() + ".logical_delete_step"),
560
+ type: angularComponents.EnumColumnFieldType.STRING,
561
+ style: {
562
+ width: "340px"
563
+ }
564
+ },
565
+ {
566
+ field: "status",
567
+ attributes: ["status"],
568
+ header: this.translate.instant(this.projectConfigs.getTranslationPrefix() + ".logical_delete_status"),
569
+ type: angularComponents.EnumColumnFieldType.ENUM,
570
+ enumPrefix: this.projectConfigs.getTranslationPrefix() + ".logical_delete_enum_exclusion_process_status_",
571
+ style: {
572
+ width: "100px"
573
+ },
574
+ tooltip: this.getColumnStatusTooltip,
575
+ badgeConfigs: EXCLUSION_PROCESS_STATUS_BADGE
551
576
  }
552
577
  ];
553
578
  };
@@ -571,7 +596,14 @@
571
596
  return;
572
597
  }
573
598
  _this.processDetails = process;
574
- _this.loadProcessSummary(process);
599
+ _this._processGroupData = _this.sortGroupsByStartDate(process.groups)
600
+ .map(function (p) { return (__assign(__assign({}, p), { steps: _this.sortStepsByStartDate(p.steps) })); });
601
+ _this.expandedRows = {};
602
+ _this._processGroupData
603
+ .filter(function (p) { return p.status !== EnumExclusionProcessStatus.SUCCESS; })
604
+ .forEach(function (p) {
605
+ _this.expandedRows[p.id] = true;
606
+ });
575
607
  });
576
608
  };
577
609
  ExclusionDetailsComponent.prototype.sortByDate = function (startDate, finishDate) {
@@ -591,21 +623,6 @@
591
623
  var _this = this;
592
624
  return steps.sort(function (a, b) { return _this.sortByDate(a.startDate, b.finishDate); });
593
625
  };
594
- ExclusionDetailsComponent.prototype.loadProcessSummary = function (process) {
595
- var _this = this;
596
- var stepLogs = [];
597
- this.sortGroupsByStartDate(process.groups)
598
- .forEach(function (group) {
599
- var steps = _this.sortStepsByStartDate(group.steps)
600
- .map(function (step) { return ({
601
- description: step.description,
602
- status: step.status,
603
- errorMessage: step.errorMessage
604
- }); });
605
- stepLogs.push.apply(stepLogs, __spread(steps));
606
- });
607
- this._processSummaryData = stepLogs;
608
- };
609
626
  ExclusionDetailsComponent.prototype.disconnectWebSocket = function () {
610
627
  if (this._exclusionProcessStatusChangedSubscribe) {
611
628
  this._exclusionProcessStatusChangedSubscribe.unsubscribe();
@@ -656,7 +673,6 @@
656
673
  });
657
674
  };
658
675
  ExclusionDetailsComponent.ctorParameters = function () { return [
659
- { type: router.Router },
660
676
  { type: router.ActivatedRoute },
661
677
  { type: core$1.TranslateService },
662
678
  { type: LogicalDeleteService },
@@ -670,20 +686,26 @@
670
686
  ], ExclusionDetailsComponent.prototype, "isLoading", null);
671
687
  __decorate([
672
688
  core.Output()
673
- ], ExclusionDetailsComponent.prototype, "processSummaryData", null);
689
+ ], ExclusionDetailsComponent.prototype, "processGroupData", null);
690
+ __decorate([
691
+ core.Output()
692
+ ], ExclusionDetailsComponent.prototype, "processGroupColumns", null);
674
693
  __decorate([
675
694
  core.Output()
676
- ], ExclusionDetailsComponent.prototype, "processSummaryColumns", null);
695
+ ], ExclusionDetailsComponent.prototype, "processStepColumns", null);
677
696
  __decorate([
678
697
  core.Output()
679
698
  ], ExclusionDetailsComponent.prototype, "processDetails", void 0);
680
699
  __decorate([
681
700
  core.Output()
682
701
  ], ExclusionDetailsComponent.prototype, "entityDescription", void 0);
702
+ __decorate([
703
+ core.Output()
704
+ ], ExclusionDetailsComponent.prototype, "expandedRows", void 0);
683
705
  ExclusionDetailsComponent = __decorate([
684
706
  core.Component({
685
707
  selector: "s-exclusion-details",
686
- template: "<s-sidebar [visible]=\"isVisible\" (visibleChange)=\"onVisibilityChanged($event)\" [header]=\"getSidebarTitle()\">\n <s-loading-state [loading]=\"isLoading\">\n <p-panel [showHeader]=\"false\" styleClass=\"s-exclusion-details-record-details-panel\">\n <div class=\"s-exclusion-details-record-details-container\">\n <div class=\"s-exclusion-details-record-icon-background\">\n <em class=\"far fa-file-alt s-exclusion-details-record-icon\"></em>\n </div>\n\n <div class=\"s-exclusion-details-record-details-recordinfo\">\n <span class=\"s-exclusion-details-record-details-type\">\n {{entityDescription}}\n </span>\n <span>\n {{getRecordDescription()}}\n </span>\n </div>\n\n <div class=\"s-exclusion-details-record-details-dateinfo\">\n <span>\n {{getStartDateLabel()}}: {{getInicialDate()}}\n </span>\n <span *ngIf=\"isFinished()\">\n {{getFinishDateLabel()}}: {{getFinishDate()}}\n </span>\n </div>\n </div>\n </p-panel>\n\n <p-panel>\n <p-header>\n {{getSummaryLabel()}}\n </p-header>\n\n <s-empty-state\n *ngIf=\"processSummaryData && !processSummaryData.length\"\n [title]=\"getEmptyStateTitle()\"\n [description]=\"getEmptyStateDescription()\">\n [showPrimaryAction]=\"false\"\n </s-empty-state>\n\n <p-table\n [value]=\"processSummaryData\"\n [columns]=\"processSummaryColumns\"\n dataKey=\"id\"\n [lazy]=\"false\"\n [scrollable]=\"false\"\n [paginator]=\"false\"\n *ngIf=\"processSummaryData && processSummaryData.length\">\n\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col *ngFor=\"let col of columns\"\n [style.width]=\"col.width\"\n />\n </colgroup>\n </ng-template>\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\"\n [id]=\"col.field\"\n [ngStyle]=\"col.style\"\n [pSortableColumn]=\"col.field\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n <p-sortIcon [field]=\"col.field\" ></p-sortIcon>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\n <tr>\n <s-table-columns\n [columns]=\"columns\"\n [rowValue]=\"rowData\"\n [locale]=\"locale\">\n </s-table-columns>\n </tr>\n </ng-template>\n </p-table>\n </p-panel>\n </s-loading-state>\n\n <s-footer>\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <s-button [label]=\"getShowExclusionsButtonLabel()\" (onClick)=\"openExclusions()\"></s-button>\n <s-button [label]=\"getCloseButtonLabel()\" priority=\"link\" (onClick)=\"closeDetails()\"></s-button>\n </div>\n </div>\n </s-footer>\n</s-sidebar>\n",
708
+ template: "<s-sidebar [visible]=\"isVisible\" (visibleChange)=\"onVisibilityChanged($event)\" [header]=\"getSidebarTitle()\">\n <s-loading-state [loading]=\"isLoading\">\n <p-panel [showHeader]=\"false\" styleClass=\"s-exclusion-details-record-details-panel\">\n <div class=\"s-exclusion-details-record-details-container\">\n <div class=\"s-exclusion-details-record-icon-background\">\n <em class=\"far fa-file-alt s-exclusion-details-record-icon\"></em>\n </div>\n\n <div class=\"s-exclusion-details-record-details-recordinfo\">\n <span class=\"s-exclusion-details-record-details-type\">\n {{entityDescription}}\n </span>\n <span>\n {{getRecordDescription()}}\n </span>\n </div>\n\n <div class=\"s-exclusion-details-record-details-dateinfo\">\n <span>\n {{getStartDateLabel()}}: {{getInicialDate()}}\n </span>\n <span *ngIf=\"isFinished()\">\n {{getFinishDateLabel()}}: {{getFinishDate()}}\n </span>\n </div>\n </div>\n </p-panel>\n\n <p-panel>\n <p-header>\n {{getSummaryLabel()}}\n </p-header>\n\n <s-empty-state\n *ngIf=\"processGroupData && !processGroupData.length\"\n [title]=\"getEmptyStateTitle()\"\n [description]=\"getEmptyStateDescription()\">\n [showPrimaryAction]=\"false\"\n </s-empty-state>\n\n <p-table\n [value]=\"processGroupData\"\n [columns]=\"processGroupColumns\"\n dataKey=\"id\"\n [lazy]=\"false\"\n [scrollable]=\"false\"\n [paginator]=\"false\"\n *ngIf=\"processGroupData && processGroupData.length\"\n [expandedRowKeys]=\"expandedRows\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th id=\"expend-column\" style=\"width: 40px;\"></th>\n <th *ngFor=\"let col of columns\"\n [id]=\"col.field\"\n [ngStyle]=\"col.style\"\n [pSortableColumn]=\"col.field\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n <p-sortIcon [field]=\"col.field\" ></p-sortIcon>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-expanded=\"expanded\">\n <tr sNavigation [sRowToggler]=\"rowData\">\n <td style=\"width: 40px;\" tabindex=\"0\">\n <em class=\"fa fa-{{ expanded ? 'minus' : 'plus' }}\"></em>\n </td>\n <s-table-columns\n [columns]=\"columns\"\n [rowValue]=\"rowData\"\n [locale]=\"locale\">\n </s-table-columns>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-rowData let-columns=\"columns\">\n <tr class=\"sds-expanded-row\">\n <td [attr.colspan]=\"columns.length + 1\">\n <p-table \n [value]=\"rowData.steps\"\n [columns]=\"processStepColumns\"\n dataKey=\"id\"\n [paginator]=\"false\"\n [responsive]=\"true\"\n [scrollable]=\"false\"\n [lazy]=\"false\">\n\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th *ngFor=\"let col of columns\"\n [id]=\"col.field\"\n [ngStyle]=\"col.style\"\n [pSortableColumn]=\"col.field\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n <p-sortIcon [field]=\"col.field\" ></p-sortIcon>\n </div>\n </th>\n </tr>\n </ng-template>\n \n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\n <tr>\n <s-table-columns\n [columns]=\"columns\"\n [rowValue]=\"rowData\"\n [locale]=\"locale\">\n </s-table-columns>\n </tr>\n </ng-template>\n </p-table>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </p-panel>\n </s-loading-state>\n\n <s-footer>\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <s-button [label]=\"getCloseButtonLabel()\" priority=\"link\" (onClick)=\"closeDetails()\"></s-button>\n </div>\n </div>\n </s-footer>\n</s-sidebar>\n",
687
709
  encapsulation: core.ViewEncapsulation.None,
688
710
  styles: [".s-exclusion-details-record-details-panel{margin-bottom:10px}.s-exclusion-details-record-details-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.s-exclusion-details-record-details-recordinfo{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-left:10px;-ms-flex:1;flex:1}.s-exclusion-details-record-details-dateinfo{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-left:10px;-ms-flex-align:end;align-items:flex-end;font-size:12px}.s-exclusion-details-record-details-type{color:#999}.s-exclusion-details-record-icon{font-size:22pt;color:#7e8d95}.s-exclusion-details-record-icon-background{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:16px;background-color:#c1cad1;border-radius:50%;height:60px;width:60px}"]
689
711
  })
@@ -823,7 +845,8 @@
823
845
  var HTTP_CODE_SERVER_ERROR_START = 500;
824
846
  var HTTP_CODE_SERVER_ERROR_END = 600;
825
847
  var ExclusionsListComponent = /** @class */ (function () {
826
- function ExclusionsListComponent(route, translate, formBuilder, changeDetectorRef, logicalDeleteService, filterService, projectConfigs) {
848
+ function ExclusionsListComponent(router, route, translate, formBuilder, changeDetectorRef, logicalDeleteService, filterService, projectConfigs, cdr) {
849
+ this.router = router;
827
850
  this.route = route;
828
851
  this.translate = translate;
829
852
  this.formBuilder = formBuilder;
@@ -831,6 +854,7 @@
831
854
  this.logicalDeleteService = logicalDeleteService;
832
855
  this.filterService = filterService;
833
856
  this.projectConfigs = projectConfigs;
857
+ this.cdr = cdr;
834
858
  this.currentListParams = { page: 0, size: 10, sort: [], filterData: {} };
835
859
  this.showLoader = false;
836
860
  this.totalRecords = 0;
@@ -850,30 +874,32 @@
850
874
  .subscribe(function (data) {
851
875
  _this.locale = data.localeConfig;
852
876
  });
853
- this.route.params
854
- .pipe(operators.takeUntil(this.ngUnsubscribe))
855
- .subscribe(function (params) {
856
- _this.entityName = params.entityName;
857
- _this.showBasedOnRoute();
858
- });
859
877
  this.route.queryParams
860
878
  .pipe(operators.takeUntil(this.ngUnsubscribe))
861
879
  .subscribe(function (queryParams) {
880
+ _this.entityName = queryParams.entityName;
862
881
  _this.entityDescription = queryParams.entityDescription;
863
882
  _this.processId = queryParams.processId;
864
- _this.showBasedOnRoute();
865
883
  });
866
884
  };
867
- ExclusionsListComponent.prototype.showBasedOnRoute = function () {
885
+ ExclusionsListComponent.prototype.ngAfterViewInit = function () {
868
886
  if (this.entityName && this.entityDescription && this.processId) {
869
887
  this.exclusionDetailsComponent.showDetails({
870
888
  processId: this.processId,
871
889
  entityDescription: this.entityDescription,
872
890
  entityName: this.entityName
873
891
  });
892
+ this.cdr.detectChanges();
874
893
  }
875
894
  };
876
895
  ExclusionsListComponent.prototype.ngOnDestroy = function () {
896
+ var _a;
897
+ var params = __assign({}, (_a = this.route.snapshot) === null || _a === void 0 ? void 0 : _a.queryParams);
898
+ if (params) {
899
+ delete params.entityName;
900
+ delete params.entityDescription;
901
+ this.router.navigate([], { queryParams: params });
902
+ }
877
903
  this.ngUnsubscribe.next();
878
904
  this.ngUnsubscribe.complete();
879
905
  };
@@ -881,8 +907,8 @@
881
907
  return this.formBuilder.group({
882
908
  description: [undefined, forms.Validators.compose([])],
883
909
  status: [undefined, forms.Validators.compose([])],
884
- startDate: [{ value: undefined, disabled: false }, forms.Validators.compose([])],
885
- endDate: [{ value: undefined, disabled: false }, forms.Validators.compose([])]
910
+ startDate: [{ value: null, disabled: false }, forms.Validators.compose([])],
911
+ endDate: [{ value: null, disabled: false }, forms.Validators.compose([])]
886
912
  });
887
913
  };
888
914
  ExclusionsListComponent.prototype.getGridColumns = function () {
@@ -1155,13 +1181,15 @@
1155
1181
  var ExclusionsListComponent_1;
1156
1182
  ExclusionsListComponent.DATE_FORMAT = "YYYY-MM-DD";
1157
1183
  ExclusionsListComponent.ctorParameters = function () { return [
1184
+ { type: router.Router },
1158
1185
  { type: router.ActivatedRoute },
1159
1186
  { type: core$1.TranslateService },
1160
1187
  { type: forms.FormBuilder },
1161
1188
  { type: core.ChangeDetectorRef },
1162
1189
  { type: LogicalDeleteService },
1163
1190
  { type: FilterService },
1164
- { type: LogicalDeleteConfigService }
1191
+ { type: LogicalDeleteConfigService },
1192
+ { type: core.ChangeDetectorRef }
1165
1193
  ]; };
1166
1194
  __decorate([
1167
1195
  core.ViewChild("exclusionsTable")
@@ -1260,7 +1288,7 @@
1260
1288
  },
1261
1289
  children: [
1262
1290
  {
1263
- path: ":entityName",
1291
+ path: "",
1264
1292
  component: ExclusionsListComponent
1265
1293
  }
1266
1294
  ]