@tolle_/tolle-ui 18.2.30 → 18.3.1

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 (55) hide show
  1. package/esm2022/lib/alert-dialog-dynamic.component.mjs +8 -3
  2. package/esm2022/lib/alert-dialog.component.mjs +39 -6
  3. package/esm2022/lib/alert-dialog.service.mjs +38 -6
  4. package/esm2022/lib/bar-list.component.mjs +95 -0
  5. package/esm2022/lib/category-bar.component.mjs +130 -0
  6. package/esm2022/lib/chart-spark.component.mjs +120 -0
  7. package/esm2022/lib/chart.component.mjs +131 -45
  8. package/esm2022/lib/chart.service.mjs +33 -8
  9. package/esm2022/lib/context-menu.service.mjs +11 -7
  10. package/esm2022/lib/modal-ref.mjs +36 -7
  11. package/esm2022/lib/modal.component.mjs +42 -28
  12. package/esm2022/lib/modal.mjs +2 -29
  13. package/esm2022/lib/modal.service.mjs +26 -4
  14. package/esm2022/lib/progress-circle.component.mjs +138 -0
  15. package/esm2022/lib/resizable-panel.component.mjs +5 -5
  16. package/esm2022/lib/segment.component.mjs +3 -3
  17. package/esm2022/lib/tracker.component.mjs +84 -0
  18. package/esm2022/public-api.mjs +6 -1
  19. package/fesm2022/tolle-ui.mjs +900 -139
  20. package/fesm2022/tolle-ui.mjs.map +1 -1
  21. package/lib/alert-dialog-dynamic.component.d.ts +5 -0
  22. package/lib/alert-dialog.component.d.ts +13 -0
  23. package/lib/bar-list.component.d.ts +39 -0
  24. package/lib/category-bar.component.d.ts +49 -0
  25. package/lib/chart-spark.component.d.ts +49 -0
  26. package/lib/chart.component.d.ts +68 -9
  27. package/lib/chart.service.d.ts +25 -5
  28. package/lib/modal-ref.d.ts +6 -1
  29. package/lib/modal.component.d.ts +7 -4
  30. package/lib/modal.d.ts +9 -3
  31. package/lib/progress-circle.component.d.ts +35 -0
  32. package/lib/tracker.component.d.ts +39 -0
  33. package/package.json +3 -2
  34. package/preset.js +7 -1
  35. package/public-api.d.ts +5 -0
  36. package/registry/docs-content.json +330 -2
  37. package/registry/llms-full.txt +98 -2
  38. package/registry/llms.txt +5 -0
  39. package/registry/manifest.json +380 -3
  40. package/registry/r/alert-dialog-dynamic.json +1 -1
  41. package/registry/r/alert-dialog.json +1 -1
  42. package/registry/r/bar-list.json +21 -0
  43. package/registry/r/category-bar.json +21 -0
  44. package/registry/r/chart-pie.json +1 -1
  45. package/registry/r/chart-spark.json +30 -0
  46. package/registry/r/chart.json +2 -2
  47. package/registry/r/context-menu-trigger.json +1 -1
  48. package/registry/r/context-menu.json +1 -1
  49. package/registry/r/modal.json +3 -3
  50. package/registry/r/progress-circle.json +21 -0
  51. package/registry/r/resizable-panel.json +1 -1
  52. package/registry/r/segment.json +1 -1
  53. package/registry/r/tracker.json +25 -0
  54. package/registry/registry.json +112 -0
  55. package/theme.css +15 -3
@@ -6,6 +6,11 @@ import * as i0 from "@angular/core";
6
6
  export class AlertDialogDynamicComponent {
7
7
  config;
8
8
  dialogRef;
9
+ /**
10
+ * Set by `AlertDialogService` once the dialog's result is ready, so the
11
+ * content panel plays its exit animation before the overlay is torn down.
12
+ */
13
+ closing = false;
9
14
  onOpenChange(open) {
10
15
  if (!open) {
11
16
  this.close(false);
@@ -16,7 +21,7 @@ export class AlertDialogDynamicComponent {
16
21
  }
17
22
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertDialogDynamicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
23
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AlertDialogDynamicComponent, isStandalone: true, selector: "tolle-alert-dialog-dynamic", ngImport: i0, template: `
19
- <tolle-alert-dialog [open]="true" (openChange)="onOpenChange($event)">
24
+ <tolle-alert-dialog [open]="!closing" (openChange)="onOpenChange($event)">
20
25
  <tolle-alert-dialog-content [size]="config.size || 'lg'">
21
26
  <tolle-alert-dialog-header>
22
27
  <tolle-alert-dialog-title>{{ config.title }}</tolle-alert-dialog-title>
@@ -52,7 +57,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52
57
  AlertDialogActionComponent,
53
58
  ButtonComponent
54
59
  ], template: `
55
- <tolle-alert-dialog [open]="true" (openChange)="onOpenChange($event)">
60
+ <tolle-alert-dialog [open]="!closing" (openChange)="onOpenChange($event)">
56
61
  <tolle-alert-dialog-content [size]="config.size || 'lg'">
57
62
  <tolle-alert-dialog-header>
58
63
  <tolle-alert-dialog-title>{{ config.title }}</tolle-alert-dialog-title>
@@ -74,4 +79,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
74
79
  </tolle-alert-dialog>
75
80
  `, styles: [":host{display:block}\n"] }]
76
81
  }] });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQTBDckQsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQXFCO0lBQzNCLFNBQVMsQ0FBa0I7SUFFM0IsWUFBWSxDQUFDLElBQWE7UUFDeEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFlO1FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7d0dBWlUsMkJBQTJCOzRGQUEzQiwyQkFBMkIsc0ZBdkI1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJULCtGQWhDQyxZQUFZLCtCQUNaLG9CQUFvQiwwR0FDcEIsMkJBQTJCLGtHQUMzQiwwQkFBMEIseUZBQzFCLHlCQUF5Qix3RkFDekIsK0JBQStCLDhGQUMvQiwwQkFBMEIseUZBQzFCLDBCQUEwQiw4RkFDMUIsMEJBQTBCLDhGQUMxQixlQUFlOzs0RkF5Qk4sMkJBQTJCO2tCQXZDdkMsU0FBUzsrQkFDRSw0QkFBNEIsY0FFMUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQiwyQkFBMkI7d0JBQzNCLDBCQUEwQjt3QkFDMUIseUJBQXlCO3dCQUN6QiwrQkFBK0I7d0JBQy9CLDBCQUEwQjt3QkFDMUIsMEJBQTBCO3dCQUMxQiwwQkFBMEI7d0JBQzFCLGVBQWU7cUJBQ2hCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFsZXJ0RGlhbG9nQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0NvbnRlbnRDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nQWN0aW9uQ29tcG9uZW50XG59IGZyb20gJy4vYWxlcnQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dDb25maWcsIEFsZXJ0RGlhbG9nUmVmIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctZHluYW1pYycsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQWxlcnREaWFsb2dDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dDb250ZW50Q29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nVGl0bGVDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0NhbmNlbENvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0FjdGlvbkNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8dG9sbGUtYWxlcnQtZGlhbG9nIFtvcGVuXT1cInRydWVcIiAob3BlbkNoYW5nZSk9XCJvbk9wZW5DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWNvbnRlbnQgW3NpemVdPVwiY29uZmlnLnNpemUgfHwgJ2xnJ1wiPlxuICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctaGVhZGVyPlxuICAgICAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy10aXRsZT57eyBjb25maWcudGl0bGUgfX08L3RvbGxlLWFsZXJ0LWRpYWxvZy10aXRsZT5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctZGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgIHt7IGNvbmZpZy5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctZGVzY3JpcHRpb24+XG4gICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctaGVhZGVyPlxuICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctZm9vdGVyPlxuICAgICAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1jYW5jZWwgKGNsaWNrKT1cImNsb3NlKGZhbHNlKVwiPlxuICAgICAgICAgICAgICA8dG9sbGUtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lXCI+e3sgY29uZmlnLmNhbmNlbFRleHQgfHwgJ0NhbmNlbCcgfX08L3RvbGxlLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWNhbmNlbD5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctYWN0aW9uIChjbGljayk9XCJjbG9zZSh0cnVlKVwiPlxuICAgICAgICAgICAgICA8dG9sbGUtYnV0dG9uIFt2YXJpYW50XT1cImNvbmZpZy52YXJpYW50ID09PSAnZGVzdHJ1Y3RpdmUnID8gJ2Rlc3RydWN0aXZlJyA6ICdkZWZhdWx0J1wiPlxuICAgICAgICAgICAgICAgIHt7IGNvbmZpZy5hY3Rpb25UZXh0IHx8ICdDb250aW51ZScgfX1cbiAgICAgICAgICAgICAgPC90b2xsZS1idXR0b24+XG4gICAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1hY3Rpb24+XG4gICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctZm9vdGVyPlxuICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1jb250ZW50PlxuICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nRHluYW1pY0NvbXBvbmVudCB7XG4gIGNvbmZpZyE6IEFsZXJ0RGlhbG9nQ29uZmlnO1xuICBkaWFsb2dSZWYhOiBBbGVydERpYWxvZ1JlZjtcblxuICBvbk9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbikge1xuICAgIGlmICghb3Blbikge1xuICAgICAgdGhpcy5jbG9zZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2UocmVzdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UocmVzdWx0KTtcbiAgfVxufVxuIl19
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQTBDckQsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQXFCO0lBQzNCLFNBQVMsQ0FBa0I7SUFFM0I7OztPQUdHO0lBQ0gsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixZQUFZLENBQUMsSUFBYTtRQUN4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQWU7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQzt3R0FsQlUsMkJBQTJCOzRGQUEzQiwyQkFBMkIsc0ZBdkI1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJULCtGQWhDQyxZQUFZLCtCQUNaLG9CQUFvQiwwR0FDcEIsMkJBQTJCLGtHQUMzQiwwQkFBMEIseUZBQzFCLHlCQUF5Qix3RkFDekIsK0JBQStCLDhGQUMvQiwwQkFBMEIseUZBQzFCLDBCQUEwQiw4RkFDMUIsMEJBQTBCLDhGQUMxQixlQUFlOzs0RkF5Qk4sMkJBQTJCO2tCQXZDdkMsU0FBUzsrQkFDRSw0QkFBNEIsY0FFMUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQiwyQkFBMkI7d0JBQzNCLDBCQUEwQjt3QkFDMUIseUJBQXlCO3dCQUN6QiwrQkFBK0I7d0JBQy9CLDBCQUEwQjt3QkFDMUIsMEJBQTBCO3dCQUMxQiwwQkFBMEI7d0JBQzFCLGVBQWU7cUJBQ2hCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFsZXJ0RGlhbG9nQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0NvbnRlbnRDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nQWN0aW9uQ29tcG9uZW50XG59IGZyb20gJy4vYWxlcnQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dDb25maWcsIEFsZXJ0RGlhbG9nUmVmIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctZHluYW1pYycsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQWxlcnREaWFsb2dDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dDb250ZW50Q29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nVGl0bGVDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0NhbmNlbENvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0FjdGlvbkNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8dG9sbGUtYWxlcnQtZGlhbG9nIFtvcGVuXT1cIiFjbG9zaW5nXCIgKG9wZW5DaGFuZ2UpPVwib25PcGVuQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1jb250ZW50IFtzaXplXT1cImNvbmZpZy5zaXplIHx8ICdsZydcIj5cbiAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcj5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctdGl0bGU+e3sgY29uZmlnLnRpdGxlIH19PC90b2xsZS1hbGVydC1kaWFsb2ctdGl0bGU+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgICB7eyBjb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uPlxuICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcj5cbiAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWZvb3Rlcj5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctY2FuY2VsIChjbGljayk9XCJjbG9zZShmYWxzZSlcIj5cbiAgICAgICAgICAgICAgPHRvbGxlLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZVwiPnt7IGNvbmZpZy5jYW5jZWxUZXh0IHx8ICdDYW5jZWwnIH19PC90b2xsZS1idXR0b24+XG4gICAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1jYW5jZWw+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWFjdGlvbiAoY2xpY2spPVwiY2xvc2UodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgPHRvbGxlLWJ1dHRvbiBbdmFyaWFudF09XCJjb25maWcudmFyaWFudCA9PT0gJ2Rlc3RydWN0aXZlJyA/ICdkZXN0cnVjdGl2ZScgOiAnZGVmYXVsdCdcIj5cbiAgICAgICAgICAgICAgICB7eyBjb25maWcuYWN0aW9uVGV4dCB8fCAnQ29udGludWUnIH19XG4gICAgICAgICAgICAgIDwvdG9sbGUtYnV0dG9uPlxuICAgICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctYWN0aW9uPlxuICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWZvb3Rlcj5cbiAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctY29udGVudD5cbiAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZz5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0R5bmFtaWNDb21wb25lbnQge1xuICBjb25maWchOiBBbGVydERpYWxvZ0NvbmZpZztcbiAgZGlhbG9nUmVmITogQWxlcnREaWFsb2dSZWY7XG5cbiAgLyoqXG4gICAqIFNldCBieSBgQWxlcnREaWFsb2dTZXJ2aWNlYCBvbmNlIHRoZSBkaWFsb2cncyByZXN1bHQgaXMgcmVhZHksIHNvIHRoZVxuICAgKiBjb250ZW50IHBhbmVsIHBsYXlzIGl0cyBleGl0IGFuaW1hdGlvbiBiZWZvcmUgdGhlIG92ZXJsYXkgaXMgdG9ybiBkb3duLlxuICAgKi9cbiAgY2xvc2luZyA9IGZhbHNlO1xuXG4gIG9uT3BlbkNoYW5nZShvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyZXN1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXN1bHQpO1xuICB9XG59XG4iXX0=
@@ -7,6 +7,14 @@ import { cn } from './utils/cn';
7
7
  import { BehaviorSubject } from 'rxjs';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "@angular/cdk/a11y";
10
+ /**
11
+ * Safety net if the exit animation's `animationend` never fires — reduced
12
+ * motion, no matching keyframe, or a panel that never rendered — so an
13
+ * alert dialog can never get stuck open forever. Also used by
14
+ * `alert-dialog.service.ts` and `alert-dialog-dynamic.component.ts`, which
15
+ * animate the same content component through a different overlay wiring.
16
+ */
17
+ export const CLOSE_FALLBACK_MS = 300;
10
18
  class AlertDialogInternalService {
11
19
  openSubject = new BehaviorSubject(false);
12
20
  open$ = this.openSubject.asObservable();
@@ -101,14 +109,39 @@ export class AlertDialogPortalComponent {
101
109
  });
102
110
  const portal = new TemplatePortal(this.portalContent, this.viewContainerRef);
103
111
  this.overlayRef.attach(portal);
112
+ // The backdrop element only exists once attached — setting this any
113
+ // earlier would silently no-op.
114
+ this.overlayRef.backdropElement?.setAttribute('data-state', 'open');
104
115
  }
116
+ /**
117
+ * Tears the overlay down once its exit animation finishes (or after
118
+ * `CLOSE_FALLBACK_MS`, whichever comes first) instead of instantly, so
119
+ * `data-[state=closed]:animate-out` actually gets a chance to play.
120
+ */
105
121
  hide() {
106
- if (this.overlayRef) {
107
- this.overlayRef.detach();
108
- this.overlayRef.dispose();
109
- this.overlayRef = undefined;
122
+ const ref = this.overlayRef;
123
+ if (!ref)
124
+ return;
125
+ ref.backdropElement?.setAttribute('data-state', 'closed');
126
+ let finished = false;
127
+ const finish = () => {
128
+ if (finished)
129
+ return;
130
+ finished = true;
131
+ ref.detach();
132
+ ref.dispose();
133
+ if (this.overlayRef === ref)
134
+ this.overlayRef = undefined;
110
135
  // Restore focus to the trigger.
111
136
  this.previouslyFocused?.focus?.();
137
+ };
138
+ const panel = ref.overlayElement.querySelector('[data-state]');
139
+ if (panel) {
140
+ panel.addEventListener('animationend', finish, { once: true });
141
+ setTimeout(finish, CLOSE_FALLBACK_MS);
142
+ }
143
+ else {
144
+ finish();
112
145
  }
113
146
  }
114
147
  ngOnDestroy() {
@@ -146,7 +179,7 @@ export class AlertDialogContentComponent {
146
179
  });
147
180
  }
148
181
  get computedClass() {
149
- return cn("fixed left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] z-50 grid w-full gap-4 border border-input bg-background p-6 shadow-lg data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] rounded-lg", {
182
+ return cn("fixed left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] z-50 grid w-full gap-4 border border-input bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] rounded-lg", {
150
183
  'max-w-xs': this.size === 'xs',
151
184
  'max-w-sm': this.size === 'sm',
152
185
  'max-w-md': this.size === 'md',
@@ -296,4 +329,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
296
329
  type: HostListener,
297
330
  args: ['click', ['$event']]
298
331
  }] } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYWxlcnQtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxnQkFBZ0IsRUFBcUIsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoTSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQUd2QyxNQUNNLDBCQUEwQjtJQUNwQixXQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDMUQsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFeEMsT0FBTyxDQUFDLEtBQWM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFD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MEJBQTBCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRiw2RUFBNkU7SUFDbkUsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFHckQsV0FBVyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQzt3R0FWUSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtTEFGekIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFHYiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0ksMkJBQTJCLGNBRXpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQjs4QkFNM0IsU0FBUztzQkFBbEIsTUFBTTtnQkFHUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0YWJsZSwgaW5qZWN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsLCBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydERpYWxvZ1NpemUgfSBmcm9tICcuL2FsZXJ0LWRpYWxvZy50eXBlcyc7XG5cbkBJbmplY3RhYmxlKClcbmNsYXNzIEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG9wZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgb3BlbiQgPSB0aGlzLm9wZW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgc2V0T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm9wZW5TdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIGdldE9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKCkge1xuICAgICAgICB0aGlzLnNldE9wZW4oIXRoaXMuZ2V0T3BlbigpKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHByb3ZpZGVyczogW0FsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBzZXQgb3Blbih2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih2YWwpO1xuICAgIH1cbiAgICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KHZhbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhjbGljayknOiAnb25PcGVuKCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1RyaWdnZXJDb21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih0cnVlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLXBvcnRhbCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjcG9ydGFsQ29udGVudD5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nUG9ydGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3BvcnRhbENvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3J0YWxDb250ZW50ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSk7XG4gICAgcHJpdmF0ZSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgICBwcml2YXRlIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICAgIC8qKiBFbGVtZW50IGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgb3BlbmVkLCByZXN0b3JlZCBvbiBjbG9zZS4gKi9cbiAgICBwcml2YXRlIHByZXZpb3VzbHlGb2N1c2VkPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLm9wZW4kLnN1YnNjcmliZShvcGVuID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3coKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHJldHVybjtcblxuICAgICAgICAvLyBSZW1lbWJlciB0aGUgdHJpZ2dlciBzbyBmb2N1cyBjYW4gYmUgcmVzdG9yZWQgb24gY2xvc2UuXG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFsnY2RrLW92ZXJsYXktYmFja2Ryb3AnLCAnYmctYmxhY2svODAnLCAnYmFja2Ryb3AtYmx1ci1zbScsICdkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluJywgJ2RhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQnLCAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wJywgJ2RhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCddLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuXG4gICAgICAgIC8vIEFsZXJ0LWRpYWxvZyBzZW1hbnRpY3M6IGJhY2tkcm9wIGNsaWNrcyBtdXN0IE5PVCBkaXNtaXNzLlxuICAgICAgICAvLyBFc2NhcGUgc3RpbGwgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLnNldE9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5wb3J0YWxDb250ZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlKCkge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSBmb2N1cyB0byB0aGUgdHJpZ2dlci5cbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWQ/LmZvY3VzPy4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWNvbnRlbnQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQTExeU1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJpc09wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgICAgIHJvbGU9XCJhbGVydGRpYWxvZ1wiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlQ21wPy5pZCB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmlwdGlvbkNtcD8uaWQgfHwgbnVsbFwiXG4gICAgICAgIGNka1RyYXBGb2N1cyBjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZT48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3NdJzogJ1wiY29udGVudHNcIidcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29udGVudENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHNpemU6IEFsZXJ0RGlhbG9nU2l6ZSA9ICdsZyc7XG5cbiAgICAvKiogUHJvamVjdGVkIHRpdGxlL2Rlc2NyaXB0aW9uIHVzZWQgdG8gYnVpbGQgdGhlIGRpYWxvZydzIGFjY2Vzc2libGUgbmFtZS4gKi9cbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudCkpIHRpdGxlQ21wPzogQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudDtcbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCkpIGRlc2NyaXB0aW9uQ21wPzogQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudDtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcbiAgICBpc09wZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGNuKFxuICAgICAgICAgICAgXCJmaXhlZCBsZWZ0LVs1MCVdIHRvcC1bNTAlXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIHotNTAgZ3JpZCB3LWZ1bGwgZ2FwLTQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHAtNiBzaGFkb3ctbGcgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by1sZWZ0LTEvMiBkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by10b3AtWzQ4JV0gcm91bmRlZC1sZ1wiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdtYXgtdy14cyc6IHRoaXMuc2l6ZSA9PT0gJ3hzJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctc20nOiB0aGlzLnNpemUgPT09ICdzbScsXG4gICAgICAgICAgICAgICAgJ21heC13LW1kJzogdGhpcy5zaXplID09PSAnbWQnLFxuICAgICAgICAgICAgICAgICdtYXgtdy1sZyc6IHRoaXMuc2l6ZSA9PT0gJ2xnJyxcbiAgICAgICAgICAgICAgICAnbWF4LXcteGwnOiB0aGlzLnNpemUgPT09ICd4bCcsXG4gICAgICAgICAgICAgICAgJ21heC13LTJ4bCc6IHRoaXMuc2l6ZSA9PT0gJzJ4bCcsXG4gICAgICAgICAgICAgICAgJ21heC13LWZ1bGwnOiB0aGlzLnNpemUgPT09ICdmdWxsJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctZml0JzogdGhpcy5zaXplID09PSAnZml0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RvbGxlLWFsZXJ0LWRpYWxvZy1oZWFkZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgICBob3N0OiB7ICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnIH1cbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dIZWFkZXJDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHsgcmV0dXJuIGNuKFwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTIgdGV4dC1jZW50ZXIgc206dGV4dC1sZWZ0XCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWZvb3RlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHsgJ1tjbGFzc10nOiAnY29tcHV0ZWRDbGFzcycgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIGdldCBjb21wdXRlZENsYXNzKCkgeyByZXR1cm4gY24oXCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHNwYWNlLXgtMlwiLCB0aGlzLmNsYXNzKTsgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RvbGxlLWFsZXJ0LWRpYWxvZy10aXRsZScsXG4gICAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gICAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJywgJ1thdHRyLmlkXSc6ICdpZCcgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gICAgLyoqIFN0YWJsZSBpZCByZWZlcmVuY2VkIGJ5IHRoZSBkaWFsb2cncyBgYXJpYS1sYWJlbGxlZGJ5YC4gKi9cbiAgICByZWFkb25seSBpZCA9IGB0b2xsZS1hbGVydC1kaWFsb2ctdGl0bGUtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHsgcmV0dXJuIGNuKFwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZm9yZWdyb3VuZFwiLCB0aGlzLmNsYXNzKTsgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RvbGxlLWFsZXJ0LWRpYWxvZy1kZXNjcmlwdGlvbicsXG4gICAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gICAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJywgJ1thdHRyLmlkXSc6ICdpZCcgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gICAgLyoqIFN0YWJsZSBpZCByZWZlcmVuY2VkIGJ5IHRoZSBkaWFsb2cncyBgYXJpYS1kZXNjcmliZWRieWAuICovXG4gICAgcmVhZG9ubHkgaWQgPSBgdG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7IHJldHVybiBjbihcInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWFjdGlvbicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQWN0aW9uQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKiBGaXJlcyBiZWZvcmUgdGhlIGRpYWxvZyBjbG9zZXMsIHNvIGNvbnN1bWVycyBjYW4gcnVuIHRoZSBjb25maXJtZWQgYWN0aW9uLiAqL1xuICAgIEBPdXRwdXQoKSBjb25maXJtZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5jb25maXJtZWQuZW1pdChldmVudCk7XG4gICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlPy5zZXRPcGVuKGZhbHNlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWNhbmNlbCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ2FuY2VsQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKiBGaXJlcyBiZWZvcmUgdGhlIGRpYWxvZyBjbG9zZXMsIHNvIGNvbnN1bWVycyBjYW4gcmVhY3QgdG8gYSBkaXNtaXNzYWwuICovXG4gICAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2U/LnNldE9wZW4oZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYWxlcnQtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxnQkFBZ0IsRUFBcUIsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoTSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBYyxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQUd2Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFFckMsTUFDTSwwQkFBMEI7SUFDcEIsV0FBVyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzFELEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXhDLE9BQU8sQ0FBQyxLQUFjO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7d0dBZEMsMEJBQTBCOzRHQUExQiwwQkFBMEI7OzRGQUExQiwwQkFBMEI7a0JBRC9CLFVBQVU7O0FBMEJYLE1BQU0sT0FBTyxvQkFBb0I7SUFDN0IsSUFBYSxJQUFJLENBQUMsR0FBWTtRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDUyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUUzQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUVoRTtRQUNJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0FaUSxvQkFBb0I7NEZBQXBCLG9CQUFvQixrSUFIbEIsQ0FBQywwQkFBMEIsQ0FBQywwQkFDN0IsMkJBQTJCLCtGQUYzQixZQUFZOzs0RkFJYixvQkFBb0I7a0JBUmhDLFNBQVM7K0JBQ0ksb0JBQW9CLGNBRWxCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxhQUNaLENBQUMsMEJBQTBCLENBQUMsWUFDN0IsMkJBQTJCO3dEQUd4QixJQUFJO3NCQUFoQixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU07O0FBcUJYLE1BQU0sT0FBTywyQkFBMkI7SUFDNUIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFFaEUsTUFBTTtRQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQzt3R0FMUSwyQkFBMkI7NEZBQTNCLDJCQUEyQixvSUFMMUIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFNYiwyQkFBMkI7a0JBVnZDLFNBQVM7K0JBQ0ksNEJBQTRCLGNBRTFCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQixRQUMvQjt3QkFDRixTQUFTLEVBQUUsVUFBVTtxQkFDeEI7O0FBcUJMLE1BQU0sT0FBTywwQkFBMEI7SUFDVyxhQUFhLENBQW9CO0lBQ3ZFLGtCQUFrQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDNUMsVUFBVSxDQUFjO0lBQ2hDLG1FQUFtRTtJQUMzRCxpQkFBaUIsQ0FBc0I7SUFFL0MsUUFBUTtRQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLElBQUk7UUFDUixJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUU1QiwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxhQUFtQyxDQUFDO1FBRXRFLE1BQU0sTUFBTSxHQUFHLElBQUksYUFBYSxDQUFDO1lBQzdCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxDQUFDLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSw4QkFBOEIsRUFBRSxpQ0FBaUMsRUFBRSxnQ0FBZ0MsRUFBRSw2QkFBNkIsQ0FBQztZQUM5TSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUYsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1NBQ3hELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUMsNERBQTREO1FBQzVELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUMvRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9CLG9FQUFvRTtRQUNwRSxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLElBQUk7UUFDUixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUVqQixHQUFHLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFMUQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNyQixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxHQUFHO2dCQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQ3pELGdDQUFnQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBYyxjQUFjLENBQUMsQ0FBQztRQUM1RSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvRCxVQUFVLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEVBQUUsQ0FBQztRQUNiLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO3dHQXBGUSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtTkFOekI7Ozs7R0FJWCwrRkFMVyxZQUFZOzs0RkFPYiwwQkFBMEI7a0JBWHRDLFNBQVM7K0JBQ0ksMkJBQTJCLGNBRXpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7O0dBSVg7OEJBRytDLGFBQWE7c0JBQTFELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7QUFvR2hELE1BQU0sT0FBTywyQkFBMkI7SUFDM0IsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixJQUFJLEdBQW9CLElBQUksQ0FBQztJQUV0Qyw4RUFBOEU7SUFDbkIsUUFBUSxDQUE2QjtJQUMvQixjQUFjLENBQW1DO0lBRTFHLGtCQUFrQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZjtRQUNJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sRUFBRSxDQUNMLDhmQUE4ZixFQUM5ZjtZQUNJLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUk7WUFDOUIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSTtZQUM5QixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJO1lBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUk7WUFDOUIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSTtZQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLO1lBQ2hDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU07WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSztTQUNuQyxFQUNELElBQUksQ0FBQyxLQUFLLENBQ2IsQ0FBQztJQUNOLENBQUM7d0dBaENRLDJCQUEyQjs0RkFBM0IsMkJBQTJCLDZPQUtMLHlCQUF5QixzR0FDekIsK0JBQStCLGlEQWhCcEQ7Ozs7OzZFQUsrRCwyREFOL0QsWUFBWSw4QkFBRSxVQUFVOzs0RkFXekIsMkJBQTJCO2tCQWR2QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDO29CQUNuQyxRQUFRLEVBQUU7Ozs7OzZFQUsrRDtvQkFDekUsSUFBSSxFQUFFO3dCQUNGLFNBQVMsRUFBRSxZQUFZO3FCQUMxQjtpQkFDSjt3REFFWSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUdxRCxRQUFRO3NCQUFsRSxZQUFZO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDUSxjQUFjO3NCQUE5RSxZQUFZO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQzs7QUFvQ25FLE1BQU0sT0FBTywwQkFBMEI7SUFDMUIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUM1QixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dHQUZ6RiwwQkFBMEI7NEZBQTFCLDBCQUEwQixxS0FIekIsMkJBQTJCLDJEQUQzQixZQUFZOzs0RkFJYiwwQkFBMEI7a0JBUHRDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtpQkFDdkM7OEJBRVksS0FBSztzQkFBYixLQUFLOztBQVdWLE1BQU0sT0FBTywwQkFBMEI7SUFDMUIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUM1QixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dHQUY1RSwwQkFBMEI7NEZBQTFCLDBCQUEwQixxS0FIekIsMkJBQTJCLDJEQUQzQixZQUFZOzs0RkFJYiwwQkFBMEI7a0JBUHRDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtpQkFDdkM7OEJBRVksS0FBSztzQkFBYixLQUFLOztBQVlWLE1BQU0sT0FBTyx5QkFBeUI7SUFDekIsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUM1Qiw4REFBOEQ7SUFDckQsRUFBRSxHQUFHLDRCQUE0QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dHQUo5RSx5QkFBeUI7NEZBQXpCLHlCQUF5QixxTEFIeEIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFJYix5QkFBeUI7a0JBUnJDLFNBQVM7K0JBQ0ksMEJBQTBCLGNBRXhCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQixRQUMvQixFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTs4QkFHOUMsS0FBSztzQkFBYixLQUFLOztBQWNWLE1BQU0sT0FBTywrQkFBK0I7SUFDL0IsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUM1QiwrREFBK0Q7SUFDdEQsRUFBRSxHQUFHLGtDQUFrQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dHQUp0RSwrQkFBK0I7NEZBQS9CLCtCQUErQiwyTEFIOUIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFJYiwrQkFBK0I7a0JBUjNDLFNBQVM7K0JBQ0ksZ0NBQWdDLGNBRTlCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQixRQUMvQixFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTs4QkFHOUMsS0FBSztzQkFBYixLQUFLOztBQWFWLE1BQU0sT0FBTywwQkFBMEI7SUFDM0Isa0JBQWtCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFcEYsaUZBQWlGO0lBQ3ZFLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBR3JELFdBQVcsQ0FBQyxLQUFpQjtRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBVlEsMEJBQTBCOzRGQUExQiwwQkFBMEIsbUxBRnpCLDJCQUEyQiwrRkFEM0IsWUFBWTs7NEZBR2IsMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNJLDJCQUEyQixjQUV6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsWUFDYiwyQkFBMkI7OEJBTTNCLFNBQVM7c0JBQWxCLE1BQU07Z0JBR1AsV0FBVztzQkFEVixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7QUFjckMsTUFBTSxPQUFPLDBCQUEwQjtJQUMzQixrQkFBa0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRiw2RUFBNkU7SUFDbkUsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFHckQsV0FBVyxDQUFDLEtBQWlCO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQzt3R0FWUSwwQkFBMEI7NEZBQTFCLDBCQUEwQixtTEFGekIsMkJBQTJCLCtGQUQzQixZQUFZOzs0RkFHYiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0ksMkJBQTJCLGNBRXpCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJCQUEyQjs4QkFNM0IsU0FBUztzQkFBbEIsTUFBTTtnQkFHUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0YWJsZSwgaW5qZWN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsLCBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydERpYWxvZ1NpemUgfSBmcm9tICcuL2FsZXJ0LWRpYWxvZy50eXBlcyc7XG5cbi8qKlxuICogU2FmZXR5IG5ldCBpZiB0aGUgZXhpdCBhbmltYXRpb24ncyBgYW5pbWF0aW9uZW5kYCBuZXZlciBmaXJlcyDigJQgcmVkdWNlZFxuICogbW90aW9uLCBubyBtYXRjaGluZyBrZXlmcmFtZSwgb3IgYSBwYW5lbCB0aGF0IG5ldmVyIHJlbmRlcmVkIOKAlCBzbyBhblxuICogYWxlcnQgZGlhbG9nIGNhbiBuZXZlciBnZXQgc3R1Y2sgb3BlbiBmb3JldmVyLiBBbHNvIHVzZWQgYnlcbiAqIGBhbGVydC1kaWFsb2cuc2VydmljZS50c2AgYW5kIGBhbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHNgLCB3aGljaFxuICogYW5pbWF0ZSB0aGUgc2FtZSBjb250ZW50IGNvbXBvbmVudCB0aHJvdWdoIGEgZGlmZmVyZW50IG92ZXJsYXkgd2lyaW5nLlxuICovXG5leHBvcnQgY29uc3QgQ0xPU0VfRkFMTEJBQ0tfTVMgPSAzMDA7XG5cbkBJbmplY3RhYmxlKClcbmNsYXNzIEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG9wZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgb3BlbiQgPSB0aGlzLm9wZW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgc2V0T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm9wZW5TdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIGdldE9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKCkge1xuICAgICAgICB0aGlzLnNldE9wZW4oIXRoaXMuZ2V0T3BlbigpKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHByb3ZpZGVyczogW0FsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBzZXQgb3Blbih2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih2YWwpO1xuICAgIH1cbiAgICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KHZhbCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctdHJpZ2dlcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhjbGljayknOiAnb25PcGVuKCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1RyaWdnZXJDb21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcblxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2Uuc2V0T3Blbih0cnVlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLXBvcnRhbCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjcG9ydGFsQ29udGVudD5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nUG9ydGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3BvcnRhbENvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3J0YWxDb250ZW50ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwcml2YXRlIGFsZXJ0RGlhbG9nU2VydmljZSA9IGluamVjdChBbGVydERpYWxvZ0ludGVybmFsU2VydmljZSk7XG4gICAgcHJpdmF0ZSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgICBwcml2YXRlIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICAgIC8qKiBFbGVtZW50IGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgb3BlbmVkLCByZXN0b3JlZCBvbiBjbG9zZS4gKi9cbiAgICBwcml2YXRlIHByZXZpb3VzbHlGb2N1c2VkPzogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLm9wZW4kLnN1YnNjcmliZShvcGVuID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3coKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHJldHVybjtcblxuICAgICAgICAvLyBSZW1lbWJlciB0aGUgdHJpZ2dlciBzbyBmb2N1cyBjYW4gYmUgcmVzdG9yZWQgb24gY2xvc2UuXG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFsnY2RrLW92ZXJsYXktYmFja2Ryb3AnLCAnYmctYmxhY2svODAnLCAnYmFja2Ryb3AtYmx1ci1zbScsICdkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluJywgJ2RhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQnLCAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wJywgJ2RhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCddLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuXG4gICAgICAgIC8vIEFsZXJ0LWRpYWxvZyBzZW1hbnRpY3M6IGJhY2tkcm9wIGNsaWNrcyBtdXN0IE5PVCBkaXNtaXNzLlxuICAgICAgICAvLyBFc2NhcGUgc3RpbGwgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnREaWFsb2dTZXJ2aWNlLnNldE9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5wb3J0YWxDb250ZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG5cbiAgICAgICAgLy8gVGhlIGJhY2tkcm9wIGVsZW1lbnQgb25seSBleGlzdHMgb25jZSBhdHRhY2hlZCDigJQgc2V0dGluZyB0aGlzIGFueVxuICAgICAgICAvLyBlYXJsaWVyIHdvdWxkIHNpbGVudGx5IG5vLW9wLlxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnb3BlbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlYXJzIHRoZSBvdmVybGF5IGRvd24gb25jZSBpdHMgZXhpdCBhbmltYXRpb24gZmluaXNoZXMgKG9yIGFmdGVyXG4gICAgICogYENMT1NFX0ZBTExCQUNLX01TYCwgd2hpY2hldmVyIGNvbWVzIGZpcnN0KSBpbnN0ZWFkIG9mIGluc3RhbnRseSwgc29cbiAgICAgKiBgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dGAgYWN0dWFsbHkgZ2V0cyBhIGNoYW5jZSB0byBwbGF5LlxuICAgICAqL1xuICAgIHByaXZhdGUgaGlkZSgpIHtcbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5vdmVybGF5UmVmO1xuICAgICAgICBpZiAoIXJlZikgcmV0dXJuO1xuXG4gICAgICAgIHJlZi5iYWNrZHJvcEVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsICdjbG9zZWQnKTtcblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICByZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICByZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZiA9PT0gcmVmKSB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBSZXN0b3JlIGZvY3VzIHRvIHRoZSB0cmlnZ2VyLlxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZD8uZm9jdXM/LigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gcmVmLm92ZXJsYXlFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1zdGF0ZV0nKTtcbiAgICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgICAgICBwYW5lbC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCBmaW5pc2gsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZmluaXNoLCBDTE9TRV9GQUxMQkFDS19NUyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWNvbnRlbnQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQTExeU1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCIgW2F0dHIuZGF0YS1zdGF0ZV09XCJpc09wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgICAgIHJvbGU9XCJhbGVydGRpYWxvZ1wiXG4gICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlQ21wPy5pZCB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmlwdGlvbkNtcD8uaWQgfHwgbnVsbFwiXG4gICAgICAgIGNka1RyYXBGb2N1cyBjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZT48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3NdJzogJ1wiY29udGVudHNcIidcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQ29udGVudENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIHNpemU6IEFsZXJ0RGlhbG9nU2l6ZSA9ICdsZyc7XG5cbiAgICAvKiogUHJvamVjdGVkIHRpdGxlL2Rlc2NyaXB0aW9uIHVzZWQgdG8gYnVpbGQgdGhlIGRpYWxvZydzIGFjY2Vzc2libGUgbmFtZS4gKi9cbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudCkpIHRpdGxlQ21wPzogQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudDtcbiAgICBAQ29udGVudENoaWxkKGZvcndhcmRSZWYoKCkgPT4gQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCkpIGRlc2NyaXB0aW9uQ21wPzogQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudDtcblxuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlKTtcbiAgICBpc09wZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZS5vcGVuJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdmFsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGNuKFxuICAgICAgICAgICAgXCJmaXhlZCBsZWZ0LVs1MCVdIHRvcC1bNTAlXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIHotNTAgZ3JpZCB3LWZ1bGwgZ2FwLTQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHAtNiBzaGFkb3ctbGcgZHVyYXRpb24tMjAwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1sZWZ0LTEvMiBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLXRvcC1bNDglXSBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWxlZnQtMS8yIGRhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLXRvcC1bNDglXSByb3VuZGVkLWxnXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJ21heC13LXhzJzogdGhpcy5zaXplID09PSAneHMnLFxuICAgICAgICAgICAgICAgICdtYXgtdy1zbSc6IHRoaXMuc2l6ZSA9PT0gJ3NtJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctbWQnOiB0aGlzLnNpemUgPT09ICdtZCcsXG4gICAgICAgICAgICAgICAgJ21heC13LWxnJzogdGhpcy5zaXplID09PSAnbGcnLFxuICAgICAgICAgICAgICAgICdtYXgtdy14bCc6IHRoaXMuc2l6ZSA9PT0gJ3hsJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctMnhsJzogdGhpcy5zaXplID09PSAnMnhsJyxcbiAgICAgICAgICAgICAgICAnbWF4LXctZnVsbCc6IHRoaXMuc2l6ZSA9PT0gJ2Z1bGwnLFxuICAgICAgICAgICAgICAgICdtYXgtdy1maXQnOiB0aGlzLnNpemUgPT09ICdmaXQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxuICAgIGhvc3Q6IHsgJ1tjbGFzc10nOiAnY29tcHV0ZWRDbGFzcycgfVxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0hlYWRlckNvbXBvbmVudCB7XG4gICAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICcnO1xuICAgIGdldCBjb21wdXRlZENsYXNzKCkgeyByZXR1cm4gY24oXCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMiB0ZXh0LWNlbnRlciBzbTp0ZXh0LWxlZnRcIiwgdGhpcy5jbGFzcyk7IH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctZm9vdGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gICAgaG9zdDogeyAnW2NsYXNzXSc6ICdjb21wdXRlZENsYXNzJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nRm9vdGVyQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gICAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7IHJldHVybiBjbihcImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgc3BhY2UteC0yXCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLXRpdGxlJyxcbiAgICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgICBob3N0OiB7ICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnLCAnW2F0dHIuaWRdJzogJ2lkJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nVGl0bGVDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICAvKiogU3RhYmxlIGlkIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWxvZydzIGBhcmlhLWxhYmVsbGVkYnlgLiAqL1xuICAgIHJlYWRvbmx5IGlkID0gYHRvbGxlLWFsZXJ0LWRpYWxvZy10aXRsZS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xuICAgIGdldCBjb21wdXRlZENsYXNzKCkgeyByZXR1cm4gY24oXCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgdGV4dC1mb3JlZ3JvdW5kXCIsIHRoaXMuY2xhc3MpOyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uJyxcbiAgICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgICBob3N0OiB7ICdbY2xhc3NdJzogJ2NvbXB1dGVkQ2xhc3MnLCAnW2F0dHIuaWRdJzogJ2lkJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb25Db21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcbiAgICAvKiogU3RhYmxlIGlkIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWxvZydzIGBhcmlhLWRlc2NyaWJlZGJ5YC4gKi9cbiAgICByZWFkb25seSBpZCA9IGB0b2xsZS1hbGVydC1kaWFsb2ctZGVzY3JpcHRpb24tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgICBnZXQgY29tcHV0ZWRDbGFzcygpIHsgcmV0dXJuIGNuKFwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiwgdGhpcy5jbGFzcyk7IH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctYWN0aW9uJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dBY3Rpb25Db21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIEZpcmVzIGJlZm9yZSB0aGUgZGlhbG9nIGNsb3Nlcywgc28gY29uc3VtZXJzIGNhbiBydW4gdGhlIGNvbmZpcm1lZCBhY3Rpb24uICovXG4gICAgQE91dHB1dCgpIGNvbmZpcm1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmNvbmZpcm1lZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5hbGVydERpYWxvZ1NlcnZpY2U/LnNldE9wZW4oZmFsc2UpO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctY2FuY2VsJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQge1xuICAgIHByaXZhdGUgYWxlcnREaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0RGlhbG9nSW50ZXJuYWxTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIEZpcmVzIGJlZm9yZSB0aGUgZGlhbG9nIGNsb3Nlcywgc28gY29uc3VtZXJzIGNhbiByZWFjdCB0byBhIGRpc21pc3NhbC4gKi9cbiAgICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoZXZlbnQpO1xuICAgICAgICB0aGlzLmFsZXJ0RGlhbG9nU2VydmljZT8uc2V0T3BlbihmYWxzZSk7XG4gICAgfVxufVxuIl19
@@ -3,6 +3,7 @@ import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
3
3
  import { ComponentPortal } from '@angular/cdk/portal';
4
4
  import { AlertDialogRef } from './alert-dialog.types';
5
5
  import { AlertDialogDynamicComponent } from './alert-dialog-dynamic.component';
6
+ import { CLOSE_FALLBACK_MS } from './alert-dialog.component';
6
7
  import * as i0 from "@angular/core";
7
8
  export class AlertDialogService {
8
9
  overlay = inject(Overlay);
@@ -12,7 +13,15 @@ export class AlertDialogService {
12
13
  const previouslyFocused = document.activeElement;
13
14
  const overlayConfig = new OverlayConfig({
14
15
  hasBackdrop: true,
15
- backdropClass: ['cdk-overlay-backdrop', 'bg-black/80', 'backdrop-blur-sm'],
16
+ backdropClass: [
17
+ 'cdk-overlay-backdrop',
18
+ 'bg-black/80',
19
+ 'backdrop-blur-sm',
20
+ 'data-[state=open]:animate-in',
21
+ 'data-[state=open]:fade-in-0',
22
+ 'data-[state=closed]:animate-out',
23
+ 'data-[state=closed]:fade-out-0',
24
+ ],
16
25
  positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),
17
26
  scrollStrategy: this.overlay.scrollStrategies.block()
18
27
  });
@@ -20,13 +29,36 @@ export class AlertDialogService {
20
29
  const dialogRef = new AlertDialogRef();
21
30
  const portal = new ComponentPortal(AlertDialogDynamicComponent, null, this.injector);
22
31
  const componentRef = overlayRef.attach(portal);
32
+ // The backdrop element only exists once attached — setting this any
33
+ // earlier would silently no-op.
34
+ overlayRef.backdropElement?.setAttribute('data-state', 'open');
23
35
  componentRef.instance.config = config;
24
36
  componentRef.instance.dialogRef = dialogRef;
37
+ // The result (`afterClosed$`) is ready immediately, but disposing the
38
+ // overlay waits for the content panel's exit animation to finish (or
39
+ // a fallback timeout), so `data-[state=closed]:animate-out` gets a
40
+ // chance to play instead of being torn down mid-frame.
25
41
  dialogRef.afterClosed$.subscribe(() => {
26
- overlayRef.detach();
27
- overlayRef.dispose();
28
- // Restore focus to the trigger.
29
- previouslyFocused?.focus?.();
42
+ overlayRef.backdropElement?.setAttribute('data-state', 'closed');
43
+ componentRef.instance.closing = true;
44
+ let finished = false;
45
+ const finish = () => {
46
+ if (finished)
47
+ return;
48
+ finished = true;
49
+ overlayRef.detach();
50
+ overlayRef.dispose();
51
+ // Restore focus to the trigger.
52
+ previouslyFocused?.focus?.();
53
+ };
54
+ const panel = overlayRef.overlayElement.querySelector('[data-state]');
55
+ if (panel) {
56
+ panel.addEventListener('animationend', finish, { once: true });
57
+ setTimeout(finish, CLOSE_FALLBACK_MS);
58
+ }
59
+ else {
60
+ finish();
61
+ }
30
62
  });
31
63
  // Alert-dialog semantics: backdrop clicks must NOT dismiss.
32
64
  // Escape still closes the dialog.
@@ -47,4 +79,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
47
79
  providedIn: 'root'
48
80
  }]
49
81
  }] });
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2FsZXJ0LWRpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFvQixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFxQixjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFLL0UsTUFBTSxPQUFPLGtCQUFrQjtJQUNuQixPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFcEMsSUFBSSxDQUFDLE1BQXlCO1FBQzFCLDBEQUEwRDtRQUMxRCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxhQUFtQyxDQUFDO1FBRXZFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDO1lBQ3BDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxDQUFDLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQztZQUMxRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUYsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1NBQ3hELENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFFdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9DLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN0QyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFNUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsZ0NBQWdDO1lBQ2hDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCw0REFBNEQ7UUFDNUQsa0NBQWtDO1FBQ2xDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDMUQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQzt3R0F6Q1Esa0JBQWtCOzRHQUFsQixrQkFBa0IsY0FGZixNQUFNOzs0RkFFVCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBWaWV3Q29udGFpbmVyUmVmLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dDb25maWcsIEFsZXJ0RGlhbG9nUmVmIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cudHlwZXMnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dEeW5hbWljQ29tcG9uZW50IH0gZnJvbSAnLi9hbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nU2VydmljZSB7XG4gICAgcHJpdmF0ZSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gICAgb3Blbihjb25maWc6IEFsZXJ0RGlhbG9nQ29uZmlnKTogQWxlcnREaWFsb2dSZWYge1xuICAgICAgICAvLyBSZW1lbWJlciB0aGUgdHJpZ2dlciBzbyBmb2N1cyBjYW4gYmUgcmVzdG9yZWQgb24gY2xvc2UuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogWydjZGstb3ZlcmxheS1iYWNrZHJvcCcsICdiZy1ibGFjay84MCcsICdiYWNrZHJvcC1ibHVyLXNtJ10sXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gbmV3IEFsZXJ0RGlhbG9nUmVmKCk7XG5cbiAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChBbGVydERpYWxvZ0R5bmFtaWNDb21wb25lbnQsIG51bGwsIHRoaXMuaW5qZWN0b3IpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBvdmVybGF5UmVmLmF0dGFjaChwb3J0YWwpO1xuXG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBjb25maWc7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kaWFsb2dSZWYgPSBkaWFsb2dSZWY7XG5cbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSBmb2N1cyB0byB0aGUgdHJpZ2dlci5cbiAgICAgICAgICAgIHByZXZpb3VzbHlGb2N1c2VkPy5mb2N1cz8uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFsZXJ0LWRpYWxvZyBzZW1hbnRpY3M6IGJhY2tkcm9wIGNsaWNrcyBtdXN0IE5PVCBkaXNtaXNzLlxuICAgICAgICAvLyBFc2NhcGUgc3RpbGwgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICAgIG92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGlhbG9nUmVmO1xuICAgIH1cbn1cbiJdfQ==
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2FsZXJ0LWRpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQUs3RCxNQUFNLE9BQU8sa0JBQWtCO0lBQ25CLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVwQyxJQUFJLENBQUMsTUFBeUI7UUFDMUIsMERBQTBEO1FBQzFELE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLGFBQW1DLENBQUM7UUFFdkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDcEMsV0FBVyxFQUFFLElBQUk7WUFDakIsYUFBYSxFQUFFO2dCQUNYLHNCQUFzQjtnQkFDdEIsYUFBYTtnQkFDYixrQkFBa0I7Z0JBQ2xCLDhCQUE4QjtnQkFDOUIsNkJBQTZCO2dCQUM3QixpQ0FBaUM7Z0JBQ2pDLGdDQUFnQzthQUNuQztZQUNELGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxRixjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7U0FDeEQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUV2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0Msb0VBQW9FO1FBQ3BFLGdDQUFnQztRQUNoQyxVQUFVLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0QsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUU1QyxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSx1REFBdUQ7UUFDdkQsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFFckMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDaEIsSUFBSSxRQUFRO29CQUFFLE9BQU87Z0JBQ3JCLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixnQ0FBZ0M7Z0JBQ2hDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDakMsQ0FBQyxDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQWMsY0FBYyxDQUFDLENBQUM7WUFDbkYsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixLQUFLLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRCxVQUFVLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDMUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sRUFBRSxDQUFDO1lBQ2IsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsNERBQTREO1FBQzVELGtDQUFrQztRQUNsQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO1lBQzFELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7d0dBekVRLGtCQUFrQjs0R0FBbEIsa0JBQWtCLGNBRmYsTUFBTTs7NEZBRVQsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nQ29uZmlnLCBBbGVydERpYWxvZ1JlZiB9IGZyb20gJy4vYWxlcnQtZGlhbG9nLnR5cGVzJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nRHluYW1pY0NvbXBvbmVudCB9IGZyb20gJy4vYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50JztcbmltcG9ydCB7IENMT1NFX0ZBTExCQUNLX01TIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1NlcnZpY2Uge1xuICAgIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgICBwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAgIG9wZW4oY29uZmlnOiBBbGVydERpYWxvZ0NvbmZpZyk6IEFsZXJ0RGlhbG9nUmVmIHtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIHRyaWdnZXIgc28gZm9jdXMgY2FuIGJlIHJlc3RvcmVkIG9uIGNsb3NlLlxuICAgICAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFtcbiAgICAgICAgICAgICAgICAnY2RrLW92ZXJsYXktYmFja2Ryb3AnLFxuICAgICAgICAgICAgICAgICdiZy1ibGFjay84MCcsXG4gICAgICAgICAgICAgICAgJ2JhY2tkcm9wLWJsdXItc20nLFxuICAgICAgICAgICAgICAgICdkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluJyxcbiAgICAgICAgICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wJyxcbiAgICAgICAgICAgICAgICAnZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCcsXG4gICAgICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuY2VudGVyVmVydGljYWxseSgpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IG5ldyBBbGVydERpYWxvZ1JlZigpO1xuXG4gICAgICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoQWxlcnREaWFsb2dEeW5hbWljQ29tcG9uZW50LCBudWxsLCB0aGlzLmluamVjdG9yKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gb3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcblxuICAgICAgICAvLyBUaGUgYmFja2Ryb3AgZWxlbWVudCBvbmx5IGV4aXN0cyBvbmNlIGF0dGFjaGVkIOKAlCBzZXR0aW5nIHRoaXMgYW55XG4gICAgICAgIC8vIGVhcmxpZXIgd291bGQgc2lsZW50bHkgbm8tb3AuXG4gICAgICAgIG92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnb3BlbicpO1xuXG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBjb25maWc7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kaWFsb2dSZWYgPSBkaWFsb2dSZWY7XG5cbiAgICAgICAgLy8gVGhlIHJlc3VsdCAoYGFmdGVyQ2xvc2VkJGApIGlzIHJlYWR5IGltbWVkaWF0ZWx5LCBidXQgZGlzcG9zaW5nIHRoZVxuICAgICAgICAvLyBvdmVybGF5IHdhaXRzIGZvciB0aGUgY29udGVudCBwYW5lbCdzIGV4aXQgYW5pbWF0aW9uIHRvIGZpbmlzaCAob3JcbiAgICAgICAgLy8gYSBmYWxsYmFjayB0aW1lb3V0KSwgc28gYGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXRgIGdldHMgYVxuICAgICAgICAvLyBjaGFuY2UgdG8gcGxheSBpbnN0ZWFkIG9mIGJlaW5nIHRvcm4gZG93biBtaWQtZnJhbWUuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIG92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnY2xvc2VkJyk7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY2xvc2luZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIHRyaWdnZXIuXG4gICAgICAgICAgICAgICAgcHJldmlvdXNseUZvY3VzZWQ/LmZvY3VzPy4oKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtc3RhdGVdJyk7XG4gICAgICAgICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgICAgICAgICBwYW5lbC5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCBmaW5pc2gsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZpbmlzaCwgQ0xPU0VfRkFMTEJBQ0tfTVMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWxlcnQtZGlhbG9nIHNlbWFudGljczogYmFja2Ryb3AgY2xpY2tzIG11c3QgTk9UIGRpc21pc3MuXG4gICAgICAgIC8vIEVzY2FwZSBzdGlsbCBjbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgICAgb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGRpYWxvZ1JlZi5jbG9zZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,95 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cn } from './utils/cn';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * A ranked list of horizontal bars — label left, value right, bar width
8
+ * scaled to each row's share of the list's largest value. Unlike a chart
9
+ * series or a category bar's segments, every bar is the same accent: rank is
10
+ * carried by length, not by a categorical palette.
11
+ * @new
12
+ */
13
+ export class BarListComponent {
14
+ /**
15
+ * Angular writes a bound `class` input through its styling path, which does
16
+ * not mark an OnPush component dirty — without this hook the component keeps
17
+ * rendering the class it was born with.
18
+ */
19
+ ngOnChanges() {
20
+ this.cdr.markForCheck();
21
+ }
22
+ /** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
23
+ trackByIndex = (index) => index;
24
+ /** Rows to rank, in the order they should be drawn. @default [] */
25
+ data = [];
26
+ /** Row key holding each row's label. @default 'label' */
27
+ labelKey = 'label';
28
+ /** Row key holding each row's numeric value. @default 'value' */
29
+ valueKey = 'value';
30
+ /** Extra Tailwind classes merged onto the list via `cn()` (last-wins). */
31
+ class = '';
32
+ cdr = inject(ChangeDetectorRef);
33
+ get rows() {
34
+ const rows = this.data ?? [];
35
+ const values = rows.map((row) => {
36
+ const num = Number(row?.[this.valueKey]);
37
+ return Number.isFinite(num) ? num : 0;
38
+ });
39
+ const max = values.reduce((m, v) => Math.max(m, v), 0);
40
+ return rows.map((row, i) => {
41
+ const raw = row?.[this.labelKey];
42
+ const value = values[i];
43
+ return {
44
+ label: raw == null ? '' : String(raw),
45
+ value,
46
+ percent: max > 0 ? Math.max(0, Math.min(100, (value / max) * 100)) : 0,
47
+ formattedValue: value.toLocaleString('en-US'),
48
+ };
49
+ });
50
+ }
51
+ get computedClass() {
52
+ return cn('flex w-full flex-col gap-1', this.class);
53
+ }
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BarListComponent, isStandalone: true, selector: "tolle-bar-list", inputs: { data: "data", labelKey: "labelKey", valueKey: "valueKey", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
56
+ <div [class]="computedClass">
57
+ <div
58
+ *ngFor="let row of rows; trackBy: trackByIndex"
59
+ class="relative flex items-center overflow-hidden rounded-sm"
60
+ >
61
+ <div class="absolute inset-y-0 left-0 rounded-sm bg-primary/15" [style.width.%]="row.percent"></div>
62
+ <span class="relative z-10 truncate px-2 py-1.5 text-sm text-foreground">{{ row.label }}</span>
63
+ <span class="relative z-10 ml-auto shrink-0 px-2 py-1.5 text-sm font-medium tabular-nums text-foreground">
64
+ {{ row.formattedValue }}
65
+ </span>
66
+ </div>
67
+ </div>
68
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69
+ }
70
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarListComponent, decorators: [{
71
+ type: Component,
72
+ args: [{ selector: 'tolle-bar-list', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
73
+ <div [class]="computedClass">
74
+ <div
75
+ *ngFor="let row of rows; trackBy: trackByIndex"
76
+ class="relative flex items-center overflow-hidden rounded-sm"
77
+ >
78
+ <div class="absolute inset-y-0 left-0 rounded-sm bg-primary/15" [style.width.%]="row.percent"></div>
79
+ <span class="relative z-10 truncate px-2 py-1.5 text-sm text-foreground">{{ row.label }}</span>
80
+ <span class="relative z-10 ml-auto shrink-0 px-2 py-1.5 text-sm font-medium tabular-nums text-foreground">
81
+ {{ row.formattedValue }}
82
+ </span>
83
+ </div>
84
+ </div>
85
+ `, styles: [":host{display:block}\n"] }]
86
+ }], propDecorators: { data: [{
87
+ type: Input
88
+ }], labelKey: [{
89
+ type: Input
90
+ }], valueKey: [{
91
+ type: Input
92
+ }], class: [{
93
+ type: Input
94
+ }] } });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9iYXItbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFVaEM7Ozs7OztHQU1HO0FBc0JILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0I7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrRkFBa0Y7SUFDbEYsWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFFaEQsbUVBQW1FO0lBQzFELElBQUksR0FBMEIsRUFBRSxDQUFDO0lBQzFDLHlEQUF5RDtJQUNoRCxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLGlFQUFpRTtJQUN4RCxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLDBFQUEwRTtJQUNqRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRUgsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpELElBQUksSUFBSTtRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV2RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixPQUFPO2dCQUNMLEtBQUssRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ3JDLEtBQUs7Z0JBQ0wsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQzthQUM5QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7d0dBOUNVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLHFMQWZqQjs7Ozs7Ozs7Ozs7OztHQWFULCtGQWZTLFlBQVk7OzRGQWlCWCxnQkFBZ0I7a0JBckI1QixTQUFTOytCQUNFLGdCQUFnQixjQUVkLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7O0dBYVQ7OEJBZ0JRLElBQUk7c0JBQVosS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbi8qKiBPbmUgcmVzb2x2ZWQgcm93OiBpdHMgbGFiZWwsIGl0cyB2YWx1ZSwgYW5kIGl0cyBzaGFyZSBvZiB0aGUgbGlzdCdzIGxhcmdlc3QgdmFsdWUuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhckxpc3RSb3cge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBwZXJjZW50OiBudW1iZXI7XG4gIGZvcm1hdHRlZFZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByYW5rZWQgbGlzdCBvZiBob3Jpem9udGFsIGJhcnMg4oCUIGxhYmVsIGxlZnQsIHZhbHVlIHJpZ2h0LCBiYXIgd2lkdGhcbiAqIHNjYWxlZCB0byBlYWNoIHJvdydzIHNoYXJlIG9mIHRoZSBsaXN0J3MgbGFyZ2VzdCB2YWx1ZS4gVW5saWtlIGEgY2hhcnRcbiAqIHNlcmllcyBvciBhIGNhdGVnb3J5IGJhcidzIHNlZ21lbnRzLCBldmVyeSBiYXIgaXMgdGhlIHNhbWUgYWNjZW50OiByYW5rIGlzXG4gKiBjYXJyaWVkIGJ5IGxlbmd0aCwgbm90IGJ5IGEgY2F0ZWdvcmljYWwgcGFsZXR0ZS5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYmFyLWxpc3QnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtc21cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCByb3VuZGVkLXNtIGJnLXByaW1hcnkvMTVcIiBbc3R5bGUud2lkdGguJV09XCJyb3cucGVyY2VudFwiPjwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlbGF0aXZlIHotMTAgdHJ1bmNhdGUgcHgtMiBweS0xLjUgdGV4dC1zbSB0ZXh0LWZvcmVncm91bmRcIj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVsYXRpdmUgei0xMCBtbC1hdXRvIHNocmluay0wIHB4LTIgcHktMS41IHRleHQtc20gZm9udC1tZWRpdW0gdGFidWxhci1udW1zIHRleHQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgIHt7IHJvdy5mb3JtYXR0ZWRWYWx1ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQmFyTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogSWRlbnRpdHkgZm9yIGAqbmdGb3JgLCBzbyBhIHJlZHJhdyBwYXRjaGVzIG5vZGVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIC8qKiBSb3dzIHRvIHJhbmssIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBkcmF3bi4gQGRlZmF1bHQgW10gKi9cbiAgQElucHV0KCkgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdID0gW107XG4gIC8qKiBSb3cga2V5IGhvbGRpbmcgZWFjaCByb3cncyBsYWJlbC4gQGRlZmF1bHQgJ2xhYmVsJyAqL1xuICBASW5wdXQoKSBsYWJlbEtleSA9ICdsYWJlbCc7XG4gIC8qKiBSb3cga2V5IGhvbGRpbmcgZWFjaCByb3cncyBudW1lcmljIHZhbHVlLiBAZGVmYXVsdCAndmFsdWUnICovXG4gIEBJbnB1dCgpIHZhbHVlS2V5ID0gJ3ZhbHVlJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGxpc3QgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgZ2V0IHJvd3MoKTogQmFyTGlzdFJvd1tdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhID8/IFtdO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlcihyb3c/Llt0aGlzLnZhbHVlS2V5XSk7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bSkgPyBudW0gOiAwO1xuICAgIH0pO1xuICAgIGNvbnN0IG1heCA9IHZhbHVlcy5yZWR1Y2UoKG0sIHYpID0+IE1hdGgubWF4KG0sIHYpLCAwKTtcblxuICAgIHJldHVybiByb3dzLm1hcCgocm93LCBpKSA9PiB7XG4gICAgICBjb25zdCByYXcgPSByb3c/Llt0aGlzLmxhYmVsS2V5XTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHJhdyA9PSBudWxsID8gJycgOiBTdHJpbmcocmF3KSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHBlcmNlbnQ6IG1heCA+IDAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsICh2YWx1ZSAvIG1heCkgKiAxMDApKSA6IDAsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiB2YWx1ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oJ2ZsZXggdy1mdWxsIGZsZXgtY29sIGdhcC0xJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,130 @@
1
+ import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cn } from './utils/cn';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * A single bar split into proportional, labelled ranges — for showing where
8
+ * one value falls against a scale made of categories (a credit score inside
9
+ * "Poor / Fair / Good / Excellent", latency inside "Fast / OK / Slow").
10
+ *
11
+ * Segments take the chart palette by position, since a category bar has no
12
+ * stable per-render identity to key colour off the way a chart series does —
13
+ * pass `colors` to override.
14
+ * @new
15
+ */
16
+ export class CategoryBarComponent {
17
+ /**
18
+ * Angular writes a bound `class` input through its styling path, which does
19
+ * not mark an OnPush component dirty — without this hook the component keeps
20
+ * rendering the class it was born with.
21
+ */
22
+ ngOnChanges() {
23
+ this.cdr.markForCheck();
24
+ }
25
+ /** Identity for `*ngFor`, so a redraw patches nodes instead of replacing them. */
26
+ trackByIndex = (index) => index;
27
+ /** Width of each segment. Values that are not finite and greater than zero are dropped. @default [] */
28
+ values = [];
29
+ /** Name for each segment, used in the accessible summary and as a title tooltip. @default [] */
30
+ labels = [];
31
+ /** Paint for each segment, by index. Falls back to the chart palette --chart-1 through --chart-5. @default [] */
32
+ colors = [];
33
+ /** Position of the pointer, 0-100 on the same scale the segments sum to. Omit to draw no pointer. @default null */
34
+ markerValue = null;
35
+ /** Accessible name, prefixed onto the sr-only summary of segments and marker. @default '' */
36
+ ariaLabel = '';
37
+ /** Extra Tailwind classes merged onto the bar via `cn()` (last-wins). */
38
+ class = '';
39
+ cdr = inject(ChangeDetectorRef);
40
+ get total() {
41
+ return this.values.reduce((sum, v) => (Number.isFinite(v) && v > 0 ? sum + v : sum), 0);
42
+ }
43
+ get segments() {
44
+ const total = this.total;
45
+ if (total <= 0)
46
+ return [];
47
+ return this.values
48
+ .map((value, i) => ({ value, i }))
49
+ .filter(({ value }) => Number.isFinite(value) && value > 0)
50
+ .map(({ value, i }) => ({
51
+ label: this.labels[i] ?? '',
52
+ value,
53
+ percent: (value / total) * 100,
54
+ color: this.colors[i] || 'rgb(var(--chart-' + ((i % 5) + 1) + '))',
55
+ }));
56
+ }
57
+ get clampedMarker() {
58
+ if (this.markerValue == null || !Number.isFinite(this.markerValue))
59
+ return null;
60
+ return Math.min(100, Math.max(0, this.markerValue));
61
+ }
62
+ get summary() {
63
+ const parts = this.segments.map((s) => (s.label ? s.label + ': ' : '') + s.percent.toFixed(0) + '%');
64
+ const marker = this.clampedMarker !== null ? ', current position ' + this.clampedMarker.toFixed(0) + '%' : '';
65
+ const prefix = this.ariaLabel ? this.ariaLabel + '. ' : '';
66
+ return prefix + parts.join(', ') + marker;
67
+ }
68
+ get computedClass() {
69
+ return cn('w-full', this.class);
70
+ }
71
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CategoryBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CategoryBarComponent, isStandalone: true, selector: "tolle-category-bar", inputs: { values: "values", labels: "labels", colors: "colors", markerValue: "markerValue", ariaLabel: "ariaLabel", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
73
+ <div [class]="computedClass">
74
+ <div class="relative flex w-full gap-0.5">
75
+ <div
76
+ *ngFor="let segment of segments; let i = index; trackBy: trackByIndex"
77
+ class="h-2 first:rounded-l-full last:rounded-r-full"
78
+ [style.width.%]="segment.percent"
79
+ [style.background]="segment.color"
80
+ [attr.title]="segment.label || null"
81
+ ></div>
82
+
83
+ <span
84
+ *ngIf="clampedMarker !== null"
85
+ class="absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-background bg-foreground shadow"
86
+ [style.left.%]="clampedMarker"
87
+ ></span>
88
+ </div>
89
+
90
+ <p class="sr-only">{{ summary }}</p>
91
+ </div>
92
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
93
+ }
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CategoryBarComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'tolle-category-bar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
97
+ <div [class]="computedClass">
98
+ <div class="relative flex w-full gap-0.5">
99
+ <div
100
+ *ngFor="let segment of segments; let i = index; trackBy: trackByIndex"
101
+ class="h-2 first:rounded-l-full last:rounded-r-full"
102
+ [style.width.%]="segment.percent"
103
+ [style.background]="segment.color"
104
+ [attr.title]="segment.label || null"
105
+ ></div>
106
+
107
+ <span
108
+ *ngIf="clampedMarker !== null"
109
+ class="absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-background bg-foreground shadow"
110
+ [style.left.%]="clampedMarker"
111
+ ></span>
112
+ </div>
113
+
114
+ <p class="sr-only">{{ summary }}</p>
115
+ </div>
116
+ `, styles: [":host{display:block}\n"] }]
117
+ }], propDecorators: { values: [{
118
+ type: Input
119
+ }], labels: [{
120
+ type: Input
121
+ }], colors: [{
122
+ type: Input
123
+ }], markerValue: [{
124
+ type: Input
125
+ }], ariaLabel: [{
126
+ type: Input
127
+ }], class: [{
128
+ type: Input
129
+ }] } });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvY2F0ZWdvcnktYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQVVoQzs7Ozs7Ozs7O0dBU0c7QUE2QkgsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQjs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztJQUVoRCx1R0FBdUc7SUFDOUYsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUMvQixnR0FBZ0c7SUFDdkYsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUMvQixpSEFBaUg7SUFDeEcsTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUMvQixtSEFBbUg7SUFDMUcsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFDM0MsNkZBQTZGO0lBQ3BGLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIseUVBQXlFO0lBQ2hFLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFSCxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQsSUFBWSxLQUFLO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEs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bUJBQ04sdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQlQ7OEJBZ0JRLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqIE9uZSByZXNvbHZlZCBzZWdtZW50OiBpdHMgc2hhcmUgb2YgdGhlIGJhcidzIHdpZHRoLCBpdHMgcGFpbnQsIGFuZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5QmFyU2VnbWVudCB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHBlcmNlbnQ6IG51bWJlcjtcbiAgY29sb3I6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBiYXIgc3BsaXQgaW50byBwcm9wb3J0aW9uYWwsIGxhYmVsbGVkIHJhbmdlcyDigJQgZm9yIHNob3dpbmcgd2hlcmVcbiAqIG9uZSB2YWx1ZSBmYWxscyBhZ2FpbnN0IGEgc2NhbGUgbWFkZSBvZiBjYXRlZ29yaWVzIChhIGNyZWRpdCBzY29yZSBpbnNpZGVcbiAqIFwiUG9vciAvIEZhaXIgLyBHb29kIC8gRXhjZWxsZW50XCIsIGxhdGVuY3kgaW5zaWRlIFwiRmFzdCAvIE9LIC8gU2xvd1wiKS5cbiAqXG4gKiBTZWdtZW50cyB0YWtlIHRoZSBjaGFydCBwYWxldHRlIGJ5IHBvc2l0aW9uLCBzaW5jZSBhIGNhdGVnb3J5IGJhciBoYXMgbm9cbiAqIHN0YWJsZSBwZXItcmVuZGVyIGlkZW50aXR5IHRvIGtleSBjb2xvdXIgb2ZmIHRoZSB3YXkgYSBjaGFydCBzZXJpZXMgZG9lcyDigJRcbiAqIHBhc3MgYGNvbG9yc2AgdG8gb3ZlcnJpZGUuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNhdGVnb3J5LWJhcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgZ2FwLTAuNVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJoLTIgZmlyc3Q6cm91bmRlZC1sLWZ1bGwgbGFzdDpyb3VuZGVkLXItZnVsbFwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwic2VnbWVudC5wZXJjZW50XCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzZWdtZW50LmNvbG9yXCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJzZWdtZW50LmxhYmVsIHx8IG51bGxcIlxuICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdJZj1cImNsYW1wZWRNYXJrZXIgIT09IG51bGxcIlxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTEvMiBoLTMgdy0zIC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMiByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWJhY2tncm91bmQgYmctZm9yZWdyb3VuZCBzaGFkb3dcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiY2xhbXBlZE1hcmtlclwiXG4gICAgICAgID48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHAgY2xhc3M9XCJzci1vbmx5XCI+e3sgc3VtbWFyeSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcnlCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIElkZW50aXR5IGZvciBgKm5nRm9yYCwgc28gYSByZWRyYXcgcGF0Y2hlcyBub2RlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiAqL1xuICB0cmFja0J5SW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICAvKiogV2lkdGggb2YgZWFjaCBzZWdtZW50LiBWYWx1ZXMgdGhhdCBhcmUgbm90IGZpbml0ZSBhbmQgZ3JlYXRlciB0aGFuIHplcm8gYXJlIGRyb3BwZWQuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgLyoqIE5hbWUgZm9yIGVhY2ggc2VnbWVudCwgdXNlZCBpbiB0aGUgYWNjZXNzaWJsZSBzdW1tYXJ5IGFuZCBhcyBhIHRpdGxlIHRvb2x0aXAuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFBhaW50IGZvciBlYWNoIHNlZ21lbnQsIGJ5IGluZGV4LiBGYWxscyBiYWNrIHRvIHRoZSBjaGFydCBwYWxldHRlIC0tY2hhcnQtMSB0aHJvdWdoIC0tY2hhcnQtNS4gQGRlZmF1bHQgW10gKi9cbiAgQElucHV0KCkgY29sb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogUG9zaXRpb24gb2YgdGhlIHBvaW50ZXIsIDAtMTAwIG9uIHRoZSBzYW1lIHNjYWxlIHRoZSBzZWdtZW50cyBzdW0gdG8uIE9taXQgdG8gZHJhdyBubyBwb2ludGVyLiBAZGVmYXVsdCBudWxsICovXG4gIEBJbnB1dCgpIG1hcmtlclZhbHVlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFjY2Vzc2libGUgbmFtZSwgcHJlZml4ZWQgb250byB0aGUgc3Itb25seSBzdW1tYXJ5IG9mIHNlZ21lbnRzIGFuZCBtYXJrZXIuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICcnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgYmFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHByaXZhdGUgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLnJlZHVjZSgoc3VtLCB2KSA9PiAoTnVtYmVyLmlzRmluaXRlKHYpICYmIHYgPiAwID8gc3VtICsgdiA6IHN1bSksIDApO1xuICB9XG5cbiAgZ2V0IHNlZ21lbnRzKCk6IENhdGVnb3J5QmFyU2VnbWVudFtdIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWw7XG4gICAgaWYgKHRvdGFsIDw9IDApIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0aGlzLnZhbHVlc1xuICAgICAgLm1hcCgodmFsdWUsIGkpID0+ICh7IHZhbHVlLCBpIH0pKVxuICAgICAgLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMClcbiAgICAgIC5tYXAoKHsgdmFsdWUsIGkgfSkgPT4gKHtcbiAgICAgICAgbGFiZWw6IHRoaXMubGFiZWxzW2ldID8/ICcnLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcGVyY2VudDogKHZhbHVlIC8gdG90YWwpICogMTAwLFxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvcnNbaV0gfHwgJ3JnYih2YXIoLS1jaGFydC0nICsgKChpICUgNSkgKyAxKSArICcpKScsXG4gICAgICB9KSk7XG4gIH1cblxuICBnZXQgY2xhbXBlZE1hcmtlcigpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGhpcy5tYXJrZXJWYWx1ZSA9PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUodGhpcy5tYXJrZXJWYWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIHRoaXMubWFya2VyVmFsdWUpKTtcbiAgfVxuXG4gIGdldCBzdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnNlZ21lbnRzLm1hcCgocykgPT4gKHMubGFiZWwgPyBzLmxhYmVsICsgJzogJyA6ICcnKSArIHMucGVyY2VudC50b0ZpeGVkKDApICsgJyUnKTtcbiAgICBjb25zdCBtYXJrZXIgPSB0aGlzLmNsYW1wZWRNYXJrZXIgIT09IG51bGwgPyAnLCBjdXJyZW50IHBvc2l0aW9uICcgKyB0aGlzLmNsYW1wZWRNYXJrZXIudG9GaXhlZCgwKSArICclJyA6ICcnO1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuYXJpYUxhYmVsID8gdGhpcy5hcmlhTGFiZWwgKyAnLiAnIDogJyc7XG4gICAgcmV0dXJuIHByZWZpeCArIHBhcnRzLmpvaW4oJywgJykgKyBtYXJrZXI7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oJ3ctZnVsbCcsIHRoaXMuY2xhc3MpO1xuICB9XG59XG4iXX0=