@tolle_/tolle-ui 18.2.29 → 18.2.30

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 (279) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
  4. package/esm2022/lib/alert-dialog.component.mjs +44 -59
  5. package/esm2022/lib/alert.component.mjs +5 -11
  6. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  7. package/esm2022/lib/attachment.component.mjs +334 -0
  8. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  9. package/esm2022/lib/avatar.component.mjs +4 -9
  10. package/esm2022/lib/badge.component.mjs +4 -9
  11. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  12. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  15. package/esm2022/lib/bubble.component.mjs +301 -0
  16. package/esm2022/lib/button.component.mjs +5 -11
  17. package/esm2022/lib/calendar.component.mjs +5 -11
  18. package/esm2022/lib/card.component.mjs +14 -43
  19. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  20. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  21. package/esm2022/lib/chart-pie.component.mjs +386 -0
  22. package/esm2022/lib/chart.component.mjs +1146 -0
  23. package/esm2022/lib/chart.service.mjs +555 -0
  24. package/esm2022/lib/checkbox.component.mjs +5 -11
  25. package/esm2022/lib/checkpoint.component.mjs +134 -0
  26. package/esm2022/lib/collapsible.component.mjs +4 -11
  27. package/esm2022/lib/combobox.component.mjs +372 -0
  28. package/esm2022/lib/command-dialog.component.mjs +164 -0
  29. package/esm2022/lib/command.component.mjs +514 -0
  30. package/esm2022/lib/command.service.mjs +130 -0
  31. package/esm2022/lib/confirmation.component.mjs +219 -0
  32. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  33. package/esm2022/lib/context-menu.component.mjs +460 -0
  34. package/esm2022/lib/context-menu.service.mjs +121 -0
  35. package/esm2022/lib/context.component.mjs +377 -0
  36. package/esm2022/lib/conversation.component.mjs +442 -0
  37. package/esm2022/lib/country-selector.component.mjs +5 -11
  38. package/esm2022/lib/data-table.component.mjs +59 -12
  39. package/esm2022/lib/date-picker.component.mjs +251 -198
  40. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  41. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  42. package/esm2022/lib/direction.component.mjs +79 -0
  43. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  44. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  48. package/esm2022/lib/empty-state.component.mjs +4 -9
  49. package/esm2022/lib/field.component.mjs +394 -0
  50. package/esm2022/lib/hover-card.component.mjs +6 -16
  51. package/esm2022/lib/inline-citation.component.mjs +263 -0
  52. package/esm2022/lib/input-group.component.mjs +418 -0
  53. package/esm2022/lib/input.component.mjs +5 -11
  54. package/esm2022/lib/item.component.mjs +243 -0
  55. package/esm2022/lib/kbd.component.mjs +82 -0
  56. package/esm2022/lib/label.component.mjs +4 -9
  57. package/esm2022/lib/marker.component.mjs +135 -0
  58. package/esm2022/lib/masked-input.component.mjs +5 -11
  59. package/esm2022/lib/menubar.component.mjs +683 -0
  60. package/esm2022/lib/message-scroller.component.mjs +353 -0
  61. package/esm2022/lib/message-scroller.service.mjs +157 -0
  62. package/esm2022/lib/message.component.mjs +228 -0
  63. package/esm2022/lib/model-selector.component.mjs +310 -0
  64. package/esm2022/lib/multi-select.component.mjs +155 -72
  65. package/esm2022/lib/native-select.component.mjs +201 -0
  66. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  67. package/esm2022/lib/otp-group.component.mjs +3 -3
  68. package/esm2022/lib/otp-slot.component.mjs +4 -9
  69. package/esm2022/lib/otp.component.mjs +5 -11
  70. package/esm2022/lib/pagination.component.mjs +7 -10
  71. package/esm2022/lib/plan.component.mjs +335 -0
  72. package/esm2022/lib/popover-content.component.mjs +4 -9
  73. package/esm2022/lib/popover.component.mjs +15 -13
  74. package/esm2022/lib/progress.component.mjs +4 -9
  75. package/esm2022/lib/prompt-input.component.mjs +526 -0
  76. package/esm2022/lib/queue.component.mjs +280 -0
  77. package/esm2022/lib/radio-group.component.mjs +6 -13
  78. package/esm2022/lib/radio-item.component.mjs +4 -9
  79. package/esm2022/lib/range-calendar.component.mjs +5 -11
  80. package/esm2022/lib/reasoning.component.mjs +335 -0
  81. package/esm2022/lib/resizable.component.mjs +219 -0
  82. package/esm2022/lib/segment.component.mjs +17 -7
  83. package/esm2022/lib/select-group.component.mjs +4 -8
  84. package/esm2022/lib/select-item.component.mjs +4 -9
  85. package/esm2022/lib/select-separator.component.mjs +4 -8
  86. package/esm2022/lib/select.component.mjs +133 -49
  87. package/esm2022/lib/separator.component.mjs +4 -9
  88. package/esm2022/lib/sheet.component.mjs +38 -56
  89. package/esm2022/lib/shimmer.component.mjs +84 -0
  90. package/esm2022/lib/sidebar.component.mjs +11 -1
  91. package/esm2022/lib/skeleton.component.mjs +4 -9
  92. package/esm2022/lib/sources.component.mjs +452 -0
  93. package/esm2022/lib/spinner.component.mjs +68 -0
  94. package/esm2022/lib/suggestion.component.mjs +207 -0
  95. package/esm2022/lib/switch.component.mjs +5 -11
  96. package/esm2022/lib/table.component.mjs +213 -0
  97. package/esm2022/lib/tabs.component.mjs +4 -11
  98. package/esm2022/lib/tag-input.component.mjs +5 -11
  99. package/esm2022/lib/task.component.mjs +359 -0
  100. package/esm2022/lib/textarea.component.mjs +5 -11
  101. package/esm2022/lib/theme.service.mjs +17 -6
  102. package/esm2022/lib/time-picker.component.mjs +923 -0
  103. package/esm2022/lib/toast.service.mjs +3 -2
  104. package/esm2022/lib/toaster.component.mjs +76 -39
  105. package/esm2022/lib/toggle-group.component.mjs +4 -9
  106. package/esm2022/lib/toggle.component.mjs +5 -11
  107. package/esm2022/lib/tool.component.mjs +462 -0
  108. package/esm2022/lib/typography.component.mjs +83 -0
  109. package/esm2022/lib/utils/color.mjs +140 -19
  110. package/esm2022/public-api.mjs +61 -1
  111. package/fesm2022/tolle-ui.mjs +16453 -1024
  112. package/fesm2022/tolle-ui.mjs.map +1 -1
  113. package/lib/alert-dialog.component.d.ts +10 -2
  114. package/lib/aspect-ratio.component.d.ts +20 -0
  115. package/lib/attachment.component.d.ts +101 -0
  116. package/lib/bubble.component.d.ts +112 -0
  117. package/lib/chain-of-thought.component.d.ts +166 -0
  118. package/lib/chart-pie.component.d.ts +108 -0
  119. package/lib/chart.component.d.ts +369 -0
  120. package/lib/chart.service.d.ts +222 -0
  121. package/lib/checkpoint.component.d.ts +51 -0
  122. package/lib/combobox.component.d.ts +90 -0
  123. package/lib/command-dialog.component.d.ts +53 -0
  124. package/lib/command.component.d.ts +189 -0
  125. package/lib/command.service.d.ts +67 -0
  126. package/lib/confirmation.component.d.ts +70 -0
  127. package/lib/context-menu-trigger.directive.d.ts +12 -0
  128. package/lib/context-menu.component.d.ts +41 -0
  129. package/lib/context-menu.service.d.ts +38 -0
  130. package/lib/context.component.d.ts +134 -0
  131. package/lib/conversation.component.d.ts +165 -0
  132. package/lib/data-table.component.d.ts +26 -1
  133. package/lib/date-picker.component.d.ts +72 -11
  134. package/lib/date-range-picker.component.d.ts +63 -6
  135. package/lib/date-time-picker.component.d.ts +119 -0
  136. package/lib/direction.component.d.ts +45 -0
  137. package/lib/field.component.d.ts +201 -0
  138. package/lib/inline-citation.component.d.ts +103 -0
  139. package/lib/input-group.component.d.ts +150 -0
  140. package/lib/item.component.d.ts +154 -0
  141. package/lib/kbd.component.d.ts +50 -0
  142. package/lib/marker.component.d.ts +58 -0
  143. package/lib/menubar.component.d.ts +247 -0
  144. package/lib/message-scroller.component.d.ts +159 -0
  145. package/lib/message-scroller.service.d.ts +73 -0
  146. package/lib/message.component.d.ts +128 -0
  147. package/lib/model-selector.component.d.ts +103 -0
  148. package/lib/multi-select.component.d.ts +66 -14
  149. package/lib/native-select.component.d.ts +57 -0
  150. package/lib/navigation-menu.component.d.ts +230 -0
  151. package/lib/plan.component.d.ts +120 -0
  152. package/lib/popover.component.d.ts +1 -0
  153. package/lib/prompt-input.component.d.ts +194 -0
  154. package/lib/queue.component.d.ts +106 -0
  155. package/lib/reasoning.component.d.ts +127 -0
  156. package/lib/resizable.component.d.ts +43 -0
  157. package/lib/segment.component.d.ts +13 -3
  158. package/lib/select.component.d.ts +37 -5
  159. package/lib/sheet.component.d.ts +3 -0
  160. package/lib/shimmer.component.d.ts +38 -0
  161. package/lib/sidebar.component.d.ts +2 -0
  162. package/lib/sources.component.d.ts +156 -0
  163. package/lib/spinner.component.d.ts +29 -0
  164. package/lib/suggestion.component.d.ts +96 -0
  165. package/lib/table.component.d.ts +106 -0
  166. package/lib/task.component.d.ts +151 -0
  167. package/lib/theme.service.d.ts +9 -0
  168. package/lib/time-picker.component.d.ts +243 -0
  169. package/lib/toast.service.d.ts +3 -1
  170. package/lib/toaster.component.d.ts +26 -9
  171. package/lib/tool.component.d.ts +158 -0
  172. package/lib/typography.component.d.ts +32 -0
  173. package/lib/utils/color.d.ts +19 -5
  174. package/package.json +1 -1
  175. package/public-api.d.ts +50 -0
  176. package/registry/docs-content.json +8480 -1542
  177. package/registry/llms-full.txt +2679 -319
  178. package/registry/llms.txt +43 -4
  179. package/registry/manifest.json +9090 -1742
  180. package/registry/r/accordion-item.json +1 -1
  181. package/registry/r/accordion.json +1 -1
  182. package/registry/r/alert-dialog-dynamic.json +1 -1
  183. package/registry/r/alert-dialog.json +1 -1
  184. package/registry/r/alert.json +1 -1
  185. package/registry/r/attachment.json +23 -0
  186. package/registry/r/avatar-fallback.json +1 -1
  187. package/registry/r/avatar.json +1 -1
  188. package/registry/r/badge.json +1 -1
  189. package/registry/r/breadcrumb-item.json +1 -1
  190. package/registry/r/breadcrumb-link.json +1 -1
  191. package/registry/r/breadcrumb-separator.json +1 -1
  192. package/registry/r/breadcrumb.json +1 -1
  193. package/registry/r/bubble.json +23 -0
  194. package/registry/r/button.json +1 -1
  195. package/registry/r/calendar.json +1 -1
  196. package/registry/r/card.json +1 -1
  197. package/registry/r/carousel.json +1 -1
  198. package/registry/r/chain-of-thought.json +23 -0
  199. package/registry/r/chart-pie.json +30 -0
  200. package/registry/r/chart.json +28 -0
  201. package/registry/r/checkbox.json +1 -1
  202. package/registry/r/checkpoint.json +23 -0
  203. package/registry/r/collapsible.json +1 -1
  204. package/registry/r/combobox.json +31 -0
  205. package/registry/r/command-dialog.json +21 -0
  206. package/registry/r/command.json +26 -0
  207. package/registry/r/confirmation.json +23 -0
  208. package/registry/r/context.json +26 -0
  209. package/registry/r/conversation.json +23 -0
  210. package/registry/r/country-selector.json +1 -1
  211. package/registry/r/data-table.json +1 -1
  212. package/registry/r/date-picker.json +4 -4
  213. package/registry/r/date-range-picker.json +3 -3
  214. package/registry/r/date-time-picker.json +28 -0
  215. package/registry/r/direction.json +16 -0
  216. package/registry/r/dropdown-item.json +1 -1
  217. package/registry/r/dropdown-label.json +1 -1
  218. package/registry/r/dropdown-menu.json +1 -1
  219. package/registry/r/dropdown-separator.json +1 -1
  220. package/registry/r/dropdown-trigger.json +1 -1
  221. package/registry/r/empty-state.json +1 -1
  222. package/registry/r/field.json +23 -0
  223. package/registry/r/hover-card.json +1 -1
  224. package/registry/r/inline-citation.json +26 -0
  225. package/registry/r/input-group.json +23 -0
  226. package/registry/r/input.json +1 -1
  227. package/registry/r/item.json +23 -0
  228. package/registry/r/kbd.json +23 -0
  229. package/registry/r/label.json +1 -1
  230. package/registry/r/marker.json +23 -0
  231. package/registry/r/masked-input.json +1 -1
  232. package/registry/r/menubar.json +24 -0
  233. package/registry/r/message-scroller.json +26 -0
  234. package/registry/r/message.json +23 -0
  235. package/registry/r/model-selector.json +32 -0
  236. package/registry/r/multi-select.json +2 -2
  237. package/registry/r/native-select.json +23 -0
  238. package/registry/r/navigation-menu.json +24 -0
  239. package/registry/r/otp-group.json +1 -1
  240. package/registry/r/otp-slot.json +1 -1
  241. package/registry/r/otp.json +1 -1
  242. package/registry/r/pagination.json +3 -2
  243. package/registry/r/plan.json +23 -0
  244. package/registry/r/popover-content.json +1 -1
  245. package/registry/r/popover.json +1 -1
  246. package/registry/r/progress.json +1 -1
  247. package/registry/r/prompt-input.json +23 -0
  248. package/registry/r/queue.json +23 -0
  249. package/registry/r/radio-group.json +1 -1
  250. package/registry/r/radio-item.json +1 -1
  251. package/registry/r/range-calendar.json +1 -1
  252. package/registry/r/reasoning.json +23 -0
  253. package/registry/r/segment.json +1 -1
  254. package/registry/r/select-group.json +1 -1
  255. package/registry/r/select-item.json +1 -1
  256. package/registry/r/select-separator.json +1 -1
  257. package/registry/r/select.json +4 -3
  258. package/registry/r/separator.json +1 -1
  259. package/registry/r/sheet.json +1 -1
  260. package/registry/r/shimmer.json +23 -0
  261. package/registry/r/sidebar.json +1 -1
  262. package/registry/r/skeleton.json +1 -1
  263. package/registry/r/sources.json +23 -0
  264. package/registry/r/spinner.json +23 -0
  265. package/registry/r/suggestion.json +23 -0
  266. package/registry/r/switch.json +1 -1
  267. package/registry/r/table.json +21 -0
  268. package/registry/r/tabs.json +1 -1
  269. package/registry/r/tag-input.json +1 -1
  270. package/registry/r/task.json +23 -0
  271. package/registry/r/textarea.json +1 -1
  272. package/registry/r/time-picker.json +24 -0
  273. package/registry/r/toaster.json +2 -2
  274. package/registry/r/toggle-group.json +1 -1
  275. package/registry/r/toggle.json +1 -1
  276. package/registry/r/tool.json +23 -0
  277. package/registry/r/typography.json +23 -0
  278. package/registry/registry.json +915 -22
  279. package/theme.css +109 -8
@@ -1,35 +1,112 @@
1
- import { Component, Input, forwardRef, ViewChild, HostListener } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, forwardRef, ViewChild, ChangeDetectionStrategy, HostListener } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
4
4
  import { computePosition, flip, shift, offset, autoUpdate } from '@floating-ui/dom';
5
- import { format, parse, isValid, startOfDay } from 'date-fns';
5
+ import { cva } from 'class-variance-authority';
6
+ import { format, isValid, startOfDay } from 'date-fns';
6
7
  import { cn } from './utils/cn';
7
- import { MaskedInputComponent } from './masked-input.component';
8
8
  import { CalendarComponent } from './calendar.component';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/common";
11
11
  import * as i2 from "@angular/forms";
12
+ /**
13
+ * The trigger button — same shape as `tolle-date-time-picker`'s, so the two
14
+ * controls read as siblings: a bordered field that opens a floating panel,
15
+ * not a typeable text input.
16
+ */
17
+ const datePickerTriggerVariants = cva('flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background text-foreground shadow-sm transition-colors ' +
18
+ 'focus:outline-none focus-visible:border-primary/80 focus-visible:ring-4 focus-visible:ring-ring/30 ' +
19
+ 'disabled:cursor-not-allowed disabled:opacity-50', {
20
+ variants: {
21
+ size: {
22
+ xs: 'h-8 px-2 text-xs',
23
+ sm: 'h-9 px-3 text-sm',
24
+ default: 'h-10 px-3 text-sm',
25
+ lg: 'h-11 px-4 text-base',
26
+ },
27
+ invalid: {
28
+ true: 'border-destructive focus-visible:border-destructive/80 focus-visible:ring-destructive/30',
29
+ false: '',
30
+ },
31
+ },
32
+ defaultVariants: { size: 'default', invalid: false },
33
+ });
34
+ /**
35
+ * A button trigger paired with a `tolle-calendar` in a floating panel.
36
+ *
37
+ * The value is a `Date` normalised to the start of its day — a calendar date
38
+ * has no time, and carrying one would make two selections of the same day
39
+ * compare unequal. `mode` switches the whole control between picking a day, a
40
+ * month or a year, taking the calendar's own quick-actions row with it.
41
+ *
42
+ * Implements `ControlValueAccessor`, so it works with `ngModel` and reactive
43
+ * forms. Use `tolle-date-range-picker` for a span and `tolle-date-time-picker`
44
+ * when a time is needed alongside — this trigger is deliberately the same
45
+ * shape as that one, not a typeable masked field.
46
+ */
12
47
  export class DatePickerComponent {
13
48
  cdr;
14
- placeholder = 'MM/DD/YYYY';
49
+ /**
50
+ * Angular writes a bound `class` input through its styling path, which does
51
+ * not mark an OnPush component dirty — without this hook the component keeps
52
+ * rendering the class it was born with.
53
+ */
54
+ ngOnChanges() {
55
+ this.cdr.markForCheck();
56
+ }
57
+ /** Text shown on the trigger when no date is selected. @default 'Pick a date' */
58
+ placeholder = 'Pick a date';
59
+ /** Disables the control. @default false */
15
60
  disabled = false;
61
+ /** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). @default '' */
16
62
  class = '';
63
+ /** Disables every day before today in the calendar. @default false */
17
64
  disablePastDates = false;
65
+ /** Shows the footer's Clear button. @default true */
18
66
  showClear = true;
67
+ /** Shows the panel's Clear / Done footer. @default true */
19
68
  showQuickActions = true;
69
+ /** Earliest selectable date; earlier days are disabled. */
20
70
  minDate;
71
+ /** Latest selectable date; later days are disabled. */
21
72
  maxDate;
73
+ /** Whether the control picks a day, a month or a year. @default 'date' */
22
74
  mode = 'date';
75
+ /** Overrides how a month is labelled in the calendar header. */
23
76
  formatMonthFn;
77
+ /** Overrides how a year is labelled in the calendar header. */
24
78
  formatYearFn;
25
- // Format functions for display
79
+ /** Overrides how the selected date is rendered on the trigger. */
26
80
  displayFormat;
81
+ /** Height and text size of the trigger. @default 'default' */
82
+ size = 'default';
83
+ /** Applies the destructive border and focus ring. @default false */
84
+ invalid = false;
85
+ /** Accessible name when there is no associated visible label. @default '' */
86
+ ariaLabel = '';
87
+ /** Emitted with the chosen date, or `null` when the value is cleared. */
88
+ valueChange = new EventEmitter();
89
+ /** Emitted when the calendar panel opens. */
90
+ opened = new EventEmitter();
91
+ /** Emitted when the calendar panel closes. */
92
+ closed = new EventEmitter();
27
93
  trigger;
28
94
  popover;
29
95
  value = null;
30
- inputValue = '';
31
96
  isOpen = false;
32
97
  cleanupAutoUpdate;
98
+ /** Footer buttons, styled exactly as the date-time picker's. */
99
+ footerButtonClass = cn('rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors', 'hover:bg-accent hover:text-accent-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring');
100
+ /** Footer Clear — empties the value and leaves the panel open, like the reference. */
101
+ clearFromFooter() {
102
+ this.value = null;
103
+ this.emit();
104
+ this.cdr.markForCheck();
105
+ }
106
+ /** Footer Done — commits what is already selected and closes. */
107
+ done() {
108
+ this.close();
109
+ }
33
110
  _outsideClickHandler = (event) => {
34
111
  if (!this.trigger.nativeElement.contains(event.target) && !this.popover?.nativeElement.contains(event.target)) {
35
112
  this.close();
@@ -38,87 +115,45 @@ export class DatePickerComponent {
38
115
  constructor(cdr) {
39
116
  this.cdr = cdr;
40
117
  }
41
- getMask() {
42
- switch (this.mode) {
43
- case 'date': return '00/00/0000';
44
- case 'month': return '00/0000';
45
- case 'year': return '0000';
46
- default: return '00/00/0000';
47
- }
118
+ get computedTriggerClass() {
119
+ return cn(datePickerTriggerVariants({ size: this.size, invalid: this.invalid }), this.class);
48
120
  }
49
- getPlaceholder() {
50
- switch (this.mode) {
51
- case 'date': return 'MM/DD/YYYY';
52
- case 'month': return 'MM/YYYY';
53
- case 'year': return 'YYYY';
54
- default: return 'MM/DD/YYYY';
55
- }
56
- }
57
- getFormatString() {
58
- switch (this.mode) {
59
- case 'date': return 'MM/dd/yyyy';
60
- case 'month': return 'MM/yyyy';
61
- case 'year': return 'yyyy';
62
- default: return 'MM/dd/yyyy';
63
- }
121
+ get displayValue() {
122
+ return this.value ? this.formatDate(this.value) : '';
64
123
  }
65
124
  formatDate(date) {
66
125
  if (this.displayFormat) {
67
126
  return this.displayFormat(date, this.mode);
68
127
  }
69
128
  switch (this.mode) {
70
- case 'date': return format(date, 'MM/dd/yyyy');
71
- case 'month': return format(date, 'MM/yyyy');
129
+ case 'date': return format(date, 'MMM d, yyyy');
130
+ case 'month': return format(date, 'MMMM yyyy');
72
131
  case 'year': return format(date, 'yyyy');
73
- default: return format(date, 'MM/dd/yyyy');
74
- }
75
- }
76
- parseDate(str) {
77
- try {
78
- const parsed = parse(str, this.getFormatString(), new Date());
79
- return isValid(parsed) ? startOfDay(parsed) : null;
80
- }
81
- catch {
82
- return null;
83
- }
84
- }
85
- onInputChange(str) {
86
- const expectedLength = this.getFormatString().replace(/[^0]/g, '').length;
87
- if (str?.length === expectedLength) {
88
- const parsed = this.parseDate(str);
89
- if (parsed) {
90
- this.value = parsed;
91
- this.onChange(this.value);
92
- }
93
- }
94
- else if (!str) {
95
- this.value = null;
96
- this.onChange(null);
132
+ default: return format(date, 'MMM d, yyyy');
97
133
  }
98
134
  }
99
135
  onCalendarChange(date) {
100
136
  this.value = date;
101
- if (date) {
102
- this.inputValue = this.formatDate(date);
103
- }
104
- else {
105
- this.inputValue = '';
106
- }
107
- this.onChange(this.value);
137
+ this.emit();
108
138
  this.close();
139
+ this.cdr.markForCheck();
109
140
  }
110
- togglePopover(event) {
111
- event.stopPropagation();
112
- if (this.disabled)
113
- return;
141
+ toggle() {
114
142
  this.isOpen ? this.close() : this.open();
115
143
  }
144
+ onTriggerKeyDown(event) {
145
+ if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key) && !this.isOpen) {
146
+ event.preventDefault();
147
+ this.open();
148
+ }
149
+ }
116
150
  onEscape() { if (this.isOpen)
117
151
  this.close(); }
118
152
  open() {
119
- if (this.disabled)
153
+ if (this.disabled || this.isOpen)
120
154
  return;
121
155
  this.isOpen = true;
156
+ this.opened.emit();
122
157
  // Render the popover synchronously so its DOM node + @ViewChild('popover') exist
123
158
  // before we position it. Otherwise, with zone eventCoalescing (Angular defers change
124
159
  // detection to the next animation frame), updatePosition() can run first, find no
@@ -127,22 +162,24 @@ export class DatePickerComponent {
127
162
  this.trigger.nativeElement.focus();
128
163
  requestAnimationFrame(() => {
129
164
  this.updatePosition();
130
- document.addEventListener('mousedown', this._outsideClickHandler);
165
+ document.addEventListener('pointerdown', this._outsideClickHandler, true);
131
166
  });
132
167
  }
133
168
  close() {
169
+ if (!this.isOpen)
170
+ return;
134
171
  this.isOpen = false;
135
- if (this.cleanupAutoUpdate)
136
- this.cleanupAutoUpdate();
137
- document.removeEventListener('mousedown', this._outsideClickHandler);
138
- }
139
- clear(event) {
140
- event.stopPropagation();
141
- this.value = null;
142
- this.inputValue = '';
143
- this.onChange(null);
172
+ this.closed.emit();
173
+ this.teardown();
174
+ // The outside-click handler is a raw document listener, so nothing else
175
+ // marks this OnPush view dirty when it fires.
144
176
  this.cdr.markForCheck();
145
177
  }
178
+ /** Reports the current value to the form and to `valueChange`. */
179
+ emit() {
180
+ this.onChange(this.value);
181
+ this.valueChange.emit(this.value);
182
+ }
146
183
  updatePosition() {
147
184
  if (!this.trigger || !this.popover)
148
185
  return;
@@ -165,10 +202,15 @@ export class DatePickerComponent {
165
202
  });
166
203
  });
167
204
  }
168
- ngOnDestroy() {
169
- if (this.cleanupAutoUpdate)
205
+ teardown() {
206
+ if (this.cleanupAutoUpdate) {
170
207
  this.cleanupAutoUpdate();
171
- document.removeEventListener('mousedown', this._outsideClickHandler);
208
+ this.cleanupAutoUpdate = undefined;
209
+ }
210
+ document.removeEventListener('pointerdown', this._outsideClickHandler, true);
211
+ }
212
+ ngOnDestroy() {
213
+ this.teardown();
172
214
  }
173
215
  // CVA Implementation
174
216
  onChange = () => { };
@@ -176,159 +218,158 @@ export class DatePickerComponent {
176
218
  writeValue(val) {
177
219
  if (val) {
178
220
  const date = new Date(val);
179
- if (isValid(date)) {
180
- this.value = startOfDay(date);
181
- this.inputValue = this.formatDate(this.value);
182
- }
221
+ this.value = isValid(date) ? startOfDay(date) : null;
183
222
  }
184
223
  else {
185
224
  this.value = null;
186
- this.inputValue = '';
187
225
  }
188
226
  this.cdr.markForCheck();
189
227
  }
190
228
  registerOnChange(fn) { this.onChange = fn; }
191
229
  registerOnTouched(fn) { this.onTouched = fn; }
192
- setDisabledState(isDisabled) { this.disabled = isDisabled; }
230
+ setDisabledState(isDisabled) {
231
+ this.disabled = isDisabled;
232
+ this.cdr.markForCheck();
233
+ }
193
234
  cn = cn;
194
235
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
195
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DatePickerComponent, isStandalone: true, selector: "tolle-date-picker", inputs: { placeholder: "placeholder", disabled: "disabled", class: "class", disablePastDates: "disablePastDates", showClear: "showClear", showQuickActions: "showQuickActions", minDate: "minDate", maxDate: "maxDate", mode: "mode", formatMonthFn: "formatMonthFn", formatYearFn: "formatYearFn", displayFormat: "displayFormat" }, host: { listeners: { "keydown.escape": "onEscape()" } }, providers: [
236
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DatePickerComponent, isStandalone: true, selector: "tolle-date-picker", inputs: { placeholder: "placeholder", disabled: "disabled", class: "class", disablePastDates: "disablePastDates", showClear: "showClear", showQuickActions: "showQuickActions", minDate: "minDate", maxDate: "maxDate", mode: "mode", formatMonthFn: "formatMonthFn", formatYearFn: "formatYearFn", displayFormat: "displayFormat", size: "size", invalid: "invalid", ariaLabel: "ariaLabel" }, outputs: { valueChange: "valueChange", opened: "opened", closed: "closed" }, host: { listeners: { "keydown.escape": "onEscape()" } }, providers: [
196
237
  {
197
238
  provide: NG_VALUE_ACCESSOR,
198
239
  useExisting: forwardRef(() => DatePickerComponent),
199
240
  multi: true
200
241
  }
201
- ], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }], ngImport: i0, template: `
202
- <div class="relative w-full" #triggerContainer>
203
- <tolle-masked-input
204
- #maskInput
205
- [mask]="getMask()"
206
- [placeholder]="getPlaceholder()"
207
- [disabled]="disabled"
208
- [(ngModel)]="inputValue"
209
- (ngModelChange)="onInputChange($event)"
210
- [class]="cn(class)">
211
- <div suffix class="flex items-center gap-1.5">
212
- <button
213
- *ngIf="value && !disabled && showClear"
214
- type="button"
215
- aria-label="Clear date"
216
- (click)="clear($event)"
217
- class="ri-close-line cursor-pointer text-muted-foreground hover:text-foreground transition-colors"
218
- tabindex="-1"
219
- ></button>
242
+ ], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
243
+ <button
244
+ #trigger
245
+ type="button"
246
+ aria-haspopup="dialog"
247
+ [attr.aria-expanded]="isOpen"
248
+ [attr.aria-label]="ariaLabel || null"
249
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
250
+ [disabled]="disabled"
251
+ [class]="computedTriggerClass"
252
+ (click)="toggle()"
253
+ (keydown)="onTriggerKeyDown($event)"
254
+ >
255
+ <span [class]="cn('truncate', displayValue ? 'text-foreground' : 'text-muted-foreground')">
256
+ {{ displayValue || placeholder }}
257
+ </span>
258
+ <i class="ri-calendar-line shrink-0 text-muted-foreground" aria-hidden="true"></i>
259
+ </button>
220
260
 
261
+ <div
262
+ #popover
263
+ *ngIf="isOpen"
264
+ role="dialog"
265
+ [attr.aria-label]="'Choose a date'"
266
+ class="fixed left-0 top-0 z-[50]"
267
+ style="visibility: hidden"
268
+ >
269
+ <div class="rounded-md border border-border bg-popover text-popover-foreground shadow-md">
270
+ <div class="p-3">
271
+ <tolle-calendar
272
+ [bordered]="false"
273
+ [showQuickActions]="false"
274
+ [(ngModel)]="value"
275
+ (ngModelChange)="onCalendarChange($event)"
276
+ [mode]="mode"
277
+ [disablePastDates]="disablePastDates"
278
+ [minDate]="minDate"
279
+ [maxDate]="maxDate"
280
+ [formatMonthFn]="formatMonthFn"
281
+ [formatYearFn]="formatYearFn"
282
+ ></tolle-calendar>
283
+ </div>
284
+
285
+ <div
286
+ *ngIf="showQuickActions"
287
+ class="flex items-center justify-between gap-2 border-t border-border px-3 py-2"
288
+ >
289
+ <button *ngIf="showClear" type="button" [class]="footerButtonClass" (click)="clearFromFooter()">
290
+ Clear
291
+ </button>
221
292
  <button
222
293
  type="button"
223
- #trigger
224
- aria-label="Open calendar"
225
- aria-haspopup="dialog"
226
- [attr.aria-expanded]="isOpen"
227
- (click)="togglePopover($event)"
228
- [disabled]="disabled"
229
- [class]="cn(
230
- 'cursor-pointer text-muted-foreground transition-colors',
231
- 'ri-calendar-line'
232
- )"
233
- tabindex="-1"
234
- ></button>
294
+ [class]="cn(footerButtonClass, 'bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground', !showClear && 'ml-auto')"
295
+ (click)="done()"
296
+ >
297
+ Done
298
+ </button>
235
299
  </div>
236
- </tolle-masked-input>
237
-
238
- <div
239
- #popover
240
- *ngIf="isOpen"
241
- role="dialog"
242
- class="fixed z-[50]"
243
- style="visibility: hidden; top: 0; left: 0;"
244
- >
245
- <tolle-calendar class="shadow-lg"
246
- [(ngModel)]="value"
247
- (ngModelChange)="onCalendarChange($event)"
248
- [mode]="mode"
249
- [disablePastDates]="disablePastDates"
250
- [minDate]="minDate"
251
- [maxDate]="maxDate"
252
- [showQuickActions]="showQuickActions"
253
- [formatMonthFn]="formatMonthFn"
254
- [formatYearFn]="formatYearFn"
255
- ></tolle-calendar>
256
300
  </div>
257
301
  </div>
258
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "externalFocused"] }, { kind: "component", type: CalendarComponent, selector: "tolle-calendar", inputs: ["class", "bordered", "mode", "disablePastDates", "showQuickActions", "minDate", "maxDate", "formatMonthFn", "formatYearFn", "formatDateFn"], outputs: ["dateSelect"] }] });
302
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CalendarComponent, selector: "tolle-calendar", inputs: ["class", "bordered", "mode", "disablePastDates", "showQuickActions", "minDate", "maxDate", "formatMonthFn", "formatYearFn", "formatDateFn"], outputs: ["dateSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
259
303
  }
260
304
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatePickerComponent, decorators: [{
261
305
  type: Component,
262
- args: [{
263
- selector: 'tolle-date-picker',
264
- standalone: true,
265
- imports: [CommonModule, FormsModule, MaskedInputComponent, CalendarComponent],
266
- providers: [
306
+ args: [{ selector: 'tolle-date-picker', standalone: true, imports: [CommonModule, FormsModule, CalendarComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
267
307
  {
268
308
  provide: NG_VALUE_ACCESSOR,
269
309
  useExisting: forwardRef(() => DatePickerComponent),
270
310
  multi: true
271
311
  }
272
- ],
273
- template: `
274
- <div class="relative w-full" #triggerContainer>
275
- <tolle-masked-input
276
- #maskInput
277
- [mask]="getMask()"
278
- [placeholder]="getPlaceholder()"
279
- [disabled]="disabled"
280
- [(ngModel)]="inputValue"
281
- (ngModelChange)="onInputChange($event)"
282
- [class]="cn(class)">
283
- <div suffix class="flex items-center gap-1.5">
284
- <button
285
- *ngIf="value && !disabled && showClear"
286
- type="button"
287
- aria-label="Clear date"
288
- (click)="clear($event)"
289
- class="ri-close-line cursor-pointer text-muted-foreground hover:text-foreground transition-colors"
290
- tabindex="-1"
291
- ></button>
312
+ ], template: `
313
+ <button
314
+ #trigger
315
+ type="button"
316
+ aria-haspopup="dialog"
317
+ [attr.aria-expanded]="isOpen"
318
+ [attr.aria-label]="ariaLabel || null"
319
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
320
+ [disabled]="disabled"
321
+ [class]="computedTriggerClass"
322
+ (click)="toggle()"
323
+ (keydown)="onTriggerKeyDown($event)"
324
+ >
325
+ <span [class]="cn('truncate', displayValue ? 'text-foreground' : 'text-muted-foreground')">
326
+ {{ displayValue || placeholder }}
327
+ </span>
328
+ <i class="ri-calendar-line shrink-0 text-muted-foreground" aria-hidden="true"></i>
329
+ </button>
330
+
331
+ <div
332
+ #popover
333
+ *ngIf="isOpen"
334
+ role="dialog"
335
+ [attr.aria-label]="'Choose a date'"
336
+ class="fixed left-0 top-0 z-[50]"
337
+ style="visibility: hidden"
338
+ >
339
+ <div class="rounded-md border border-border bg-popover text-popover-foreground shadow-md">
340
+ <div class="p-3">
341
+ <tolle-calendar
342
+ [bordered]="false"
343
+ [showQuickActions]="false"
344
+ [(ngModel)]="value"
345
+ (ngModelChange)="onCalendarChange($event)"
346
+ [mode]="mode"
347
+ [disablePastDates]="disablePastDates"
348
+ [minDate]="minDate"
349
+ [maxDate]="maxDate"
350
+ [formatMonthFn]="formatMonthFn"
351
+ [formatYearFn]="formatYearFn"
352
+ ></tolle-calendar>
353
+ </div>
292
354
 
355
+ <div
356
+ *ngIf="showQuickActions"
357
+ class="flex items-center justify-between gap-2 border-t border-border px-3 py-2"
358
+ >
359
+ <button *ngIf="showClear" type="button" [class]="footerButtonClass" (click)="clearFromFooter()">
360
+ Clear
361
+ </button>
293
362
  <button
294
363
  type="button"
295
- #trigger
296
- aria-label="Open calendar"
297
- aria-haspopup="dialog"
298
- [attr.aria-expanded]="isOpen"
299
- (click)="togglePopover($event)"
300
- [disabled]="disabled"
301
- [class]="cn(
302
- 'cursor-pointer text-muted-foreground transition-colors',
303
- 'ri-calendar-line'
304
- )"
305
- tabindex="-1"
306
- ></button>
364
+ [class]="cn(footerButtonClass, 'bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground', !showClear && 'ml-auto')"
365
+ (click)="done()"
366
+ >
367
+ Done
368
+ </button>
307
369
  </div>
308
- </tolle-masked-input>
309
-
310
- <div
311
- #popover
312
- *ngIf="isOpen"
313
- role="dialog"
314
- class="fixed z-[50]"
315
- style="visibility: hidden; top: 0; left: 0;"
316
- >
317
- <tolle-calendar class="shadow-lg"
318
- [(ngModel)]="value"
319
- (ngModelChange)="onCalendarChange($event)"
320
- [mode]="mode"
321
- [disablePastDates]="disablePastDates"
322
- [minDate]="minDate"
323
- [maxDate]="maxDate"
324
- [showQuickActions]="showQuickActions"
325
- [formatMonthFn]="formatMonthFn"
326
- [formatYearFn]="formatYearFn"
327
- ></tolle-calendar>
328
370
  </div>
329
371
  </div>
330
- `
331
- }]
372
+ `, styles: [":host{display:block}\n"] }]
332
373
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { placeholder: [{
333
374
  type: Input
334
375
  }], disabled: [{
@@ -353,6 +394,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
353
394
  type: Input
354
395
  }], displayFormat: [{
355
396
  type: Input
397
+ }], size: [{
398
+ type: Input
399
+ }], invalid: [{
400
+ type: Input
401
+ }], ariaLabel: [{
402
+ type: Input
403
+ }], valueChange: [{
404
+ type: Output
405
+ }], opened: [{
406
+ type: Output
407
+ }], closed: [{
408
+ type: Output
356
409
  }], trigger: [{
357
410
  type: ViewChild,
358
411
  args: ['trigger']
@@ -363,4 +416,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
363
416
  type: HostListener,
364
417
  args: ['keydown.escape']
365
418
  }] } });
366
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFjLFNBQVMsRUFBZ0MsWUFBWSxFQUNoRyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUF3RXZFLE1BQU0sT0FBTyxtQkFBbUI7SUE4QlY7SUE3QlgsV0FBVyxHQUFHLFlBQVksQ0FBQztJQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDeEIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsSUFBSSxHQUFpQixNQUFNLENBQUM7SUFDNUIsYUFBYSxDQUEwQjtJQUN2QyxZ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QUMsU0FBUztnQkFnR1ksUUFBUTtzQkFBdkMsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBmb3J3YXJkUmVmLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29tcHV0ZVBvc2l0aW9uLCBmbGlwLCBzaGlmdCwgb2Zmc2V0LCBhdXRvVXBkYXRlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgeyBmb3JtYXQsIHBhcnNlLCBpc1ZhbGlkLCBzdGFydE9mRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7IE1hc2tlZElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9tYXNrZWQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IENhbGVuZGFyQ29tcG9uZW50LCBDYWxlbmRhck1vZGUgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWRhdGUtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hc2tlZElucHV0Q29tcG9uZW50LCBDYWxlbmRhckNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsXCIgI3RyaWdnZXJDb250YWluZXI+XG4gICAgICA8dG9sbGUtbWFza2VkLWlucHV0XG4gICAgICAgICNtYXNrSW5wdXRcbiAgICAgICAgW21hc2tdPVwiZ2V0TWFzaygpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbklucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICBbY2xhc3NdPVwiY24oY2xhc3MpXCI+XG4gICAgICAgIDxkaXYgc3VmZml4IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwidmFsdWUgJiYgIWRpc2FibGVkICYmIHNob3dDbGVhclwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBkYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwicmktY2xvc2UtbGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LW11dGVkLWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgI3RyaWdnZXJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIGNhbGVuZGFyXCJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBvcG92ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICAgICAnY3Vyc29yLXBvaW50ZXIgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgJ3JpLWNhbGVuZGFyLWxpbmUnXG4gICAgICAgICAgICApXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RvbGxlLW1hc2tlZC1pbnB1dD5cblxuICAgICAgPGRpdlxuICAgICAgICAjcG9wb3ZlclxuICAgICAgICAqbmdJZj1cImlzT3BlblwiXG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBjbGFzcz1cImZpeGVkIHotWzUwXVwiXG4gICAgICAgIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuOyB0b3A6IDA7IGxlZnQ6IDA7XCJcbiAgICAgID5cbiAgICAgICAgPHRvbGxlLWNhbGVuZGFyIGNsYXNzPVwic2hhZG93LWxnXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNhbGVuZGFyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgIFtkaXNhYmxlUGFzdERhdGVzXT1cImRpc2FibGVQYXN0RGF0ZXNcIlxuICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgIFtzaG93UXVpY2tBY3Rpb25zXT1cInNob3dRdWlja0FjdGlvbnNcIlxuICAgICAgICAgIFtmb3JtYXRNb250aEZuXT1cImZvcm1hdE1vbnRoRm5cIlxuICAgICAgICAgIFtmb3JtYXRZZWFyRm5dPVwiZm9ybWF0WWVhckZuXCJcbiAgICAgICAgPjwvdG9sbGUtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ01NL0REL1lZWVknO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBASW5wdXQoKSBkaXNhYmxlUGFzdERhdGVzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dDbGVhciA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dRdWlja0FjdGlvbnMgPSB0cnVlO1xuICBASW5wdXQoKSBtaW5EYXRlPzogRGF0ZTtcbiAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XG4gIEBJbnB1dCgpIG1vZGU6IENhbGVuZGFyTW9kZSA9ICdkYXRlJztcbiAgQElucHV0KCkgZm9ybWF0TW9udGhGbj86IChkYXRlOiBEYXRlKSA9PiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdFllYXJGbj86IChkYXRlOiBEYXRlKSA9PiBzdHJpbmc7XG5cbiAgLy8gRm9ybWF0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheVxuICBASW5wdXQoKSBkaXNwbGF5Rm9ybWF0PzogKGRhdGU6IERhdGUsIG1vZGU6IENhbGVuZGFyTW9kZSkgPT4gc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInKSB0cmlnZ2VyITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncG9wb3ZlcicpIHBvcG92ZXIhOiBFbGVtZW50UmVmO1xuXG4gIHZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGlucHV0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBpc09wZW4gPSBmYWxzZTtcbiAgY2xlYW51cEF1dG9VcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgX291dHNpZGVDbGlja0hhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoIXRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgIXRoaXMucG9wb3Zlcj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBnZXRNYXNrKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgJ2RhdGUnOiByZXR1cm4gJzAwLzAwLzAwMDAnO1xuICAgICAgY2FzZSAnbW9udGgnOiByZXR1cm4gJzAwLzAwMDAnO1xuICAgICAgY2FzZSAneWVhcic6IHJldHVybiAnMDAwMCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJzAwLzAwLzAwMDAnO1xuICAgIH1cbiAgfVxuXG4gIGdldFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgJ2RhdGUnOiByZXR1cm4gJ01NL0REL1lZWVknO1xuICAgICAgY2FzZSAnbW9udGgnOiByZXR1cm4gJ01NL1lZWVknO1xuICAgICAgY2FzZSAneWVhcic6IHJldHVybiAnWVlZWSc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ01NL0REL1lZWVknO1xuICAgIH1cbiAgfVxuXG4gIGdldEZvcm1hdFN0cmluZygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlICdkYXRlJzogcmV0dXJuICdNTS9kZC95eXl5JztcbiAgICAgIGNhc2UgJ21vbnRoJzogcmV0dXJuICdNTS95eXl5JztcbiAgICAgIGNhc2UgJ3llYXInOiByZXR1cm4gJ3l5eXknO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdNTS9kZC95eXl5JztcbiAgICB9XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRpc3BsYXlGb3JtYXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlGb3JtYXQoZGF0ZSwgdGhpcy5tb2RlKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSAnZGF0ZSc6IHJldHVybiBmb3JtYXQoZGF0ZSwgJ01NL2RkL3l5eXknKTtcbiAgICAgIGNhc2UgJ21vbnRoJzogcmV0dXJuIGZvcm1hdChkYXRlLCAnTU0veXl5eScpO1xuICAgICAgY2FzZSAneWVhcic6IHJldHVybiBmb3JtYXQoZGF0ZSwgJ3l5eXknKTtcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBmb3JtYXQoZGF0ZSwgJ01NL2RkL3l5eXknKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZURhdGUoc3RyOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHN0ciwgdGhpcy5nZXRGb3JtYXRTdHJpbmcoKSwgbmV3IERhdGUoKSk7XG4gICAgICByZXR1cm4gaXNWYWxpZChwYXJzZWQpID8gc3RhcnRPZkRheShwYXJzZWQpIDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRDaGFuZ2Uoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IHRoaXMuZ2V0Rm9ybWF0U3RyaW5nKCkucmVwbGFjZSgvW14wXS9nLCAnJykubGVuZ3RoO1xuXG4gICAgaWYgKHN0cj8ubGVuZ3RoID09PSBleHBlY3RlZExlbmd0aCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZURhdGUoc3RyKTtcbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHBhcnNlZDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzdHIpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBvbkNhbGVuZGFyQ2hhbmdlKGRhdGU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgdG9nZ2xlUG9wb3ZlcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW4gPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZXNjYXBlJykgb25Fc2NhcGUoKSB7IGlmICh0aGlzLmlzT3BlbikgdGhpcy5jbG9zZSgpOyB9XG5cbiAgb3BlbigpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAvLyBSZW5kZXIgdGhlIHBvcG92ZXIgc3luY2hyb25vdXNseSBzbyBpdHMgRE9NIG5vZGUgKyBAVmlld0NoaWxkKCdwb3BvdmVyJykgZXhpc3RcbiAgICAvLyBiZWZvcmUgd2UgcG9zaXRpb24gaXQuIE90aGVyd2lzZSwgd2l0aCB6b25lIGV2ZW50Q29hbGVzY2luZyAoQW5ndWxhciBkZWZlcnMgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uIHRvIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZSksIHVwZGF0ZVBvc2l0aW9uKCkgY2FuIHJ1biBmaXJzdCwgZmluZCBub1xuICAgIC8vIHBvcG92ZXIsIGFuZCB0aGUgY2FsZW5kYXIgc3RheXMgaGlkZGVuIOKAlCByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBwaWNrZXIgaXMgdXNlZC5cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb3V0c2lkZUNsaWNrSGFuZGxlcik7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsZWFudXBBdXRvVXBkYXRlKSB0aGlzLmNsZWFudXBBdXRvVXBkYXRlKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb3V0c2lkZUNsaWNrSGFuZGxlcik7XG4gIH1cblxuICBjbGVhcihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgIGlmICghdGhpcy50cmlnZ2VyIHx8ICF0aGlzLnBvcG92ZXIpIHJldHVybjtcblxuICAgIHRoaXMuY2xlYW51cEF1dG9VcGRhdGUgPSBhdXRvVXBkYXRlKFxuICAgICAgdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29tcHV0ZVBvc2l0aW9uKHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgIHN0cmF0ZWd5OiAnZml4ZWQnLFxuICAgICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbS1zdGFydCcsXG4gICAgICAgICAgbWlkZGxld2FyZTogW1xuICAgICAgICAgICAgb2Zmc2V0KDQpLFxuICAgICAgICAgICAgZmxpcCgpLFxuICAgICAgICAgICAgc2hpZnQoeyBwYWRkaW5nOiA4IH0pXG4gICAgICAgICAgXSxcbiAgICAgICAgfSkudGhlbigoeyB4LCB5LCBzdHJhdGVneSB9KSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246IHN0cmF0ZWd5LFxuICAgICAgICAgICAgbGVmdDogYCR7eH1weGAsXG4gICAgICAgICAgICB0b3A6IGAke3l9cHhgLFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY2xlYW51cEF1dG9VcGRhdGUpIHRoaXMuY2xlYW51cEF1dG9VcGRhdGUoKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vdXRzaWRlQ2xpY2tIYW5kbGVyKTtcbiAgfVxuXG4gIC8vIENWQSBJbXBsZW1lbnRhdGlvblxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgd3JpdGVWYWx1ZSh2YWw6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgaWYgKGlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHN0YXJ0T2ZEYXkoZGF0ZSk7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHsgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7IH1cbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQWMsU0FBUyxFQUFxQix1QkFBdUIsRUFBYSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2xNLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEYsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFdkU7Ozs7R0FJRztBQUNILE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUNuQywwSUFBMEk7SUFDeEkscUdBQXFHO0lBQ3JHLGlEQUFpRCxFQUNuRDtJQUNFLFFBQVEsRUFBRTtRQUNSLElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsRUFBRSxFQUFFLGtCQUFrQjtZQUN0QixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLEVBQUUsRUFBRSxxQkFBcUI7U0FDMUI7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsMEZBQTBG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O3NCQUFyQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRWUsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNFLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkF3RVksUUFBUTtzQkFBdkMsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uRGVzdHJveSwgSG9zdExpc3RlbmVyLCBPbkNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgZm9ybWF0LCBpc1ZhbGlkLCBzdGFydE9mRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7IENhbGVuZGFyQ29tcG9uZW50LCBDYWxlbmRhck1vZGUgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogVGhlIHRyaWdnZXIgYnV0dG9uIOKAlCBzYW1lIHNoYXBlIGFzIGB0b2xsZS1kYXRlLXRpbWUtcGlja2VyYCdzLCBzbyB0aGUgdHdvXG4gKiBjb250cm9scyByZWFkIGFzIHNpYmxpbmdzOiBhIGJvcmRlcmVkIGZpZWxkIHRoYXQgb3BlbnMgYSBmbG9hdGluZyBwYW5lbCxcbiAqIG5vdCBhIHR5cGVhYmxlIHRleHQgaW5wdXQuXG4gKi9cbmNvbnN0IGRhdGVQaWNrZXJUcmlnZ2VyVmFyaWFudHMgPSBjdmEoXG4gICdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gdHJhbnNpdGlvbi1jb2xvcnMgJyArXG4gICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1wcmltYXJ5LzgwIGZvY3VzLXZpc2libGU6cmluZy00IGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzMwICcgK1xuICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgc2l6ZToge1xuICAgICAgICB4czogJ2gtOCBweC0yIHRleHQteHMnLFxuICAgICAgICBzbTogJ2gtOSBweC0zIHRleHQtc20nLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCBweC0zIHRleHQtc20nLFxuICAgICAgICBsZzogJ2gtMTEgcHgtNCB0ZXh0LWJhc2UnLFxuICAgICAgfSxcbiAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgdHJ1ZTogJ2JvcmRlci1kZXN0cnVjdGl2ZSBmb2N1cy12aXNpYmxlOmJvcmRlci1kZXN0cnVjdGl2ZS84MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMzAnLFxuICAgICAgICBmYWxzZTogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7IHNpemU6ICdkZWZhdWx0JywgaW52YWxpZDogZmFsc2UgfSxcbiAgfVxuKTtcblxuLyoqIFZhcmlhbnQgcHJvcHMgZm9yIHRoZSBkYXRlIHBpY2tlci4gKi9cbmV4cG9ydCB0eXBlIERhdGVQaWNrZXJQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgZGF0ZVBpY2tlclRyaWdnZXJWYXJpYW50cz47XG5cbi8qKlxuICogQSBidXR0b24gdHJpZ2dlciBwYWlyZWQgd2l0aCBhIGB0b2xsZS1jYWxlbmRhcmAgaW4gYSBmbG9hdGluZyBwYW5lbC5cbiAqXG4gKiBUaGUgdmFsdWUgaXMgYSBgRGF0ZWAgbm9ybWFsaXNlZCB0byB0aGUgc3RhcnQgb2YgaXRzIGRheSDigJQgYSBjYWxlbmRhciBkYXRlXG4gKiBoYXMgbm8gdGltZSwgYW5kIGNhcnJ5aW5nIG9uZSB3b3VsZCBtYWtlIHR3byBzZWxlY3Rpb25zIG9mIHRoZSBzYW1lIGRheVxuICogY29tcGFyZSB1bmVxdWFsLiBgbW9kZWAgc3dpdGNoZXMgdGhlIHdob2xlIGNvbnRyb2wgYmV0d2VlbiBwaWNraW5nIGEgZGF5LCBhXG4gKiBtb250aCBvciBhIHllYXIsIHRha2luZyB0aGUgY2FsZW5kYXIncyBvd24gcXVpY2stYWN0aW9ucyByb3cgd2l0aCBpdC5cbiAqXG4gKiBJbXBsZW1lbnRzIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAsIHNvIGl0IHdvcmtzIHdpdGggYG5nTW9kZWxgIGFuZCByZWFjdGl2ZVxuICogZm9ybXMuIFVzZSBgdG9sbGUtZGF0ZS1yYW5nZS1waWNrZXJgIGZvciBhIHNwYW4gYW5kIGB0b2xsZS1kYXRlLXRpbWUtcGlja2VyYFxuICogd2hlbiBhIHRpbWUgaXMgbmVlZGVkIGFsb25nc2lkZSDigJQgdGhpcyB0cmlnZ2VyIGlzIGRlbGliZXJhdGVseSB0aGUgc2FtZVxuICogc2hhcGUgYXMgdGhhdCBvbmUsIG5vdCBhIHR5cGVhYmxlIG1hc2tlZCBmaWVsZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtZGF0ZS1waWNrZXInLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ2FsZW5kYXJDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgICN0cmlnZ2VyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5kYXRhLXN0YXRlXT1cImlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRUcmlnZ2VyQ2xhc3NcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleURvd24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNwYW4gW2NsYXNzXT1cImNuKCd0cnVuY2F0ZScsIGRpc3BsYXlWYWx1ZSA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgIHt7IGRpc3BsYXlWYWx1ZSB8fCBwbGFjZWhvbGRlciB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPGkgY2xhc3M9XCJyaS1jYWxlbmRhci1saW5lIHNocmluay0wIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICNwb3BvdmVyXG4gICAgICAqbmdJZj1cImlzT3BlblwiXG4gICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Nob29zZSBhIGRhdGUnXCJcbiAgICAgIGNsYXNzPVwiZml4ZWQgbGVmdC0wIHRvcC0wIHotWzUwXVwiXG4gICAgICBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlblwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtM1wiPlxuICAgICAgICAgIDx0b2xsZS1jYWxlbmRhclxuICAgICAgICAgICAgW2JvcmRlcmVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtzaG93UXVpY2tBY3Rpb25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DYWxlbmRhckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVQYXN0RGF0ZXNdPVwiZGlzYWJsZVBhc3REYXRlc1wiXG4gICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW2Zvcm1hdE1vbnRoRm5dPVwiZm9ybWF0TW9udGhGblwiXG4gICAgICAgICAgICBbZm9ybWF0WWVhckZuXT1cImZvcm1hdFllYXJGblwiXG4gICAgICAgICAgPjwvdG9sbGUtY2FsZW5kYXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInNob3dRdWlja0FjdGlvbnNcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIGJvcmRlci10IGJvcmRlci1ib3JkZXIgcHgtMyBweS0yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93Q2xlYXJcIiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzXT1cImZvb3RlckJ1dHRvbkNsYXNzXCIgKGNsaWNrKT1cImNsZWFyRnJvbUZvb3RlcigpXCI+XG4gICAgICAgICAgICBDbGVhclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNuKGZvb3RlckJ1dHRvbkNsYXNzLCAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5LzkwIGhvdmVyOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJywgIXNob3dDbGVhciAmJiAnbWwtYXV0bycpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkb25lKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERvbmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRleHQgc2hvd24gb24gdGhlIHRyaWdnZXIgd2hlbiBubyBkYXRlIGlzIHNlbGVjdGVkLiBAZGVmYXVsdCAnUGljayBhIGRhdGUnICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1BpY2sgYSBkYXRlJztcbiAgLyoqIERpc2FibGVzIHRoZSBjb250cm9sLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdHJpZ2dlciB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICAvKiogRGlzYWJsZXMgZXZlcnkgZGF5IGJlZm9yZSB0b2RheSBpbiB0aGUgY2FsZW5kYXIuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0RGF0ZXMgPSBmYWxzZTtcbiAgLyoqIFNob3dzIHRoZSBmb290ZXIncyBDbGVhciBidXR0b24uIEBkZWZhdWx0IHRydWUgKi9cbiAgQElucHV0KCkgc2hvd0NsZWFyID0gdHJ1ZTtcbiAgLyoqIFNob3dzIHRoZSBwYW5lbCdzIENsZWFyIC8gRG9uZSBmb290ZXIuIEBkZWZhdWx0IHRydWUgKi9cbiAgQElucHV0KCkgc2hvd1F1aWNrQWN0aW9ucyA9IHRydWU7XG4gIC8qKiBFYXJsaWVzdCBzZWxlY3RhYmxlIGRhdGU7IGVhcmxpZXIgZGF5cyBhcmUgZGlzYWJsZWQuICovXG4gIEBJbnB1dCgpIG1pbkRhdGU/OiBEYXRlO1xuICAvKiogTGF0ZXN0IHNlbGVjdGFibGUgZGF0ZTsgbGF0ZXIgZGF5cyBhcmUgZGlzYWJsZWQuICovXG4gIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xuICAvKiogV2hldGhlciB0aGUgY29udHJvbCBwaWNrcyBhIGRheSwgYSBtb250aCBvciBhIHllYXIuIEBkZWZhdWx0ICdkYXRlJyAqL1xuICBASW5wdXQoKSBtb2RlOiBDYWxlbmRhck1vZGUgPSAnZGF0ZSc7XG4gIC8qKiBPdmVycmlkZXMgaG93IGEgbW9udGggaXMgbGFiZWxsZWQgaW4gdGhlIGNhbGVuZGFyIGhlYWRlci4gKi9cbiAgQElucHV0KCkgZm9ybWF0TW9udGhGbj86IChkYXRlOiBEYXRlKSA9PiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZXMgaG93IGEgeWVhciBpcyBsYWJlbGxlZCBpbiB0aGUgY2FsZW5kYXIgaGVhZGVyLiAqL1xuICBASW5wdXQoKSBmb3JtYXRZZWFyRm4/OiAoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nO1xuICAvKiogT3ZlcnJpZGVzIGhvdyB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyByZW5kZXJlZCBvbiB0aGUgdHJpZ2dlci4gKi9cbiAgQElucHV0KCkgZGlzcGxheUZvcm1hdD86IChkYXRlOiBEYXRlLCBtb2RlOiBDYWxlbmRhck1vZGUpID0+IHN0cmluZztcbiAgLyoqIEhlaWdodCBhbmQgdGV4dCBzaXplIG9mIHRoZSB0cmlnZ2VyLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogRGF0ZVBpY2tlclByb3BzWydzaXplJ10gPSAnZGVmYXVsdCc7XG4gIC8qKiBBcHBsaWVzIHRoZSBkZXN0cnVjdGl2ZSBib3JkZXIgYW5kIGZvY3VzIHJpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcbiAgLyoqIEFjY2Vzc2libGUgbmFtZSB3aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbC4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgY2hvc2VuIGRhdGUsIG9yIGBudWxsYCB3aGVuIHRoZSB2YWx1ZSBpcyBjbGVhcmVkLiAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBjYWxlbmRhciBwYW5lbCBvcGVucy4gKi9cbiAgQE91dHB1dCgpIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgY2FsZW5kYXIgcGFuZWwgY2xvc2VzLiAqL1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInKSB0cmlnZ2VyITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncG9wb3ZlcicpIHBvcG92ZXIhOiBFbGVtZW50UmVmO1xuXG4gIHZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGlzT3BlbiA9IGZhbHNlO1xuICBjbGVhbnVwQXV0b1VwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIEZvb3RlciBidXR0b25zLCBzdHlsZWQgZXhhY3RseSBhcyB0aGUgZGF0ZS10aW1lIHBpY2tlcidzLiAqL1xuICByZWFkb25seSBmb290ZXJCdXR0b25DbGFzcyA9IGNuKFxuICAgICdyb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICdmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZydcbiAgKTtcblxuICAvKiogRm9vdGVyIENsZWFyIOKAlCBlbXB0aWVzIHRoZSB2YWx1ZSBhbmQgbGVhdmVzIHRoZSBwYW5lbCBvcGVuLCBsaWtlIHRoZSByZWZlcmVuY2UuICovXG4gIGNsZWFyRnJvbUZvb3RlcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBGb290ZXIgRG9uZSDigJQgY29tbWl0cyB3aGF0IGlzIGFscmVhZHkgc2VsZWN0ZWQgYW5kIGNsb3Nlcy4gKi9cbiAgZG9uZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIF9vdXRzaWRlQ2xpY2tIYW5kbGVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmICF0aGlzLnBvcG92ZXI/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgZ2V0IGNvbXB1dGVkVHJpZ2dlckNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKGRhdGVQaWNrZXJUcmlnZ2VyVmFyaWFudHMoeyBzaXplOiB0aGlzLnNpemUsIGludmFsaWQ6IHRoaXMuaW52YWxpZCB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cblxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLmZvcm1hdERhdGUodGhpcy52YWx1ZSkgOiAnJztcbiAgfVxuXG4gIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGlzcGxheUZvcm1hdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheUZvcm1hdChkYXRlLCB0aGlzLm1vZGUpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlICdkYXRlJzogcmV0dXJuIGZvcm1hdChkYXRlLCAnTU1NIGQsIHl5eXknKTtcbiAgICAgIGNhc2UgJ21vbnRoJzogcmV0dXJuIGZvcm1hdChkYXRlLCAnTU1NTSB5eXl5Jyk7XG4gICAgICBjYXNlICd5ZWFyJzogcmV0dXJuIGZvcm1hdChkYXRlLCAneXl5eScpO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIGZvcm1hdChkYXRlLCAnTU1NIGQsIHl5eXknKTtcbiAgICB9XG4gIH1cblxuICBvbkNhbGVuZGFyQ2hhbmdlKGRhdGU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7XG4gIH1cblxuICBvblRyaWdnZXJLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFsnQXJyb3dEb3duJywgJ0Fycm93VXAnLCAnRW50ZXInLCAnICddLmluY2x1ZGVzKGV2ZW50LmtleSkgJiYgIXRoaXMuaXNPcGVuKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnKSBvbkVzY2FwZSgpIHsgaWYgKHRoaXMuaXNPcGVuKSB0aGlzLmNsb3NlKCk7IH1cblxuICBvcGVuKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcbiAgICAvLyBSZW5kZXIgdGhlIHBvcG92ZXIgc3luY2hyb25vdXNseSBzbyBpdHMgRE9NIG5vZGUgKyBAVmlld0NoaWxkKCdwb3BvdmVyJykgZXhpc3RcbiAgICAvLyBiZWZvcmUgd2UgcG9zaXRpb24gaXQuIE90aGVyd2lzZSwgd2l0aCB6b25lIGV2ZW50Q29hbGVzY2luZyAoQW5ndWxhciBkZWZlcnMgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uIHRvIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZSksIHVwZGF0ZVBvc2l0aW9uKCkgY2FuIHJ1biBmaXJzdCwgZmluZCBub1xuICAgIC8vIHBvcG92ZXIsIGFuZCB0aGUgY2FsZW5kYXIgc3RheXMgaGlkZGVuIOKAlCByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBwaWNrZXIgaXMgdXNlZC5cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlQ2xpY2tIYW5kbGVyLCB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5pc09wZW4pIHJldHVybjtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgLy8gVGhlIG91dHNpZGUtY2xpY2sgaGFuZGxlciBpcyBhIHJhdyBkb2N1bWVudCBsaXN0ZW5lciwgc28gbm90aGluZyBlbHNlXG4gICAgLy8gbWFya3MgdGhpcyBPblB1c2ggdmlldyBkaXJ0eSB3aGVuIGl0IGZpcmVzLlxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFJlcG9ydHMgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIGZvcm0gYW5kIHRvIGB2YWx1ZUNoYW5nZWAuICovXG4gIHByaXZhdGUgZW1pdCgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIgfHwgIXRoaXMucG9wb3ZlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGVhbnVwQXV0b1VwZGF0ZSA9IGF1dG9VcGRhdGUoXG4gICAgICB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb21wdXRlUG9zaXRpb24odGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgICAgc3RyYXRlZ3k6ICdmaXhlZCcsXG4gICAgICAgICAgcGxhY2VtZW50OiAnYm90dG9tLXN0YXJ0JyxcbiAgICAgICAgICBtaWRkbGV3YXJlOiBbXG4gICAgICAgICAgICBvZmZzZXQoNCksXG4gICAgICAgICAgICBmbGlwKCksXG4gICAgICAgICAgICBzaGlmdCh7IHBhZGRpbmc6IDggfSlcbiAgICAgICAgICBdLFxuICAgICAgICB9KS50aGVuKCh7IHgsIHksIHN0cmF0ZWd5IH0pID0+IHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgICBwb3NpdGlvbjogc3RyYXRlZ3ksXG4gICAgICAgICAgICBsZWZ0OiBgJHt4fXB4YCxcbiAgICAgICAgICAgIHRvcDogYCR7eX1weGAsXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRlYXJkb3duKCkge1xuICAgIGlmICh0aGlzLmNsZWFudXBBdXRvVXBkYXRlKSB7XG4gICAgICB0aGlzLmNsZWFudXBBdXRvVXBkYXRlKCk7XG4gICAgICB0aGlzLmNsZWFudXBBdXRvVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX291dHNpZGVDbGlja0hhbmRsZXIsIHRydWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy50ZWFyZG93bigpO1xuICB9XG5cbiAgLy8gQ1ZBIEltcGxlbWVudGF0aW9uXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbDogYW55KTogdm9pZCB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICB0aGlzLnZhbHVlID0gaXNWYWxpZChkYXRlKSA/IHN0YXJ0T2ZEYXkoZGF0ZSkgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cbiJdfQ==