@banta/sdk 4.7.12 → 4.7.14

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.
@@ -10,7 +10,7 @@ import { MatButtonModule } from '@angular/material/button';
10
10
  import { BantaTrustResourceUrlPipe } from './trust-resource-url.pipe';
11
11
  import { BantaAttachmentComponent } from './attachment/attachment.component';
12
12
  import { BantaMentionLinkerPipe } from './mention-linker.pipe';
13
- import { TimerPool } from 'projects/sdk/src/lib/common/timer-pool.service';
13
+ import { TimerPool } from './timer-pool.service';
14
14
  import * as i0 from "@angular/core";
15
15
  const COMPONENTS = [
16
16
  TimestampComponent,
@@ -65,4 +65,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
65
65
  exports: COMPONENTS
66
66
  }]
67
67
  }] });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9jb21tb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7QUFFM0UsTUFBTSxVQUFVLEdBQUc7SUFDZixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIseUJBQXlCO0lBQ3pCLHdCQUF3QjtJQUN4Qix5QkFBeUI7Q0FDNUIsQ0FBQztBQVlGLE1BQU0sT0FBTyxpQkFBaUI7SUFDMUIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixTQUFTLEVBQUU7Z0JBQ1AsU0FBUzthQUNaO1NBQ0osQ0FBQTtJQUNMLENBQUM7OytHQVJRLGlCQUFpQjtnSEFBakIsaUJBQWlCLGlCQW5CMUIsa0JBQWtCO1FBQ2xCLGlCQUFpQjtRQUNqQix1QkFBdUI7UUFDdkIsc0JBQXNCO1FBQ3RCLHlCQUF5QjtRQUN6Qix3QkFBd0I7UUFDeEIseUJBQXlCLGFBTXJCLFlBQVk7UUFDWixhQUFhO1FBQ2Isd0JBQXdCO1FBQ3hCLGVBQWUsYUFmbkIsa0JBQWtCO1FBQ2xCLGlCQUFpQjtRQUNqQix1QkFBdUI7UUFDdkIsc0JBQXNCO1FBQ3RCLHlCQUF5QjtRQUN6Qix3QkFBd0I7UUFDeEIseUJBQXlCO2dIQWFoQixpQkFBaUIsWUFQdEIsWUFBWTtRQUNaLGFBQWE7UUFDYix3QkFBd0I7UUFDeEIsZUFBZTs0RkFJVixpQkFBaUI7a0JBVjdCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2Isd0JBQXdCO3dCQUN4QixlQUFlO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUUsVUFBVTtpQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lc3RhbXBDb21wb25lbnQgfSBmcm9tICcuL3RpbWVzdGFtcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBMaWdodGJveENvbXBvbmVudCB9IGZyb20gJy4vbGlnaHRib3gvbGlnaHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBCYW50YU1hcmtkb3duVG9IdG1sUGlwZSB9IGZyb20gJy4vbWFya2Rvd24tdG8taHRtbC5waXBlJztcclxuaW1wb3J0IHsgQmFudGFBdHRhY2htZW50c0NvbXBvbmVudCB9IGZyb20gJy4vYXR0YWNobWVudHMvYXR0YWNobWVudHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IEJhbnRhVHJ1c3RSZXNvdXJjZVVybFBpcGUgfSBmcm9tICcuL3RydXN0LXJlc291cmNlLXVybC5waXBlJztcclxuaW1wb3J0IHsgQmFudGFBdHRhY2htZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hdHRhY2htZW50L2F0dGFjaG1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmFudGFNZW50aW9uTGlua2VyUGlwZSB9IGZyb20gJy4vbWVudGlvbi1saW5rZXIucGlwZSc7XHJcbmltcG9ydCB7IFRpbWVyUG9vbCB9IGZyb20gJ3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi90aW1lci1wb29sLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgQ09NUE9ORU5UUyA9IFtcclxuICAgIFRpbWVzdGFtcENvbXBvbmVudCxcclxuICAgIExpZ2h0Ym94Q29tcG9uZW50LFxyXG4gICAgQmFudGFNYXJrZG93blRvSHRtbFBpcGUsXHJcbiAgICBCYW50YU1lbnRpb25MaW5rZXJQaXBlLFxyXG4gICAgQmFudGFUcnVzdFJlc291cmNlVXJsUGlwZSxcclxuICAgIEJhbnRhQXR0YWNobWVudENvbXBvbmVudCxcclxuICAgIEJhbnRhQXR0YWNobWVudHNDb21wb25lbnRcclxuXTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgICBkZWNsYXJhdGlvbnM6IENPTVBPTkVOVFMsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxyXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZVxyXG4gICAgXSxcclxuICAgIGV4cG9ydHM6IENPTVBPTkVOVFNcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhbnRhQ29tbW9uTW9kdWxlIHtcclxuICAgIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8QmFudGFDb21tb25Nb2R1bGU+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuZ01vZHVsZTogQmFudGFDb21tb25Nb2R1bGUsXHJcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgICAgICAgICAgVGltZXJQb29sXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9jb21tb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFakQsTUFBTSxVQUFVLEdBQUc7SUFDZixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIseUJBQXlCO0lBQ3pCLHdCQUF3QjtJQUN4Qix5QkFBeUI7Q0FDNUIsQ0FBQztBQVlGLE1BQU0sT0FBTyxpQkFBaUI7SUFDMUIsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPO1lBQ0gsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixTQUFTLEVBQUU7Z0JBQ1AsU0FBUzthQUNaO1NBQ0osQ0FBQTtJQUNMLENBQUM7OytHQVJRLGlCQUFpQjtnSEFBakIsaUJBQWlCLGlCQW5CMUIsa0JBQWtCO1FBQ2xCLGlCQUFpQjtRQUNqQix1QkFBdUI7UUFDdkIsc0JBQXNCO1FBQ3RCLHlCQUF5QjtRQUN6Qix3QkFBd0I7UUFDeEIseUJBQXlCLGFBTXJCLFlBQVk7UUFDWixhQUFhO1FBQ2Isd0JBQXdCO1FBQ3hCLGVBQWUsYUFmbkIsa0JBQWtCO1FBQ2xCLGlCQUFpQjtRQUNqQix1QkFBdUI7UUFDdkIsc0JBQXNCO1FBQ3RCLHlCQUF5QjtRQUN6Qix3QkFBd0I7UUFDeEIseUJBQXlCO2dIQWFoQixpQkFBaUIsWUFQdEIsWUFBWTtRQUNaLGFBQWE7UUFDYix3QkFBd0I7UUFDeEIsZUFBZTs0RkFJVixpQkFBaUI7a0JBVjdCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2Isd0JBQXdCO3dCQUN4QixlQUFlO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUUsVUFBVTtpQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lc3RhbXBDb21wb25lbnQgfSBmcm9tICcuL3RpbWVzdGFtcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBMaWdodGJveENvbXBvbmVudCB9IGZyb20gJy4vbGlnaHRib3gvbGlnaHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBCYW50YU1hcmtkb3duVG9IdG1sUGlwZSB9IGZyb20gJy4vbWFya2Rvd24tdG8taHRtbC5waXBlJztcclxuaW1wb3J0IHsgQmFudGFBdHRhY2htZW50c0NvbXBvbmVudCB9IGZyb20gJy4vYXR0YWNobWVudHMvYXR0YWNobWVudHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IEJhbnRhVHJ1c3RSZXNvdXJjZVVybFBpcGUgfSBmcm9tICcuL3RydXN0LXJlc291cmNlLXVybC5waXBlJztcclxuaW1wb3J0IHsgQmFudGFBdHRhY2htZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hdHRhY2htZW50L2F0dGFjaG1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmFudGFNZW50aW9uTGlua2VyUGlwZSB9IGZyb20gJy4vbWVudGlvbi1saW5rZXIucGlwZSc7XHJcbmltcG9ydCB7IFRpbWVyUG9vbCB9IGZyb20gJy4vdGltZXItcG9vbC5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IENPTVBPTkVOVFMgPSBbXHJcbiAgICBUaW1lc3RhbXBDb21wb25lbnQsXHJcbiAgICBMaWdodGJveENvbXBvbmVudCxcclxuICAgIEJhbnRhTWFya2Rvd25Ub0h0bWxQaXBlLFxyXG4gICAgQmFudGFNZW50aW9uTGlua2VyUGlwZSxcclxuICAgIEJhbnRhVHJ1c3RSZXNvdXJjZVVybFBpcGUsXHJcbiAgICBCYW50YUF0dGFjaG1lbnRDb21wb25lbnQsXHJcbiAgICBCYW50YUF0dGFjaG1lbnRzQ29tcG9uZW50XHJcbl07XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBDT01QT05FTlRTLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIENvbW1vbk1vZHVsZSxcclxuICAgICAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgICAgICBNYXRCdXR0b25Nb2R1bGVcclxuICAgIF0sXHJcbiAgICBleHBvcnRzOiBDT01QT05FTlRTXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYW50YUNvbW1vbk1vZHVsZSB7XHJcbiAgICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEJhbnRhQ29tbW9uTW9kdWxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmdNb2R1bGU6IEJhbnRhQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgICAgIFRpbWVyUG9vbFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
@@ -1,6 +1,6 @@
1
1
  import { Component, Input } from "@angular/core";
2
2
  import * as i0 from "@angular/core";
3
- import * as i1 from "projects/sdk/src/lib/common/timer-pool.service";
3
+ import * as i1 from "../../lib/common/timer-pool.service";
4
4
  import * as i2 from "@angular/common";
5
5
  export class TimestampComponent {
6
6
  constructor(timerPool) {
@@ -120,4 +120,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
120
120
  }], ctorParameters: function () { return [{ type: i1.TimerPool }]; }, propDecorators: { value: [{
121
121
  type: Input
122
122
  }] } });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXN0YW1wLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi90aW1lc3RhbXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBZWpELE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsWUFDWSxTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBS2hDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBR0wsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFFMUIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVkzQixpQkFBWSxHQUFHLEtBQUssQ0FBQztJQXJCckIsQ0FBQztJQVdELFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUNJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUlELE1BQU07UUFDRixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQ2YsT0FBTztRQUVYLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksS0FBSyxHQUFH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QUFHLENBQUMsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDcEY7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLENBQUM7UUFDUCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNqQjtJQUNMLENBQUM7O2dIQTVHUSxrQkFBa0I7b0dBQWxCLGtCQUFrQixtRkFWakI7Ozs7Ozs7S0FPVDs0RkFHUSxrQkFBa0I7a0JBWjlCLFNBQVM7K0JBQ0ksaUJBQWlCLFlBQ2pCOzs7Ozs7O0tBT1Q7Z0dBd0JHLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBUaW1lclBvb2wgfSBmcm9tIFwicHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL3RpbWVyLXBvb2wuc2VydmljZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLXRpbWVzdGFtcCcsXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0Fic29sdXRlXCIgW3RpdGxlXT1cInZhbHVlIHwgZGF0ZSA6ICdzaG9ydCdcIj5cclxuICAgICAgICAgICAge3t2YWx1ZSB8IGRhdGUgOiAnc2hvcnREYXRlJ319XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIXNob3dBYnNvbHV0ZVwiIFt0aXRsZV09XCJ2YWx1ZSB8IGRhdGUgOiAnc2hvcnQnXCI+XHJcbiAgICAgICAgICAgIHt7cmVsYXRpdmV9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtgYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbWVzdGFtcENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHRpbWVyUG9vbDogVGltZXJQb29sXHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF92YWx1ZSA6IG51bWJlcjtcclxuICAgIHJlbGF0aXZlID0gJyc7XHJcbiAgICB0b29sdGlwID0gJyc7XHJcblxyXG4gICAgcHJpdmF0ZSB0aW1lclVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSB0aW1lckludGVydmFsOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3llZCA9IGZhbHNlO1xyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50aW1lclVuc3Vic2NyaWJlPy4oKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93QWJzb2x1dGUgPSBmYWxzZTtcclxuXHJcbiAgICB1cGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGxldCBkaWZmID0gbm93IC0gdGhpcy52YWx1ZTtcclxuICAgICAgICBsZXQgbWludXRlID0gMTAwMCo2MDtcclxuICAgICAgICBsZXQgaG91ciA9IG1pbnV0ZSAqIDYwO1xyXG4gICAgICAgIGxldCBkYXkgPSBob3VyICogMjQ7XHJcbiAgICAgICAgbGV0IHdlZWsgPSBkYXkgKiA3O1xyXG4gICAgICAgIGxldCBtb250aCA9IGRheSAqIDMwO1xyXG4gICAgICAgIGxldCB5ZWFyID0gZGF5ICogMzY1O1xyXG4gICAgICAgIHRoaXMuc2hvd0Fic29sdXRlID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHVwZGF0ZVRpbWUgPSAwO1xyXG5cclxuICAgICAgICBpZiAoZGlmZiA+IHllYXIpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93QWJzb2x1dGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gJ2Ficyc7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaWZmID4gbW9udGgpIHtcclxuICAgICAgICAgICAgbGV0IG1vbnRocyA9IE1hdGguZmxvb3IoZGlmZiAvIG1vbnRoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtb250aHMgPT09IDEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7bW9udGhzfSBtb250aCBhZ29gO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7bW9udGhzfSBtb250aHMgYWdvYDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gd2Vlaykge1xyXG4gICAgICAgICAgICBsZXQgd2Vla3MgPSBNYXRoLmZsb29yKGRpZmYgLyB3ZWVrKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh3ZWVrcyA9PT0gMSlcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgJHt3ZWVrc30gd2VlayBhZ29gO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7d2Vla3N9IHdlZWtzIGFnb2A7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gZGF5KSB7XHJcbiAgICAgICAgICAgIGxldCBkYXlzID0gTWF0aC5mbG9vcihkaWZmIC8gZGF5KTtcclxuICAgICAgICAgICAgaWYgKGRheXMgPT09IDEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7ZGF5c30gZGF5IGFnb2A7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgJHtkYXlzfSBkYXlzIGFnb2A7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gaG91cikge1xyXG4gICAgICAgICAgICBsZXQgaG91cnMgPSBNYXRoLmZsb29yKGRpZmYgLyBob3VyKTtcclxuICAgICAgICAgICAgaWYgKGhvdXJzID09PSAxKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGAke2hvdXJzfSBob3VyIGFnb2A7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgJHtob3Vyc30gaG91cnMgYWdvYDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHVwZGF0ZVRpbWUgPSAxMDAwICogNjAgKiAzMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiBtaW51dGUpIHtcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGRpZmYgLyBtaW51dGUpO1xyXG4gICAgICAgICAgICBpZiAobWludXRlcyA9PT0gMSlcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgJHttaW51dGVzfSBtaW51dGUgYWdvYDtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGAke21pbnV0ZXN9IG1pbnV0ZXMgYWdvYDtcclxuICAgICAgICAgICAgdXBkYXRlVGltZSA9IDEwMDAgKiA0NTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiAzMF8wMDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGBhYm91dCBhIG1pbnV0ZSBhZ29gO1xyXG4gICAgICAgICAgICB1cGRhdGVUaW1lID0gMTAwMCAqIDYwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBganVzdCBub3dgO1xyXG4gICAgICAgICAgICB1cGRhdGVUaW1lID0gMTAwMCAqIDMwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZXJJbnRlcnZhbCAhPT0gdXBkYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lckludGVydmFsID0gdXBkYXRlVGltZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZXJVbnN1YnNjcmliZT8uKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlVGltZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUgPSB0aGlzLnRpbWVyUG9vbC5hZGRUaW1lcih1cGRhdGVUaW1lLCAoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXQgdmFsdWUodikge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHY7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXN0YW1wLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi90aW1lc3RhbXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBZWpELE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsWUFDWSxTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBS2hDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBR0wsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFFMUIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVkzQixpQkFBWSxHQUFHLEtBQUssQ0FBQztJQXJCckIsQ0FBQztJQVdELFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUNJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUlELE1BQU07UUFDRixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQ2YsT0FBTztRQUVYLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksS0FBSyxHQUFH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QUFHLENBQUMsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDcEY7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLENBQUM7UUFDUCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNqQjtJQUNMLENBQUM7O2dIQTVHUSxrQkFBa0I7b0dBQWxCLGtCQUFrQixtRkFWakI7Ozs7Ozs7S0FPVDs0RkFHUSxrQkFBa0I7a0JBWjlCLFNBQVM7K0JBQ0ksaUJBQWlCLFlBQ2pCOzs7Ozs7O0tBT1Q7Z0dBd0JHLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBUaW1lclBvb2wgfSBmcm9tIFwiLi4vLi4vbGliL2NvbW1vbi90aW1lci1wb29sLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS10aW1lc3RhbXAnLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dBYnNvbHV0ZVwiIFt0aXRsZV09XCJ2YWx1ZSB8IGRhdGUgOiAnc2hvcnQnXCI+XHJcbiAgICAgICAgICAgIHt7dmFsdWUgfCBkYXRlIDogJ3Nob3J0RGF0ZSd9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFzaG93QWJzb2x1dGVcIiBbdGl0bGVdPVwidmFsdWUgfCBkYXRlIDogJ3Nob3J0J1wiPlxyXG4gICAgICAgICAgICB7e3JlbGF0aXZlfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICBgLFxyXG4gICAgc3R5bGVzOiBbYGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSB0aW1lclBvb2w6IFRpbWVyUG9vbFxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdmFsdWUgOiBudW1iZXI7XHJcbiAgICByZWxhdGl2ZSA9ICcnO1xyXG4gICAgdG9vbHRpcCA9ICcnO1xyXG5cclxuICAgIHByaXZhdGUgdGltZXJVbnN1YnNjcmliZTogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgdGltZXJJbnRlcnZhbDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9kZXN0cm95ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGltZXJVbnN1YnNjcmliZT8uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCB2YWx1ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Fic29sdXRlID0gZmFsc2U7XHJcblxyXG4gICAgdXBkYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgZGlmZiA9IG5vdyAtIHRoaXMudmFsdWU7XHJcbiAgICAgICAgbGV0IG1pbnV0ZSA9IDEwMDAqNjA7XHJcbiAgICAgICAgbGV0IGhvdXIgPSBtaW51dGUgKiA2MDtcclxuICAgICAgICBsZXQgZGF5ID0gaG91ciAqIDI0O1xyXG4gICAgICAgIGxldCB3ZWVrID0gZGF5ICogNztcclxuICAgICAgICBsZXQgbW9udGggPSBkYXkgKiAzMDtcclxuICAgICAgICBsZXQgeWVhciA9IGRheSAqIDM2NTtcclxuICAgICAgICB0aGlzLnNob3dBYnNvbHV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB1cGRhdGVUaW1lID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGRpZmYgPiB5ZWFyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0Fic29sdXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9ICdhYnMnO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGlmZiA+IG1vbnRoKSB7XHJcbiAgICAgICAgICAgIGxldCBtb250aHMgPSBNYXRoLmZsb29yKGRpZmYgLyBtb250aCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobW9udGhzID09PSAxKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGAke21vbnRoc30gbW9udGggYWdvYDtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGAke21vbnRoc30gbW9udGhzIGFnb2A7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IHdlZWspIHtcclxuICAgICAgICAgICAgbGV0IHdlZWtzID0gTWF0aC5mbG9vcihkaWZmIC8gd2Vlayk7XHJcblxyXG4gICAgICAgICAgICBpZiAod2Vla3MgPT09IDEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7d2Vla3N9IHdlZWsgYWdvYDtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGAke3dlZWtzfSB3ZWVrcyBhZ29gO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IGRheSkge1xyXG4gICAgICAgICAgICBsZXQgZGF5cyA9IE1hdGguZmxvb3IoZGlmZiAvIGRheSk7XHJcbiAgICAgICAgICAgIGlmIChkYXlzID09PSAxKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IGAke2RheXN9IGRheSBhZ29gO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7ZGF5c30gZGF5cyBhZ29gO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IGhvdXIpIHtcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gTWF0aC5mbG9vcihkaWZmIC8gaG91cik7XHJcbiAgICAgICAgICAgIGlmIChob3VycyA9PT0gMSlcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgJHtob3Vyc30gaG91ciBhZ29gO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7aG91cnN9IGhvdXJzIGFnb2A7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB1cGRhdGVUaW1lID0gMTAwMCAqIDYwICogMzA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gbWludXRlKSB7XHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gTWF0aC5mbG9vcihkaWZmIC8gbWludXRlKTtcclxuICAgICAgICAgICAgaWYgKG1pbnV0ZXMgPT09IDEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYCR7bWludXRlc30gbWludXRlIGFnb2A7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgJHttaW51dGVzfSBtaW51dGVzIGFnb2A7XHJcbiAgICAgICAgICAgIHVwZGF0ZVRpbWUgPSAxMDAwICogNDU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gMzBfMDAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsYXRpdmUgPSBgYWJvdXQgYSBtaW51dGUgYWdvYDtcclxuICAgICAgICAgICAgdXBkYXRlVGltZSA9IDEwMDAgKiA2MDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlbGF0aXZlID0gYGp1c3Qgbm93YDtcclxuICAgICAgICAgICAgdXBkYXRlVGltZSA9IDEwMDAgKiAzMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVySW50ZXJ2YWwgIT09IHVwZGF0ZVRpbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZXJJbnRlcnZhbCA9IHVwZGF0ZVRpbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmU/LigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVRpbWUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lclVuc3Vic2NyaWJlID0gdGhpcy50aW1lclBvb2wuYWRkVGltZXIodXBkYXRlVGltZSwgKCkgPT4gdGhpcy51cGRhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZhbHVlKHYpIHtcclxuICAgICAgICBpZiAodGhpcy5fdmFsdWUgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==
@@ -2,8 +2,9 @@ import { Observable, Subject, BehaviorSubject, Subscription } from 'rxjs';
2
2
  import { publish, take } from 'rxjs/operators';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Component, Input, ViewChild, Pipe, Inject, Optional, Output, HostBinding, NgModule, ViewChildren, Directive, TemplateRef, ContentChild, Injectable as Injectable$1 } from '@angular/core';
5
- import * as i1 from 'projects/sdk/src/lib/common/timer-pool.service';
6
- import { TimerPool as TimerPool$1 } from 'projects/sdk/src/lib/common/timer-pool.service';
5
+ import { __decorate, __awaiter } from 'tslib';
6
+ import * as i1$2 from '@banta/common';
7
+ import { Injectable, CommentsOrder, SocketRPC, RpcEvent, DurableSocket } from '@banta/common';
7
8
  import * as i2 from '@angular/common';
8
9
  import { CommonModule } from '@angular/common';
9
10
  import * as i2$1 from '@angular/material/icon';
@@ -11,22 +12,19 @@ import { MatIconModule } from '@angular/material/icon';
11
12
  import * as marked from 'marked';
12
13
  import createDOMPurify from 'dompurify';
13
14
  import twemoji$1 from 'twemoji';
14
- import * as i1$1 from '@angular/platform-browser';
15
+ import * as i1 from '@angular/platform-browser';
15
16
  import * as i3 from '@angular/cdk/bidi';
16
17
  import * as i4 from '@angular/material/progress-spinner';
17
18
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
18
19
  import * as i6 from '@angular/material/button';
19
20
  import { MatButtonModule } from '@angular/material/button';
20
- import { __decorate, __awaiter } from 'tslib';
21
- import * as i1$3 from '@banta/common';
22
- import { Injectable, CommentsOrder, SocketRPC, RpcEvent, DurableSocket } from '@banta/common';
23
21
  import * as i4$1 from '@angular/forms';
24
22
  import { FormsModule } from '@angular/forms';
25
23
  import * as i6$1 from '@angular/material/form-field';
26
24
  import { MatFormFieldModule } from '@angular/material/form-field';
27
25
  import * as i7 from '@angular/material/input';
28
26
  import { MatInputModule } from '@angular/material/input';
29
- import * as i1$2 from '@angular/cdk/overlay';
27
+ import * as i1$1 from '@angular/cdk/overlay';
30
28
  import { OverlayModule } from '@angular/cdk/overlay';
31
29
  import * as i4$2 from '@angular/cdk/portal';
32
30
  import { PortalModule } from '@angular/cdk/portal';
@@ -58,6 +56,89 @@ function lazyConnection(options) {
58
56
  return obs.pipe(publish()).refCount();
59
57
  }
60
58
 
59
+ /**
60
+ * Provides a way to hook in to a shared set of timers, instead of creating a timer per instance.
61
+ * This is very useful for cases where the update is not extremely time-sensitive, but happens at scale.
62
+ * The principal use case is the TimestampComponent. When several hundred (or several thousand) comments are
63
+ * being displayed, we do not want to trigger thousands of independent relative timestamp updates, because over
64
+ * time the updates will saturate the CPU since they don't perfectly align.
65
+ */
66
+ let TimerPool = class TimerPool {
67
+ constructor() {
68
+ this.subscriptions = new Map();
69
+ this.newSubscriptions = new Map();
70
+ this.removedSubscriptions = new Map();
71
+ }
72
+ addTimer(interval, callback) {
73
+ var _a;
74
+ if (interval <= 0) {
75
+ console.warn(`Refusing to set timer with interval of ${interval}!`);
76
+ return () => { };
77
+ }
78
+ let state;
79
+ let sizeWas = this.subscriptions.size;
80
+ if (!this.subscriptions.has(interval)) {
81
+ state = { subscribers: [] };
82
+ state.handle = setInterval(() => {
83
+ console.debug(`[Banta/TimerPool] Notifying ${state.subscribers.length} subs [${interval}ms]`);
84
+ state.subscribers.forEach(sub => sub());
85
+ }, interval);
86
+ this.subscriptions.set(interval, state);
87
+ }
88
+ else {
89
+ state = this.subscriptions.get(interval);
90
+ }
91
+ state.subscribers.push(callback);
92
+ // Debug information //////////////////////////
93
+ //
94
+ if (!this.newSubscriptions.has(interval))
95
+ this.newSubscriptions.set(interval, 0);
96
+ this.newSubscriptions.set(interval, ((_a = this.newSubscriptions.get(interval)) !== null && _a !== void 0 ? _a : 0) + 1);
97
+ clearTimeout(this.newSubscriptionsNotice);
98
+ this.newSubscriptionsNotice = setTimeout(() => {
99
+ for (let [interval, count] of this.newSubscriptions) {
100
+ console.debug(`[Banta/TimerPool] ${count} new subscriptions to ${interval}ms [${state.subscribers.length} total]`);
101
+ }
102
+ this.newSubscriptions.clear();
103
+ });
104
+ //
105
+ ///////////////////////////////////////////////
106
+ if (sizeWas === 0) {
107
+ console.debug(`[Banta/TimerPool] No longer idle.`);
108
+ }
109
+ // Unsubscribe function
110
+ return () => {
111
+ var _a;
112
+ let state = this.subscriptions.get(interval);
113
+ let index = state.subscribers.indexOf(callback);
114
+ if (index >= 0)
115
+ state.subscribers.splice(index, 1);
116
+ if (state.subscribers.length === 0) {
117
+ clearInterval(state.handle);
118
+ this.subscriptions.delete(interval);
119
+ }
120
+ if (!this.removedSubscriptions.has(interval))
121
+ this.removedSubscriptions.set(interval, 0);
122
+ this.removedSubscriptions.set(interval, ((_a = this.removedSubscriptions.get(interval)) !== null && _a !== void 0 ? _a : 0) + 1);
123
+ // Debug information ////////////////////////////////////////////////////////////////////
124
+ clearTimeout(this.removedSubscriptionsNotice);
125
+ this.removedSubscriptionsNotice = setTimeout(() => {
126
+ var _a, _b;
127
+ for (let [interval, count] of this.removedSubscriptions) {
128
+ let state = this.subscriptions.get(interval);
129
+ console.debug(`[Banta/TimerPool] ${count} unsubscribed from ${interval}ms [${(_b = (_a = state === null || state === void 0 ? void 0 : state.subscribers) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0} remain]`);
130
+ }
131
+ if (this.subscriptions.size === 0)
132
+ console.debug(`[Banta/TimerPool] All subscriptions have been removed. Now idle.`);
133
+ this.removedSubscriptions.clear();
134
+ });
135
+ };
136
+ }
137
+ };
138
+ TimerPool = __decorate([
139
+ Injectable()
140
+ ], TimerPool);
141
+
61
142
  class TimestampComponent {
62
143
  constructor(timerPool) {
63
144
  this.timerPool = timerPool;
@@ -156,7 +237,7 @@ class TimestampComponent {
156
237
  }
157
238
  }
158
239
  }
159
- TimestampComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TimestampComponent, deps: [{ token: i1.TimerPool }], target: i0.ɵɵFactoryTarget.Component });
240
+ TimestampComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TimestampComponent, deps: [{ token: TimerPool }], target: i0.ɵɵFactoryTarget.Component });
160
241
  TimestampComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TimestampComponent, selector: "banta-timestamp", inputs: { value: "value" }, ngImport: i0, template: `
161
242
  <span *ngIf="showAbsolute" [title]="value | date : 'short'">
162
243
  {{value | date : 'shortDate'}}
@@ -175,7 +256,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
175
256
  {{relative}}
176
257
  </span>
177
258
  ` }]
178
- }], ctorParameters: function () { return [{ type: i1.TimerPool }]; }, propDecorators: { value: [{
259
+ }], ctorParameters: function () { return [{ type: TimerPool }]; }, propDecorators: { value: [{
179
260
  type: Input
180
261
  }] } });
181
262
 
@@ -278,7 +359,7 @@ class BantaMarkdownToHtmlPipe {
278
359
  }));
279
360
  }
280
361
  }
281
- BantaMarkdownToHtmlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaMarkdownToHtmlPipe, deps: [{ token: i1$1.DomSanitizer }, { token: BANTA_SDK_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
362
+ BantaMarkdownToHtmlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaMarkdownToHtmlPipe, deps: [{ token: i1.DomSanitizer }, { token: BANTA_SDK_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
282
363
  BantaMarkdownToHtmlPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: BantaMarkdownToHtmlPipe, name: "markdownToHtml" });
283
364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaMarkdownToHtmlPipe, decorators: [{
284
365
  type: Pipe,
@@ -286,7 +367,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
286
367
  name: 'markdownToHtml'
287
368
  }]
288
369
  }], ctorParameters: function () {
289
- return [{ type: i1$1.DomSanitizer }, { type: undefined, decorators: [{
370
+ return [{ type: i1.DomSanitizer }, { type: undefined, decorators: [{
290
371
  type: Inject,
291
372
  args: [BANTA_SDK_OPTIONS]
292
373
  }, {
@@ -304,14 +385,14 @@ class BantaTrustResourceUrlPipe {
304
385
  return this.sanitizer.bypassSecurityTrustResourceUrl(value);
305
386
  }
306
387
  }
307
- BantaTrustResourceUrlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaTrustResourceUrlPipe, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
388
+ BantaTrustResourceUrlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaTrustResourceUrlPipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
308
389
  BantaTrustResourceUrlPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: BantaTrustResourceUrlPipe, name: "trustResourceUrl" });
309
390
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaTrustResourceUrlPipe, decorators: [{
310
391
  type: Pipe,
311
392
  args: [{
312
393
  name: 'trustResourceUrl'
313
394
  }]
314
- }], ctorParameters: function () { return [{ type: i1$1.DomSanitizer }]; } });
395
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
315
396
 
316
397
  class BantaMentionLinkerPipe {
317
398
  transform(value, links) {
@@ -524,89 +605,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
524
605
  type: Output
525
606
  }] } });
526
607
 
527
- /**
528
- * Provides a way to hook in to a shared set of timers, instead of creating a timer per instance.
529
- * This is very useful for cases where the update is not extremely time-sensitive, but happens at scale.
530
- * The principal use case is the TimestampComponent. When several hundred (or several thousand) comments are
531
- * being displayed, we do not want to trigger thousands of independent relative timestamp updates, because over
532
- * time the updates will saturate the CPU since they don't perfectly align.
533
- */
534
- let TimerPool = class TimerPool {
535
- constructor() {
536
- this.subscriptions = new Map();
537
- this.newSubscriptions = new Map();
538
- this.removedSubscriptions = new Map();
539
- }
540
- addTimer(interval, callback) {
541
- var _a;
542
- if (interval <= 0) {
543
- console.warn(`Refusing to set timer with interval of ${interval}!`);
544
- return () => { };
545
- }
546
- let state;
547
- let sizeWas = this.subscriptions.size;
548
- if (!this.subscriptions.has(interval)) {
549
- state = { subscribers: [] };
550
- state.handle = setInterval(() => {
551
- console.debug(`[Banta/TimerPool] Notifying ${state.subscribers.length} subs [${interval}ms]`);
552
- state.subscribers.forEach(sub => sub());
553
- }, interval);
554
- this.subscriptions.set(interval, state);
555
- }
556
- else {
557
- state = this.subscriptions.get(interval);
558
- }
559
- state.subscribers.push(callback);
560
- // Debug information //////////////////////////
561
- //
562
- if (!this.newSubscriptions.has(interval))
563
- this.newSubscriptions.set(interval, 0);
564
- this.newSubscriptions.set(interval, ((_a = this.newSubscriptions.get(interval)) !== null && _a !== void 0 ? _a : 0) + 1);
565
- clearTimeout(this.newSubscriptionsNotice);
566
- this.newSubscriptionsNotice = setTimeout(() => {
567
- for (let [interval, count] of this.newSubscriptions) {
568
- console.debug(`[Banta/TimerPool] ${count} new subscriptions to ${interval}ms [${state.subscribers.length} total]`);
569
- }
570
- this.newSubscriptions.clear();
571
- });
572
- //
573
- ///////////////////////////////////////////////
574
- if (sizeWas === 0) {
575
- console.debug(`[Banta/TimerPool] No longer idle.`);
576
- }
577
- // Unsubscribe function
578
- return () => {
579
- var _a;
580
- let state = this.subscriptions.get(interval);
581
- let index = state.subscribers.indexOf(callback);
582
- if (index >= 0)
583
- state.subscribers.splice(index, 1);
584
- if (state.subscribers.length === 0) {
585
- clearInterval(state.handle);
586
- this.subscriptions.delete(interval);
587
- }
588
- if (!this.removedSubscriptions.has(interval))
589
- this.removedSubscriptions.set(interval, 0);
590
- this.removedSubscriptions.set(interval, ((_a = this.removedSubscriptions.get(interval)) !== null && _a !== void 0 ? _a : 0) + 1);
591
- // Debug information ////////////////////////////////////////////////////////////////////
592
- clearTimeout(this.removedSubscriptionsNotice);
593
- this.removedSubscriptionsNotice = setTimeout(() => {
594
- var _a, _b;
595
- for (let [interval, count] of this.removedSubscriptions) {
596
- let state = this.subscriptions.get(interval);
597
- console.debug(`[Banta/TimerPool] ${count} unsubscribed from ${interval}ms [${(_b = (_a = state === null || state === void 0 ? void 0 : state.subscribers) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0} remain]`);
598
- }
599
- if (this.subscriptions.size === 0)
600
- console.debug(`[Banta/TimerPool] All subscriptions have been removed. Now idle.`);
601
- this.removedSubscriptions.clear();
602
- });
603
- };
604
- }
605
- };
606
- TimerPool = __decorate([
607
- Injectable()
608
- ], TimerPool);
609
-
610
608
  const COMPONENTS$3 = [
611
609
  TimestampComponent,
612
610
  LightboxComponent,
@@ -621,7 +619,7 @@ class BantaCommonModule {
621
619
  return {
622
620
  ngModule: BantaCommonModule,
623
621
  providers: [
624
- TimerPool$1
622
+ TimerPool
625
623
  ]
626
624
  };
627
625
  }
@@ -7242,13 +7240,13 @@ class EmojiSelectorPanelComponent {
7242
7240
  this.categories = this.pairs(cats).map(pair => pair[1]);
7243
7241
  }
7244
7242
  }
7245
- EmojiSelectorPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EmojiSelectorPanelComponent, deps: [{ token: i1$1.DomSanitizer }, { token: BANTA_SDK_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
7243
+ EmojiSelectorPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EmojiSelectorPanelComponent, deps: [{ token: i1.DomSanitizer }, { token: BANTA_SDK_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
7246
7244
  EmojiSelectorPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: EmojiSelectorPanelComponent, selector: "emoji-selector-panel", outputs: { selected: "selected" }, ngImport: i0, template: "<div class=\"search-box\" *ngIf=\"searchVisible\">\r\n\t<a mat-icon-button href=\"javascript:;\" (click)=\"hideSearch()\">\r\n\t\t<mat-icon>arrow_back</mat-icon>\r\n\t</a>\r\n\t<mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n\t\t<mat-label>Search for emoji</mat-label>\r\n\t\t<input name=\"search\" type=\"text\" matInput placeholder=\"Start typing\" [(ngModel)]=\"searchQuery\" />\r\n\t</mat-form-field>\r\n</div>\r\n\r\n<div class=\"selector\">\r\n\t<ng-container *ngIf=\"searchVisible\">\r\n\t\t<div class=\"emoji-list\">\r\n\t\t\t<a href=\"javascript:;\" (click)=\"select(emoji.char)\" \r\n\t\t\t\t*ngFor=\"let emoji of searchResults\" [innerHtml]=\"emoji.html || ''\">\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</ng-container>\r\n\t<ng-container *ngIf=\"!searchVisible\">\r\n\t\t<div class=\"categories\">\r\n\t\t\t<ng-container *ngIf=\"!searchVisible\">\r\n\t\t\t\t<a [title]=\"humanize(category.name)\" [class.active]=\"activeCategory === category.name\" mat-icon-button *ngFor=\"let category of categories\" (click)=\"activeCategory = category.name\">\r\n\t\t\t\t\t<mat-icon>{{category.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\r\n\t\t\t\t<a title=\"Search\" [class.active] mat-icon-button (click)=\"showSearch()\">\r\n\t\t\t\t\t<mat-icon>search</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t\t<ng-container *ngFor=\"let category of categories\">\r\n\t\t\t<div class=\"emoji-list\" *ngIf=\"activeCategory && activeCategory == category.name\">\r\n\t\t\t\t<a href=\"javascript:;\" (click)=\"select(emoji.char)\" \r\n\t\t\t\t\t*ngFor=\"let emoji of category.emojis\" [innerHtml]=\"emoji.html || ''\">\r\n\t\t\t\t</a>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n</div>", styles: [":host{background:#111;color:#fff;border:1px solid #333;border-radius:5px;padding:.5em;width:calc(9*(32px + 1em));max-width:calc(100vw - 1.5em - 5px)}.selector{display:flex;flex-direction:column}.categories a{opacity:.25;transition:.4s opacity ease-in-out}.categories a:hover{opacity:.5}.categories a.active{opacity:1}.emoji-list{flex-grow:1;overflow-y:auto;height:20em}.emoji-list a{display:inline-block;padding:2px;margin:4px;background-color:#111}.emoji-list a ::ng-deep .emoji{width:32px;height:32px}.emoji-list a:hover{background-color:#333}.search-box{display:flex;align-items:baseline}.search-box mat-form-field{flex-grow:1}@media (max-width: 500px){.selector{flex-direction:row;height:27em}.emoji-list{height:auto}}:host-context(.banta-mobile) .selector{flex-direction:row;height:27em}:host-context(.banta-mobile) .emoji-list{height:auto}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4$1.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: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6$1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.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"] }] });
7247
7245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EmojiSelectorPanelComponent, decorators: [{
7248
7246
  type: Component,
7249
7247
  args: [{ selector: 'emoji-selector-panel', template: "<div class=\"search-box\" *ngIf=\"searchVisible\">\r\n\t<a mat-icon-button href=\"javascript:;\" (click)=\"hideSearch()\">\r\n\t\t<mat-icon>arrow_back</mat-icon>\r\n\t</a>\r\n\t<mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n\t\t<mat-label>Search for emoji</mat-label>\r\n\t\t<input name=\"search\" type=\"text\" matInput placeholder=\"Start typing\" [(ngModel)]=\"searchQuery\" />\r\n\t</mat-form-field>\r\n</div>\r\n\r\n<div class=\"selector\">\r\n\t<ng-container *ngIf=\"searchVisible\">\r\n\t\t<div class=\"emoji-list\">\r\n\t\t\t<a href=\"javascript:;\" (click)=\"select(emoji.char)\" \r\n\t\t\t\t*ngFor=\"let emoji of searchResults\" [innerHtml]=\"emoji.html || ''\">\r\n\t\t\t</a>\r\n\t\t</div>\r\n\t</ng-container>\r\n\t<ng-container *ngIf=\"!searchVisible\">\r\n\t\t<div class=\"categories\">\r\n\t\t\t<ng-container *ngIf=\"!searchVisible\">\r\n\t\t\t\t<a [title]=\"humanize(category.name)\" [class.active]=\"activeCategory === category.name\" mat-icon-button *ngFor=\"let category of categories\" (click)=\"activeCategory = category.name\">\r\n\t\t\t\t\t<mat-icon>{{category.icon}}</mat-icon>\r\n\t\t\t\t</a>\r\n\r\n\t\t\t\t<a title=\"Search\" [class.active] mat-icon-button (click)=\"showSearch()\">\r\n\t\t\t\t\t<mat-icon>search</mat-icon>\r\n\t\t\t\t</a>\r\n\t\t\t</ng-container>\r\n\t\t</div>\r\n\t\t<ng-container *ngFor=\"let category of categories\">\r\n\t\t\t<div class=\"emoji-list\" *ngIf=\"activeCategory && activeCategory == category.name\">\r\n\t\t\t\t<a href=\"javascript:;\" (click)=\"select(emoji.char)\" \r\n\t\t\t\t\t*ngFor=\"let emoji of category.emojis\" [innerHtml]=\"emoji.html || ''\">\r\n\t\t\t\t</a>\r\n\t\t\t</div>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n</div>", styles: [":host{background:#111;color:#fff;border:1px solid #333;border-radius:5px;padding:.5em;width:calc(9*(32px + 1em));max-width:calc(100vw - 1.5em - 5px)}.selector{display:flex;flex-direction:column}.categories a{opacity:.25;transition:.4s opacity ease-in-out}.categories a:hover{opacity:.5}.categories a.active{opacity:1}.emoji-list{flex-grow:1;overflow-y:auto;height:20em}.emoji-list a{display:inline-block;padding:2px;margin:4px;background-color:#111}.emoji-list a ::ng-deep .emoji{width:32px;height:32px}.emoji-list a:hover{background-color:#333}.search-box{display:flex;align-items:baseline}.search-box mat-form-field{flex-grow:1}@media (max-width: 500px){.selector{flex-direction:row;height:27em}.emoji-list{height:auto}}:host-context(.banta-mobile) .selector{flex-direction:row;height:27em}:host-context(.banta-mobile) .emoji-list{height:auto}\n"] }]
7250
7248
  }], ctorParameters: function () {
7251
- return [{ type: i1$1.DomSanitizer }, { type: undefined, decorators: [{
7249
+ return [{ type: i1.DomSanitizer }, { type: undefined, decorators: [{
7252
7250
  type: Inject,
7253
7251
  args: [BANTA_SDK_OPTIONS]
7254
7252
  }, {
@@ -7323,7 +7321,7 @@ class EmojiSelectorButtonComponent {
7323
7321
  this.overlayRef.attach(this.selectorPanelTemplate);
7324
7322
  }
7325
7323
  }
7326
- EmojiSelectorButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EmojiSelectorButtonComponent, deps: [{ token: i0.ElementRef }, { token: i1$2.Overlay }], target: i0.ɵɵFactoryTarget.Component });
7324
+ EmojiSelectorButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EmojiSelectorButtonComponent, deps: [{ token: i0.ElementRef }, { token: i1$1.Overlay }], target: i0.ɵɵFactoryTarget.Component });
7327
7325
  EmojiSelectorButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: EmojiSelectorButtonComponent, selector: "emoji-selector-button", inputs: { overlayX: "overlayX", overlayY: "overlayY", originX: "originX", originY: "originY" }, outputs: { selected: "selected" }, viewQueries: [{ propertyName: "selectorPanelTemplate", first: true, predicate: ["selectorPanelTemplate"], descendants: true }], ngImport: i0, template: `
7328
7326
  <button #button type="button" mat-icon-button (click)="show()">
7329
7327
  <mat-icon>emoji_emotions</mat-icon>
@@ -7348,7 +7346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7348
7346
  ></emoji-selector-panel>
7349
7347
  </ng-template>
7350
7348
  `, styles: [":host{display:block;position:relative}button{color:#666}\n"] }]
7351
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$2.Overlay }]; }, propDecorators: { selectorPanelTemplate: [{
7349
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.Overlay }]; }, propDecorators: { selectorPanelTemplate: [{
7352
7350
  type: ViewChild,
7353
7351
  args: ['selectorPanelTemplate']
7354
7352
  }], selected: [{
@@ -8082,12 +8080,12 @@ class AttachmentButtonComponent {
8082
8080
  });
8083
8081
  }
8084
8082
  }
8085
- AttachmentButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentButtonComponent, deps: [{ token: i1$3.CDNProvider }], target: i0.ɵɵFactoryTarget.Component });
8083
+ AttachmentButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentButtonComponent, deps: [{ token: i1$2.CDNProvider }], target: i0.ɵɵFactoryTarget.Component });
8086
8084
  AttachmentButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AttachmentButtonComponent, selector: "banta-attachment-button", outputs: { addedAttachment: "addedAttachment", attachmentError: "attachmentError" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileUpload"], descendants: true }], ngImport: i0, template: "<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >", styles: ["button{color:#666}\n"], dependencies: [{ kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
8087
8085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AttachmentButtonComponent, decorators: [{
8088
8086
  type: Component,
8089
8087
  args: [{ selector: 'banta-attachment-button', template: "<button matTooltip=\"Add an image or gif\" #button type=\"button\" mat-icon-button (click)=\"show()\">\r\n\t<mat-icon>image</mat-icon>\r\n</button>\r\n<input style=\"display: none;\" #fileUpload [multiple]=\"false\" (change)=\"fileChange($event)\" type=\"file\" >", styles: ["button{color:#666}\n"] }]
8090
- }], ctorParameters: function () { return [{ type: i1$3.CDNProvider }]; }, propDecorators: { fileInput: [{
8088
+ }], ctorParameters: function () { return [{ type: i1$2.CDNProvider }]; }, propDecorators: { fileInput: [{
8091
8089
  type: ViewChild,
8092
8090
  args: ['fileUpload', { static: false }]
8093
8091
  }], addedAttachment: [{