@tolle_/tolle-ui 18.2.23 → 18.2.25

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 (183) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +17 -5
  2. package/esm2022/lib/alert-dialog-dynamic.component.mjs +1 -1
  3. package/esm2022/lib/alert-dialog.component.mjs +48 -10
  4. package/esm2022/lib/alert-dialog.service.mjs +13 -2
  5. package/esm2022/lib/alert.component.mjs +5 -5
  6. package/esm2022/lib/avatar.component.mjs +30 -9
  7. package/esm2022/lib/badge.component.mjs +41 -15
  8. package/esm2022/lib/breadcrumb-link.component.mjs +5 -5
  9. package/esm2022/lib/button.component.mjs +14 -3
  10. package/esm2022/lib/calendar.component.mjs +99 -17
  11. package/esm2022/lib/card.component.mjs +29 -9
  12. package/esm2022/lib/carousel/carousel.component.mjs +19 -3
  13. package/esm2022/lib/checkbox.component.mjs +44 -21
  14. package/esm2022/lib/collapsible.component.mjs +12 -4
  15. package/esm2022/lib/country-selector.component.mjs +140 -20
  16. package/esm2022/lib/data-table.component.mjs +27 -16
  17. package/esm2022/lib/date-picker.component.mjs +60 -25
  18. package/esm2022/lib/date-range-picker.component.mjs +64 -26
  19. package/esm2022/lib/dropdown-item.component.mjs +19 -5
  20. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  21. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  22. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  23. package/esm2022/lib/dropdown-trigger.directive.mjs +7 -3
  24. package/esm2022/lib/empty-state.component.mjs +3 -3
  25. package/esm2022/lib/hover-card.component.mjs +4 -2
  26. package/esm2022/lib/input.component.mjs +7 -5
  27. package/esm2022/lib/label.component.mjs +2 -2
  28. package/esm2022/lib/masked-input.component.mjs +3 -3
  29. package/esm2022/lib/modal.component.mjs +58 -22
  30. package/esm2022/lib/modal.service.mjs +13 -1
  31. package/esm2022/lib/multi-select.component.mjs +228 -20
  32. package/esm2022/lib/otp.component.mjs +6 -3
  33. package/esm2022/lib/pagination.component.mjs +19 -9
  34. package/esm2022/lib/progress.component.mjs +8 -5
  35. package/esm2022/lib/radio-group.component.mjs +51 -3
  36. package/esm2022/lib/radio-item.component.mjs +46 -8
  37. package/esm2022/lib/radio-service.mjs +60 -1
  38. package/esm2022/lib/range-calendar.component.mjs +317 -98
  39. package/esm2022/lib/resizable-panel.component.mjs +5 -4
  40. package/esm2022/lib/scroll-area.component.mjs +5 -5
  41. package/esm2022/lib/segment.component.mjs +73 -7
  42. package/esm2022/lib/select-item.component.mjs +20 -2
  43. package/esm2022/lib/select-separator.component.mjs +3 -3
  44. package/esm2022/lib/select.component.mjs +221 -14
  45. package/esm2022/lib/separator.component.mjs +12 -6
  46. package/esm2022/lib/sheet-ref.mjs +8 -1
  47. package/esm2022/lib/sheet-wrapper.component.mjs +27 -11
  48. package/esm2022/lib/sheet.component.mjs +57 -16
  49. package/esm2022/lib/sheet.service.mjs +5 -1
  50. package/esm2022/lib/sidebar.component.mjs +73 -15
  51. package/esm2022/lib/skeleton.component.mjs +19 -5
  52. package/esm2022/lib/switch.component.mjs +59 -53
  53. package/esm2022/lib/tabs.component.mjs +75 -13
  54. package/esm2022/lib/tag-input.component.mjs +6 -3
  55. package/esm2022/lib/textarea.component.mjs +9 -7
  56. package/esm2022/lib/theme.service.mjs +114 -138
  57. package/esm2022/lib/toaster.component.mjs +19 -9
  58. package/esm2022/lib/toggle-group.component.mjs +76 -4
  59. package/esm2022/lib/tolle-config.mjs +1 -1
  60. package/esm2022/lib/tooltip.directive.mjs +41 -17
  61. package/esm2022/lib/utils/color.mjs +324 -0
  62. package/esm2022/public-api.mjs +2 -1
  63. package/fesm2022/tolle-ui.mjs +2715 -682
  64. package/fesm2022/tolle-ui.mjs.map +1 -1
  65. package/lib/alert-dialog.component.d.ts +10 -1
  66. package/lib/avatar.component.d.ts +16 -3
  67. package/lib/badge.component.d.ts +17 -5
  68. package/lib/button.component.d.ts +8 -1
  69. package/lib/calendar.component.d.ts +21 -3
  70. package/lib/card.component.d.ts +6 -0
  71. package/lib/carousel/carousel.component.d.ts +1 -0
  72. package/lib/checkbox.component.d.ts +12 -4
  73. package/lib/country-selector.component.d.ts +11 -2
  74. package/lib/date-picker.component.d.ts +2 -1
  75. package/lib/date-range-picker.component.d.ts +5 -2
  76. package/lib/dropdown-item.component.d.ts +4 -2
  77. package/lib/dropdown-trigger.directive.d.ts +1 -1
  78. package/lib/modal.component.d.ts +6 -0
  79. package/lib/multi-select.component.d.ts +20 -0
  80. package/lib/otp.component.d.ts +1 -0
  81. package/lib/progress.component.d.ts +1 -0
  82. package/lib/radio-group.component.d.ts +8 -0
  83. package/lib/radio-item.component.d.ts +10 -4
  84. package/lib/radio-service.d.ts +29 -0
  85. package/lib/range-calendar.component.d.ts +33 -4
  86. package/lib/segment.component.d.ts +13 -0
  87. package/lib/select-item.component.d.ts +4 -1
  88. package/lib/select.component.d.ts +20 -0
  89. package/lib/separator.component.d.ts +2 -0
  90. package/lib/sheet-wrapper.component.d.ts +4 -0
  91. package/lib/sheet.component.d.ts +10 -1
  92. package/lib/sidebar.component.d.ts +2 -0
  93. package/lib/skeleton.component.d.ts +9 -3
  94. package/lib/switch.component.d.ts +13 -20
  95. package/lib/tabs.component.d.ts +11 -1
  96. package/lib/theme.service.d.ts +21 -6
  97. package/lib/toaster.component.d.ts +2 -2
  98. package/lib/toggle-group.component.d.ts +20 -2
  99. package/lib/tolle-config.d.ts +8 -0
  100. package/lib/tooltip.directive.d.ts +3 -0
  101. package/lib/utils/color.d.ts +87 -0
  102. package/package.json +4 -1
  103. package/preset.js +28 -0
  104. package/public-api.d.ts +1 -0
  105. package/registry/docs-content.json +4214 -0
  106. package/registry/llms-full.txt +1599 -0
  107. package/registry/llms.txt +83 -0
  108. package/registry/manifest.json +4925 -0
  109. package/registry/r/accordion-item.json +21 -0
  110. package/registry/r/accordion.json +23 -0
  111. package/registry/r/alert-dialog-dynamic.json +31 -0
  112. package/registry/r/alert-dialog.json +26 -0
  113. package/registry/r/alert.json +23 -0
  114. package/registry/r/aspect-ratio.json +21 -0
  115. package/registry/r/avatar-fallback.json +16 -0
  116. package/registry/r/avatar.json +23 -0
  117. package/registry/r/badge.json +23 -0
  118. package/registry/r/breadcrumb-item.json +16 -0
  119. package/registry/r/breadcrumb-link.json +16 -0
  120. package/registry/r/breadcrumb-separator.json +16 -0
  121. package/registry/r/breadcrumb.json +21 -0
  122. package/registry/r/button-group.json +21 -0
  123. package/registry/r/button.json +23 -0
  124. package/registry/r/calendar.json +23 -0
  125. package/registry/r/card.json +21 -0
  126. package/registry/r/carousel.json +18 -0
  127. package/registry/r/checkbox.json +23 -0
  128. package/registry/r/collapsible.json +21 -0
  129. package/registry/r/context-menu-trigger.json +23 -0
  130. package/registry/r/context-menu.json +28 -0
  131. package/registry/r/country-selector.json +31 -0
  132. package/registry/r/data-table.json +38 -0
  133. package/registry/r/date-picker.json +27 -0
  134. package/registry/r/date-range-picker.json +32 -0
  135. package/registry/r/dropdown-item.json +21 -0
  136. package/registry/r/dropdown-label.json +16 -0
  137. package/registry/r/dropdown-menu.json +16 -0
  138. package/registry/r/dropdown-separator.json +16 -0
  139. package/registry/r/dropdown-trigger.json +20 -0
  140. package/registry/r/empty-state.json +23 -0
  141. package/registry/r/hover-card.json +23 -0
  142. package/registry/r/input.json +21 -0
  143. package/registry/r/label.json +21 -0
  144. package/registry/r/masked-input.json +21 -0
  145. package/registry/r/modal.json +36 -0
  146. package/registry/r/multi-select.json +33 -0
  147. package/registry/r/otp-group.json +16 -0
  148. package/registry/r/otp-slot.json +21 -0
  149. package/registry/r/otp.json +21 -0
  150. package/registry/r/pagination.json +32 -0
  151. package/registry/r/phone-number-input.json +34 -0
  152. package/registry/r/popover-content.json +21 -0
  153. package/registry/r/popover.json +18 -0
  154. package/registry/r/progress.json +21 -0
  155. package/registry/r/radio-group.json +26 -0
  156. package/registry/r/radio-item.json +26 -0
  157. package/registry/r/range-calendar.json +28 -0
  158. package/registry/r/resizable-panel-item.json +23 -0
  159. package/registry/r/resizable-panel.json +23 -0
  160. package/registry/r/resizable.json +21 -0
  161. package/registry/r/scroll-area.json +21 -0
  162. package/registry/r/segment.json +21 -0
  163. package/registry/r/select-group.json +21 -0
  164. package/registry/r/select-item.json +26 -0
  165. package/registry/r/select-separator.json +21 -0
  166. package/registry/r/select.json +31 -0
  167. package/registry/r/separator.json +21 -0
  168. package/registry/r/sheet-wrapper.json +31 -0
  169. package/registry/r/sheet.json +21 -0
  170. package/registry/r/sidebar.json +21 -0
  171. package/registry/r/skeleton.json +23 -0
  172. package/registry/r/slider.json +21 -0
  173. package/registry/r/switch.json +23 -0
  174. package/registry/r/tabs.json +23 -0
  175. package/registry/r/tag-input.json +25 -0
  176. package/registry/r/textarea.json +21 -0
  177. package/registry/r/toaster.json +26 -0
  178. package/registry/r/toggle-group.json +25 -0
  179. package/registry/r/toggle.json +23 -0
  180. package/registry/r/tolle-cell.json +16 -0
  181. package/registry/r/tooltip.json +23 -0
  182. package/registry/registry.json +1540 -0
  183. package/theme.css +60 -5
@@ -2,6 +2,7 @@ import { Injectable, Inject, PLATFORM_ID, Optional } from '@angular/core';
2
2
  import { DOCUMENT, isPlatformBrowser } from '@angular/common';
3
3
  import { TOLLE_CONFIG } from './tolle-config';
4
4
  import { BehaviorSubject } from 'rxjs';
5
+ import { hexToRgb, radiusScale, generateThemeCss, generateBaseCss, generateChartCss } from './utils/color';
5
6
  import * as i0 from "@angular/core";
6
7
  export class ThemeService {
7
8
  document;
@@ -11,6 +12,8 @@ export class ThemeService {
11
12
  _isDark = new BehaviorSubject(false);
12
13
  isDark$ = this._isDark.asObservable();
13
14
  styleId = 'tolle-dynamic-theme';
15
+ baseStyleId = 'tolle-base-theme';
16
+ chartStyleId = 'tolle-chart-theme';
14
17
  constructor(document, platformId, config, rendererFactory) {
15
18
  this.document = document;
16
19
  this.platformId = platformId;
@@ -55,10 +58,99 @@ export class ThemeService {
55
58
  else if (this.config?.radius) {
56
59
  this.setRadius(this.config.radius, false);
57
60
  }
61
+ // Apply Base (neutral) color (saved > config > theme.css default = zinc)
62
+ const savedBase = localStorage.getItem('tolle-base-color');
63
+ if (savedBase) {
64
+ this.setBaseColor(savedBase, false);
65
+ }
66
+ else if (this.config?.baseColor) {
67
+ this.setBaseColor(this.config.baseColor, false);
68
+ }
69
+ // Apply Chart color (saved > config)
70
+ const savedChart = localStorage.getItem('tolle-chart-color');
71
+ if (savedChart) {
72
+ this.setChartColor(savedChart, false);
73
+ }
74
+ else if (this.config?.chartColor) {
75
+ this.setChartColor(this.config.chartColor, false);
76
+ }
77
+ // Apply Typography (saved preference > config default > theme.css default)
78
+ for (const kind of ['sans', 'serif', 'mono']) {
79
+ const saved = localStorage.getItem(`tolle-font-${kind}`);
80
+ const fromConfig = this.config?.[`font${kind[0].toUpperCase()}${kind.slice(1)}`];
81
+ if (saved) {
82
+ this.setFont(kind, saved, false);
83
+ }
84
+ else if (fromConfig) {
85
+ this.setFont(kind, fromConfig, false);
86
+ }
87
+ }
58
88
  if (!savedTheme) {
59
89
  localStorage.setItem('tolle-theme', shouldBeDark ? 'dark' : 'light');
60
90
  }
61
91
  }
92
+ /** Set a typography stack (`--font-sans` / `--font-serif` / `--font-mono`). */
93
+ setFont(kind, stack, persist = true) {
94
+ if (!isPlatformBrowser(this.platformId))
95
+ return;
96
+ this.renderer.setStyle(this.document.documentElement, `--font-${kind}`, stack);
97
+ if (persist) {
98
+ localStorage.setItem(`tolle-font-${kind}`, stack);
99
+ }
100
+ }
101
+ /** Read the current stack for a font role from the live document. */
102
+ getFont(kind) {
103
+ if (!isPlatformBrowser(this.platformId))
104
+ return '';
105
+ return getComputedStyle(this.document.documentElement).getPropertyValue(`--font-${kind}`).trim();
106
+ }
107
+ /** Set light/dark explicitly (a directional companion to `toggleTheme`). */
108
+ setAppearance(mode, persist = true) {
109
+ mode === 'dark' ? this.enableDarkMode(persist) : this.disableDarkMode(persist);
110
+ }
111
+ /**
112
+ * Set the neutral base-color family (background/foreground/card/muted/border…).
113
+ * Accepts a family id: `zinc` | `slate` | `gray` | `neutral` | `stone`.
114
+ */
115
+ setBaseColor(baseId, persist = true) {
116
+ if (!isPlatformBrowser(this.platformId))
117
+ return;
118
+ this.injectStyleById(this.baseStyleId, generateBaseCss(baseId));
119
+ if (persist)
120
+ localStorage.setItem('tolle-base-color', baseId);
121
+ }
122
+ /** Set the chart palette from a base hex; derives `--chart-1…5`. */
123
+ setChartColor(hex, persist = true) {
124
+ if (!isPlatformBrowser(this.platformId))
125
+ return;
126
+ this.injectStyleById(this.chartStyleId, generateChartCss(hex));
127
+ if (persist)
128
+ localStorage.setItem('tolle-chart-color', hex);
129
+ }
130
+ /** Read the current base-color family id (persisted), or null. */
131
+ get baseColor() {
132
+ if (!isPlatformBrowser(this.platformId))
133
+ return null;
134
+ return localStorage.getItem('tolle-base-color');
135
+ }
136
+ /** Read the current chart base color (persisted), or null. */
137
+ get chartColor() {
138
+ if (!isPlatformBrowser(this.platformId))
139
+ return null;
140
+ return localStorage.getItem('tolle-chart-color');
141
+ }
142
+ /** Upsert a keyed <style> element in <head> with the given CSS text. */
143
+ injectStyleById(id, css) {
144
+ if (!isPlatformBrowser(this.platformId))
145
+ return;
146
+ const existing = this.document.getElementById(id);
147
+ if (existing)
148
+ existing.remove();
149
+ const el = this.document.createElement('style');
150
+ el.id = id;
151
+ el.textContent = css;
152
+ this.renderer.appendChild(this.document.head, el);
153
+ }
62
154
  setRadius(radius, persist = true) {
63
155
  if (!isPlatformBrowser(this.platformId))
64
156
  return;
@@ -72,22 +164,17 @@ export class ThemeService {
72
164
  }
73
165
  updateAllRadiusVariables(baseRadius) {
74
166
  const root = this.document.documentElement;
75
- // Parse the radius to extract numeric value and unit
76
- const radiusMatch = baseRadius.match(/^(\d*\.?\d+)([a-z]+|%)$/);
77
- if (!radiusMatch) {
167
+ const scale = radiusScale(baseRadius);
168
+ if (!scale) {
78
169
  console.warn(`Invalid radius format: ${baseRadius}. Using default values.`);
79
170
  return;
80
171
  }
81
- const numericValue = parseFloat(radiusMatch[1]);
82
- const unit = radiusMatch[2];
83
- // Set all radius variables according to your CSS classes
84
- this.renderer.setStyle(root, '--radius-sm', `${numericValue * 0.5}${unit}`);
85
- this.renderer.setStyle(root, '--radius-md', `${numericValue}${unit}`);
86
- this.renderer.setStyle(root, '--radius-lg', `${numericValue * 1.5}${unit}`);
87
- this.renderer.setStyle(root, '--radius-xl', `${numericValue * 2}${unit}`);
88
- this.renderer.setStyle(root, '--radius-2xl', `${numericValue * 3}${unit}`);
89
- this.renderer.setStyle(root, '--radius-3xl', `${numericValue * 4}${unit}`);
90
- this.renderer.setStyle(root, '--radius-full', '9999px');
172
+ // `--radius` itself is set by setRadius(); apply the derived scale here.
173
+ for (const [name, value] of Object.entries(scale)) {
174
+ if (name === '--radius')
175
+ continue;
176
+ this.renderer.setStyle(root, name, value);
177
+ }
91
178
  }
92
179
  updateRadiusInDynamicStyles(radius) {
93
180
  const existingStyle = this.document.getElementById(this.styleId);
@@ -127,125 +214,10 @@ export class ThemeService {
127
214
  }
128
215
  }
129
216
  generatePrimaryShades(baseColor) {
130
- const rgb = this.hexToRgb(baseColor);
131
- const rgbString = rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
132
- const ringLight = this.lightenColor(baseColor, 40);
133
- const ringLightRgb = this.hexToRgb(ringLight);
134
- const ringLightRgbString = ringLightRgb ? `${ringLightRgb.r} ${ringLightRgb.g} ${ringLightRgb.b}` : '96 165 250';
135
- const ringDark = this.lightenColor(baseColor, 20);
136
- const ringDarkRgb = this.hexToRgb(ringDark);
137
- const ringDarkRgbString = ringDarkRgb ? `${ringDarkRgb.r} ${ringDarkRgb.g} ${ringDarkRgb.b}` : '147 197 253';
138
- // Get current radius or default
217
+ // Radius is read from the DOM here; the token math lives in utils/color.
139
218
  const root = this.document.documentElement;
140
219
  const currentRadius = getComputedStyle(root).getPropertyValue('--radius').trim() || '0.5rem';
141
- // Calculate all derived radius values
142
- const radiusMatch = currentRadius.match(/^(\d*\.?\d+)([a-z]+|%)$/);
143
- let radiusVariables = '';
144
- if (radiusMatch) {
145
- const numericValue = parseFloat(radiusMatch[1]);
146
- const unit = radiusMatch[2];
147
- radiusVariables = `
148
- --radius: ${currentRadius};
149
- --radius-sm: ${numericValue * 0.5}${unit};
150
- --radius-md: ${numericValue}${unit};
151
- --radius-lg: ${numericValue * 1.5}${unit};
152
- --radius-xl: ${numericValue * 2}${unit};
153
- --radius-2xl: ${numericValue * 3}${unit};
154
- --radius-3xl: ${numericValue * 4}${unit};
155
- --radius-full: 9999px;
156
- `;
157
- }
158
- else {
159
- radiusVariables = `--radius: ${currentRadius};`;
160
- }
161
- const css = `
162
- :root {
163
- --primary: ${rgbString};
164
- --primary-foreground: ${this.getContrastColorRgb(baseColor)};
165
- ${radiusVariables}
166
- --primary-50: ${this.hexToRgbString(this.lightenColor(baseColor, 90))};
167
- --primary-100: ${this.hexToRgbString(this.lightenColor(baseColor, 80))};
168
- --primary-200: ${this.hexToRgbString(this.lightenColor(baseColor, 60))};
169
- --primary-300: ${this.hexToRgbString(this.lightenColor(baseColor, 40))};
170
- --primary-400: ${this.hexToRgbString(this.lightenColor(baseColor, 20))};
171
- --primary-500: ${rgbString};
172
- --primary-600: ${this.hexToRgbString(this.darkenColor(baseColor, 20))};
173
- --primary-700: ${this.hexToRgbString(this.darkenColor(baseColor, 40))};
174
- --primary-800: ${this.hexToRgbString(this.darkenColor(baseColor, 60))};
175
- --primary-900: ${this.hexToRgbString(this.darkenColor(baseColor, 80))};
176
- --ring: ${ringLightRgbString};
177
- }
178
-
179
- .dark {
180
- --primary: ${rgbString};
181
- --primary-foreground: ${this.getContrastColorRgb(baseColor)};
182
- ${radiusVariables}
183
- --primary-50: ${this.hexToRgbString(this.darkenColor(baseColor, 85))};
184
- --primary-100: ${this.hexToRgbString(this.darkenColor(baseColor, 75))};
185
- --primary-200: ${this.hexToRgbString(this.darkenColor(baseColor, 65))};
186
- --primary-300: ${this.hexToRgbString(this.darkenColor(baseColor, 55))};
187
- --primary-400: ${this.hexToRgbString(this.darkenColor(baseColor, 45))};
188
- --primary-500: ${rgbString};
189
- --primary-600: ${this.hexToRgbString(this.lightenColor(baseColor, 20))};
190
- --primary-700: ${this.hexToRgbString(this.lightenColor(baseColor, 35))};
191
- --primary-800: ${this.hexToRgbString(this.lightenColor(baseColor, 50))};
192
- --primary-900: ${this.hexToRgbString(this.lightenColor(baseColor, 65))};
193
- --ring: ${ringDarkRgbString};
194
- }
195
- `;
196
- this.injectDynamicStyles(css);
197
- }
198
- hexToRgb(hex) {
199
- const cleanedHex = hex.replace('#', '');
200
- let r = 0, g = 0, b = 0;
201
- if (cleanedHex.length === 3) {
202
- r = parseInt(cleanedHex[0] + cleanedHex[0], 16);
203
- g = parseInt(cleanedHex[1] + cleanedHex[1], 16);
204
- b = parseInt(cleanedHex[2] + cleanedHex[2], 16);
205
- return { r, g, b };
206
- }
207
- if (cleanedHex.length === 6) {
208
- r = parseInt(cleanedHex.substring(0, 2), 16);
209
- g = parseInt(cleanedHex.substring(2, 4), 16);
210
- b = parseInt(cleanedHex.substring(4, 6), 16);
211
- return { r, g, b };
212
- }
213
- return null;
214
- }
215
- hexToRgbString(hexColor) {
216
- const rgb = this.hexToRgb(hexColor);
217
- return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '37 99 235';
218
- }
219
- getContrastColorRgb(hexColor) {
220
- const contrast = this.getContrastColor(hexColor);
221
- const rgb = this.hexToRgb(contrast);
222
- return rgb ? `${rgb.r} ${rgb.g} ${rgb.b}` : '255 255 255';
223
- }
224
- lightenColor(color, percent) {
225
- const rgb = this.hexToRgb(color);
226
- if (!rgb)
227
- return color;
228
- const r = Math.min(255, Math.floor(rgb.r + (255 - rgb.r) * (percent / 100)));
229
- const g = Math.min(255, Math.floor(rgb.g + (255 - rgb.g) * (percent / 100)));
230
- const b = Math.min(255, Math.floor(rgb.b + (255 - rgb.b) * (percent / 100)));
231
- return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
232
- }
233
- darkenColor(color, percent) {
234
- const rgb = this.hexToRgb(color);
235
- if (!rgb)
236
- return color;
237
- const factor = 1 - (percent / 100);
238
- const r = Math.max(0, Math.floor(rgb.r * factor));
239
- const g = Math.max(0, Math.floor(rgb.g * factor));
240
- const b = Math.max(0, Math.floor(rgb.b * factor));
241
- return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
242
- }
243
- getContrastColor(hexColor) {
244
- const rgb = this.hexToRgb(hexColor);
245
- if (!rgb)
246
- return '#ffffff';
247
- const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
248
- return luminance > 0.5 ? '#000000' : '#ffffff';
220
+ this.injectDynamicStyles(generateThemeCss(baseColor, currentRadius));
249
221
  }
250
222
  injectDynamicStyles(css) {
251
223
  if (!isPlatformBrowser(this.platformId))
@@ -281,7 +253,7 @@ export class ThemeService {
281
253
  if (!isPlatformBrowser(this.platformId))
282
254
  return;
283
255
  this.generatePrimaryShades(color);
284
- const rgb = this.hexToRgb(color);
256
+ const rgb = hexToRgb(color);
285
257
  if (rgb) {
286
258
  this.renderer.setStyle(this.document.documentElement, '--primary', `${rgb.r} ${rgb.g} ${rgb.b}`);
287
259
  }
@@ -311,9 +283,11 @@ export class ThemeService {
311
283
  resetToConfigDefaults() {
312
284
  if (!isPlatformBrowser(this.platformId))
313
285
  return;
314
- localStorage.removeItem('tolle-theme');
315
- localStorage.removeItem('tolle-primary-color');
316
- localStorage.removeItem('tolle-radius');
286
+ ['tolle-theme', 'tolle-primary-color', 'tolle-radius', 'tolle-base-color', 'tolle-chart-color',
287
+ 'tolle-font-sans', 'tolle-font-serif', 'tolle-font-mono']
288
+ .forEach((k) => localStorage.removeItem(k));
289
+ this.document.getElementById(this.baseStyleId)?.remove();
290
+ this.document.getElementById(this.chartStyleId)?.remove();
317
291
  this.initializeTheme();
318
292
  }
319
293
  getUserPreferences() {
@@ -328,9 +302,11 @@ export class ThemeService {
328
302
  clearUserPreferences() {
329
303
  if (!isPlatformBrowser(this.platformId))
330
304
  return;
331
- localStorage.removeItem('tolle-theme');
332
- localStorage.removeItem('tolle-primary-color');
333
- localStorage.removeItem('tolle-radius');
305
+ ['tolle-theme', 'tolle-primary-color', 'tolle-radius', 'tolle-base-color', 'tolle-chart-color',
306
+ 'tolle-font-sans', 'tolle-font-serif', 'tolle-font-mono']
307
+ .forEach((k) => localStorage.removeItem(k));
308
+ this.document.getElementById(this.baseStyleId)?.remove();
309
+ this.document.getElementById(this.chartStyleId)?.remove();
334
310
  const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
335
311
  if (systemPrefersDark) {
336
312
  this.enableDarkMode(false);
@@ -369,4 +345,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
369
345
  type: Inject,
370
346
  args: [TOLLE_CONFIG]
371
347
  }] }, { type: i0.RendererFactory2 }] });
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3ZDLE1BQU0sT0FBTyxZQUFZO0lBUUs7SUFDRztJQUNhO0lBVHBDLFFBQVEsQ0FBWTtJQUNwQixPQUFPLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFckMsT0FBTyxHQUFHLHFCQUFxQixDQUFDO0lBRXhDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFaEQsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxD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QUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0UsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVsRCxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFB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QVZ2QixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFTN0IsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPcHRpb25hbCwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRPTExFX0NPTkZJRywgVG9sbGVDb25maWcgfSBmcm9tICcuL3RvbGxlLWNvbmZpZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChUT0xMRV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBUb2xsZUNvbmZpZyxcbiAgICByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTJcbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgICB0aGlzLmluaXRpYWxpemVUaGVtZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGhlbWUoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAvLyBMT0dJQzogVXNlciBTYXZlZCBQcmVmZXJlbmNlcyA+IENvbmZpZyBEZWZhdWx0cyA+IFN5c3RlbSBQcmVmZXJlbmNlXG4gICAgY29uc3Qgc2F2ZWRUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGNvbnN0IHNhdmVkUHJpbWFyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgY29uc3Qgc2F2ZWRSYWRpdXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcmFkaXVzJyk7XG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG5cbiAgICAvLyBEZXRlcm1pbmUgRGFyay9MaWdodCBNb2RlXG4gICAgbGV0IHNob3VsZEJlRGFyayA9IHN5c3RlbVByZWZlcnNEYXJrO1xuXG4gICAgaWYgKHNhdmVkVGhlbWUpIHtcbiAgICAgIHNob3VsZEJlRGFyayA9IHNhdmVkVGhlbWUgPT09ICdkYXJrJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5kYXJrQnlEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNob3VsZEJlRGFyayA9IHRoaXMuY29uZmlnLmRhcmtCeURlZmF1bHQ7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlbWUgbW9kZVxuICAgIGlmIChzaG91bGRCZURhcmspIHtcbiAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgUHJpbWFyeSBDb2xvclxuICAgIGlmIChzYXZlZFByaW1hcnkpIHtcbiAgICAgIHRoaXMuc2V0UHJpbWFyeUNvbG9yKHNhdmVkUHJpbWFyeSwgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnByaW1hcnlDb2xvcikge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3IodGhpcy5jb25maWcucHJpbWFyeUNvbG9yLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgUmFkaXVzXG4gICAgaWYgKHNhdmVkUmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyhzYXZlZFJhZGl1cywgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LnJhZGl1cykge1xuICAgICAgdGhpcy5zZXRSYWRpdXModGhpcy5jb25maWcucmFkaXVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuICBzZXRSYWRpdXMocmFkaXVzOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMnLCByYWRpdXMpO1xuICAgIHRoaXMudXBkYXRlUmFkaXVzSW5EeW5hbWljU3R5bGVzKHJhZGl1cyk7XG4gICAgdGhpcy51cGRhdGVBbGxSYWRpdXNWYXJpYWJsZXMocmFkaXVzKTtcblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcmFkaXVzJywgcmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUFsbFJhZGl1c1ZhcmlhYmxlcyhiYXNlUmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGV4dHJhY3QgbnVtZXJpYyB2YWx1ZSBhbmQgdW5pdFxuICAgIGNvbnN0IHJhZGl1c01hdGNoID0gYmFzZVJhZGl1cy5tYXRjaCgvXihcXGQqXFwuP1xcZCspKFthLXpdK3wlKSQvKTtcbiAgICBpZiAoIXJhZGl1c01hdGNoKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgcmFkaXVzIGZvcm1hdDogJHtiYXNlUmFkaXVzfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZXMuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgY29uc3QgdW5pdCA9IHJhZGl1c01hdGNoWzJdO1xuXG4gICAgLy8gU2V0IGFsbCByYWRpdXMgdmFyaWFibGVzIGFjY29yZGluZyB0byB5b3VyIENTUyBjbGFzc2VzXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMtc20nLCBgJHtudW1lcmljVmFsdWUgKiAwLjV9JHt1bml0fWApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzLW1kJywgYCR7bnVtZXJpY1ZhbHVlfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy1sZycsIGAke251bWVyaWNWYWx1ZSAqIDEuNX0ke3VuaXR9YCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCAnLS1yYWRpdXMteGwnLCBgJHtudW1lcmljVmFsdWUgKiAyfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy0yeGwnLCBgJHtudW1lcmljVmFsdWUgKiAzfSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy0zeGwnLCBgJHtudW1lcmljVmFsdWUgKiA0fSR7dW5pdH1gKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvb3QsICctLXJhZGl1cy1mdWxsJywgJzk5OTlweCcpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGNhbGN1bGF0ZSBkZXJpdmVkIHZhbHVlc1xuICAgICAgY29uc3QgcmFkaXVzTWF0Y2ggPSByYWRpdXMubWF0Y2goL14oXFxkKlxcLj9cXGQrKShbYS16XSt8JSkkLyk7XG4gICAgICBpZiAocmFkaXVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSByYWRpdXNNYXRjaFsyXTtcblxuICAgICAgICBjb25zdCBkZXJpdmVkUmFkaWkgPSB7XG4gICAgICAgICAgJy0tcmFkaXVzLXNtJzogYCR7bnVtZXJpY1ZhbHVlICogMC41fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1tZCc6IGAke251bWVyaWNWYWx1ZX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtbGcnOiBgJHtudW1lcmljVmFsdWUgKiAxLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLXhsJzogYCR7bnVtZXJpY1ZhbHVlICogMn0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtMnhsJzogYCR7bnVtZXJpY1ZhbHVlICogM30ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtM3hsJzogYCR7bnVtZXJpY1ZhbHVlICogNH0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtZnVsbCc6ICc5OTk5cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIGJhc2UgcmFkaXVzXG4gICAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFyaWFibGVzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlcml2ZWRSYWRpaSkuZm9yRWFjaCgoW3Zhck5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChjc3MuaW5jbHVkZXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHt2YXJOYW1lfTpbXjtdKztgLCAnZycpO1xuICAgICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmVnZXgsIGAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB2YXJpYWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgJHt2YXJOYW1lfTogJHt2YWx1ZX07YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoYmFzZUNvbG9yKTtcbiAgICBjb25zdCByZ2JTdHJpbmcgPSByZ2IgPyBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gIDogJzM3IDk5IDIzNSc7XG5cbiAgICBjb25zdCByaW5nTGlnaHQgPSB0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDQwKTtcbiAgICBjb25zdCByaW5nTGlnaHRSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdMaWdodCk7XG4gICAgY29uc3QgcmluZ0xpZ2h0UmdiU3RyaW5nID0gcmluZ0xpZ2h0UmdiID8gYCR7cmluZ0xpZ2h0UmdiLnJ9ICR7cmluZ0xpZ2h0UmdiLmd9ICR7cmluZ0xpZ2h0UmdiLmJ9YCA6ICc5NiAxNjUgMjUwJztcblxuICAgIGNvbnN0IHJpbmdEYXJrID0gdGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCk7XG4gICAgY29uc3QgcmluZ0RhcmtSZ2IgPSB0aGlzLmhleFRvUmdiKHJpbmdEYXJrKTtcbiAgICBjb25zdCByaW5nRGFya1JnYlN0cmluZyA9IHJpbmdEYXJrUmdiID8gYCR7cmluZ0RhcmtSZ2Iucn0gJHtyaW5nRGFya1JnYi5nfSAke3JpbmdEYXJrUmdiLmJ9YCA6ICcxNDcgMTk3IDI1Myc7XG5cbiAgICAvLyBHZXQgY3VycmVudCByYWRpdXMgb3IgZGVmYXVsdFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50UmFkaXVzID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJhZGl1cycpLnRyaW0oKSB8fCAnMC41cmVtJztcblxuICAgIC8vIENhbGN1bGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFsdWVzXG4gICAgY29uc3QgcmFkaXVzTWF0Y2ggPSBjdXJyZW50UmFkaXVzLm1hdGNoKC9eKFxcZCpcXC4/XFxkKykoW2Etel0rfCUpJC8pO1xuICAgIGxldCByYWRpdXNWYXJpYWJsZXMgPSAnJztcblxuICAgIGlmIChyYWRpdXNNYXRjaCkge1xuICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICBjb25zdCB1bml0ID0gcmFkaXVzTWF0Y2hbMl07XG5cbiAgICAgIHJhZGl1c1ZhcmlhYmxlcyA9IGBcbiAgICAgICAgLS1yYWRpdXM6ICR7Y3VycmVudFJhZGl1c307XG4gICAgICAgIC0tcmFkaXVzLXNtOiAke251bWVyaWNWYWx1ZSAqIDAuNX0ke3VuaXR9O1xuICAgICAgICAtLXJhZGl1cy1tZDogJHtudW1lcmljVmFsdWV9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtbGc6ICR7bnVtZXJpY1ZhbHVlICogMS41fSR7dW5pdH07XG4gICAgICAgIC0tcmFkaXVzLXhsOiAke251bWVyaWNWYWx1ZSAqIDJ9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtMnhsOiAke251bWVyaWNWYWx1ZSAqIDN9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtM3hsOiAke251bWVyaWNWYWx1ZSAqIDR9JHt1bml0fTtcbiAgICAgICAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFkaXVzVmFyaWFibGVzID0gYC0tcmFkaXVzOiAke2N1cnJlbnRSYWRpdXN9O2A7XG4gICAgfVxuXG4gICAgY29uc3QgY3NzID0gYFxuICAgICAgOnJvb3Qge1xuICAgICAgICAtLXByaW1hcnk6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LWZvcmVncm91bmQ6ICR7dGhpcy5nZXRDb250cmFzdENvbG9yUmdiKGJhc2VDb2xvcil9O1xuICAgICAgICAke3JhZGl1c1ZhcmlhYmxlc31cbiAgICAgICAgLS1wcmltYXJ5LTUwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA5MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgODApKX07XG4gICAgICAgIC0tcHJpbWFyeS0yMDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDYwKSl9O1xuICAgICAgICAtLXByaW1hcnktMzAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMjApKX07XG4gICAgICAgIC0tcHJpbWFyeS01MDA6ICR7cmdiU3RyaW5nfTtcbiAgICAgICAgLS1wcmltYXJ5LTYwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTgwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2MCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTkwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4MCkpfTtcbiAgICAgICAgLS1yaW5nOiAke3JpbmdMaWdodFJnYlN0cmluZ307XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIHtcbiAgICAgICAgLS1wcmltYXJ5OiAke3JnYlN0cmluZ307XG4gICAgICAgIC0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAke3RoaXMuZ2V0Q29udHJhc3RDb2xvclJnYihiYXNlQ29sb3IpfTtcbiAgICAgICAgJHtyYWRpdXNWYXJpYWJsZXN9XG4gICAgICAgIC0tcHJpbWFyeS01MDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA4NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTEwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA3NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTIwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTMwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA1NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTQwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMuZGFya2VuQ29sb3IoYmFzZUNvbG9yLCA0NSkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTUwMDogJHtyZ2JTdHJpbmd9O1xuICAgICAgICAtLXByaW1hcnktNjAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCAyMCkpfTtcbiAgICAgICAgLS1wcmltYXJ5LTcwMDogJHt0aGlzLmhleFRvUmdiU3RyaW5nKHRoaXMubGlnaHRlbkNvbG9yKGJhc2VDb2xvciwgMzUpKX07XG4gICAgICAgIC0tcHJpbWFyeS04MDA6ICR7dGhpcy5oZXhUb1JnYlN0cmluZyh0aGlzLmxpZ2h0ZW5Db2xvcihiYXNlQ29sb3IsIDUwKSl9O1xuICAgICAgICAtLXByaW1hcnktOTAwOiAke3RoaXMuaGV4VG9SZ2JTdHJpbmcodGhpcy5saWdodGVuQ29sb3IoYmFzZUNvbG9yLCA2NSkpfTtcbiAgICAgICAgLS1yaW5nOiAke3JpbmdEYXJrUmdiU3RyaW5nfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGNzcyk7XG4gIH1cblxuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKTogeyByOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBjbGVhbmVkSGV4ID0gaGV4LnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgbGV0IHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDMpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4WzBdICsgY2xlYW5lZEhleFswXSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXhbMV0gKyBjbGVhbmVkSGV4WzFdLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleFsyXSArIGNsZWFuZWRIZXhbMl0sIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICBpZiAoY2xlYW5lZEhleC5sZW5ndGggPT09IDYpIHtcbiAgICAgIHIgPSBwYXJzZUludChjbGVhbmVkSGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICAgICAgZyA9IHBhcnNlSW50KGNsZWFuZWRIZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gICAgICBiID0gcGFyc2VJbnQoY2xlYW5lZEhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcbiAgICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGV4VG9SZ2JTdHJpbmcoaGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihoZXhDb2xvcik7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMzcgOTkgMjM1JztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvclJnYihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cmFzdCA9IHRoaXMuZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcik7XG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb250cmFzdCk7XG4gICAgcmV0dXJuIHJnYiA/IGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWAgOiAnMjU1IDI1NSAyNTUnO1xuICB9XG5cbiAgcHJpdmF0ZSBsaWdodGVuQ29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuIGNvbG9yO1xuXG4gICAgY29uc3QgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyZ2IuciArICgyNTUgLSByZ2IucikgKiAocGVyY2VudCAvIDEwMCkpKTtcbiAgICBjb25zdCBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHJnYi5nICsgKDI1NSAtIHJnYi5nKSAqIChwZXJjZW50IC8gMTAwKSkpO1xuICAgIGNvbnN0IGIgPSBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IocmdiLmIgKyAoMjU1IC0gcmdiLmIpICogKHBlcmNlbnQgLyAxMDApKSk7XG5cbiAgICByZXR1cm4gYCMkeygoMSA8PCAyNCkgKyAociA8PCAxNikgKyAoZyA8PCA4KSArIGIpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXJrZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xuICAgIGlmICghcmdiKSByZXR1cm4gY29sb3I7XG5cbiAgICBjb25zdCBmYWN0b3IgPSAxIC0gKHBlcmNlbnQgLyAxMDApO1xuICAgIGNvbnN0IHIgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJnYi5yICogZmFjdG9yKSk7XG4gICAgY29uc3QgZyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmdiLmcgKiBmYWN0b3IpKTtcbiAgICBjb25zdCBiID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihyZ2IuYiAqIGZhY3RvcikpO1xuXG4gICAgcmV0dXJuIGAjJHtyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7Zy50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2IudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJhc3RDb2xvcihoZXhDb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGhleENvbG9yKTtcbiAgICBpZiAoIXJnYikgcmV0dXJuICcjZmZmZmZmJztcblxuICAgIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHJnYi5yICsgMC41ODcgKiByZ2IuZyArIDAuMTE0ICogcmdiLmIpIC8gMjU1O1xuICAgIHJldHVybiBsdW1pbmFuY2UgPiAwLjUgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRGFyay5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcbiAgICBpZiAocmdiKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgJy0tcHJpbWFyeScsXG4gICAgICAgIGAke3JnYi5yfSAke3JnYi5nfSAke3JnYi5ifWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJywgY29sb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50VGhlbWUoKTogJ2RhcmsnIHwgJ2xpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGFyay5nZXRWYWx1ZSgpID8gJ2RhcmsnIDogJ2xpZ2h0JztcbiAgfVxuXG4gIGdldCBpc0RhcmsoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGFyay5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0IHByaW1hcnlDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGNzc1ZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXByaW1hcnknKS50cmltKCk7XG5cbiAgICBpZiAoY3NzVmFsdWUgJiYgY3NzVmFsdWUgIT09ICcnKSB7XG4gICAgICBjb25zdCByZ2JQYXJ0cyA9IGNzc1ZhbHVlLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gICAgICBpZiAocmdiUGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBgIyR7cmdiUGFydHNbMF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1sxXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke3JnYlBhcnRzWzJdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gIH1cblxuICByZXNldFRvQ29uZmlnRGVmYXVsdHMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtdGhlbWUnKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1yYWRpdXMnKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBnZXRVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyksXG4gICAgICBwcmltYXJ5Q29sb3I6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyksXG4gICAgICByYWRpdXM6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKVxuICAgIH07XG4gIH1cblxuICBjbGVhclVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS10aGVtZScpO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b2xsZS1wcmltYXJ5LWNvbG9yJyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RvbGxlLXJhZGl1cycpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczRyxNQUFNLE9BQU8sWUFBWTtJQVVLO0lBQ0c7SUFDYTtJQVhwQyxRQUFRLENBQVk7SUFDcEIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXJDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztJQUNoQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0lBRTNDLFlBQzRCLFFBQWtCLEVBQ2YsVUFBa0IsRUFDTCxNQUFtQixFQUM3RCxlQUFpQztRQUhQLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ0wsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUc3RCxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FB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Q0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1QywyQ0FBMkM7UUFDM0MsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUM7YUFDMUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVMLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQzt3R0F2V1UsWUFBWSxrQkFVYixRQUFRLGFBQ1IsV0FBVyxhQUNDLFlBQVk7NEdBWnZCLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVc3QixNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVE9MTEVfQ09ORklHLCBUb2xsZUNvbmZpZyB9IGZyb20gJy4vdG9sbGUtY29uZmlnJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaGV4VG9SZ2IsIHJhZGl1c1NjYWxlLCBnZW5lcmF0ZVRoZW1lQ3NzLCBnZW5lcmF0ZUJhc2VDc3MsIGdlbmVyYXRlQ2hhcnRDc3MgfSBmcm9tICcuL3V0aWxzL2NvbG9yJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgX2lzRGFyayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgaXNEYXJrJCA9IHRoaXMuX2lzRGFyay5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHN0eWxlSWQgPSAndG9sbGUtZHluYW1pYy10aGVtZSc7XG4gIHByaXZhdGUgYmFzZVN0eWxlSWQgPSAndG9sbGUtYmFzZS10aGVtZSc7XG4gIHByaXZhdGUgY2hhcnRTdHlsZUlkID0gJ3RvbGxlLWNoYXJ0LXRoZW1lJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRPTExFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRvbGxlQ29uZmlnLFxuICAgIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVRoZW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUaGVtZSgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIExPR0lDOiBVc2VyIFNhdmVkIFByZWZlcmVuY2VzID4gQ29uZmlnIERlZmF1bHRzID4gU3lzdGVtIFByZWZlcmVuY2VcbiAgICBjb25zdCBzYXZlZFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXRoZW1lJyk7XG4gICAgY29uc3Qgc2F2ZWRQcmltYXJ5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKTtcbiAgICBjb25zdCBzYXZlZFJhZGl1cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2xsZS1yYWRpdXMnKTtcbiAgICBjb25zdCBzeXN0ZW1QcmVmZXJzRGFyayA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcblxuICAgIC8vIERldGVybWluZSBEYXJrL0xpZ2h0IE1vZGVcbiAgICBsZXQgc2hvdWxkQmVEYXJrID0gc3lzdGVtUHJlZmVyc0Rhcms7XG5cbiAgICBpZiAoc2F2ZWRUaGVtZSkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gc2F2ZWRUaGVtZSA9PT0gJ2RhcmsnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWc/LmRhcmtCeURlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2hvdWxkQmVEYXJrID0gdGhpcy5jb25maWcuZGFya0J5RGVmYXVsdDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGVtZSBtb2RlXG4gICAgaWYgKHNob3VsZEJlRGFyaykge1xuICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBQcmltYXJ5IENvbG9yXG4gICAgaWYgKHNhdmVkUHJpbWFyeSkge1xuICAgICAgdGhpcy5zZXRQcmltYXJ5Q29sb3Ioc2F2ZWRQcmltYXJ5LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucHJpbWFyeUNvbG9yKSB7XG4gICAgICB0aGlzLnNldFByaW1hcnlDb2xvcih0aGlzLmNvbmZpZy5wcmltYXJ5Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBSYWRpdXNcbiAgICBpZiAoc2F2ZWRSYWRpdXMpIHtcbiAgICAgIHRoaXMuc2V0UmFkaXVzKHNhdmVkUmFkaXVzLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8ucmFkaXVzKSB7XG4gICAgICB0aGlzLnNldFJhZGl1cyh0aGlzLmNvbmZpZy5yYWRpdXMsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBCYXNlIChuZXV0cmFsKSBjb2xvciAoc2F2ZWQgPiBjb25maWcgPiB0aGVtZS5jc3MgZGVmYXVsdCA9IHppbmMpXG4gICAgY29uc3Qgc2F2ZWRCYXNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWJhc2UtY29sb3InKTtcbiAgICBpZiAoc2F2ZWRCYXNlKSB7XG4gICAgICB0aGlzLnNldEJhc2VDb2xvcihzYXZlZEJhc2UsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnPy5iYXNlQ29sb3IpIHtcbiAgICAgIHRoaXMuc2V0QmFzZUNvbG9yKHRoaXMuY29uZmlnLmJhc2VDb2xvciwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IENoYXJ0IGNvbG9yIChzYXZlZCA+IGNvbmZpZylcbiAgICBjb25zdCBzYXZlZENoYXJ0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gICAgaWYgKHNhdmVkQ2hhcnQpIHtcbiAgICAgIHRoaXMuc2V0Q2hhcnRDb2xvcihzYXZlZENoYXJ0LCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uY2hhcnRDb2xvcikge1xuICAgICAgdGhpcy5zZXRDaGFydENvbG9yKHRoaXMuY29uZmlnLmNoYXJ0Q29sb3IsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBUeXBvZ3JhcGh5IChzYXZlZCBwcmVmZXJlbmNlID4gY29uZmlnIGRlZmF1bHQgPiB0aGVtZS5jc3MgZGVmYXVsdClcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgWydzYW5zJywgJ3NlcmlmJywgJ21vbm8nXSBhcyBjb25zdCkge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgdG9sbGUtZm9udC0ke2tpbmR9YCk7XG4gICAgICBjb25zdCBmcm9tQ29uZmlnID0gdGhpcy5jb25maWc/LltgZm9udCR7a2luZFswXS50b1VwcGVyQ2FzZSgpfSR7a2luZC5zbGljZSgxKX1gIGFzICdmb250U2FucycgfCAnZm9udFNlcmlmJyB8ICdmb250TW9ubyddO1xuICAgICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBzYXZlZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmIChmcm9tQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuc2V0Rm9udChraW5kLCBmcm9tQ29uZmlnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzYXZlZFRoZW1lKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCBzaG91bGRCZURhcmsgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IGEgdHlwb2dyYXBoeSBzdGFjayAoYC0tZm9udC1zYW5zYCAvIGAtLWZvbnQtc2VyaWZgIC8gYC0tZm9udC1tb25vYCkuICovXG4gIHNldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJywgc3RhY2s6IHN0cmluZywgcGVyc2lzdCA9IHRydWUpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBgLS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGB0b2xsZS1mb250LSR7a2luZH1gLCBzdGFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgc3RhY2sgZm9yIGEgZm9udCByb2xlIGZyb20gdGhlIGxpdmUgZG9jdW1lbnQuICovXG4gIGdldEZvbnQoa2luZDogJ3NhbnMnIHwgJ3NlcmlmJyB8ICdtb25vJyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tZm9udC0ke2tpbmR9YCkudHJpbSgpO1xuICB9XG5cbiAgLyoqIFNldCBsaWdodC9kYXJrIGV4cGxpY2l0bHkgKGEgZGlyZWN0aW9uYWwgY29tcGFuaW9uIHRvIGB0b2dnbGVUaGVtZWApLiAqL1xuICBzZXRBcHBlYXJhbmNlKG1vZGU6ICdsaWdodCcgfCAnZGFyaycsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgbW9kZSA9PT0gJ2RhcmsnID8gdGhpcy5lbmFibGVEYXJrTW9kZShwZXJzaXN0KSA6IHRoaXMuZGlzYWJsZURhcmtNb2RlKHBlcnNpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmV1dHJhbCBiYXNlLWNvbG9yIGZhbWlseSAoYmFja2dyb3VuZC9mb3JlZ3JvdW5kL2NhcmQvbXV0ZWQvYm9yZGVy4oCmKS5cbiAgICogQWNjZXB0cyBhIGZhbWlseSBpZDogYHppbmNgIHwgYHNsYXRlYCB8IGBncmF5YCB8IGBuZXV0cmFsYCB8IGBzdG9uZWAuXG4gICAqL1xuICBzZXRCYXNlQ29sb3IoYmFzZUlkOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5iYXNlU3R5bGVJZCwgZ2VuZXJhdGVCYXNlQ3NzKGJhc2VJZCkpO1xuICAgIGlmIChwZXJzaXN0KSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicsIGJhc2VJZCk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjaGFydCBwYWxldHRlIGZyb20gYSBiYXNlIGhleDsgZGVyaXZlcyBgLS1jaGFydC0x4oCmNWAuICovXG4gIHNldENoYXJ0Q29sb3IoaGV4OiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdGhpcy5pbmplY3RTdHlsZUJ5SWQodGhpcy5jaGFydFN0eWxlSWQsIGdlbmVyYXRlQ2hhcnRDc3MoaGV4KSk7XG4gICAgaWYgKHBlcnNpc3QpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS1jaGFydC1jb2xvcicsIGhleCk7XG4gIH1cblxuICAvKiogUmVhZCB0aGUgY3VycmVudCBiYXNlLWNvbG9yIGZhbWlseSBpZCAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGJhc2VDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtYmFzZS1jb2xvcicpO1xuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgY2hhcnQgYmFzZSBjb2xvciAocGVyc2lzdGVkKSwgb3IgbnVsbC4gKi9cbiAgZ2V0IGNoYXJ0Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLWNoYXJ0LWNvbG9yJyk7XG4gIH1cblxuICAvKiogVXBzZXJ0IGEga2V5ZWQgPHN0eWxlPiBlbGVtZW50IGluIDxoZWFkPiB3aXRoIHRoZSBnaXZlbiBDU1MgdGV4dC4gKi9cbiAgcHJpdmF0ZSBpbmplY3RTdHlsZUJ5SWQoaWQ6IHN0cmluZywgY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucmVtb3ZlKCk7XG4gICAgY29uc3QgZWwgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgZWwuaWQgPSBpZDtcbiAgICBlbC50ZXh0Q29udGVudCA9IGNzcztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgZWwpO1xuICB9XG5cbiAgc2V0UmFkaXVzKHJhZGl1czogc3RyaW5nLCBwZXJzaXN0ID0gdHJ1ZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm9vdCwgJy0tcmFkaXVzJywgcmFkaXVzKTtcbiAgICB0aGlzLnVwZGF0ZVJhZGl1c0luRHluYW1pY1N0eWxlcyhyYWRpdXMpO1xuICAgIHRoaXMudXBkYXRlQWxsUmFkaXVzVmFyaWFibGVzKHJhZGl1cyk7XG5cbiAgICBpZiAocGVyc2lzdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RvbGxlLXJhZGl1cycsIHJhZGl1cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbGxSYWRpdXNWYXJpYWJsZXMoYmFzZVJhZGl1czogc3RyaW5nKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gcmFkaXVzU2NhbGUoYmFzZVJhZGl1cyk7XG4gICAgaWYgKCFzY2FsZSkge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHJhZGl1cyBmb3JtYXQ6ICR7YmFzZVJhZGl1c30uIFVzaW5nIGRlZmF1bHQgdmFsdWVzLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgLS1yYWRpdXNgIGl0c2VsZiBpcyBzZXQgYnkgc2V0UmFkaXVzKCk7IGFwcGx5IHRoZSBkZXJpdmVkIHNjYWxlIGhlcmUuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjYWxlKSkge1xuICAgICAgaWYgKG5hbWUgPT09ICctLXJhZGl1cycpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb290LCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSYWRpdXNJbkR5bmFtaWNTdHlsZXMocmFkaXVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGxldCBjc3MgPSBleGlzdGluZ1N0eWxlLnRleHRDb250ZW50IHx8ICcnO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcmFkaXVzIHRvIGNhbGN1bGF0ZSBkZXJpdmVkIHZhbHVlc1xuICAgICAgY29uc3QgcmFkaXVzTWF0Y2ggPSByYWRpdXMubWF0Y2goL14oXFxkKlxcLj9cXGQrKShbYS16XSt8JSkkLyk7XG4gICAgICBpZiAocmFkaXVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChyYWRpdXNNYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IHVuaXQgPSByYWRpdXNNYXRjaFsyXTtcblxuICAgICAgICBjb25zdCBkZXJpdmVkUmFkaWkgPSB7XG4gICAgICAgICAgJy0tcmFkaXVzLXNtJzogYCR7bnVtZXJpY1ZhbHVlICogMC41fSR7dW5pdH1gLFxuICAgICAgICAgICctLXJhZGl1cy1tZCc6IGAke251bWVyaWNWYWx1ZX0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtbGcnOiBgJHtudW1lcmljVmFsdWUgKiAxLjV9JHt1bml0fWAsXG4gICAgICAgICAgJy0tcmFkaXVzLXhsJzogYCR7bnVtZXJpY1ZhbHVlICogMn0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtMnhsJzogYCR7bnVtZXJpY1ZhbHVlICogM30ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtM3hsJzogYCR7bnVtZXJpY1ZhbHVlICogNH0ke3VuaXR9YCxcbiAgICAgICAgICAnLS1yYWRpdXMtZnVsbCc6ICc5OTk5cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIGJhc2UgcmFkaXVzXG4gICAgICAgIGlmIChjc3MuaW5jbHVkZXMoJy0tcmFkaXVzOicpKSB7XG4gICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UoLy0tcmFkaXVzOlteO10rOy9nLCBgLS1yYWRpdXM6ICR7cmFkaXVzfTtgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgZGVyaXZlZCByYWRpdXMgdmFyaWFibGVzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlcml2ZWRSYWRpaSkuZm9yRWFjaCgoW3Zhck5hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmIChjc3MuaW5jbHVkZXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHt2YXJOYW1lfTpbXjtdKztgLCAnZycpO1xuICAgICAgICAgICAgY3NzID0gY3NzLnJlcGxhY2UocmVnZXgsIGAke3Zhck5hbWV9OiAke3ZhbHVlfTtgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB2YXJpYWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBjc3MgPSBjc3MucmVwbGFjZSgvOnJvb3RcXHMqey8sIGA6cm9vdCB7XFxuICAgICAgJHt2YXJOYW1lfTogJHt2YWx1ZX07YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZXhpc3RpbmdTdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJpbWFyeVNoYWRlcyhiYXNlQ29sb3I6IHN0cmluZykge1xuICAgIC8vIFJhZGl1cyBpcyByZWFkIGZyb20gdGhlIERPTSBoZXJlOyB0aGUgdG9rZW4gbWF0aCBsaXZlcyBpbiB1dGlscy9jb2xvci5cbiAgICBjb25zdCByb290ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFJhZGl1cyA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1yYWRpdXMnKS50cmltKCkgfHwgJzAuNXJlbSc7XG4gICAgdGhpcy5pbmplY3REeW5hbWljU3R5bGVzKGdlbmVyYXRlVGhlbWVDc3MoYmFzZUNvbG9yLCBjdXJyZW50UmFkaXVzKSk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdER5bmFtaWNTdHlsZXMoY3NzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nU3R5bGUgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3R5bGVJZCk7XG4gICAgaWYgKGV4aXN0aW5nU3R5bGUpIHtcbiAgICAgIGV4aXN0aW5nU3R5bGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9IHRoaXMuc3R5bGVJZDtcbiAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICB0b2dnbGVUaGVtZSgpIHtcbiAgICBjb25zdCBpc0N1cnJlbnRseURhcmsgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKTtcbiAgICBpc0N1cnJlbnRseURhcmsgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVEYXJrTW9kZShzYXZlVG9TdG9yYWdlID0gdHJ1ZSkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdkYXJrJyk7XG4gICAgaWYgKHNhdmVUb1N0b3JhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2xsZS10aGVtZScsICdkYXJrJyk7XG4gICAgfVxuICAgIHRoaXMuX2lzRGFyay5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRGFya01vZGUoc2F2ZVRvU3RvcmFnZSA9IHRydWUpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGFyaycpO1xuICAgIGlmIChzYXZlVG9TdG9yYWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtdGhlbWUnLCAnbGlnaHQnKTtcbiAgICB9XG4gICAgdGhpcy5faXNEYXJrLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UHJpbWFyeUNvbG9yKGNvbG9yOiBzdHJpbmcsIHBlcnNpc3QgPSB0cnVlKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmdlbmVyYXRlUHJpbWFyeVNoYWRlcyhjb2xvcik7XG5cbiAgICBjb25zdCByZ2IgPSBoZXhUb1JnYihjb2xvcik7XG4gICAgaWYgKHJnYikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICctLXByaW1hcnknLFxuICAgICAgICBgJHtyZ2Iucn0gJHtyZ2IuZ30gJHtyZ2IuYn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicsIGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFRoZW1lKCk6ICdkYXJrJyB8ICdsaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKSA/ICdkYXJrJyA6ICdsaWdodCc7XG4gIH1cblxuICBnZXQgaXNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RhcmsuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCBwcmltYXJ5Q29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBjc3NWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1wcmltYXJ5JykudHJpbSgpO1xuXG4gICAgaWYgKGNzc1ZhbHVlICYmIGNzc1ZhbHVlICE9PSAnJykge1xuICAgICAgY29uc3QgcmdiUGFydHMgPSBjc3NWYWx1ZS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICAgICAgaWYgKHJnYlBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gYCMke3JnYlBhcnRzWzBdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7cmdiUGFydHNbMV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtyZ2JQYXJ0c1syXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtcHJpbWFyeS1jb2xvcicpO1xuICB9XG5cbiAgcmVzZXRUb0NvbmZpZ0RlZmF1bHRzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplVGhlbWUoKTtcbiAgfVxuXG4gIGdldFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9sbGUtdGhlbWUnKSxcbiAgICAgIHByaW1hcnlDb2xvcjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXByaW1hcnktY29sb3InKSxcbiAgICAgIHJhZGl1czogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvbGxlLXJhZGl1cycpXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyVXNlclByZWZlcmVuY2VzKCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuXG4gICAgWyd0b2xsZS10aGVtZScsICd0b2xsZS1wcmltYXJ5LWNvbG9yJywgJ3RvbGxlLXJhZGl1cycsICd0b2xsZS1iYXNlLWNvbG9yJywgJ3RvbGxlLWNoYXJ0LWNvbG9yJyxcbiAgICAgJ3RvbGxlLWZvbnQtc2FucycsICd0b2xsZS1mb250LXNlcmlmJywgJ3RvbGxlLWZvbnQtbW9ubyddXG4gICAgICAuZm9yRWFjaCgoaykgPT4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaykpO1xuXG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhc2VTdHlsZUlkKT8ucmVtb3ZlKCk7XG4gICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNoYXJ0U3R5bGVJZCk/LnJlbW92ZSgpO1xuXG4gICAgY29uc3Qgc3lzdGVtUHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgaWYgKHN5c3RlbVByZWZlcnNEYXJrKSB7XG4gICAgICB0aGlzLmVuYWJsZURhcmtNb2RlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlRGFya01vZGUoZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXByaW1hcnknKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsICctLXJhZGl1cycpO1xuXG4gICAgLy8gQWxzbyByZW1vdmUgYWxsIGRlcml2ZWQgcmFkaXVzIHZhcmlhYmxlc1xuICAgIFsnLS1yYWRpdXMtc20nLCAnLS1yYWRpdXMtbWQnLCAnLS1yYWRpdXMtbGcnLCAnLS1yYWRpdXMteGwnLCAnLS1yYWRpdXMtMnhsJywgJy0tcmFkaXVzLTN4bCcsICctLXJhZGl1cy1mdWxsJ11cbiAgICAgIC5mb3JFYWNoKHZhck5hbWUgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHJvb3QsIHZhck5hbWUpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ1N0eWxlID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN0eWxlSWQpO1xuICAgIGlmIChleGlzdGluZ1N0eWxlKSB7XG4gICAgICBleGlzdGluZ1N0eWxlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -10,16 +10,16 @@ export class ToastContainerComponent {
10
10
  position = 'bottom-right';
11
11
  toasts$ = this.toastService.toasts$;
12
12
  icons = {
13
- destructive: 'ri-error-warning-line text-destructive dark:text-red-400',
14
- success: 'ri-checkbox-circle-line text-emerald-600 dark:text-emerald-400',
13
+ destructive: 'ri-error-warning-line text-destructive',
14
+ success: 'ri-checkbox-circle-line text-success',
15
15
  default: 'ri-information-line text-primary'
16
16
  };
17
17
  getVariantClasses(variant = 'default') {
18
18
  switch (variant) {
19
19
  case 'destructive':
20
- return 'border-destructive/50 bg-destructive/5 dark:bg-red-950 text-destructive dark:text-red-400';
20
+ return 'border-destructive/50 bg-destructive/10 text-destructive';
21
21
  case 'success':
22
- return 'border-emerald-500/50 bg-emerald-50 dark:bg-emerald-950 text-emerald-700 dark:text-emerald-400';
22
+ return 'border-success/50 bg-success/10 text-success';
23
23
  default:
24
24
  return 'bg-background text-foreground border-border';
25
25
  }
@@ -27,9 +27,9 @@ export class ToastContainerComponent {
27
27
  getProgressClasses(variant = 'default') {
28
28
  switch (variant) {
29
29
  case 'destructive':
30
- return 'bg-destructive dark:bg-red-400';
30
+ return 'bg-destructive';
31
31
  case 'success':
32
- return 'bg-emerald-600 dark:bg-emerald-400';
32
+ return 'bg-success';
33
33
  default:
34
34
  return 'bg-primary';
35
35
  }
@@ -51,6 +51,9 @@ export class ToastContainerComponent {
51
51
  <div [class]="cn('fixed z-[100] flex flex-col gap-2 w-full max-w-[380px] p-4', positionClasses)">
52
52
  <div
53
53
  *ngFor="let toast of toasts$ | async"
54
+ role="status"
55
+ [attr.aria-live]="toast.variant === 'destructive' ? 'assertive' : 'polite'"
56
+ aria-atomic="true"
54
57
  (mouseenter)="toastService.setPaused(toast.id, true)"
55
58
  (mouseleave)="toastService.setPaused(toast.id, false)"
56
59
  [class]="cn(
@@ -67,11 +70,13 @@ export class ToastContainerComponent {
67
70
  </div>
68
71
  </div>
69
72
 
70
- <button (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
73
+ <button type="button" aria-label="Close" (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
74
+ <span class="sr-only">Close</span>
71
75
  <i class="ri-close-line text-lg"></i>
72
76
  </button>
73
77
 
74
78
  <div
79
+ aria-hidden="true"
75
80
  class="absolute bottom-0 left-0 h-1 transition-all duration-100 ease-linear"
76
81
  [style.width.%]="(toast.remainingTime / (toast.duration || 3000)) * 100"
77
82
  [class]="getProgressClasses(toast.variant)"
@@ -90,6 +95,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
90
95
  <div [class]="cn('fixed z-[100] flex flex-col gap-2 w-full max-w-[380px] p-4', positionClasses)">
91
96
  <div
92
97
  *ngFor="let toast of toasts$ | async"
98
+ role="status"
99
+ [attr.aria-live]="toast.variant === 'destructive' ? 'assertive' : 'polite'"
100
+ aria-atomic="true"
93
101
  (mouseenter)="toastService.setPaused(toast.id, true)"
94
102
  (mouseleave)="toastService.setPaused(toast.id, false)"
95
103
  [class]="cn(
@@ -106,11 +114,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
106
114
  </div>
107
115
  </div>
108
116
 
109
- <button (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
117
+ <button type="button" aria-label="Close" (click)="toastService.remove(toast.id)" class="opacity-50 hover:opacity-100 transition-opacity">
118
+ <span class="sr-only">Close</span>
110
119
  <i class="ri-close-line text-lg"></i>
111
120
  </button>
112
121
 
113
122
  <div
123
+ aria-hidden="true"
114
124
  class="absolute bottom-0 left-0 h-1 transition-all duration-100 ease-linear"
115
125
  [style.width.%]="(toast.remainingTime / (toast.duration || 3000)) * 100"
116
126
  [class]="getProgressClasses(toast.variant)"
@@ -122,4 +132,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
122
132
  }], propDecorators: { position: [{
123
133
  type: Input
124
134
  }] } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Rlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3RvYXN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBdUNoQyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0IsUUFBUSxHQUFrQixjQUFjLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBRXBDLEtBQUssR0FBRztRQUNOLFdBQVcsRUFBRSwwREFBMEQ7UUFDdkUsT0FBTyxFQUFFLGdFQUFnRTtRQUN6RSxPQUFPLEVBQUUsa0NBQWtDO0tBQzVDLENBQUM7SUFFRixpQkFBaUIsQ0FBQyxVQUFrQixTQUFTO1FBQzNDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLDJGQUEyRixDQUFDO1lBQ3JHLEtBQUssU0FBUztnQkFDWixPQUFPLGdHQUFnRyxDQUFDO1lBQzFHO2dCQUNFLE9BQU8sNkNBQTZDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUFrQixTQUFTO1FBQzVDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLGdDQUFnQyxDQUFDO1lBQzFDLEtBQUssU0FBUztnQkFDWixPQUFPLG9DQUFvQyxDQUFDO1lBQzlDO2dCQUNFLE9BQU8sWUFBWSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE1BQU0sR0FBRyxHQUFHO1lBQ1YsV0FBVyxFQUFFLGdDQUFnQztZQUM3QyxVQUFVLEVBQUUsK0JBQStCO1lBQzNDLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsYUFBYSxFQUFFLGlCQUFpQjtZQUNoQyxZQUFZLEVBQUUsa0RBQWtEO1lBQ2hFLGVBQWUsRUFBRSxvQ0FBb0M7U0FDdEQsQ0FBQztRQUNGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ1MsRUFBRSxHQUFHLEVBQUUsQ0FBQzt3R0E1Q1AsdUJBQXVCOzRGQUF2Qix1QkFBdUIsMkdBakN4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVCwyREFoQ1MsWUFBWTs7NEZBa0NYLHVCQUF1QjtrQkFyQ25DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVDtpQkFDRjs4QkFHVSxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcHJvamVjdHMvdG9sbGUvc3JjL2xpYi90b2FzdC1jb250YWluZXIuY29tcG9uZW50LnRzXG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0LCBUb2FzdFBvc2l0aW9uIH0gZnJvbSAnLi90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXRvYXN0ZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbignZml4ZWQgei1bMTAwXSBmbGV4IGZsZXgtY29sIGdhcC0yIHctZnVsbCBtYXgtdy1bMzgwcHhdIHAtNCcsIHBvc2l0aW9uQ2xhc3NlcylcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IHRvYXN0IG9mIHRvYXN0cyQgfCBhc3luY1wiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInRvYXN0U2VydmljZS5zZXRQYXVzZWQodG9hc3QuaWQsIHRydWUpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwidG9hc3RTZXJ2aWNlLnNldFBhdXNlZCh0b2FzdC5pZCwgZmFsc2UpXCJcbiAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICdyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gcC00IHJvdW5kZWQtbWQgYm9yZGVyIHNoYWRvdy1sZyBmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICAgIGdldFZhcmlhbnRDbGFzc2VzKHRvYXN0LnZhcmlhbnQpXG4gICAgICAgIClcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgIDxpICpuZ0lmPVwidG9hc3QudmFyaWFudCAmJiBpY29uc1t0b2FzdC52YXJpYW50XVwiIFtjbGFzc109XCJjbigndGV4dC1sZycsIGljb25zW3RvYXN0LnZhcmlhbnRdKVwiPjwvaT5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBnYXAtMVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRvYXN0LnRpdGxlXCIgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lXCI+e3sgdG9hc3QudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG9wYWNpdHktOTAgbGVhZGluZy1yZWxheGVkXCI+e3sgdG9hc3QuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9hc3RTZXJ2aWNlLnJlbW92ZSh0b2FzdC5pZClcIiBjbGFzcz1cIm9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5XCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJyaS1jbG9zZS1saW5lIHRleHQtbGdcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCBoLTEgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMTAwIGVhc2UtbGluZWFyXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCIodG9hc3QucmVtYWluaW5nVGltZSAvICh0b2FzdC5kdXJhdGlvbiB8fCAzMDAwKSkgKiAxMDBcIlxuICAgICAgICAgIFtjbGFzc109XCJnZXRQcm9ncmVzc0NsYXNzZXModG9hc3QudmFyaWFudClcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdENvbnRhaW5lckNvbXBvbmVudCB7XG4gIHRvYXN0U2VydmljZSA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBASW5wdXQoKSBwb3NpdGlvbjogVG9hc3RQb3NpdGlvbiA9ICdib3R0b20tcmlnaHQnO1xuICB0b2FzdHMkID0gdGhpcy50b2FzdFNlcnZpY2UudG9hc3RzJDtcblxuICBpY29ucyA9IHtcbiAgICBkZXN0cnVjdGl2ZTogJ3JpLWVycm9yLXdhcm5pbmctbGluZSB0ZXh0LWRlc3RydWN0aXZlIGRhcms6dGV4dC1yZWQtNDAwJyxcbiAgICBzdWNjZXNzOiAncmktY2hlY2tib3gtY2lyY2xlLWxpbmUgdGV4dC1lbWVyYWxkLTYwMCBkYXJrOnRleHQtZW1lcmFsZC00MDAnLFxuICAgIGRlZmF1bHQ6ICdyaS1pbmZvcm1hdGlvbi1saW5lIHRleHQtcHJpbWFyeSdcbiAgfTtcblxuICBnZXRWYXJpYW50Q2xhc3Nlcyh2YXJpYW50OiBzdHJpbmcgPSAnZGVmYXVsdCcpIHtcbiAgICBzd2l0Y2ggKHZhcmlhbnQpIHtcbiAgICAgIGNhc2UgJ2Rlc3RydWN0aXZlJzpcbiAgICAgICAgcmV0dXJuICdib3JkZXItZGVzdHJ1Y3RpdmUvNTAgYmctZGVzdHJ1Y3RpdmUvNSBkYXJrOmJnLXJlZC05NTAgdGV4dC1kZXN0cnVjdGl2ZSBkYXJrOnRleHQtcmVkLTQwMCc7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdib3JkZXItZW1lcmFsZC01MDAvNTAgYmctZW1lcmFsZC01MCBkYXJrOmJnLWVtZXJhbGQtOTUwIHRleHQtZW1lcmFsZC03MDAgZGFyazp0ZXh0LWVtZXJhbGQtNDAwJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnYmctYmFja2dyb3VuZCB0ZXh0LWZvcmVncm91bmQgYm9yZGVyLWJvcmRlcic7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvZ3Jlc3NDbGFzc2VzKHZhcmlhbnQ6IHN0cmluZyA9ICdkZWZhdWx0Jykge1xuICAgIHN3aXRjaCAodmFyaWFudCkge1xuICAgICAgY2FzZSAnZGVzdHJ1Y3RpdmUnOlxuICAgICAgICByZXR1cm4gJ2JnLWRlc3RydWN0aXZlIGRhcms6YmctcmVkLTQwMCc7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdiZy1lbWVyYWxkLTYwMCBkYXJrOmJnLWVtZXJhbGQtNDAwJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnYmctcHJpbWFyeSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBvc2l0aW9uQ2xhc3NlcygpIHtcbiAgICBjb25zdCBwb3MgPSB7XG4gICAgICAndG9wLXJpZ2h0JzogJ3RvcC0wIHJpZ2h0LTAgZmxleC1jb2wtcmV2ZXJzZScsXG4gICAgICAndG9wLWxlZnQnOiAndG9wLTAgbGVmdC0wIGZsZXgtY29sLXJldmVyc2UnLFxuICAgICAgJ2JvdHRvbS1yaWdodCc6ICdib3R0b20tMCByaWdodC0wJyxcbiAgICAgICdib3R0b20tbGVmdCc6ICdib3R0b20tMCBsZWZ0LTAnLFxuICAgICAgJ3RvcC1jZW50ZXInOiAndG9wLTAgbGVmdC0xLzIgLXRyYW5zbGF0ZS14LTEvMiBmbGV4LWNvbC1yZXZlcnNlJyxcbiAgICAgICdib3R0b20tY2VudGVyJzogJ2JvdHRvbS0wIGxlZnQtMS8yIC10cmFuc2xhdGUteC0xLzInXG4gICAgfTtcbiAgICByZXR1cm4gcG9zW3RoaXMucG9zaXRpb25dO1xuICB9XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Rlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL3RvYXN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBNENoQyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0IsUUFBUSxHQUFrQixjQUFjLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBRXBDLEtBQUssR0FBRztRQUNOLFdBQVcsRUFBRSx3Q0FBd0M7UUFDckQsT0FBTyxFQUFFLHNDQUFzQztRQUMvQyxPQUFPLEVBQUUsa0NBQWtDO0tBQzVDLENBQUM7SUFFRixpQkFBaUIsQ0FBQyxVQUFrQixTQUFTO1FBQzNDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLDBEQUEwRCxDQUFDO1lBQ3BFLEtBQUssU0FBUztnQkFDWixPQUFPLDhDQUE4QyxDQUFDO1lBQ3hEO2dCQUNFLE9BQU8sNkNBQTZDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUFrQixTQUFTO1FBQzVDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLGdCQUFnQixDQUFDO1lBQzFCLEtBQUssU0FBUztnQkFDWixPQUFPLFlBQVksQ0FBQztZQUN0QjtnQkFDRSxPQUFPLFlBQVksQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixNQUFNLEdBQUcsR0FBRztZQUNWLFdBQVcsRUFBRSxnQ0FBZ0M7WUFDN0MsVUFBVSxFQUFFLCtCQUErQjtZQUMzQyxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLGFBQWEsRUFBRSxpQkFBaUI7WUFDaEMsWUFBWSxFQUFFLGtEQUFrRDtZQUNoRSxlQUFlLEVBQUUsb0NBQW9DO1NBQ3RELENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNTLEVBQUUsR0FBRyxFQUFFLENBQUM7d0dBNUNQLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDJHQXRDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVCwyREFyQ1MsWUFBWTs7NEZBdUNYLHVCQUF1QjtrQkExQ25DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NUO2lCQUNGOzhCQUdVLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm9qZWN0cy90b2xsZS9zcmMvbGliL3RvYXN0LWNvbnRhaW5lci5jb21wb25lbnQudHNcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSwgVG9hc3QsIFRvYXN0UG9zaXRpb24gfSBmcm9tICcuL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtdG9hc3RlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNuKCdmaXhlZCB6LVsxMDBdIGZsZXggZmxleC1jb2wgZ2FwLTIgdy1mdWxsIG1heC13LVszODBweF0gcC00JywgcG9zaXRpb25DbGFzc2VzKVwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgdG9hc3Qgb2YgdG9hc3RzJCB8IGFzeW5jXCJcbiAgICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJ0b2FzdC52YXJpYW50ID09PSAnZGVzdHJ1Y3RpdmUnID8gJ2Fzc2VydGl2ZScgOiAncG9saXRlJ1wiXG4gICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInRvYXN0U2VydmljZS5zZXRQYXVzZWQodG9hc3QuaWQsIHRydWUpXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwidG9hc3RTZXJ2aWNlLnNldFBhdXNlZCh0b2FzdC5pZCwgZmFsc2UpXCJcbiAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICdyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gcC00IHJvdW5kZWQtbWQgYm9yZGVyIHNoYWRvdy1sZyBmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAnLFxuICAgICAgICAgIGdldFZhcmlhbnRDbGFzc2VzKHRvYXN0LnZhcmlhbnQpXG4gICAgICAgIClcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgIDxpICpuZ0lmPVwidG9hc3QudmFyaWFudCAmJiBpY29uc1t0b2FzdC52YXJpYW50XVwiIFtjbGFzc109XCJjbigndGV4dC1sZycsIGljb25zW3RvYXN0LnZhcmlhbnRdKVwiPjwvaT5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBnYXAtMVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRvYXN0LnRpdGxlXCIgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lXCI+e3sgdG9hc3QudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG9wYWNpdHktOTAgbGVhZGluZy1yZWxheGVkXCI+e3sgdG9hc3QuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cInRvYXN0U2VydmljZS5yZW1vdmUodG9hc3QuaWQpXCIgY2xhc3M9XCJvcGFjaXR5LTUwIGhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxuICAgICAgICAgIDxpIGNsYXNzPVwicmktY2xvc2UtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCBoLTEgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMTAwIGVhc2UtbGluZWFyXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCIodG9hc3QucmVtYWluaW5nVGltZSAvICh0b2FzdC5kdXJhdGlvbiB8fCAzMDAwKSkgKiAxMDBcIlxuICAgICAgICAgIFtjbGFzc109XCJnZXRQcm9ncmVzc0NsYXNzZXModG9hc3QudmFyaWFudClcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdENvbnRhaW5lckNvbXBvbmVudCB7XG4gIHRvYXN0U2VydmljZSA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICBASW5wdXQoKSBwb3NpdGlvbjogVG9hc3RQb3NpdGlvbiA9ICdib3R0b20tcmlnaHQnO1xuICB0b2FzdHMkID0gdGhpcy50b2FzdFNlcnZpY2UudG9hc3RzJDtcblxuICBpY29ucyA9IHtcbiAgICBkZXN0cnVjdGl2ZTogJ3JpLWVycm9yLXdhcm5pbmctbGluZSB0ZXh0LWRlc3RydWN0aXZlJyxcbiAgICBzdWNjZXNzOiAncmktY2hlY2tib3gtY2lyY2xlLWxpbmUgdGV4dC1zdWNjZXNzJyxcbiAgICBkZWZhdWx0OiAncmktaW5mb3JtYXRpb24tbGluZSB0ZXh0LXByaW1hcnknXG4gIH07XG5cbiAgZ2V0VmFyaWFudENsYXNzZXModmFyaWFudDogc3RyaW5nID0gJ2RlZmF1bHQnKSB7XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICBjYXNlICdkZXN0cnVjdGl2ZSc6XG4gICAgICAgIHJldHVybiAnYm9yZGVyLWRlc3RydWN0aXZlLzUwIGJnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnYm9yZGVyLXN1Y2Nlc3MvNTAgYmctc3VjY2Vzcy8xMCB0ZXh0LXN1Y2Nlc3MnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBib3JkZXItYm9yZGVyJztcbiAgICB9XG4gIH1cblxuICBnZXRQcm9ncmVzc0NsYXNzZXModmFyaWFudDogc3RyaW5nID0gJ2RlZmF1bHQnKSB7XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICBjYXNlICdkZXN0cnVjdGl2ZSc6XG4gICAgICAgIHJldHVybiAnYmctZGVzdHJ1Y3RpdmUnO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnYmctc3VjY2Vzcyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2JnLXByaW1hcnknO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwb3NpdGlvbkNsYXNzZXMoKSB7XG4gICAgY29uc3QgcG9zID0ge1xuICAgICAgJ3RvcC1yaWdodCc6ICd0b3AtMCByaWdodC0wIGZsZXgtY29sLXJldmVyc2UnLFxuICAgICAgJ3RvcC1sZWZ0JzogJ3RvcC0wIGxlZnQtMCBmbGV4LWNvbC1yZXZlcnNlJyxcbiAgICAgICdib3R0b20tcmlnaHQnOiAnYm90dG9tLTAgcmlnaHQtMCcsXG4gICAgICAnYm90dG9tLWxlZnQnOiAnYm90dG9tLTAgbGVmdC0wJyxcbiAgICAgICd0b3AtY2VudGVyJzogJ3RvcC0wIGxlZnQtMS8yIC10cmFuc2xhdGUteC0xLzIgZmxleC1jb2wtcmV2ZXJzZScsXG4gICAgICAnYm90dG9tLWNlbnRlcic6ICdib3R0b20tMCBsZWZ0LTEvMiAtdHJhbnNsYXRlLXgtMS8yJ1xuICAgIH07XG4gICAgcmV0dXJuIHBvc1t0aGlzLnBvc2l0aW9uXTtcbiAgfVxuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cbiJdfQ==