@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,7 +1,9 @@
1
- import { Component, Input, ContentChildren, ElementRef, ViewChild } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ContentChildren, ElementRef, ViewChild, ChangeDetectionStrategy, } 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, size } from '@floating-ui/dom';
5
+ import { cva } from 'class-variance-authority';
6
+ import { Subscription } from 'rxjs';
5
7
  import { SelectItemComponent } from './select-item.component';
6
8
  import { SelectService } from './select.service';
7
9
  import { cn } from './utils/cn';
@@ -11,81 +13,137 @@ import * as i0 from "@angular/core";
11
13
  import * as i1 from "./select.service";
12
14
  import * as i2 from "@angular/common";
13
15
  import * as i3 from "@angular/forms";
16
+ const multiSelectTriggerVariants = cva('flex h-auto min-h-10 w-full items-center justify-between rounded-md border border-input bg-background text-sm shadow-sm transition-all duration-200', {
17
+ variants: {
18
+ size: {
19
+ xs: 'px-2 py-1',
20
+ sm: 'px-3 py-1.5',
21
+ default: 'px-3 py-2',
22
+ lg: 'px-4 py-2',
23
+ },
24
+ error: {
25
+ true: 'border-destructive',
26
+ false: '',
27
+ },
28
+ disabled: {
29
+ true: 'cursor-not-allowed border-opacity-50 opacity-50',
30
+ false: '',
31
+ },
32
+ },
33
+ compoundVariants: [
34
+ // Only an interactive trigger gets the hover border and the focus ring.
35
+ {
36
+ disabled: false,
37
+ class: 'hover:border-accent focus-visible:border-primary/80 focus-visible:shadow-none focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring/30 focus-visible:ring-offset-0',
38
+ },
39
+ // …and an invalid one rings destructive instead. Declared after the rule
40
+ // above so `cn()` resolves the conflict in its favour.
41
+ {
42
+ disabled: false,
43
+ error: true,
44
+ class: 'focus-visible:border-destructive/80 focus-visible:ring-destructive/30',
45
+ },
46
+ ],
47
+ defaultVariants: { size: 'default', error: false, disabled: false },
48
+ });
49
+ /**
50
+ * A multi-select listbox: a trigger that shows the current selection as
51
+ * removable chips and opens a floating panel of `tolle-select-item` options.
52
+ * Implements `ControlValueAccessor`, so it works with `ngModel` and reactive
53
+ * forms.
54
+ */
14
55
  export class MultiSelectComponent {
15
56
  selectService;
57
+ cdr;
58
+ /** Text shown on the trigger when nothing is selected. @default 'Select options...' */
16
59
  placeholder = 'Select options...';
60
+ /** Padding and text size of the trigger. @default 'default' */
17
61
  size = 'default';
62
+ /** Adds a search box that filters the projected options. @default false */
18
63
  searchable = false;
64
+ /** Disables the control and blocks opening the panel. @default false */
19
65
  disabled = false;
66
+ /** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). @default '' */
20
67
  class = '';
68
+ /** Largest number of values that can be selected at once; leave unset for no cap. */
21
69
  maxSelections;
70
+ /** How many chips to render before collapsing the rest into a "+N more" hint. @default 3 */
22
71
  maxDisplayItems = 3;
23
- error = false; // Added to support error styling
72
+ /** Applies the destructive border and focus ring. @default false */
73
+ error = false;
74
+ /** Emitted with the full array of selected values whenever the selection changes. */
75
+ valueChange = new EventEmitter();
76
+ /** Emitted when the panel opens. */
77
+ opened = new EventEmitter();
78
+ /** Emitted when the panel closes. */
79
+ closed = new EventEmitter();
24
80
  trigger;
25
81
  popover;
26
82
  searchInput;
27
83
  items;
28
84
  value = [];
29
85
  selectedItems = [];
86
+ /**
87
+ * The chips actually rendered, built into a field rather than read from a
88
+ * getter. A getter hands `*ngFor` a freshly-allocated array on every
89
+ * change-detection pass; paired with the default identity differ that tore
90
+ * down and rebuilt every badge — including the one under the pointer, whose
91
+ * destruction re-fires its own remove handler. See `trackChip` below, which
92
+ * closes the same hole for the rebuilt chip objects `syncItems()` produces.
93
+ */
94
+ displayItems = [];
95
+ exceedsDisplayLimit = false;
30
96
  isOpen = false;
31
97
  searchQuery = '';
32
98
  noResults = false;
33
99
  cleanup;
100
+ sub = new Subscription();
34
101
  // Keyboard navigation (active-descendant) state
35
102
  activeIndex = -1;
36
103
  typeaheadBuffer = '';
37
104
  typeaheadTime = 0;
38
105
  pendingTypeaheadChar = '';
39
- constructor(selectService) {
106
+ constructor(selectService, cdr) {
40
107
  this.selectService = selectService;
41
- this.selectService.selectedValue$.subscribe(val => {
108
+ this.cdr = cdr;
109
+ this.sub.add(this.selectService.selectedValue$.subscribe(val => {
42
110
  if (val !== undefined && this.isOpen)
43
111
  this.toggleValue(val);
44
- });
112
+ }));
45
113
  }
46
- // NEW: Matches InputComponent styles exactly
47
114
  get computedTriggerClass() {
48
- return cn(
49
- // Base styles
50
- 'flex min-h-10 w-full items-center justify-between rounded-md border transition-all duration-200 h-auto', 'bg-background text-sm',
51
- // Border and shadow
52
- 'border-input shadow-sm',
53
- // Padding based on size (aligned with InputComponent logic)
54
- this.size === 'xs' && 'px-2 py-1', this.size === 'sm' && 'px-3 py-1.5', this.size === 'default' && 'px-3 py-2', this.size === 'lg' && 'px-4 py-2',
55
- // Focus state - ZARDUI STYLE (Soft ring, no offset)
56
- !this.disabled && [
57
- 'focus-visible:outline-none',
58
- 'focus-visible:ring-4',
59
- 'focus-visible:ring-ring/30',
60
- 'focus-visible:ring-offset-0',
61
- 'focus-visible:shadow-none',
62
- 'focus-visible:border-primary/80' // Darkens border on focus
63
- ],
64
- // Hover state
65
- !this.disabled && 'hover:border-accent',
66
- // Error state
67
- this.error && [
68
- 'border-destructive',
69
- !this.disabled && [
70
- 'focus-visible:border-destructive/80',
71
- 'focus-visible:ring-destructive/30'
72
- ]
73
- ],
74
- // Disabled state
75
- this.disabled && [
76
- 'cursor-not-allowed opacity-50',
77
- 'border-opacity-50'
78
- ], this.class);
115
+ return cn(multiSelectTriggerVariants({
116
+ size: this.size,
117
+ error: this.error,
118
+ disabled: this.disabled,
119
+ }), this.class);
79
120
  }
80
121
  ngAfterContentInit() {
81
122
  this.syncItems();
82
- this.items.changes.subscribe(() => this.syncItems());
83
- }
84
- get displayItems() {
85
- return this.selectedItems.slice(0, this.maxDisplayItems);
86
- }
87
- get exceedsDisplayLimit() {
88
- return this.value.length > this.maxDisplayItems;
123
+ this.sub.add(this.items.changes.subscribe(() => {
124
+ this.syncItems();
125
+ this.cdr.markForCheck();
126
+ }));
127
+ }
128
+ /**
129
+ * `maxDisplayItems` decides how much of the selection is rendered, so the
130
+ * chip list has to be rebuilt when it changes.
131
+ *
132
+ * The `markForCheck()` is not redundant: under OnPush a `[class]` binding is
133
+ * applied through Angular's *styling* path, which writes the input but —
134
+ * unlike a plain property binding — never marks the component dirty, so the
135
+ * trigger would keep rendering the class it was born with.
136
+ */
137
+ ngOnChanges() {
138
+ this.refreshDisplay();
139
+ this.cdr.markForCheck();
140
+ }
141
+ /** `*ngFor` identity for the chips — keyed on the option value, not the
142
+ * wrapper object, which `syncItems()` re-allocates on every sync. */
143
+ trackChip = (_index, chip) => chip.value;
144
+ refreshDisplay() {
145
+ this.displayItems = this.selectedItems.slice(0, this.maxDisplayItems);
146
+ this.exceedsDisplayLimit = this.value.length > this.maxDisplayItems;
89
147
  }
90
148
  get selectableItems() {
91
149
  return this.items ? this.items.filter(item => !item.disabled) : [];
@@ -106,21 +164,30 @@ export class MultiSelectComponent {
106
164
  this.isOpen ? this.close() : this.open();
107
165
  }
108
166
  open() {
167
+ const wasOpen = this.isOpen;
109
168
  this.isOpen = true;
169
+ if (!wasOpen)
170
+ this.opened.emit();
171
+ this.cdr.markForCheck();
110
172
  setTimeout(() => {
111
173
  this.updatePosition();
112
- document.addEventListener('mousedown', this._outsideClickHandler);
174
+ document.addEventListener('pointerdown', this._outsideClickHandler, true);
113
175
  this.initActiveAfterOpen();
176
+ this.cdr.markForCheck();
114
177
  });
115
178
  }
116
179
  close() {
180
+ const wasOpen = this.isOpen;
117
181
  this.isOpen = false;
118
182
  this.searchQuery = '';
119
183
  this.onSearchChange('');
120
184
  this.resetActive();
121
185
  if (this.cleanup)
122
186
  this.cleanup();
123
- document.removeEventListener('mousedown', this._outsideClickHandler);
187
+ document.removeEventListener('pointerdown', this._outsideClickHandler, true);
188
+ if (wasOpen)
189
+ this.closed.emit();
190
+ this.cdr.markForCheck();
124
191
  }
125
192
  updatePosition() {
126
193
  if (!this.trigger || !this.popover)
@@ -136,8 +203,8 @@ export class MultiSelectComponent {
136
203
  size({
137
204
  apply({ rects, elements, availableHeight }) {
138
205
  Object.assign(elements.floating.style, {
139
- width: `${rects.reference.width}px`,
140
- maxHeight: `${availableHeight}px`
206
+ width: rects.reference.width + 'px',
207
+ maxHeight: availableHeight + 'px'
141
208
  });
142
209
  },
143
210
  }),
@@ -145,8 +212,8 @@ export class MultiSelectComponent {
145
212
  }).then(({ x, y, strategy }) => {
146
213
  Object.assign(this.popover.nativeElement.style, {
147
214
  position: strategy,
148
- left: `${x}px`,
149
- top: `${y}px`,
215
+ left: x + 'px',
216
+ top: y + 'px',
150
217
  visibility: 'visible',
151
218
  });
152
219
  });
@@ -163,7 +230,7 @@ export class MultiSelectComponent {
163
230
  this.value.push(val);
164
231
  }
165
232
  this.syncItems();
166
- this.onChange([...this.value]);
233
+ this.emitValue();
167
234
  }
168
235
  selectAll() {
169
236
  if (!this.items)
@@ -181,17 +248,23 @@ export class MultiSelectComponent {
181
248
  }
182
249
  this.value = itemsToSelect;
183
250
  this.syncItems();
184
- this.onChange([...this.value]);
251
+ this.emitValue();
185
252
  }
186
253
  clearAll() {
187
254
  this.value = [];
188
255
  this.syncItems();
189
- this.onChange([]);
256
+ this.emitValue();
190
257
  }
191
258
  removeValue(event, val) {
192
259
  event.stopPropagation();
193
260
  this.toggleValue(val);
194
261
  }
262
+ emitValue() {
263
+ const snapshot = [...this.value];
264
+ this.onChange(snapshot);
265
+ this.valueChange.emit(snapshot);
266
+ this.cdr.markForCheck();
267
+ }
195
268
  syncItems() {
196
269
  if (!this.items)
197
270
  return;
@@ -208,6 +281,8 @@ export class MultiSelectComponent {
208
281
  item.disabled = false;
209
282
  }
210
283
  });
284
+ this.refreshDisplay();
285
+ this.cdr.markForCheck();
211
286
  }
212
287
  onSearchChange(q) {
213
288
  const filter = (q || '').toLowerCase();
@@ -222,6 +297,7 @@ export class MultiSelectComponent {
222
297
  // Re-anchor the active option to the first visible match while open.
223
298
  if (this.isOpen)
224
299
  this.setActive(0);
300
+ this.cdr.markForCheck();
225
301
  }
226
302
  // ---- Keyboard navigation (WAI-ARIA listbox pattern) ----
227
303
  get navigableItems() {
@@ -238,6 +314,7 @@ export class MultiSelectComponent {
238
314
  const activeItem = this.activeIndex >= 0 ? list[this.activeIndex] ?? null : null;
239
315
  this.items?.forEach(i => (i.active = i === activeItem));
240
316
  this.syncActiveDescendant();
317
+ this.cdr.markForCheck();
241
318
  }
242
319
  syncActiveDescendant() {
243
320
  const input = this.searchInput?.nativeElement?.querySelector('input');
@@ -404,7 +481,8 @@ export class MultiSelectComponent {
404
481
  }
405
482
  }
406
483
  ngOnDestroy() {
407
- document.removeEventListener('mousedown', this._outsideClickHandler);
484
+ this.sub.unsubscribe();
485
+ document.removeEventListener('pointerdown', this._outsideClickHandler, true);
408
486
  if (this.cleanup)
409
487
  this.cleanup();
410
488
  }
@@ -414,16 +492,21 @@ export class MultiSelectComponent {
414
492
  writeValue(v) {
415
493
  this.value = Array.isArray(v) ? v : [];
416
494
  this.syncItems();
495
+ this.refreshDisplay();
496
+ this.cdr.markForCheck();
417
497
  }
418
498
  registerOnChange(fn) { this.onChange = fn; }
419
499
  registerOnTouched(fn) { this.onTouched = fn; }
420
- setDisabledState(isDisabled) { this.disabled = isDisabled; }
500
+ setDisabledState(isDisabled) {
501
+ this.disabled = isDisabled;
502
+ this.cdr.markForCheck();
503
+ }
421
504
  cn = cn;
422
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i1.SelectService }], target: i0.ɵɵFactoryTarget.Component });
423
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MultiSelectComponent, isStandalone: true, selector: "tolle-multi-select", inputs: { placeholder: "placeholder", size: "size", searchable: "searchable", disabled: "disabled", class: "class", maxSelections: "maxSelections", maxDisplayItems: "maxDisplayItems", error: "error" }, providers: [
505
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i1.SelectService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
506
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MultiSelectComponent, isStandalone: true, selector: "tolle-multi-select", inputs: { placeholder: "placeholder", size: "size", searchable: "searchable", disabled: "disabled", class: "class", maxSelections: "maxSelections", maxDisplayItems: "maxDisplayItems", error: "error" }, outputs: { valueChange: "valueChange", opened: "opened", closed: "closed" }, providers: [
424
507
  SelectService,
425
508
  { provide: NG_VALUE_ACCESSOR, useExisting: MultiSelectComponent, multi: true }
426
- ], queries: [{ propertyName: "items", predicate: SelectItemComponent, descendants: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, read: ElementRef }], ngImport: i0, template: `
509
+ ], queries: [{ propertyName: "items", predicate: SelectItemComponent, descendants: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
427
510
  <div class="relative w-full" #container>
428
511
  <button
429
512
  #trigger
@@ -439,7 +522,7 @@ export class MultiSelectComponent {
439
522
 
440
523
  <div class="flex flex-wrap gap-1 items-center max-w-[95%]">
441
524
  <ng-container *ngIf="value.length; else placeholderTpl">
442
- <tolle-badge *ngFor="let item of displayItems" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
525
+ <tolle-badge *ngFor="let item of displayItems; trackBy: trackChip" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
443
526
  {{ item.label }}
444
527
  </tolle-badge>
445
528
  <span *ngIf="exceedsDisplayLimit" class="text-xs text-muted-foreground px-1">
@@ -508,19 +591,14 @@ export class MultiSelectComponent {
508
591
  </div>
509
592
  </div>
510
593
  </div>
511
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BadgeComponent, selector: "tolle-badge", inputs: ["variant", "size", "removable", "removeLabel", "class"], outputs: ["onRemove"] }, { kind: "component", type: InputComponent, selector: "tolle-input", inputs: ["id", "label", "hint", "errorMessage", "type", "placeholder", "size", "containerClass", "class", "disabled", "readonly", "error", "hideHintOnFocus"] }] });
594
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BadgeComponent, selector: "tolle-badge", inputs: ["variant", "size", "removable", "removeLabel", "class"], outputs: ["onRemove"] }, { kind: "component", type: InputComponent, selector: "tolle-input", inputs: ["id", "label", "hint", "errorMessage", "type", "placeholder", "size", "containerClass", "class", "disabled", "readonly", "error", "hideHintOnFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
512
595
  }
513
596
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiSelectComponent, decorators: [{
514
597
  type: Component,
515
- args: [{
516
- selector: 'tolle-multi-select',
517
- standalone: true,
518
- imports: [CommonModule, FormsModule, BadgeComponent, InputComponent],
519
- providers: [
598
+ args: [{ selector: 'tolle-multi-select', standalone: true, imports: [CommonModule, FormsModule, BadgeComponent, InputComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
520
599
  SelectService,
521
600
  { provide: NG_VALUE_ACCESSOR, useExisting: MultiSelectComponent, multi: true }
522
- ],
523
- template: `
601
+ ], template: `
524
602
  <div class="relative w-full" #container>
525
603
  <button
526
604
  #trigger
@@ -536,7 +614,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
536
614
 
537
615
  <div class="flex flex-wrap gap-1 items-center max-w-[95%]">
538
616
  <ng-container *ngIf="value.length; else placeholderTpl">
539
- <tolle-badge *ngFor="let item of displayItems" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
617
+ <tolle-badge *ngFor="let item of displayItems; trackBy: trackChip" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
540
618
  {{ item.label }}
541
619
  </tolle-badge>
542
620
  <span *ngIf="exceedsDisplayLimit" class="text-xs text-muted-foreground px-1">
@@ -605,9 +683,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
605
683
  </div>
606
684
  </div>
607
685
  </div>
608
- `
609
- }]
610
- }], ctorParameters: () => [{ type: i1.SelectService }], propDecorators: { placeholder: [{
686
+ `, styles: [":host{display:block}\n"] }]
687
+ }], ctorParameters: () => [{ type: i1.SelectService }, { type: i0.ChangeDetectorRef }], propDecorators: { placeholder: [{
611
688
  type: Input
612
689
  }], size: [{
613
690
  type: Input
@@ -623,6 +700,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
623
700
  type: Input
624
701
  }], error: [{
625
702
  type: Input
703
+ }], valueChange: [{
704
+ type: Output
705
+ }], opened: [{
706
+ type: Output
707
+ }], closed: [{
708
+ type: Output
626
709
  }], trigger: [{
627
710
  type: ViewChild,
628
711
  args: ['trigger']
@@ -636,4 +719,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
636
719
  type: ContentChildren,
637
720
  args: [SelectItemComponent, { descendants: true }]
638
721
  }] } });
639
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQStCLFVBQVUsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDakksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFpR25ELE1BQU0sT0FBTyxvQkFBb0I7SUE0Qlg7SUEzQlgsV0FBVyxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLElBQUksR0FBbUMsU0FBUyxDQUFDO0lBQ2pELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1gsYUFBYSxDQUFVO0lBQ3ZCLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDcEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlDQUFpQztJQUVu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LEVBQUUsY0FBYyxDQUFDO29CQUNwRSxTQUFTLEVBQUU7d0JBQ1QsYUFBYTt3QkFDYixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLHNCQUFzQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7cUJBQy9FO29CQUNELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFGVDtpQkFDRjtrRkFFVSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRWdCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDRSxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQzRCLFdBQVc7c0JBQTFELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDZSxLQUFLO3NCQUFqRSxlQUFlO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBBZnRlckNvbnRlbnRJbml0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUsIHNpemUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IFNlbGVjdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi9zZWxlY3Quc2VydmljZSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2lucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYWRnZUNvbXBvbmVudCB9IGZyb20gJy4vYmFkZ2UuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtbXVsdGktc2VsZWN0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEJhZGdlQ29tcG9uZW50LCBJbnB1dENvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW1xuICAgIFNlbGVjdFNlcnZpY2UsXG4gICAgeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IE11bHRpU2VsZWN0Q29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiICNjb250YWluZXI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICN0cmlnZ2VyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCJcbiAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImlzT3BlbiA/IGFjdGl2ZURlc2NlbmRhbnRJZCA6IG51bGxcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblRyaWdnZXJLZXlEb3duKCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3NdPVwiY29tcHV0ZWRUcmlnZ2VyQ2xhc3NcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTEgaXRlbXMtY2VudGVyIG1heC13LVs5NSVdXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhbHVlLmxlbmd0aDsgZWxzZSBwbGFjZWhvbGRlclRwbFwiPlxuICAgICAgICAgICAgPHRvbGxlLWJhZGdlICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRpc3BsYXlJdGVtc1wiIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAob25SZW1vdmUpPVwicmVtb3ZlVmFsdWUoJGV2ZW50LCBpdGVtLnZhbHVlKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L3RvbGxlLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJleGNlZWRzRGlzcGxheUxpbWl0XCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0xXCI+XG4gICAgICAgICAgICAgICt7eyB2YWx1ZS5sZW5ndGggLSBtYXhEaXNwbGF5SXRlbXMgfX0gbW9yZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhTZWxlY3Rpb25zICYmIHZhbHVlLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb25zXCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0xXCI+XG4gICAgICAgICAgICAgIChNYXggcmVhY2hlZClcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVHBsPjxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW4+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpIFtjbGFzc109XCJjbigncmktYXJyb3ctZG93bi1zLWxpbmUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG1sLTIgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwJywgaXNPcGVuID8gJ3JvdGF0ZS0xODAnIDogJycpXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxkaXYgI3BvcG92ZXIgKm5nSWY9XCJpc09wZW5cIlxuICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgIGNsYXNzPVwiZml4ZWQgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCB6LVs5OTldIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgc2hhZG93LW1kIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuOyB0b3A6IDA7IGxlZnQ6IDA7XCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtMiBib3JkZXItYiBib3JkZXItYm9yZGVyIHNwYWNlLXktMiBiZy1wb3BvdmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC0xIHRleHQteHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICAgIHt7IHZhbHVlLmxlbmd0aCB9fSBzZWxlY3RlZFxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1heFNlbGVjdGlvbnNcIj4vIHt7IG1heFNlbGVjdGlvbnMgfX0gbWF4PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhTZWxlY3Rpb25zICYmIHZhbHVlLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb25zXCIgY2xhc3M9XCJ0ZXh0LWRlc3RydWN0aXZlIHRleHQteHMgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgTWF4aW11bSByZWFjaGVkXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8dG9sbGUtaW5wdXQgKm5nSWY9XCJzZWFyY2hhYmxlXCIgI3NlYXJjaElucHV0IHNpemU9XCJ4c1wiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIiAoa2V5ZG93bik9XCJvblNlYXJjaEtleURvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGkgcHJlZml4IGNsYXNzPVwicmktc2VhcmNoLWxpbmVcIj48L2k+XG4gICAgICAgICAgPC90b2xsZS1pbnB1dD5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhKG1heFNlbGVjdGlvbnMgJiYgc2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCA+IG1heFNlbGVjdGlvbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICBtYXhTZWxlY3Rpb25zICYmIHNlbGVjdGFibGVJdGVtcy5sZW5ndGggPiBtYXhTZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0ZXh0LW11dGVkLWZvcmVncm91bmQgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dC1wcmltYXJ5IGhvdmVyOnVuZGVybGluZSdcbiAgICAgICAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgICBTZWxlY3QgQWxsXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbGVhckFsbCgpXCIgY2xhc3M9XCJ0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp1bmRlcmxpbmVcIj5cbiAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0xIG1heC1oLTYwIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibm9SZXN1bHRzXCIgY2xhc3M9XCJweS00IHRleHQtY2VudGVyIHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICBObyByZXN1bHRzIGZvdW5kIGZvciBcInt7c2VhcmNoUXVlcnl9fVwiXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm1heFNlbGVjdGlvbnMgJiYgdmFsdWUubGVuZ3RoID49IG1heFNlbGVjdGlvbnNcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJwLTIgdGV4dC1jZW50ZXIgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBiZy1tdXRlZC8yMFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZGVzdHJ1Y3RpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hbGVydC1saW5lIG1yLTFcIj48L2k+XG4gICAgICAgICAgICAgIE1heGltdW0gc2VsZWN0aW9uIGxpbWl0IHJlYWNoZWQgKHt7bWF4U2VsZWN0aW9uc319KVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCBvcHRpb25zLi4uJztcbiAgQElucHV0KCkgc2l6ZTogJ3hzJyB8ICdzbScgfCAnZGVmYXVsdCcgfCAnbGcnID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBzZWFyY2hhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIEBJbnB1dCgpIG1heFNlbGVjdGlvbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG1heERpc3BsYXlJdGVtcyA9IDM7XG4gIEBJbnB1dCgpIGVycm9yID0gZmFsc2U7IC8vIEFkZGVkIHRvIHN1cHBvcnQgZXJyb3Igc3R5bGluZ1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInKSB0cmlnZ2VyITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncG9wb3ZlcicpIHBvcG92ZXIhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBzZWFyY2hJbnB1dD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAQ29udGVudENoaWxkcmVuKFNlbGVjdEl0ZW1Db21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgaXRlbXMhOiBRdWVyeUxpc3Q8U2VsZWN0SXRlbUNvbXBvbmVudD47XG5cbiAgdmFsdWU6IGFueVtdID0gW107XG4gIHNlbGVjdGVkSXRlbXM6IHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IGFueSB9W10gPSBbXTtcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHNlYXJjaFF1ZXJ5ID0gJyc7XG4gIG5vUmVzdWx0cyA9IGZhbHNlO1xuICBwcml2YXRlIGNsZWFudXA/OiAoKSA9PiB2b2lkO1xuXG4gIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gKGFjdGl2ZS1kZXNjZW5kYW50KSBzdGF0ZVxuICBhY3RpdmVJbmRleCA9IC0xO1xuICBwcml2YXRlIHR5cGVhaGVhZEJ1ZmZlciA9ICcnO1xuICBwcml2YXRlIHR5cGVhaGVhZFRpbWUgPSAwO1xuICBwcml2YXRlIHBlbmRpbmdUeXBlYWhlYWRDaGFyID0gJyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZWxlY3RTZXJ2aWNlOiBTZWxlY3RTZXJ2aWNlKSB7XG4gICAgdGhpcy5zZWxlY3RTZXJ2aWNlLnNlbGVjdGVkVmFsdWUkLnN1YnNjcmliZSh2YWwgPT4ge1xuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNPcGVuKSB0aGlzLnRvZ2dsZVZhbHVlKHZhbCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBORVc6IE1hdGNoZXMgSW5wdXRDb21wb25lbnQgc3R5bGVzIGV4YWN0bHlcbiAgZ2V0IGNvbXB1dGVkVHJpZ2dlckNsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2Ugc3R5bGVzXG4gICAgICAnZmxleCBtaW4taC0xMCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgaC1hdXRvJyxcbiAgICAgICdiZy1iYWNrZ3JvdW5kIHRleHQtc20nLFxuXG4gICAgICAvLyBCb3JkZXIgYW5kIHNoYWRvd1xuICAgICAgJ2JvcmRlci1pbnB1dCBzaGFkb3ctc20nLFxuXG4gICAgICAvLyBQYWRkaW5nIGJhc2VkIG9uIHNpemUgKGFsaWduZWQgd2l0aCBJbnB1dENvbXBvbmVudCBsb2dpYylcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3hzJyAmJiAncHgtMiBweS0xJyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3NtJyAmJiAncHgtMyBweS0xLjUnLFxuICAgICAgdGhpcy5zaXplID09PSAnZGVmYXVsdCcgJiYgJ3B4LTMgcHktMicsXG4gICAgICB0aGlzLnNpemUgPT09ICdsZycgJiYgJ3B4LTQgcHktMicsXG5cbiAgICAgIC8vIEZvY3VzIHN0YXRlIC0gWkFSRFVJIFNUWUxFIChTb2Z0IHJpbmcsIG5vIG9mZnNldClcbiAgICAgICF0aGlzLmRpc2FibGVkICYmIFtcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6cmluZy00JyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6cmluZy1yaW5nLzMwJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMCcsXG4gICAgICAgICdmb2N1cy12aXNpYmxlOnNoYWRvdy1ub25lJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXByaW1hcnkvODAnIC8vIERhcmtlbnMgYm9yZGVyIG9uIGZvY3VzXG4gICAgICBdLFxuXG4gICAgICAvLyBIb3ZlciBzdGF0ZVxuICAgICAgIXRoaXMuZGlzYWJsZWQgJiYgJ2hvdmVyOmJvcmRlci1hY2NlbnQnLFxuXG4gICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgdGhpcy5lcnJvciAmJiBbXG4gICAgICAgICdib3JkZXItZGVzdHJ1Y3RpdmUnLFxuICAgICAgICAhdGhpcy5kaXNhYmxlZCAmJiBbXG4gICAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLWRlc3RydWN0aXZlLzgwJyxcbiAgICAgICAgICAnZm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzMwJ1xuICAgICAgICBdXG4gICAgICBdLFxuXG4gICAgICAvLyBEaXNhYmxlZCBzdGF0ZVxuICAgICAgdGhpcy5kaXNhYmxlZCAmJiBbXG4gICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS01MCcsXG4gICAgICAgICdib3JkZXItb3BhY2l0eS01MCdcbiAgICAgIF0sXG5cbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5pdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmNJdGVtcygpKTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5SXRlbXMoKTogeyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogYW55IH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcy5zbGljZSgwLCB0aGlzLm1heERpc3BsYXlJdGVtcyk7XG4gIH1cblxuICBnZXQgZXhjZWVkc0Rpc3BsYXlMaW1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggPiB0aGlzLm1heERpc3BsYXlJdGVtcztcbiAgfVxuXG4gIGdldCBzZWxlY3RhYmxlSXRlbXMoKTogU2VsZWN0SXRlbUNvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcyA/IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpIDogW107XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlU2VsZWN0aW9ucygpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5tYXhTZWxlY3Rpb25zKSByZXR1cm4gSW5maW5pdHk7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMubWF4U2VsZWN0aW9ucyAtIHRoaXMudmFsdWUubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgX291dHNpZGVDbGlja0hhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoIXRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgIXRoaXMucG9wb3Zlcj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX291dHNpZGVDbGlja0hhbmRsZXIpO1xuICAgICAgdGhpcy5pbml0QWN0aXZlQWZ0ZXJPcGVuKCk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcbiAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCcnKTtcbiAgICB0aGlzLnJlc2V0QWN0aXZlKCk7XG4gICAgaWYgKHRoaXMuY2xlYW51cCkgdGhpcy5jbGVhbnVwKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb3V0c2lkZUNsaWNrSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgIGlmICghdGhpcy50cmlnZ2VyIHx8ICF0aGlzLnBvcG92ZXIpIHJldHVybjtcblxuICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LCAoKSA9PiB7XG4gICAgICBjb21wdXRlUG9zaXRpb24odGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIHN0cmF0ZWd5OiAnZml4ZWQnLFxuICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnLFxuICAgICAgICBtaWRkbGV3YXJlOiBbXG4gICAgICAgICAgb2Zmc2V0KDQpLFxuICAgICAgICAgIGZsaXAoKSxcbiAgICAgICAgICBzaGlmdCh7IHBhZGRpbmc6IDggfSksXG4gICAgICAgICAgc2l6ZSh7XG4gICAgICAgICAgICBhcHBseSh7IHJlY3RzLCBlbGVtZW50cywgYXZhaWxhYmxlSGVpZ2h0IH0pIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50cy5mbG9hdGluZy5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBgJHtyZWN0cy5yZWZlcmVuY2Uud2lkdGh9cHhgLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogYCR7YXZhaWxhYmxlSGVpZ2h0fXB4YFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KS50aGVuKCh7IHgsIHksIHN0cmF0ZWd5IH0pID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgIHBvc2l0aW9uOiBzdHJhdGVneSxcbiAgICAgICAgICBsZWZ0OiBgJHt4fXB4YCxcbiAgICAgICAgICB0b3A6IGAke3l9cHhgLFxuICAgICAgICAgIHZpc2liaWxpdHk6ICd2aXNpYmxlJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVZhbHVlKHZhbDogYW55KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbHVlLmluZGV4T2YodmFsKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5tYXhTZWxlY3Rpb25zICYmIHRoaXMudmFsdWUubGVuZ3RoID49IHRoaXMubWF4U2VsZWN0aW9ucykgcmV0dXJuO1xuICAgICAgdGhpcy52YWx1ZS5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5vbkNoYW5nZShbLi4udGhpcy52YWx1ZV0pO1xuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIGlmICghdGhpcy5pdGVtcykgcmV0dXJuO1xuICAgIGxldCBpdGVtc1RvU2VsZWN0OiBhbnlbXSA9IFtdO1xuICAgIGlmICh0aGlzLm1heFNlbGVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUl0ZW1zID0gdGhpcy5pdGVtc1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQgJiYgIXRoaXMudmFsdWUuaW5jbHVkZXMoaXRlbS52YWx1ZSkpXG4gICAgICAgIC5zbGljZSgwLCB0aGlzLmF2YWlsYWJsZVNlbGVjdGlvbnMpXG4gICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKTtcbiAgICAgIGl0ZW1zVG9TZWxlY3QgPSBbLi4udGhpcy52YWx1ZSwgLi4uYXZhaWxhYmxlSXRlbXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc1RvU2VsZWN0ID0gdGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCkubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBpdGVtc1RvU2VsZWN0O1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5vbkNoYW5nZShbLi4udGhpcy52YWx1ZV0pO1xuICB9XG5cbiAgY2xlYXJBbGwoKSB7XG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5vbkNoYW5nZShbXSk7XG4gIH1cblxuICByZW1vdmVWYWx1ZShldmVudDogTW91c2VFdmVudCwgdmFsOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRvZ2dsZVZhbHVlKHZhbCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNJdGVtcygpIHtcbiAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLnNlbGVjdGVkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyhpdGVtLnZhbHVlKTtcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKHsgbGFiZWw6IGl0ZW0uZ2V0TGFiZWwoKSwgdmFsdWU6IGl0ZW0udmFsdWUgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXhTZWxlY3Rpb25zICYmIHRoaXMudmFsdWUubGVuZ3RoID49IHRoaXMubWF4U2VsZWN0aW9ucykge1xuICAgICAgICBpdGVtLmRpc2FibGVkID0gIXRoaXMudmFsdWUuaW5jbHVkZXMoaXRlbS52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgaXRlbS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2hDaGFuZ2UocTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsdGVyID0gKHEgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IHZpc2libGVDb3VudCA9IDA7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5nZXRMYWJlbCgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICAgIGl0ZW0uaGlkZGVuID0gIWlzVmlzaWJsZTtcbiAgICAgIGlmIChpc1Zpc2libGUpIHZpc2libGVDb3VudCsrO1xuICAgIH0pO1xuICAgIHRoaXMubm9SZXN1bHRzID0gdmlzaWJsZUNvdW50ID09PSAwICYmIGZpbHRlciAhPT0gJyc7XG5cbiAgICAvLyBSZS1hbmNob3IgdGhlIGFjdGl2ZSBvcHRpb24gdG8gdGhlIGZpcnN0IHZpc2libGUgbWF0Y2ggd2hpbGUgb3Blbi5cbiAgICBpZiAodGhpcy5pc09wZW4pIHRoaXMuc2V0QWN0aXZlKDApO1xuICB9XG5cbiAgLy8gLS0tLSBLZXlib2FyZCBuYXZpZ2F0aW9uIChXQUktQVJJQSBsaXN0Ym94IHBhdHRlcm4pIC0tLS1cblxuICBwcml2YXRlIGdldCBuYXZpZ2FibGVJdGVtcygpOiBTZWxlY3RJdGVtQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy5maWx0ZXIoaSA9PiAhaS5oaWRkZW4gJiYgIWkuZGlzYWJsZWQpIDogW107XG4gIH1cblxuICBnZXQgYWN0aXZlRGVzY2VuZGFudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm5hdmlnYWJsZUl0ZW1zO1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUluZGV4ID49IDAgJiYgdGhpcy5hY3RpdmVJbmRleCA8IGxpc3QubGVuZ3RoXG4gICAgICA/IGxpc3RbdGhpcy5hY3RpdmVJbmRleF0uaWRcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWN0aXZlU3RhdGVzKCkge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm5hdmlnYWJsZUl0ZW1zO1xuICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLmFjdGl2ZUluZGV4ID49IDAgPyBsaXN0W3RoaXMuYWN0aXZlSW5kZXhdID8/IG51bGwgOiBudWxsO1xuICAgIHRoaXMuaXRlbXM/LmZvckVhY2goaSA9PiAoaS5hY3RpdmUgPSBpID09PSBhY3RpdmVJdGVtKSk7XG4gICAgdGhpcy5zeW5jQWN0aXZlRGVzY2VuZGFudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQWN0aXZlRGVzY2VuZGFudCgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gdGhpcy5hY3RpdmVEZXNjZW5kYW50SWQ7XG4gICAgaWYgKGlkKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsIGlkKTtcbiAgICBlbHNlIGlucHV0LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZShpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubmF2aWdhYmxlSXRlbXM7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IC0xO1xuICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdGF0ZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBsaXN0Lmxlbmd0aCAtIDEpKTtcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0YXRlcygpO1xuICAgIGxpc3RbdGhpcy5hY3RpdmVJbmRleF0/LnNjcm9sbEludG9BY3RpdmVWaWV3KCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZUl0ZW0oaXRlbTogU2VsZWN0SXRlbUNvbXBvbmVudCkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMubmF2aWdhYmxlSXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaWR4ID49IDApIHRoaXMuc2V0QWN0aXZlKGlkeCk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVBY3RpdmUoZGVsdGE6IG51bWJlcikge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm5hdmlnYWJsZUl0ZW1zO1xuICAgIGlmICghbGlzdC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5hY3RpdmVJbmRleCA8IDAgPyAoZGVsdGEgPiAwID8gMCA6IGxpc3QubGVuZ3RoIC0gMSkgOiB0aGlzLmFjdGl2ZUluZGV4ICsgZGVsdGE7XG4gICAgdGhpcy5zZXRBY3RpdmUobmV4dCk7IC8vIHNldEFjdGl2ZSBjbGFtcHMgKG5vIHdyYXAsIG1hdGNoaW5nIHNoYWRjbilcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlVG9TZWxlY3RlZE9yRmlyc3QoKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubmF2aWdhYmxlSXRlbXM7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IC0xO1xuICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdGF0ZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsSWR4ID0gbGlzdC5maW5kSW5kZXgoaSA9PiB0aGlzLnZhbHVlLmluY2x1ZGVzKGkudmFsdWUpKTtcbiAgICB0aGlzLnNldEFjdGl2ZShzZWxJZHggPj0gMCA/IHNlbElkeCA6IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QWN0aXZlQWZ0ZXJPcGVuKCkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdUeXBlYWhlYWRDaGFyKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5wZW5kaW5nVHlwZWFoZWFkQ2hhcjtcbiAgICAgIHRoaXMucGVuZGluZ1R5cGVhaGVhZENoYXIgPSAnJztcbiAgICAgIHRoaXMuc2V0QWN0aXZlVG9TZWxlY3RlZE9yRmlyc3QoKTtcbiAgICAgIHRoaXMudHlwZWFoZWFkKGMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZVRvU2VsZWN0ZWRPckZpcnN0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEFjdGl2ZSgpIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gLTE7XG4gICAgdGhpcy50eXBlYWhlYWRCdWZmZXIgPSAnJztcbiAgICB0aGlzLnBlbmRpbmdUeXBlYWhlYWRDaGFyID0gJyc7XG4gICAgdGhpcy5pdGVtcz8uZm9yRWFjaChpID0+IChpLmFjdGl2ZSA9IGZhbHNlKSk7XG4gIH1cblxuICBwcml2YXRlIGlzVHlwZWFoZWFkQ2hhcihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmIGV2ZW50LmtleSAhPT0gJyAnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXk7XG4gIH1cblxuICBwcml2YXRlIHR5cGVhaGVhZChjaGFyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgYmFzZWQgb24gZWxhcHNlZCB0aW1lIChjb3JyZWN0bmVzcyBpcyBub3QgdGltZXItZHJpdmVuKS5cbiAgICBpZiAobm93IC0gdGhpcy50eXBlYWhlYWRUaW1lID4gNTAwKSB0aGlzLnR5cGVhaGVhZEJ1ZmZlciA9ICcnO1xuICAgIHRoaXMudHlwZWFoZWFkVGltZSA9IG5vdztcbiAgICB0aGlzLnR5cGVhaGVhZEJ1ZmZlciArPSBjaGFyLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLm5hdmlnYWJsZUl0ZW1zLmZpbmQoaSA9PlxuICAgICAgaS5nZXRMYWJlbCgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0aGlzLnR5cGVhaGVhZEJ1ZmZlcilcbiAgICApO1xuICAgIGlmIChtYXRjaCkgdGhpcy5zZXRBY3RpdmVJdGVtKG1hdGNoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0QWN0aXZlKCkge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm5hdmlnYWJsZUl0ZW1zW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIC8vIE11bHRpLXNlbGVjdDogbWlycm9yIFNlbGVjdEl0ZW1Db21wb25lbnQub25DbGljayDigJQgdG9nZ2xlIGFuZCBzdGF5IG9wZW4uXG4gICAgaXRlbS5zZWxlY3RlZCA9ICFpdGVtLnNlbGVjdGVkO1xuICAgIHRoaXMuc2VsZWN0U2VydmljZS5yZWdpc3RlckNsaWNrKGl0ZW0udmFsdWUsIGl0ZW0uZ2V0TGFiZWwoKSk7XG4gICAgLy8gc3luY0l0ZW1zKCkgcmFuIHN5bmNocm9ub3VzbHkgdmlhIHRoZSBzZXJ2aWNlIHN1YnNjcmlwdGlvbjsga2VlcCB0aGVcbiAgICAvLyBzYW1lIG9wdGlvbiBoaWdobGlnaHRlZCAoaXRzIGluZGV4IG1heSBoYXZlIHNoaWZ0ZWQpLlxuICAgIHRoaXMuc2V0QWN0aXZlSXRlbShpdGVtKTtcbiAgfVxuXG4gIG9uVHJpZ2dlcktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcblxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgIGlmIChrZXkgPT09ICdBcnJvd0Rvd24nIHx8IGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0VudGVyJyB8fCBrZXkgPT09ICcgJyB8fCBrZXkgPT09ICdIb21lJyB8fCBrZXkgPT09ICdFbmQnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1R5cGVhaGVhZENoYXIoZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucGVuZGluZ1R5cGVhaGVhZENoYXIgPSBrZXk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLm1vdmVBY3RpdmUoMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMubW92ZUFjdGl2ZSgtMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnSG9tZSc6IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuc2V0QWN0aXZlKDApOyBicmVhaztcbiAgICAgIGNhc2UgJ0VuZCc6IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuc2V0QWN0aXZlKHRoaXMubmF2aWdhYmxlSXRlbXMubGVuZ3RoIC0gMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodGhpcy5pc1R5cGVhaGVhZENoYXIoZXZlbnQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnR5cGVhaGVhZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gS2V5ZG93biB3aGlsZSB0aGUgKG9wdGlvbmFsKSBzZWFyY2ggaW5wdXQgaXMgZm9jdXNlZC4gQXJyb3dzL0VudGVyL0VzY2FwZVxuICAvLyBkcml2ZSB0aGUgbGlzdDsgb3RoZXIga2V5cyBmYWxsIHRocm91Z2ggc28gdGhlIHVzZXIgY2FuIHR5cGUgdG8gZmlsdGVyLlxuICBvblNlYXJjaEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMubW92ZUFjdGl2ZSgxKTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzogZXZlbnQucHJldmVudERlZmF1bHQoKTsgdGhpcy5tb3ZlQWN0aXZlKC0xKTsgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuc2VsZWN0QWN0aXZlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vdXRzaWRlQ2xpY2tIYW5kbGVyKTtcbiAgICBpZiAodGhpcy5jbGVhbnVwKSB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7IH07XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4geyB9O1xuICB3cml0ZVZhbHVlKHY6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkodikgPyB2IDogW107XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHsgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7IH1cblxuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cbiJdfQ==
722
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGVBQWUsRUFHZixVQUFVLEVBQ1YsU0FBUyxFQUdULHVCQUF1QixHQUV4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsR0FBRyxFQUFxQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFFbkQsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQ3BDLHFKQUFxSixFQUNySjtJQUNFLFFBQVEsRUFBRTtRQUNSLElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxXQUFXO1lBQ2YsRUFBRSxFQUFFLGFBQWE7WUFDakIsT0FBTyxF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RSxZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUZUO2tIQUtRLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRWUsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNFLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDNEIsV0FBVztzQkFBMUQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNlLEtBQUs7c0JBQWpFLGVBQWU7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUsIHNpemUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTZWxlY3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9zZWxlY3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VsZWN0U2VydmljZSB9IGZyb20gJy4vc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7IElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tICcuL2JhZGdlLmNvbXBvbmVudCc7XG5cbmNvbnN0IG11bHRpU2VsZWN0VHJpZ2dlclZhcmlhbnRzID0gY3ZhKFxuICAnZmxleCBoLWF1dG8gbWluLWgtMTAgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgdGV4dC1zbSBzaGFkb3ctc20gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICBzaXplOiB7XG4gICAgICAgIHhzOiAncHgtMiBweS0xJyxcbiAgICAgICAgc206ICdweC0zIHB5LTEuNScsXG4gICAgICAgIGRlZmF1bHQ6ICdweC0zIHB5LTInLFxuICAgICAgICBsZzogJ3B4LTQgcHktMicsXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgdHJ1ZTogJ2JvcmRlci1kZXN0cnVjdGl2ZScsXG4gICAgICAgIGZhbHNlOiAnJyxcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZDoge1xuICAgICAgICB0cnVlOiAnY3Vyc29yLW5vdC1hbGxvd2VkIGJvcmRlci1vcGFjaXR5LTUwIG9wYWNpdHktNTAnLFxuICAgICAgICBmYWxzZTogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcG91bmRWYXJpYW50czogW1xuICAgICAgLy8gT25seSBhbiBpbnRlcmFjdGl2ZSB0cmlnZ2VyIGdldHMgdGhlIGhvdmVyIGJvcmRlciBhbmQgdGhlIGZvY3VzIHJpbmcuXG4gICAgICB7XG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgY2xhc3M6XG4gICAgICAgICAgJ2hvdmVyOmJvcmRlci1hY2NlbnQgZm9jdXMtdmlzaWJsZTpib3JkZXItcHJpbWFyeS84MCBmb2N1cy12aXNpYmxlOnNoYWRvdy1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy00IGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzMwIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMCcsXG4gICAgICB9LFxuICAgICAgLy8g4oCmYW5kIGFuIGludmFsaWQgb25lIHJpbmdzIGRlc3RydWN0aXZlIGluc3RlYWQuIERlY2xhcmVkIGFmdGVyIHRoZSBydWxlXG4gICAgICAvLyBhYm92ZSBzbyBgY24oKWAgcmVzb2x2ZXMgdGhlIGNvbmZsaWN0IGluIGl0cyBmYXZvdXIuXG4gICAgICB7XG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgIGNsYXNzOiAnZm9jdXMtdmlzaWJsZTpib3JkZXItZGVzdHJ1Y3RpdmUvODAgZm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzMwJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHsgc2l6ZTogJ2RlZmF1bHQnLCBlcnJvcjogZmFsc2UsIGRpc2FibGVkOiBmYWxzZSB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBNdWx0aVNlbGVjdFByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBtdWx0aVNlbGVjdFRyaWdnZXJWYXJpYW50cz47XG5cbi8qKiBPbmUgY2hpcCBvbiB0aGUgdHJpZ2dlciwgc3RhbmRpbmcgZm9yIGEgc2VsZWN0ZWQgb3B0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNlbGVjdENoaXAge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xufVxuXG4vKipcbiAqIEEgbXVsdGktc2VsZWN0IGxpc3Rib3g6IGEgdHJpZ2dlciB0aGF0IHNob3dzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhc1xuICogcmVtb3ZhYmxlIGNoaXBzIGFuZCBvcGVucyBhIGZsb2F0aW5nIHBhbmVsIG9mIGB0b2xsZS1zZWxlY3QtaXRlbWAgb3B0aW9ucy5cbiAqIEltcGxlbWVudHMgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCwgc28gaXQgd29ya3Mgd2l0aCBgbmdNb2RlbGAgYW5kIHJlYWN0aXZlXG4gKiBmb3Jtcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtbXVsdGktc2VsZWN0JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEJhZGdlQ29tcG9uZW50LCBJbnB1dENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICBTZWxlY3RTZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBNdWx0aVNlbGVjdENvbXBvbmVudCwgbXVsdGk6IHRydWUgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGxcIiAjY29udGFpbmVyPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAjdHJpZ2dlclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJpc09wZW4gPyBhY3RpdmVEZXNjZW5kYW50SWQgOiBudWxsXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbXB1dGVkVHJpZ2dlckNsYXNzXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0xIGl0ZW1zLWNlbnRlciBtYXgtdy1bOTUlXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YWx1ZS5sZW5ndGg7IGVsc2UgcGxhY2Vob2xkZXJUcGxcIj5cbiAgICAgICAgICAgIDx0b2xsZS1iYWRnZSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkaXNwbGF5SXRlbXM7IHRyYWNrQnk6IHRyYWNrQ2hpcFwiIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAob25SZW1vdmUpPVwicmVtb3ZlVmFsdWUoJGV2ZW50LCBpdGVtLnZhbHVlKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L3RvbGxlLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJleGNlZWRzRGlzcGxheUxpbWl0XCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0xXCI+XG4gICAgICAgICAgICAgICt7eyB2YWx1ZS5sZW5ndGggLSBtYXhEaXNwbGF5SXRlbXMgfX0gbW9yZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhTZWxlY3Rpb25zICYmIHZhbHVlLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb25zXCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0xXCI+XG4gICAgICAgICAgICAgIChNYXggcmVhY2hlZClcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVHBsPjxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW4+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpIFtjbGFzc109XCJjbigncmktYXJyb3ctZG93bi1zLWxpbmUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG1sLTIgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwJywgaXNPcGVuID8gJ3JvdGF0ZS0xODAnIDogJycpXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxkaXYgI3BvcG92ZXIgKm5nSWY9XCJpc09wZW5cIlxuICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgIGNsYXNzPVwiZml4ZWQgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCB6LVs5OTldIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgc2hhZG93LW1kIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuOyB0b3A6IDA7IGxlZnQ6IDA7XCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtMiBib3JkZXItYiBib3JkZXItYm9yZGVyIHNwYWNlLXktMiBiZy1wb3BvdmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC0xIHRleHQteHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICAgIHt7IHZhbHVlLmxlbmd0aCB9fSBzZWxlY3RlZFxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1heFNlbGVjdGlvbnNcIj4vIHt7IG1heFNlbGVjdGlvbnMgfX0gbWF4PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhTZWxlY3Rpb25zICYmIHZhbHVlLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb25zXCIgY2xhc3M9XCJ0ZXh0LWRlc3RydWN0aXZlIHRleHQteHMgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgTWF4aW11bSByZWFjaGVkXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8dG9sbGUtaW5wdXQgKm5nSWY9XCJzZWFyY2hhYmxlXCIgI3NlYXJjaElucHV0IHNpemU9XCJ4c1wiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIiAoa2V5ZG93bik9XCJvblNlYXJjaEtleURvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGkgcHJlZml4IGNsYXNzPVwicmktc2VhcmNoLWxpbmVcIj48L2k+XG4gICAgICAgICAgPC90b2xsZS1pbnB1dD5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhKG1heFNlbGVjdGlvbnMgJiYgc2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCA+IG1heFNlbGVjdGlvbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICBtYXhTZWxlY3Rpb25zICYmIHNlbGVjdGFibGVJdGVtcy5sZW5ndGggPiBtYXhTZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0ZXh0LW11dGVkLWZvcmVncm91bmQgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dC1wcmltYXJ5IGhvdmVyOnVuZGVybGluZSdcbiAgICAgICAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgICBTZWxlY3QgQWxsXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbGVhckFsbCgpXCIgY2xhc3M9XCJ0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp1bmRlcmxpbmVcIj5cbiAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0xIG1heC1oLTYwIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibm9SZXN1bHRzXCIgY2xhc3M9XCJweS00IHRleHQtY2VudGVyIHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICBObyByZXN1bHRzIGZvdW5kIGZvciBcInt7c2VhcmNoUXVlcnl9fVwiXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm1heFNlbGVjdGlvbnMgJiYgdmFsdWUubGVuZ3RoID49IG1heFNlbGVjdGlvbnNcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJwLTIgdGV4dC1jZW50ZXIgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBiZy1tdXRlZC8yMFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZGVzdHJ1Y3RpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hbGVydC1saW5lIG1yLTFcIj48L2k+XG4gICAgICAgICAgICAgIE1heGltdW0gc2VsZWN0aW9uIGxpbWl0IHJlYWNoZWQgKHt7bWF4U2VsZWN0aW9uc319KVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqIFRleHQgc2hvd24gb24gdGhlIHRyaWdnZXIgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLiBAZGVmYXVsdCAnU2VsZWN0IG9wdGlvbnMuLi4nICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCBvcHRpb25zLi4uJztcbiAgLyoqIFBhZGRpbmcgYW5kIHRleHQgc2l6ZSBvZiB0aGUgdHJpZ2dlci4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHNpemU6IE11bHRpU2VsZWN0UHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIEFkZHMgYSBzZWFyY2ggYm94IHRoYXQgZmlsdGVycyB0aGUgcHJvamVjdGVkIG9wdGlvbnMuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIHNlYXJjaGFibGUgPSBmYWxzZTtcbiAgLyoqIERpc2FibGVzIHRoZSBjb250cm9sIGFuZCBibG9ja3Mgb3BlbmluZyB0aGUgcGFuZWwuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSB0cmlnZ2VyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIC8qKiBMYXJnZXN0IG51bWJlciBvZiB2YWx1ZXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgYXQgb25jZTsgbGVhdmUgdW5zZXQgZm9yIG5vIGNhcC4gKi9cbiAgQElucHV0KCkgbWF4U2VsZWN0aW9ucz86IG51bWJlcjtcbiAgLyoqIEhvdyBtYW55IGNoaXBzIHRvIHJlbmRlciBiZWZvcmUgY29sbGFwc2luZyB0aGUgcmVzdCBpbnRvIGEgXCIrTiBtb3JlXCIgaGludC4gQGRlZmF1bHQgMyAqL1xuICBASW5wdXQoKSBtYXhEaXNwbGF5SXRlbXMgPSAzO1xuICAvKiogQXBwbGllcyB0aGUgZGVzdHJ1Y3RpdmUgYm9yZGVyIGFuZCBmb2N1cyByaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBlcnJvciA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIGZ1bGwgYXJyYXkgb2Ygc2VsZWN0ZWQgdmFsdWVzIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgcGFuZWwgb3BlbnMuICovXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHBhbmVsIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgdHJpZ2dlciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcG92ZXInKSBwb3BvdmVyITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc2VhcmNoSW5wdXQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQENvbnRlbnRDaGlsZHJlbihTZWxlY3RJdGVtQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGl0ZW1zITogUXVlcnlMaXN0PFNlbGVjdEl0ZW1Db21wb25lbnQ+O1xuXG4gIHZhbHVlOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZEl0ZW1zOiBNdWx0aVNlbGVjdENoaXBbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hpcHMgYWN0dWFsbHkgcmVuZGVyZWQsIGJ1aWx0IGludG8gYSBmaWVsZCByYXRoZXIgdGhhbiByZWFkIGZyb20gYVxuICAgKiBnZXR0ZXIuIEEgZ2V0dGVyIGhhbmRzIGAqbmdGb3JgIGEgZnJlc2hseS1hbGxvY2F0ZWQgYXJyYXkgb24gZXZlcnlcbiAgICogY2hhbmdlLWRldGVjdGlvbiBwYXNzOyBwYWlyZWQgd2l0aCB0aGUgZGVmYXVsdCBpZGVudGl0eSBkaWZmZXIgdGhhdCB0b3JlXG4gICAqIGRvd24gYW5kIHJlYnVpbHQgZXZlcnkgYmFkZ2Ug4oCUIGluY2x1ZGluZyB0aGUgb25lIHVuZGVyIHRoZSBwb2ludGVyLCB3aG9zZVxuICAgKiBkZXN0cnVjdGlvbiByZS1maXJlcyBpdHMgb3duIHJlbW92ZSBoYW5kbGVyLiBTZWUgYHRyYWNrQ2hpcGAgYmVsb3csIHdoaWNoXG4gICAqIGNsb3NlcyB0aGUgc2FtZSBob2xlIGZvciB0aGUgcmVidWlsdCBjaGlwIG9iamVjdHMgYHN5bmNJdGVtcygpYCBwcm9kdWNlcy5cbiAgICovXG4gIGRpc3BsYXlJdGVtczogTXVsdGlTZWxlY3RDaGlwW10gPSBbXTtcbiAgZXhjZWVkc0Rpc3BsYXlMaW1pdCA9IGZhbHNlO1xuXG4gIGlzT3BlbiA9IGZhbHNlO1xuICBzZWFyY2hRdWVyeSA9ICcnO1xuICBub1Jlc3VsdHMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLy8gS2V5Ym9hcmQgbmF2aWdhdGlvbiAoYWN0aXZlLWRlc2NlbmRhbnQpIHN0YXRlXG4gIGFjdGl2ZUluZGV4ID0gLTE7XG4gIHByaXZhdGUgdHlwZWFoZWFkQnVmZmVyID0gJyc7XG4gIHByaXZhdGUgdHlwZWFoZWFkVGltZSA9IDA7XG4gIHByaXZhdGUgcGVuZGluZ1R5cGVhaGVhZENoYXIgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlbGVjdFNlcnZpY2U6IFNlbGVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc3ViLmFkZChcbiAgICAgIHRoaXMuc2VsZWN0U2VydmljZS5zZWxlY3RlZFZhbHVlJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNPcGVuKSB0aGlzLnRvZ2dsZVZhbHVlKHZhbCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRUcmlnZ2VyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgbXVsdGlTZWxlY3RUcmlnZ2VyVmFyaWFudHMoe1xuICAgICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICAgIGVycm9yOiB0aGlzLmVycm9yLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCxcbiAgICAgIH0pLFxuICAgICAgdGhpcy5jbGFzc1xuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLnN1Yi5hZGQodGhpcy5pdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNJdGVtcygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGBtYXhEaXNwbGF5SXRlbXNgIGRlY2lkZXMgaG93IG11Y2ggb2YgdGhlIHNlbGVjdGlvbiBpcyByZW5kZXJlZCwgc28gdGhlXG4gICAqIGNoaXAgbGlzdCBoYXMgdG8gYmUgcmVidWlsdCB3aGVuIGl0IGNoYW5nZXMuXG4gICAqXG4gICAqIFRoZSBgbWFya0ZvckNoZWNrKClgIGlzIG5vdCByZWR1bmRhbnQ6IHVuZGVyIE9uUHVzaCBhIGBbY2xhc3NdYCBiaW5kaW5nIGlzXG4gICAqIGFwcGxpZWQgdGhyb3VnaCBBbmd1bGFyJ3MgKnN0eWxpbmcqIHBhdGgsIHdoaWNoIHdyaXRlcyB0aGUgaW5wdXQgYnV0IOKAlFxuICAgKiB1bmxpa2UgYSBwbGFpbiBwcm9wZXJ0eSBiaW5kaW5nIOKAlCBuZXZlciBtYXJrcyB0aGUgY29tcG9uZW50IGRpcnR5LCBzbyB0aGVcbiAgICogdHJpZ2dlciB3b3VsZCBrZWVwIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMucmVmcmVzaERpc3BsYXkoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBgKm5nRm9yYCBpZGVudGl0eSBmb3IgdGhlIGNoaXBzIOKAlCBrZXllZCBvbiB0aGUgb3B0aW9uIHZhbHVlLCBub3QgdGhlXG4gICAqIHdyYXBwZXIgb2JqZWN0LCB3aGljaCBgc3luY0l0ZW1zKClgIHJlLWFsbG9jYXRlcyBvbiBldmVyeSBzeW5jLiAqL1xuICB0cmFja0NoaXAgPSAoX2luZGV4OiBudW1iZXIsIGNoaXA6IE11bHRpU2VsZWN0Q2hpcCk6IGFueSA9PiBjaGlwLnZhbHVlO1xuXG4gIHByaXZhdGUgcmVmcmVzaERpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5SXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuc2xpY2UoMCwgdGhpcy5tYXhEaXNwbGF5SXRlbXMpO1xuICAgIHRoaXMuZXhjZWVkc0Rpc3BsYXlMaW1pdCA9IHRoaXMudmFsdWUubGVuZ3RoID4gdGhpcy5tYXhEaXNwbGF5SXRlbXM7XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZUl0ZW1zKCk6IFNlbGVjdEl0ZW1Db21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMgPyB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKSA6IFtdO1xuICB9XG5cbiAgZ2V0IGF2YWlsYWJsZVNlbGVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMubWF4U2VsZWN0aW9ucykgcmV0dXJuIEluZmluaXR5O1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLm1heFNlbGVjdGlvbnMgLSB0aGlzLnZhbHVlLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIF9vdXRzaWRlQ2xpY2tIYW5kbGVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmICF0aGlzLnBvcG92ZXI/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICB0b2dnbGUoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmlzT3BlbiA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICB9XG5cbiAgb3BlbigpIHtcbiAgICBjb25zdCB3YXNPcGVuID0gdGhpcy5pc09wZW47XG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIGlmICghd2FzT3BlbikgdGhpcy5vcGVuZWQuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlQ2xpY2tIYW5kbGVyLCB0cnVlKTtcbiAgICAgIHRoaXMuaW5pdEFjdGl2ZUFmdGVyT3BlbigpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBjb25zdCB3YXNPcGVuID0gdGhpcy5pc09wZW47XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5vblNlYXJjaENoYW5nZSgnJyk7XG4gICAgdGhpcy5yZXNldEFjdGl2ZSgpO1xuICAgIGlmICh0aGlzLmNsZWFudXApIHRoaXMuY2xlYW51cCgpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fb3V0c2lkZUNsaWNrSGFuZGxlciwgdHJ1ZSk7XG4gICAgaWYgKHdhc09wZW4pIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIgfHwgIXRoaXMucG9wb3ZlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGVhbnVwID0gYXV0b1VwZGF0ZSh0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wb3BvdmVyLm5hdGl2ZUVsZW1lbnQsICgpID0+IHtcbiAgICAgIGNvbXB1dGVQb3NpdGlvbih0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wb3BvdmVyLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgICAgc3RyYXRlZ3k6ICdmaXhlZCcsXG4gICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbS1zdGFydCcsXG4gICAgICAgIG1pZGRsZXdhcmU6IFtcbiAgICAgICAgICBvZmZzZXQoNCksXG4gICAgICAgICAgZmxpcCgpLFxuICAgICAgICAgIHNoaWZ0KHsgcGFkZGluZzogOCB9KSxcbiAgICAgICAgICBzaXplKHtcbiAgICAgICAgICAgIGFwcGx5KHsgcmVjdHMsIGVsZW1lbnRzLCBhdmFpbGFibGVIZWlnaHQgfSkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnRzLmZsb2F0aW5nLnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlY3RzLnJlZmVyZW5jZS53aWR0aCArICdweCcsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBhdmFpbGFibGVIZWlnaHQgKyAncHgnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLnRoZW4oKHsgeCwgeSwgc3RyYXRlZ3kgfSkgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgcG9zaXRpb246IHN0cmF0ZWd5LFxuICAgICAgICAgIGxlZnQ6IHggKyAncHgnLFxuICAgICAgICAgIHRvcDogeSArICdweCcsXG4gICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlVmFsdWUodmFsOiBhbnkpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsdWUuaW5kZXhPZih2YWwpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1heFNlbGVjdGlvbnMgJiYgdGhpcy52YWx1ZS5sZW5ndGggPj0gdGhpcy5tYXhTZWxlY3Rpb25zKSByZXR1cm47XG4gICAgICB0aGlzLnZhbHVlLnB1c2godmFsKTtcbiAgICB9XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIGlmICghdGhpcy5pdGVtcykgcmV0dXJuO1xuICAgIGxldCBpdGVtc1RvU2VsZWN0OiBhbnlbXSA9IFtdO1xuICAgIGlmICh0aGlzLm1heFNlbGVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUl0ZW1zID0gdGhpcy5pdGVtc1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQgJiYgIXRoaXMudmFsdWUuaW5jbHVkZXMoaXRlbS52YWx1ZSkpXG4gICAgICAgIC5zbGljZSgwLCB0aGlzLmF2YWlsYWJsZVNlbGVjdGlvbnMpXG4gICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKTtcbiAgICAgIGl0ZW1zVG9TZWxlY3QgPSBbLi4udGhpcy52YWx1ZSwgLi4uYXZhaWxhYmxlSXRlbXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc1RvU2VsZWN0ID0gdGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCkubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBpdGVtc1RvU2VsZWN0O1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgfVxuXG4gIGNsZWFyQWxsKCkge1xuICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICB0aGlzLnN5bmNJdGVtcygpO1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICByZW1vdmVWYWx1ZShldmVudDogTW91c2VFdmVudCwgdmFsOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRvZ2dsZVZhbHVlKHZhbCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IFsuLi50aGlzLnZhbHVlXTtcbiAgICB0aGlzLm9uQ2hhbmdlKHNuYXBzaG90KTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoc25hcHNob3QpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jSXRlbXMoKSB7XG4gICAgaWYgKCF0aGlzLml0ZW1zKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaXRlbS5zZWxlY3RlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXMoaXRlbS52YWx1ZSk7XG4gICAgICBpZiAoaXRlbS5zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCh7IGxhYmVsOiBpdGVtLmdldExhYmVsKCksIHZhbHVlOiBpdGVtLnZhbHVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWF4U2VsZWN0aW9ucyAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+PSB0aGlzLm1heFNlbGVjdGlvbnMpIHtcbiAgICAgICAgaXRlbS5kaXNhYmxlZCA9ICF0aGlzLnZhbHVlLmluY2x1ZGVzKGl0ZW0udmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICAgIGl0ZW0uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hEaXNwbGF5KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblNlYXJjaENoYW5nZShxOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSAocSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgdmlzaWJsZUNvdW50ID0gMDtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBpc1Zpc2libGUgPSBpdGVtLmdldExhYmVsKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgaXRlbS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xuICAgICAgaWYgKGlzVmlzaWJsZSkgdmlzaWJsZUNvdW50Kys7XG4gICAgfSk7XG4gICAgdGhpcy5ub1Jlc3VsdHMgPSB2aXNpYmxlQ291bnQgPT09IDAgJiYgZmlsdGVyICE9PSAnJztcblxuICAgIC8vIFJlLWFuY2hvciB0aGUgYWN0aXZlIG9wdGlvbiB0byB0aGUgZmlyc3QgdmlzaWJsZSBtYXRjaCB3aGlsZSBvcGVuLlxuICAgIGlmICh0aGlzLmlzT3BlbikgdGhpcy5zZXRBY3RpdmUoMCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyAtLS0tIEtleWJvYXJkIG5hdmlnYXRpb24gKFdBSS1BUklBIGxpc3Rib3ggcGF0dGVybikgLS0tLVxuXG4gIHByaXZhdGUgZ2V0IG5hdmlnYWJsZUl0ZW1zKCk6IFNlbGVjdEl0ZW1Db21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMgPyB0aGlzLml0ZW1zLmZpbHRlcihpID0+ICFpLmhpZGRlbiAmJiAhaS5kaXNhYmxlZCkgOiBbXTtcbiAgfVxuXG4gIGdldCBhY3RpdmVEZXNjZW5kYW50SWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubmF2aWdhYmxlSXRlbXM7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlSW5kZXggPj0gMCAmJiB0aGlzLmFjdGl2ZUluZGV4IDwgbGlzdC5sZW5ndGhcbiAgICAgID8gbGlzdFt0aGlzLmFjdGl2ZUluZGV4XS5pZFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVTdGF0ZXMoKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubmF2aWdhYmxlSXRlbXM7XG4gICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuYWN0aXZlSW5kZXggPj0gMCA/IGxpc3RbdGhpcy5hY3RpdmVJbmRleF0gPz8gbnVsbCA6IG51bGw7XG4gICAgdGhpcy5pdGVtcz8uZm9yRWFjaChpID0+IChpLmFjdGl2ZSA9IGkgPT09IGFjdGl2ZUl0ZW0pKTtcbiAgICB0aGlzLnN5bmNBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNBY3RpdmVEZXNjZW5kYW50KCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm47XG4gICAgY29uc3QgaWQgPSB0aGlzLmFjdGl2ZURlc2NlbmRhbnRJZDtcbiAgICBpZiAoaWQpIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgaWQpO1xuICAgIGVsc2UgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5uYXZpZ2FibGVJdGVtcztcbiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gLTE7XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0YXRlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3QubGVuZ3RoIC0gMSkpO1xuICAgIHRoaXMudXBkYXRlQWN0aXZlU3RhdGVzKCk7XG4gICAgbGlzdFt0aGlzLmFjdGl2ZUluZGV4XT8uc2Nyb2xsSW50b0FjdGl2ZVZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlSXRlbShpdGVtOiBTZWxlY3RJdGVtQ29tcG9uZW50KSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5uYXZpZ2FibGVJdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggPj0gMCkgdGhpcy5zZXRBY3RpdmUoaWR4KTtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUFjdGl2ZShkZWx0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubmF2aWdhYmxlSXRlbXM7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmFjdGl2ZUluZGV4IDwgMCA/IChkZWx0YSA+IDAgPyAwIDogbGlzdC5sZW5ndGggLSAxKSA6IHRoaXMuYWN0aXZlSW5kZXggKyBkZWx0YTtcbiAgICB0aGlzLnNldEFjdGl2ZShuZXh0KTsgLy8gc2V0QWN0aXZlIGNsYW1wcyAobm8gd3JhcCwgbWF0Y2hpbmcgc2hhZGNuKVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVUb1NlbGVjdGVkT3JGaXJzdCgpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5uYXZpZ2FibGVJdGVtcztcbiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gLTE7XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0YXRlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxJZHggPSBsaXN0LmZpbmRJbmRleChpID0+IHRoaXMudmFsdWUuaW5jbHVkZXMoaS52YWx1ZSkpO1xuICAgIHRoaXMuc2V0QWN0aXZlKHNlbElkeCA+PSAwID8gc2VsSWR4IDogMCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRBY3RpdmVBZnRlck9wZW4oKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZ1R5cGVhaGVhZENoYXIpIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnBlbmRpbmdUeXBlYWhlYWRDaGFyO1xuICAgICAgdGhpcy5wZW5kaW5nVHlwZWFoZWFkQ2hhciA9ICcnO1xuICAgICAgdGhpcy5zZXRBY3RpdmVUb1NlbGVjdGVkT3JGaXJzdCgpO1xuICAgICAgdGhpcy50eXBlYWhlYWQoYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlVG9TZWxlY3RlZE9yRmlyc3QoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QWN0aXZlKCkge1xuICAgIHRoaXMuYWN0aXZlSW5kZXggPSAtMTtcbiAgICB0aGlzLnR5cGVhaGVhZEJ1ZmZlciA9ICcnO1xuICAgIHRoaXMucGVuZGluZ1R5cGVhaGVhZENoYXIgPSAnJztcbiAgICB0aGlzLml0ZW1zPy5mb3JFYWNoKGkgPT4gKGkuYWN0aXZlID0gZmFsc2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNUeXBlYWhlYWRDaGFyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZW50LmtleS5sZW5ndGggPT09IDEgJiYgZXZlbnQua2V5ICE9PSAnICcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmFsdEtleTtcbiAgfVxuXG4gIHByaXZhdGUgdHlwZWFoZWFkKGNoYXI6IHN0cmluZykge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBiYXNlZCBvbiBlbGFwc2VkIHRpbWUgKGNvcnJlY3RuZXNzIGlzIG5vdCB0aW1lci1kcml2ZW4pLlxuICAgIGlmIChub3cgLSB0aGlzLnR5cGVhaGVhZFRpbWUgPiA1MDApIHRoaXMudHlwZWFoZWFkQnVmZmVyID0gJyc7XG4gICAgdGhpcy50eXBlYWhlYWRUaW1lID0gbm93O1xuICAgIHRoaXMudHlwZWFoZWFkQnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMubmF2aWdhYmxlSXRlbXMuZmluZChpID0+XG4gICAgICBpLmdldExhYmVsKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHRoaXMudHlwZWFoZWFkQnVmZmVyKVxuICAgICk7XG4gICAgaWYgKG1hdGNoKSB0aGlzLnNldEFjdGl2ZUl0ZW0obWF0Y2gpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RBY3RpdmUoKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMubmF2aWdhYmxlSXRlbXNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgLy8gTXVsdGktc2VsZWN0OiBtaXJyb3IgU2VsZWN0SXRlbUNvbXBvbmVudC5vbkNsaWNrIOKAlCB0b2dnbGUgYW5kIHN0YXkgb3Blbi5cbiAgICBpdGVtLnNlbGVjdGVkID0gIWl0ZW0uc2VsZWN0ZWQ7XG4gICAgdGhpcy5zZWxlY3RTZXJ2aWNlLnJlZ2lzdGVyQ2xpY2soaXRlbS52YWx1ZSwgaXRlbS5nZXRMYWJlbCgpKTtcbiAgICAvLyBzeW5jSXRlbXMoKSByYW4gc3luY2hyb25vdXNseSB2aWEgdGhlIHNlcnZpY2Ugc3Vic2NyaXB0aW9uOyBrZWVwIHRoZVxuICAgIC8vIHNhbWUgb3B0aW9uIGhpZ2hsaWdodGVkIChpdHMgaW5kZXggbWF5IGhhdmUgc2hpZnRlZCkuXG4gICAgdGhpcy5zZXRBY3RpdmVJdGVtKGl0ZW0pO1xuICB9XG5cbiAgb25UcmlnZ2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xuICAgICAgaWYgKGtleSA9PT0gJ0Fycm93RG93bicgfHwga2V5ID09PSAnQXJyb3dVcCcgfHwga2V5ID09PSAnRW50ZXInIHx8IGtleSA9PT0gJyAnIHx8IGtleSA9PT0gJ0hvbWUnIHx8IGtleSA9PT0gJ0VuZCcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzVHlwZWFoZWFkQ2hhcihldmVudCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nVHlwZWFoZWFkQ2hhciA9IGtleTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMubW92ZUFjdGl2ZSgxKTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzogZXZlbnQucHJldmVudERlZmF1bHQoKTsgdGhpcy5tb3ZlQWN0aXZlKC0xKTsgYnJlYWs7XG4gICAgICBjYXNlICdIb21lJzogZXZlbnQucHJldmVudERlZmF1bHQoKTsgdGhpcy5zZXRBY3RpdmUoMCk7IGJyZWFrO1xuICAgICAgY2FzZSAnRW5kJzogZXZlbnQucHJldmVudERlZmF1bHQoKTsgdGhpcy5zZXRBY3RpdmUodGhpcy5uYXZpZ2FibGVJdGVtcy5sZW5ndGggLSAxKTsgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0aGlzLmlzVHlwZWFoZWFkQ2hhcihldmVudCkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMudHlwZWFoZWFkKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBLZXlkb3duIHdoaWxlIHRoZSAob3B0aW9uYWwpIHNlYXJjaCBpbnB1dCBpcyBmb2N1c2VkLiBBcnJvd3MvRW50ZXIvRXNjYXBlXG4gIC8vIGRyaXZlIHRoZSBsaXN0OyBvdGhlciBrZXlzIGZhbGwgdGhyb3VnaCBzbyB0aGUgdXNlciBjYW4gdHlwZSB0byBmaWx0ZXIuXG4gIG9uU2VhcmNoS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5pc09wZW4pIHJldHVybjtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzogZXZlbnQucHJldmVudERlZmF1bHQoKTsgdGhpcy5tb3ZlQWN0aXZlKDEpOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOiBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLm1vdmVBY3RpdmUoLTEpOyBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzogZXZlbnQucHJldmVudERlZmF1bHQoKTsgdGhpcy5zZWxlY3RBY3RpdmUoKTsgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9vdXRzaWRlQ2xpY2tIYW5kbGVyLCB0cnVlKTtcbiAgICBpZiAodGhpcy5jbGVhbnVwKSB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7IH07XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4geyB9O1xuICB3cml0ZVZhbHVlKHY6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkodikgPyB2IDogW107XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLnJlZnJlc2hEaXNwbGF5KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY24gPSBjbjtcbn1cbiJdfQ==