@agorapulse/ui-components 18.0.8 → 18.0.10

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 (92) hide show
  1. package/agorapulse-ui-components-18.0.10.tgz +0 -0
  2. package/avatar/avatar.component.d.ts +1 -1
  3. package/checkbox/checkbox.component.d.ts +3 -3
  4. package/close-button/close-button.component.d.ts +4 -4
  5. package/datepicker/datepicker.component.d.ts +1 -1
  6. package/esm2022/avatar/avatar.component.mjs +4 -3
  7. package/esm2022/checkbox/checkbox.component.mjs +7 -7
  8. package/esm2022/close-button/close-button.component.mjs +6 -6
  9. package/esm2022/datepicker/datepicker.component.mjs +2 -2
  10. package/esm2022/index.mjs +2 -1
  11. package/esm2022/infobox/infobox.component.mjs +1 -1
  12. package/esm2022/input-search/input-search.component.mjs +5 -4
  13. package/esm2022/labels/label.component.mjs +1 -1
  14. package/esm2022/nav-selector/agorapulse-ui-components-nav-selector.mjs +5 -0
  15. package/esm2022/nav-selector/directives/tree-node-accessibility.directive.mjs +30 -0
  16. package/esm2022/nav-selector/nav-selector-category/nav-selector-category.component.mjs +81 -0
  17. package/esm2022/nav-selector/nav-selector-category/nav-selector-category.presenter.mjs +29 -0
  18. package/esm2022/nav-selector/nav-selector-group/nav-selector-group.component.mjs +142 -0
  19. package/esm2022/nav-selector/nav-selector-group/nav-selector-group.presenter.mjs +31 -0
  20. package/esm2022/nav-selector/nav-selector-leaf/nav-selector-leaf.component.mjs +240 -0
  21. package/esm2022/nav-selector/nav-selector-leaf/nav-selector-leaf.presenter.mjs +35 -0
  22. package/esm2022/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.component.mjs +39 -0
  23. package/esm2022/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.presenter.mjs +18 -0
  24. package/esm2022/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.component.mjs +92 -0
  25. package/esm2022/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.presenter.mjs +31 -0
  26. package/esm2022/nav-selector/nav-selector.component.mjs +123 -0
  27. package/esm2022/nav-selector/nav-selector.mjs +9 -0
  28. package/esm2022/nav-selector/nav-selector.state.mjs +173 -0
  29. package/esm2022/nav-selector/public_api.mjs +2 -0
  30. package/esm2022/nav-selector/utils/leaf.utils.mjs +10 -0
  31. package/esm2022/nav-selector/utils/nav-selector.accessibility.mjs +171 -0
  32. package/esm2022/nav-selector/utils/nav-selector.builder.mjs +263 -0
  33. package/esm2022/nav-selector/utils/nav-selector.filter.mjs +102 -0
  34. package/esm2022/nav-selector/utils/nav-selector.folding.mjs +219 -0
  35. package/esm2022/nav-selector/utils/nav-selector.minifying.mjs +50 -0
  36. package/esm2022/nav-selector/utils/nav-selector.multi-select.mjs +208 -0
  37. package/esm2022/nav-selector/utils/nav-selector.single-select.mjs +91 -0
  38. package/esm2022/nav-selector/utils/nav-selector.view-more.mjs +98 -0
  39. package/esm2022/snackbars-thread/component/snackbars-thread.component.mjs +2 -2
  40. package/esm2022/tag/tag.component.mjs +7 -5
  41. package/fesm2022/agorapulse-ui-components-avatar.mjs +3 -2
  42. package/fesm2022/agorapulse-ui-components-avatar.mjs.map +1 -1
  43. package/fesm2022/agorapulse-ui-components-checkbox.mjs +6 -6
  44. package/fesm2022/agorapulse-ui-components-checkbox.mjs.map +1 -1
  45. package/fesm2022/agorapulse-ui-components-close-button.mjs +5 -5
  46. package/fesm2022/agorapulse-ui-components-close-button.mjs.map +1 -1
  47. package/fesm2022/agorapulse-ui-components-datepicker.mjs +1 -1
  48. package/fesm2022/agorapulse-ui-components-datepicker.mjs.map +1 -1
  49. package/fesm2022/agorapulse-ui-components-infobox.mjs +1 -1
  50. package/fesm2022/agorapulse-ui-components-infobox.mjs.map +1 -1
  51. package/fesm2022/agorapulse-ui-components-input-search.mjs +4 -3
  52. package/fesm2022/agorapulse-ui-components-input-search.mjs.map +1 -1
  53. package/fesm2022/agorapulse-ui-components-labels.mjs +1 -1
  54. package/fesm2022/agorapulse-ui-components-labels.mjs.map +1 -1
  55. package/fesm2022/agorapulse-ui-components-nav-selector.mjs +2198 -0
  56. package/fesm2022/agorapulse-ui-components-nav-selector.mjs.map +1 -0
  57. package/fesm2022/agorapulse-ui-components-snackbars-thread.mjs +1 -1
  58. package/fesm2022/agorapulse-ui-components-snackbars-thread.mjs.map +1 -1
  59. package/fesm2022/agorapulse-ui-components-tag.mjs +6 -4
  60. package/fesm2022/agorapulse-ui-components-tag.mjs.map +1 -1
  61. package/fesm2022/agorapulse-ui-components.mjs +1 -0
  62. package/fesm2022/agorapulse-ui-components.mjs.map +1 -1
  63. package/index.d.ts +1 -0
  64. package/input-search/input-search.component.d.ts +1 -1
  65. package/nav-selector/directives/tree-node-accessibility.directive.d.ts +9 -0
  66. package/nav-selector/index.d.ts +5 -0
  67. package/nav-selector/nav-selector-category/nav-selector-category.component.d.ts +16 -0
  68. package/nav-selector/nav-selector-category/nav-selector-category.presenter.d.ts +14 -0
  69. package/nav-selector/nav-selector-group/nav-selector-group.component.d.ts +29 -0
  70. package/nav-selector/nav-selector-group/nav-selector-group.presenter.d.ts +17 -0
  71. package/nav-selector/nav-selector-leaf/nav-selector-leaf.component.d.ts +51 -0
  72. package/nav-selector/nav-selector-leaf/nav-selector-leaf.presenter.d.ts +19 -0
  73. package/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.component.d.ts +13 -0
  74. package/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.presenter.d.ts +10 -0
  75. package/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.component.d.ts +24 -0
  76. package/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.presenter.d.ts +14 -0
  77. package/nav-selector/nav-selector.component.d.ts +29 -0
  78. package/nav-selector/nav-selector.d.ts +220 -0
  79. package/nav-selector/nav-selector.state.d.ts +47 -0
  80. package/nav-selector/public_api.d.ts +2 -0
  81. package/nav-selector/utils/leaf.utils.d.ts +5 -0
  82. package/nav-selector/utils/nav-selector.accessibility.d.ts +52 -0
  83. package/nav-selector/utils/nav-selector.builder.d.ts +32 -0
  84. package/nav-selector/utils/nav-selector.filter.d.ts +30 -0
  85. package/nav-selector/utils/nav-selector.folding.d.ts +47 -0
  86. package/nav-selector/utils/nav-selector.minifying.d.ts +27 -0
  87. package/nav-selector/utils/nav-selector.multi-select.d.ts +54 -0
  88. package/nav-selector/utils/nav-selector.single-select.d.ts +15 -0
  89. package/nav-selector/utils/nav-selector.view-more.d.ts +30 -0
  90. package/package.json +7 -1
  91. package/tag/tag.component.d.ts +3 -1
  92. package/agorapulse-ui-components-18.0.8.tgz +0 -0
@@ -0,0 +1,263 @@
1
+ import { isInternalNavSelectorEntryALeaf, isNavSelectorEntryACategory, isNavSelectorEntryAGroup, isNavSelectorEntryALeaf, } from '../nav-selector';
2
+ import { NavSelectorAccessibility } from '../utils/nav-selector.accessibility';
3
+ import { NavSelectorMultiSelect } from '../utils/nav-selector.multi-select';
4
+ import { NavSelectorSingleSelect } from './nav-selector.single-select';
5
+ const LeafLogics = {
6
+ DISABLED: 'DISABLED',
7
+ FEATURE_LOCKED: 'FEATURE_LOCKED',
8
+ TOKEN_INVALID: 'TOKEN_INVALID',
9
+ COUNTER: 'COUNTER',
10
+ };
11
+ /**
12
+ * NavSelectorBuilder is a utility class that builds the NavSelector entries for single and multiple select modes.
13
+ * It also checks the structure of the entries to ensure they are valid.
14
+ */
15
+ export class NavSelectorBuilder {
16
+ // /!\/!\ Order of logics is important /!\/!\
17
+ static LEAF_LOGICS_PRIORITY = {
18
+ [LeafLogics.DISABLED]: (leaf) => leaf.disableReason !== null,
19
+ [LeafLogics.FEATURE_LOCKED]: (leaf) => leaf.featureLocked,
20
+ [LeafLogics.TOKEN_INVALID]: (leaf) => leaf.tokenInvalid,
21
+ [LeafLogics.COUNTER]: (leaf) => leaf.counter !== null,
22
+ };
23
+ /**
24
+ * Builds the NavSelector entries for single select mode.
25
+ * @param entries nav selector entries
26
+ * @param selectedEntryUid selected entry uid
27
+ * @param detailsDisplayedLimit number of details displayed limit
28
+ */
29
+ static build(entries, selectedEntryUid, detailsDisplayedLimit) {
30
+ this.structureChecker(entries);
31
+ const builtEntries = this.buildEntries(entries, false, 1, detailsDisplayedLimit);
32
+ if (selectedEntryUid) {
33
+ return NavSelectorSingleSelect.select(builtEntries, selectedEntryUid);
34
+ }
35
+ return builtEntries;
36
+ }
37
+ /**
38
+ * Builds the NavSelector entries for multiple select mode.
39
+ * @param entries nav selector entries
40
+ * @param selectedEntryUids selected entry uids
41
+ * @param detailsDisplayedLimit number of details displayed limit
42
+ */
43
+ static buildInMultipleMode(entries, selectedEntryUids, detailsDisplayedLimit) {
44
+ this.structureChecker(entries, true);
45
+ let builtEntries = this.buildEntries(entries, true, 1, detailsDisplayedLimit);
46
+ if (selectedEntryUids) {
47
+ for (const selectedEntryUid of selectedEntryUids) {
48
+ builtEntries = NavSelectorMultiSelect.selectInMultipleMode(builtEntries, selectedEntryUid);
49
+ }
50
+ }
51
+ return builtEntries;
52
+ }
53
+ static structureChecker(entries, multipleModeEnabled = false) {
54
+ entries.forEach(entry => {
55
+ if (isNavSelectorEntryAGroup(entry) || isNavSelectorEntryACategory(entry)) {
56
+ this.structureChecker(entry.children, multipleModeEnabled);
57
+ }
58
+ else if (isNavSelectorEntryALeaf(entry)) {
59
+ if (entry.details.length && multipleModeEnabled) {
60
+ console.error(`NavSelectorBuilder: Leaf ${entry.uid} with details is not allowed in multiple mode`);
61
+ }
62
+ }
63
+ });
64
+ }
65
+ static buildEntries(entries, multipleModeEnabled, level = 1, detailsDisplayedLimit) {
66
+ const newEntries = entries
67
+ .map((entry, idx) => this.buildEntry(entry, { multipleModeEnabled, level, idx, totalNumberOfEntry: entries.length, detailsDisplayedLimit }))
68
+ .filter(it => it !== null);
69
+ return NavSelectorAccessibility.resetFocus(newEntries);
70
+ }
71
+ static buildEntry(entry, { multipleModeEnabled, level, idx, totalNumberOfEntry, detailsDisplayedLimit, }) {
72
+ if (isNavSelectorEntryALeaf(entry)) {
73
+ return this.buildLeaf(entry, {
74
+ multipleModeEnabled,
75
+ level,
76
+ idx,
77
+ totalNumberOfLeaf: totalNumberOfEntry,
78
+ focusable: true,
79
+ detailsDisplayedLimit,
80
+ });
81
+ }
82
+ else if (isNavSelectorEntryACategory(entry)) {
83
+ return this.buildCategory(entry, {
84
+ multipleModeEnabled,
85
+ level,
86
+ idx,
87
+ totalNumberOfCategory: totalNumberOfEntry,
88
+ detailsDisplayedLimit,
89
+ });
90
+ }
91
+ else {
92
+ return this.buildGroup(entry, {
93
+ multipleModeEnabled,
94
+ level,
95
+ idx,
96
+ totalNumberOfGroups: totalNumberOfEntry,
97
+ focusable: true,
98
+ detailsDisplayedLimit,
99
+ });
100
+ }
101
+ }
102
+ static buildCategoryChildren(entry, { focusable, multipleModeEnabled, categoryLevel, detailsDisplayedLimit, }) {
103
+ return entry.children
104
+ .map((child, idx) => {
105
+ if (isNavSelectorEntryALeaf(child)) {
106
+ return this.buildLeaf(child, {
107
+ focusable,
108
+ multipleModeEnabled,
109
+ level: categoryLevel + 1,
110
+ idx,
111
+ totalNumberOfLeaf: entry.children.length,
112
+ detailsDisplayedLimit,
113
+ });
114
+ }
115
+ else {
116
+ return this.buildGroup(child, {
117
+ focusable,
118
+ multipleModeEnabled,
119
+ level: categoryLevel + 1,
120
+ idx,
121
+ totalNumberOfGroups: entry.children.length,
122
+ detailsDisplayedLimit,
123
+ });
124
+ }
125
+ })
126
+ .filter(it => it !== null);
127
+ }
128
+ static buildCategory(node, { multipleModeEnabled, level, idx, totalNumberOfCategory, detailsDisplayedLimit, }) {
129
+ const children = this.buildCategoryChildren(node, {
130
+ focusable: !node.folded,
131
+ multipleModeEnabled,
132
+ categoryLevel: level,
133
+ detailsDisplayedLimit,
134
+ });
135
+ return {
136
+ uid: node.uid,
137
+ alias: node.alias,
138
+ children,
139
+ hidden: false,
140
+ focusable: true,
141
+ accessibility: {
142
+ tabIndex: -1,
143
+ ariaLevel: level,
144
+ ariaPosinset: idx + 1,
145
+ ariaSetsize: totalNumberOfCategory,
146
+ },
147
+ folded: node.folded,
148
+ type: node.type,
149
+ };
150
+ }
151
+ static buildGroupChildren(entry, { multipleModeEnabled, groupLevel, focusable, detailsDisplayedLimit, }) {
152
+ return entry.children
153
+ .map((child, idx) => this.buildLeaf(child, {
154
+ multipleModeEnabled,
155
+ level: groupLevel + 1,
156
+ idx,
157
+ totalNumberOfLeaf: entry.children.length,
158
+ focusable: focusable && !entry.folded,
159
+ detailsDisplayedLimit,
160
+ }))
161
+ .filter(it => it !== null);
162
+ }
163
+ static buildGroup(node, { focusable, multipleModeEnabled, level, idx, totalNumberOfGroups, detailsDisplayedLimit, }) {
164
+ const children = this.buildGroupChildren(node, { multipleModeEnabled, groupLevel: level, focusable, detailsDisplayedLimit });
165
+ const displayTokenInvalid = children.some(({ displayTokenInvalid }) => displayTokenInvalid);
166
+ const selectedChildrenCount = children.filter(({ selected }) => selected).length;
167
+ return {
168
+ uid: node.uid,
169
+ alias: node.alias,
170
+ children,
171
+ childrenPictureUrlSample: children
172
+ .map((child, idx) => isInternalNavSelectorEntryALeaf(child) && idx < 4 ? { url: child.pictureUrl, initial: child.alias[0] } : null)
173
+ .filter(it => it !== null),
174
+ hidden: false,
175
+ accessibility: {
176
+ tabIndex: -1,
177
+ ariaPosinset: idx + 1,
178
+ ariaLevel: level,
179
+ ariaSetsize: totalNumberOfGroups,
180
+ },
181
+ focusable,
182
+ displayCounter: node.folded && children.some(child => isInternalNavSelectorEntryALeaf(child) && child.counter !== 0),
183
+ counter: children.reduce((acc, { counter }) => acc + counter, 0),
184
+ displayTokenInvalid,
185
+ selected: false,
186
+ selectable: multipleModeEnabled && children.some(({ selectable }) => selectable),
187
+ undeterminedSelection: selectedChildrenCount !== children.length && selectedChildrenCount > 0,
188
+ folded: node.folded,
189
+ type: node.type,
190
+ };
191
+ }
192
+ static buildLeaf(leaf, { focusable, multipleModeEnabled, level, idx, totalNumberOfLeaf, detailsDisplayedLimit, }) {
193
+ if (leaf.missingPermission) {
194
+ return null;
195
+ }
196
+ const detailsDisplayable = this.isLeafLogicValid(leaf, LeafLogics.COUNTER) && !!leaf.details.length;
197
+ const foldable = !!leaf.details.length && detailsDisplayable;
198
+ const folded = true;
199
+ const counter = (leaf.details.reduce((acc, detail) => acc + (detail.counter ?? 0), 0) || leaf.counter) ?? 0;
200
+ const counterDisplayable = counter !== 0 && this.isLeafLogicValid(leaf, LeafLogics.COUNTER);
201
+ const disabled = leaf.disableReason !== null;
202
+ const viewMoreDisplayable = leaf.details.length > detailsDisplayedLimit;
203
+ return {
204
+ uid: leaf.uid,
205
+ alias: leaf.alias,
206
+ pictureUrl: leaf.pictureUrl,
207
+ disabled,
208
+ disableReason: leaf.disableReason,
209
+ hidden: false,
210
+ focusable: focusable && !disabled,
211
+ accessibility: {
212
+ tabIndex: -1,
213
+ ariaPosinset: idx + 1,
214
+ ariaLevel: level,
215
+ ariaSetsize: totalNumberOfLeaf,
216
+ },
217
+ foldable,
218
+ folded,
219
+ displayCounter: folded && counterDisplayable,
220
+ counterDisplayable,
221
+ counter,
222
+ network: leaf.network,
223
+ displayTokenInvalid: leaf.tokenInvalid && this.isLeafLogicValid(leaf, LeafLogics.TOKEN_INVALID, LeafLogics.COUNTER),
224
+ displayFeatureLocked: leaf.featureLocked && this.isLeafLogicValid(leaf, LeafLogics.FEATURE_LOCKED, LeafLogics.TOKEN_INVALID, LeafLogics.COUNTER),
225
+ selected: false,
226
+ selectable: multipleModeEnabled
227
+ ? this.isLeafLogicValid(leaf, LeafLogics.COUNTER)
228
+ : this.isLeafLogicValid(leaf, LeafLogics.FEATURE_LOCKED, LeafLogics.TOKEN_INVALID, LeafLogics.COUNTER),
229
+ detailsDisplayable,
230
+ details: leaf.details.map(detail => this.buildLeafDetail(detail, level + 1, focusable && !folded)),
231
+ type: 'LEAF',
232
+ viewMoreDisplayable,
233
+ viewMoreDisplayed: viewMoreDisplayable,
234
+ viewMoreDetailsDisplayedLimit: detailsDisplayedLimit,
235
+ };
236
+ }
237
+ static buildLeafDetail(detail, level, focusable) {
238
+ return {
239
+ uid: detail.uid,
240
+ counter: detail.counter ?? 0,
241
+ displayCounter: detail.counter !== null,
242
+ alias: detail.name,
243
+ hidden: false,
244
+ accessibility: {
245
+ tabIndex: -1,
246
+ ariaPosinset: 1,
247
+ ariaLevel: level,
248
+ ariaSetsize: 1,
249
+ },
250
+ focusable,
251
+ selected: false,
252
+ errorReason: detail.errorReason,
253
+ displayError: detail.errorReason !== null,
254
+ type: 'LEAF_DETAILS',
255
+ };
256
+ }
257
+ static isLeafLogicValid(leaf, ...excludes) {
258
+ return Object.entries(this.LEAF_LOGICS_PRIORITY)
259
+ .filter(([key]) => !excludes.includes(key))
260
+ .every(([, logic]) => !logic(leaf));
261
+ }
262
+ }
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LXNlbGVjdG9yLmJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3VpLWNvbXBvbmVudHMvbmF2LXNlbGVjdG9yL3NyYy91dGlscy9uYXYtc2VsZWN0b3IuYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBTUgsK0JBQStCLEVBQy9CLDJCQUEyQixFQUMzQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBTTFCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdkUsTUFBTSxVQUFVLEdBQUc7SUFDZixRQUFRLEVBQUUsVUFBVTtJQUNwQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGFBQWEsRUFBRSxlQUFlO0lBQzlCLE9BQU8sRUFBRSxTQUFTO0NBQ1osQ0FBQztBQUdYOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsNkNBQTZDO0lBQ3JDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBMEQ7UUFDekYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUk7UUFDN0UsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYTtRQUMxRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQXFCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZO1FBQ3hFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBcUIsRUFBRSxFQUFFLENBQUMsSUFBSSxD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Q0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQWlCLENBQUMsQ0FBQzthQUN4RCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgSW50ZXJuYWxOYXZTZWxlY3RvckNhdGVnb3J5LFxuICAgIEludGVybmFsTmF2U2VsZWN0b3JFbnRyeSxcbiAgICBJbnRlcm5hbE5hdlNlbGVjdG9yR3JvdXAsXG4gICAgSW50ZXJuYWxOYXZTZWxlY3RvckxlYWYsXG4gICAgSW50ZXJuYWxOYXZTZWxlY3RvckxlYWZEZXRhaWxzLFxuICAgIGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWYsXG4gICAgaXNOYXZTZWxlY3RvckVudHJ5QUNhdGVnb3J5LFxuICAgIGlzTmF2U2VsZWN0b3JFbnRyeUFHcm91cCxcbiAgICBpc05hdlNlbGVjdG9yRW50cnlBTGVhZixcbiAgICBOYXZTZWxlY3RvckNhdGVnb3J5LFxuICAgIE5hdlNlbGVjdG9yRW50cnksXG4gICAgTmF2U2VsZWN0b3JHcm91cCxcbiAgICBOYXZTZWxlY3RvckxlYWYsXG4gICAgTmF2U2VsZWN0b3JMZWFmRGV0YWlscyxcbn0gZnJvbSAnLi4vbmF2LXNlbGVjdG9yJztcbmltcG9ydCB7IE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eSB9IGZyb20gJy4uL3V0aWxzL25hdi1zZWxlY3Rvci5hY2Nlc3NpYmlsaXR5JztcbmltcG9ydCB7IE5hdlNlbGVjdG9yTXVsdGlTZWxlY3QgfSBmcm9tICcuLi91dGlscy9uYXYtc2VsZWN0b3IubXVsdGktc2VsZWN0JztcbmltcG9ydCB7IE5hdlNlbGVjdG9yU2luZ2xlU2VsZWN0IH0gZnJvbSAnLi9uYXYtc2VsZWN0b3Iuc2luZ2xlLXNlbGVjdCc7XG5cbmNvbnN0IExlYWZMb2dpY3MgPSB7XG4gICAgRElTQUJMRUQ6ICdESVNBQkxFRCcsXG4gICAgRkVBVFVSRV9MT0NLRUQ6ICdGRUFUVVJFX0xPQ0tFRCcsXG4gICAgVE9LRU5fSU5WQUxJRDogJ1RPS0VOX0lOVkFMSUQnLFxuICAgIENPVU5URVI6ICdDT1VOVEVSJyxcbn0gYXMgY29uc3Q7XG50eXBlIExlYWZMb2dpY3MgPSBrZXlvZiB0eXBlb2YgTGVhZkxvZ2ljcztcblxuLyoqXG4gKiBOYXZTZWxlY3RvckJ1aWxkZXIgaXMgYSB1dGlsaXR5IGNsYXNzIHRoYXQgYnVpbGRzIHRoZSBOYXZTZWxlY3RvciBlbnRyaWVzIGZvciBzaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdCBtb2Rlcy5cbiAqIEl0IGFsc28gY2hlY2tzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGVudHJpZXMgdG8gZW5zdXJlIHRoZXkgYXJlIHZhbGlkLlxuICovXG5leHBvcnQgY2xhc3MgTmF2U2VsZWN0b3JCdWlsZGVyIHtcbiAgICAvLyAvIVxcLyFcXCBPcmRlciBvZiBsb2dpY3MgaXMgaW1wb3J0YW50IC8hXFwvIVxcXG4gICAgcHJpdmF0ZSBzdGF0aWMgTEVBRl9MT0dJQ1NfUFJJT1JJVFk6IFJlY29yZDxMZWFmTG9naWNzLCAobGVmOiBOYXZTZWxlY3RvckxlYWYpID0+IGJvb2xlYW4+ID0ge1xuICAgICAgICBbTGVhZkxvZ2ljcy5ESVNBQkxFRF06IChsZWFmOiBOYXZTZWxlY3RvckxlYWYpID0+IGxlYWYuZGlzYWJsZVJlYXNvbiAhPT0gbnVsbCxcbiAgICAgICAgW0xlYWZMb2dpY3MuRkVBVFVSRV9MT0NLRURdOiAobGVhZjogTmF2U2VsZWN0b3JMZWFmKSA9PiBsZWFmLmZlYXR1cmVMb2NrZWQsXG4gICAgICAgIFtMZWFmTG9naWNzLlRPS0VOX0lOVkFMSURdOiAobGVhZjogTmF2U2VsZWN0b3JMZWFmKSA9PiBsZWFmLnRva2VuSW52YWxpZCxcbiAgICAgICAgW0xlYWZMb2dpY3MuQ09VTlRFUl06IChsZWFmOiBOYXZTZWxlY3RvckxlYWYpID0+IGxlYWYuY291bnRlciAhPT0gbnVsbCxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBOYXZTZWxlY3RvciBlbnRyaWVzIGZvciBzaW5nbGUgc2VsZWN0IG1vZGUuXG4gICAgICogQHBhcmFtIGVudHJpZXMgbmF2IHNlbGVjdG9yIGVudHJpZXNcbiAgICAgKiBAcGFyYW0gc2VsZWN0ZWRFbnRyeVVpZCBzZWxlY3RlZCBlbnRyeSB1aWRcbiAgICAgKiBAcGFyYW0gZGV0YWlsc0Rpc3BsYXllZExpbWl0IG51bWJlciBvZiBkZXRhaWxzIGRpc3BsYXllZCBsaW1pdFxuICAgICAqL1xuICAgIHN0YXRpYyBidWlsZChlbnRyaWVzOiBOYXZTZWxlY3RvckVudHJ5W10sIHNlbGVjdGVkRW50cnlVaWQ6IHN0cmluZyB8IG51bGwsIGRldGFpbHNEaXNwbGF5ZWRMaW1pdDogbnVtYmVyKTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10ge1xuICAgICAgICB0aGlzLnN0cnVjdHVyZUNoZWNrZXIoZW50cmllcyk7XG4gICAgICAgIGNvbnN0IGJ1aWx0RW50cmllcyA9IHRoaXMuYnVpbGRFbnRyaWVzKGVudHJpZXMsIGZhbHNlLCAxLCBkZXRhaWxzRGlzcGxheWVkTGltaXQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRFbnRyeVVpZCkge1xuICAgICAgICAgICAgcmV0dXJuIE5hdlNlbGVjdG9yU2luZ2xlU2VsZWN0LnNlbGVjdChidWlsdEVudHJpZXMsIHNlbGVjdGVkRW50cnlVaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsdEVudHJpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBOYXZTZWxlY3RvciBlbnRyaWVzIGZvciBtdWx0aXBsZSBzZWxlY3QgbW9kZS5cbiAgICAgKiBAcGFyYW0gZW50cmllcyBuYXYgc2VsZWN0b3IgZW50cmllc1xuICAgICAqIEBwYXJhbSBzZWxlY3RlZEVudHJ5VWlkcyBzZWxlY3RlZCBlbnRyeSB1aWRzXG4gICAgICogQHBhcmFtIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCBudW1iZXIgb2YgZGV0YWlscyBkaXNwbGF5ZWQgbGltaXRcbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRJbk11bHRpcGxlTW9kZShcbiAgICAgICAgZW50cmllczogTmF2U2VsZWN0b3JFbnRyeVtdLFxuICAgICAgICBzZWxlY3RlZEVudHJ5VWlkczogc3RyaW5nW10gfCBudWxsLFxuICAgICAgICBkZXRhaWxzRGlzcGxheWVkTGltaXQ6IG51bWJlclxuICAgICk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdIHtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVDaGVja2VyKGVudHJpZXMsIHRydWUpO1xuICAgICAgICBsZXQgYnVpbHRFbnRyaWVzID0gdGhpcy5idWlsZEVudHJpZXMoZW50cmllcywgdHJ1ZSwgMSwgZGV0YWlsc0Rpc3BsYXllZExpbWl0KTtcbiAgICAgICAgaWYgKHNlbGVjdGVkRW50cnlVaWRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdGVkRW50cnlVaWQgb2Ygc2VsZWN0ZWRFbnRyeVVpZHMpIHtcbiAgICAgICAgICAgICAgICBidWlsdEVudHJpZXMgPSBOYXZTZWxlY3Rvck11bHRpU2VsZWN0LnNlbGVjdEluTXVsdGlwbGVNb2RlKGJ1aWx0RW50cmllcywgc2VsZWN0ZWRFbnRyeVVpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWx0RW50cmllcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBzdHJ1Y3R1cmVDaGVja2VyKGVudHJpZXM6IE5hdlNlbGVjdG9yRW50cnlbXSwgbXVsdGlwbGVNb2RlRW5hYmxlZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNOYXZTZWxlY3RvckVudHJ5QUdyb3VwKGVudHJ5KSB8fCBpc05hdlNlbGVjdG9yRW50cnlBQ2F0ZWdvcnkoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVDaGVja2VyKGVudHJ5LmNoaWxkcmVuLCBtdWx0aXBsZU1vZGVFbmFibGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOYXZTZWxlY3RvckVudHJ5QUxlYWYoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRldGFpbHMubGVuZ3RoICYmIG11bHRpcGxlTW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTmF2U2VsZWN0b3JCdWlsZGVyOiBMZWFmICR7ZW50cnkudWlkfSB3aXRoIGRldGFpbHMgaXMgbm90IGFsbG93ZWQgaW4gbXVsdGlwbGUgbW9kZWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzOiBOYXZTZWxlY3RvckVudHJ5W10sXG4gICAgICAgIG11bHRpcGxlTW9kZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICAgIGxldmVsID0gMSxcbiAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0OiBudW1iZXJcbiAgICApOiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlbXSB7XG4gICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSBlbnRyaWVzXG4gICAgICAgICAgICAubWFwKChlbnRyeSwgaWR4KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbnRyeShlbnRyeSwgeyBtdWx0aXBsZU1vZGVFbmFibGVkLCBsZXZlbCwgaWR4LCB0b3RhbE51bWJlck9mRW50cnk6IGVudHJpZXMubGVuZ3RoLCBkZXRhaWxzRGlzcGxheWVkTGltaXQgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoaXQgPT4gaXQgIT09IG51bGwpO1xuICAgICAgICByZXR1cm4gTmF2U2VsZWN0b3JBY2Nlc3NpYmlsaXR5LnJlc2V0Rm9jdXMobmV3RW50cmllcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRFbnRyeShcbiAgICAgICAgZW50cnk6IE5hdlNlbGVjdG9yRW50cnksXG4gICAgICAgIHtcbiAgICAgICAgICAgIG11bHRpcGxlTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIHRvdGFsTnVtYmVyT2ZFbnRyeSxcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCxcbiAgICAgICAgfTogeyBtdWx0aXBsZU1vZGVFbmFibGVkOiBib29sZWFuOyBsZXZlbDogbnVtYmVyOyBpZHg6IG51bWJlcjsgdG90YWxOdW1iZXJPZkVudHJ5OiBudW1iZXI7IGRldGFpbHNEaXNwbGF5ZWRMaW1pdDogbnVtYmVyIH1cbiAgICApOiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnkgfCBudWxsIHtcbiAgICAgICAgaWYgKGlzTmF2U2VsZWN0b3JFbnRyeUFMZWFmKGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRMZWFmKGVudHJ5LCB7XG4gICAgICAgICAgICAgICAgbXVsdGlwbGVNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICAgICAgdG90YWxOdW1iZXJPZkxlYWY6IHRvdGFsTnVtYmVyT2ZFbnRyeSxcbiAgICAgICAgICAgICAgICBmb2N1c2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOYXZTZWxlY3RvckVudHJ5QUNhdGVnb3J5KGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDYXRlZ29yeShlbnRyeSwge1xuICAgICAgICAgICAgICAgIG11bHRpcGxlTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgICAgIHRvdGFsTnVtYmVyT2ZDYXRlZ29yeTogdG90YWxOdW1iZXJPZkVudHJ5LFxuICAgICAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRHcm91cChlbnRyeSwge1xuICAgICAgICAgICAgICAgIG11bHRpcGxlTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgICAgIHRvdGFsTnVtYmVyT2ZHcm91cHM6IHRvdGFsTnVtYmVyT2ZFbnRyeSxcbiAgICAgICAgICAgICAgICBmb2N1c2FibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWlsZENhdGVnb3J5Q2hpbGRyZW4oXG4gICAgICAgIGVudHJ5OiBOYXZTZWxlY3RvckNhdGVnb3J5LFxuICAgICAgICB7XG4gICAgICAgICAgICBmb2N1c2FibGUsXG4gICAgICAgICAgICBtdWx0aXBsZU1vZGVFbmFibGVkLFxuICAgICAgICAgICAgY2F0ZWdvcnlMZXZlbCxcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgZm9jdXNhYmxlOiBib29sZWFuO1xuICAgICAgICAgICAgbXVsdGlwbGVNb2RlRW5hYmxlZDogYm9vbGVhbjtcbiAgICAgICAgICAgIGNhdGVnb3J5TGV2ZWw6IG51bWJlcjtcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdDogbnVtYmVyO1xuICAgICAgICB9XG4gICAgKTogKEludGVybmFsTmF2U2VsZWN0b3JHcm91cCB8IEludGVybmFsTmF2U2VsZWN0b3JMZWFmKVtdIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LmNoaWxkcmVuXG4gICAgICAgICAgICAubWFwKChjaGlsZCwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmF2U2VsZWN0b3JFbnRyeUFMZWFmKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZExlYWYoY2hpbGQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogY2F0ZWdvcnlMZXZlbCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbE51bWJlck9mTGVhZjogZW50cnkuY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZEdyb3VwKGNoaWxkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU1vZGVFbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGNhdGVnb3J5TGV2ZWwgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxOdW1iZXJPZkdyb3VwczogZW50cnkuY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcihpdCA9PiBpdCAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRDYXRlZ29yeShcbiAgICAgICAgbm9kZTogTmF2U2VsZWN0b3JDYXRlZ29yeSxcbiAgICAgICAge1xuICAgICAgICAgICAgbXVsdGlwbGVNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgdG90YWxOdW1iZXJPZkNhdGVnb3J5LFxuICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBtdWx0aXBsZU1vZGVFbmFibGVkOiBib29sZWFuO1xuICAgICAgICAgICAgbGV2ZWw6IG51bWJlcjtcbiAgICAgICAgICAgIGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgdG90YWxOdW1iZXJPZkNhdGVnb3J5OiBudW1iZXI7XG4gICAgICAgICAgICBkZXRhaWxzRGlzcGxheWVkTGltaXQ6IG51bWJlcjtcbiAgICAgICAgfVxuICAgICk6IEludGVybmFsTmF2U2VsZWN0b3JDYXRlZ29yeSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5idWlsZENhdGVnb3J5Q2hpbGRyZW4obm9kZSwge1xuICAgICAgICAgICAgZm9jdXNhYmxlOiAhbm9kZS5mb2xkZWQsXG4gICAgICAgICAgICBtdWx0aXBsZU1vZGVFbmFibGVkLFxuICAgICAgICAgICAgY2F0ZWdvcnlMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICBkZXRhaWxzRGlzcGxheWVkTGltaXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1aWQ6IG5vZGUudWlkLFxuICAgICAgICAgICAgYWxpYXM6IG5vZGUuYWxpYXMsXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICBmb2N1c2FibGU6IHRydWUsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgIGFyaWFMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICAgICAgYXJpYVBvc2luc2V0OiBpZHggKyAxLFxuICAgICAgICAgICAgICAgIGFyaWFTZXRzaXplOiB0b3RhbE51bWJlck9mQ2F0ZWdvcnksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9sZGVkOiBub2RlLmZvbGRlZCxcbiAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWlsZEdyb3VwQ2hpbGRyZW4oXG4gICAgICAgIGVudHJ5OiBOYXZTZWxlY3Rvckdyb3VwLFxuICAgICAgICB7XG4gICAgICAgICAgICBtdWx0aXBsZU1vZGVFbmFibGVkLFxuICAgICAgICAgICAgZ3JvdXBMZXZlbCxcbiAgICAgICAgICAgIGZvY3VzYWJsZSxcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCxcbiAgICAgICAgfTogeyBtdWx0aXBsZU1vZGVFbmFibGVkOiBib29sZWFuOyBncm91cExldmVsOiBudW1iZXI7IGZvY3VzYWJsZTogYm9vbGVhbjsgZGV0YWlsc0Rpc3BsYXllZExpbWl0OiBudW1iZXIgfVxuICAgICk6IEludGVybmFsTmF2U2VsZWN0b3JMZWFmW10ge1xuICAgICAgICByZXR1cm4gZW50cnkuY2hpbGRyZW5cbiAgICAgICAgICAgIC5tYXAoKGNoaWxkLCBpZHgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZExlYWYoY2hpbGQsIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGdyb3VwTGV2ZWwgKyAxLFxuICAgICAgICAgICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTnVtYmVyT2ZMZWFmOiBlbnRyeS5jaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZTogZm9jdXNhYmxlICYmICFlbnRyeS5mb2xkZWQsXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcihpdCA9PiBpdCAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRHcm91cChcbiAgICAgICAgbm9kZTogTmF2U2VsZWN0b3JHcm91cCxcbiAgICAgICAge1xuICAgICAgICAgICAgZm9jdXNhYmxlLFxuICAgICAgICAgICAgbXVsdGlwbGVNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgdG90YWxOdW1iZXJPZkdyb3VwcyxcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgZm9jdXNhYmxlOiBib29sZWFuO1xuICAgICAgICAgICAgbXVsdGlwbGVNb2RlRW5hYmxlZDogYm9vbGVhbjtcbiAgICAgICAgICAgIGxldmVsOiBudW1iZXI7XG4gICAgICAgICAgICBpZHg6IG51bWJlcjtcbiAgICAgICAgICAgIHRvdGFsTnVtYmVyT2ZHcm91cHM6IG51bWJlcjtcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdDogbnVtYmVyO1xuICAgICAgICB9XG4gICAgKTogSW50ZXJuYWxOYXZTZWxlY3Rvckdyb3VwIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmJ1aWxkR3JvdXBDaGlsZHJlbihub2RlLCB7IG11bHRpcGxlTW9kZUVuYWJsZWQsIGdyb3VwTGV2ZWw6IGxldmVsLCBmb2N1c2FibGUsIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCB9KTtcbiAgICAgICAgY29uc3QgZGlzcGxheVRva2VuSW52YWxpZCA9IGNoaWxkcmVuLnNvbWUoKHsgZGlzcGxheVRva2VuSW52YWxpZCB9KSA9PiBkaXNwbGF5VG9rZW5JbnZhbGlkKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuQ291bnQgPSBjaGlsZHJlbi5maWx0ZXIoKHsgc2VsZWN0ZWQgfSkgPT4gc2VsZWN0ZWQpLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdWlkOiBub2RlLnVpZCxcbiAgICAgICAgICAgIGFsaWFzOiBub2RlLmFsaWFzLFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBjaGlsZHJlblBpY3R1cmVVcmxTYW1wbGU6IGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgLm1hcCgoY2hpbGQsIGlkeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBTGVhZihjaGlsZCkgJiYgaWR4IDwgNCA/IHsgdXJsOiBjaGlsZC5waWN0dXJlVXJsLCBpbml0aWFsOiBjaGlsZC5hbGlhc1swXSB9IDogbnVsbFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ID0+IGl0ICE9PSBudWxsKSxcbiAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgIGFyaWFQb3NpbnNldDogaWR4ICsgMSxcbiAgICAgICAgICAgICAgICBhcmlhTGV2ZWw6IGxldmVsLFxuICAgICAgICAgICAgICAgIGFyaWFTZXRzaXplOiB0b3RhbE51bWJlck9mR3JvdXBzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzYWJsZSxcbiAgICAgICAgICAgIGRpc3BsYXlDb3VudGVyOiBub2RlLmZvbGRlZCAmJiBjaGlsZHJlbi5zb21lKGNoaWxkID0+IGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWYoY2hpbGQpICYmIGNoaWxkLmNvdW50ZXIgIT09IDApLFxuICAgICAgICAgICAgY291bnRlcjogY2hpbGRyZW4ucmVkdWNlKChhY2MsIHsgY291bnRlciB9KSA9PiBhY2MgKyBjb3VudGVyLCAwKSxcbiAgICAgICAgICAgIGRpc3BsYXlUb2tlbkludmFsaWQsXG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBtdWx0aXBsZU1vZGVFbmFibGVkICYmIGNoaWxkcmVuLnNvbWUoKHsgc2VsZWN0YWJsZSB9KSA9PiBzZWxlY3RhYmxlKSxcbiAgICAgICAgICAgIHVuZGV0ZXJtaW5lZFNlbGVjdGlvbjogc2VsZWN0ZWRDaGlsZHJlbkNvdW50ICE9PSBjaGlsZHJlbi5sZW5ndGggJiYgc2VsZWN0ZWRDaGlsZHJlbkNvdW50ID4gMCxcbiAgICAgICAgICAgIGZvbGRlZDogbm9kZS5mb2xkZWQsXG4gICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRMZWFmKFxuICAgICAgICBsZWFmOiBOYXZTZWxlY3RvckxlYWYsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZSxcbiAgICAgICAgICAgIG11bHRpcGxlTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIHRvdGFsTnVtYmVyT2ZMZWFmLFxuICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICB9OiB7XG4gICAgICAgICAgICBmb2N1c2FibGU6IGJvb2xlYW47XG4gICAgICAgICAgICBtdWx0aXBsZU1vZGVFbmFibGVkOiBib29sZWFuO1xuICAgICAgICAgICAgbGV2ZWw6IG51bWJlcjtcbiAgICAgICAgICAgIGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgdG90YWxOdW1iZXJPZkxlYWY6IG51bWJlcjtcbiAgICAgICAgICAgIGRldGFpbHNEaXNwbGF5ZWRMaW1pdDogbnVtYmVyO1xuICAgICAgICB9XG4gICAgKTogSW50ZXJuYWxOYXZTZWxlY3RvckxlYWYgfCBudWxsIHtcbiAgICAgICAgaWYgKGxlYWYubWlzc2luZ1Blcm1pc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGV0YWlsc0Rpc3BsYXlhYmxlID0gdGhpcy5pc0xlYWZMb2dpY1ZhbGlkKGxlYWYsIExlYWZMb2dpY3MuQ09VTlRFUikgJiYgISFsZWFmLmRldGFpbHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmb2xkYWJsZSA9ICEhbGVhZi5kZXRhaWxzLmxlbmd0aCAmJiBkZXRhaWxzRGlzcGxheWFibGU7XG4gICAgICAgIGNvbnN0IGZvbGRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSAobGVhZi5kZXRhaWxzLnJlZHVjZSgoYWNjLCBkZXRhaWwpID0+IGFjYyArIChkZXRhaWwuY291bnRlciA/PyAwKSwgMCkgfHwgbGVhZi5jb3VudGVyKSA/PyAwO1xuICAgICAgICBjb25zdCBjb3VudGVyRGlzcGxheWFibGUgPSBjb3VudGVyICE9PSAwICYmIHRoaXMuaXNMZWFmTG9naWNWYWxpZChsZWFmLCBMZWFmTG9naWNzLkNPVU5URVIpO1xuXG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gbGVhZi5kaXNhYmxlUmVhc29uICE9PSBudWxsO1xuXG4gICAgICAgIGNvbnN0IHZpZXdNb3JlRGlzcGxheWFibGUgPSBsZWFmLmRldGFpbHMubGVuZ3RoID4gZGV0YWlsc0Rpc3BsYXllZExpbWl0O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1aWQ6IGxlYWYudWlkLFxuICAgICAgICAgICAgYWxpYXM6IGxlYWYuYWxpYXMsXG4gICAgICAgICAgICBwaWN0dXJlVXJsOiBsZWFmLnBpY3R1cmVVcmwsXG4gICAgICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgICAgIGRpc2FibGVSZWFzb246IGxlYWYuZGlzYWJsZVJlYXNvbixcbiAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICBmb2N1c2FibGU6IGZvY3VzYWJsZSAmJiAhZGlzYWJsZWQsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgIGFyaWFQb3NpbnNldDogaWR4ICsgMSxcbiAgICAgICAgICAgICAgICBhcmlhTGV2ZWw6IGxldmVsLFxuICAgICAgICAgICAgICAgIGFyaWFTZXRzaXplOiB0b3RhbE51bWJlck9mTGVhZixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb2xkYWJsZSxcbiAgICAgICAgICAgIGZvbGRlZCxcbiAgICAgICAgICAgIGRpc3BsYXlDb3VudGVyOiBmb2xkZWQgJiYgY291bnRlckRpc3BsYXlhYmxlLFxuICAgICAgICAgICAgY291bnRlckRpc3BsYXlhYmxlLFxuICAgICAgICAgICAgY291bnRlcixcbiAgICAgICAgICAgIG5ldHdvcms6IGxlYWYubmV0d29yayxcbiAgICAgICAgICAgIGRpc3BsYXlUb2tlbkludmFsaWQ6IGxlYWYudG9rZW5JbnZhbGlkICYmIHRoaXMuaXNMZWFmTG9naWNWYWxpZChsZWFmLCBMZWFmTG9naWNzLlRPS0VOX0lOVkFMSUQsIExlYWZMb2dpY3MuQ09VTlRFUiksXG4gICAgICAgICAgICBkaXNwbGF5RmVhdHVyZUxvY2tlZDpcbiAgICAgICAgICAgICAgICBsZWFmLmZlYXR1cmVMb2NrZWQgJiYgdGhpcy5pc0xlYWZMb2dpY1ZhbGlkKGxlYWYsIExlYWZMb2dpY3MuRkVBVFVSRV9MT0NLRUQsIExlYWZMb2dpY3MuVE9LRU5fSU5WQUxJRCwgTGVhZkxvZ2ljcy5DT1VOVEVSKSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IG11bHRpcGxlTW9kZUVuYWJsZWRcbiAgICAgICAgICAgICAgICA/IHRoaXMuaXNMZWFmTG9naWNWYWxpZChsZWFmLCBMZWFmTG9naWNzLkNPVU5URVIpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmlzTGVhZkxvZ2ljVmFsaWQobGVhZiwgTGVhZkxvZ2ljcy5GRUFUVVJFX0xPQ0tFRCwgTGVhZkxvZ2ljcy5UT0tFTl9JTlZBTElELCBMZWFmTG9naWNzLkNPVU5URVIpLFxuICAgICAgICAgICAgZGV0YWlsc0Rpc3BsYXlhYmxlLFxuICAgICAgICAgICAgZGV0YWlsczogbGVhZi5kZXRhaWxzLm1hcChkZXRhaWwgPT4gdGhpcy5idWlsZExlYWZEZXRhaWwoZGV0YWlsLCBsZXZlbCArIDEsIGZvY3VzYWJsZSAmJiAhZm9sZGVkKSksXG4gICAgICAgICAgICB0eXBlOiAnTEVBRicsXG4gICAgICAgICAgICB2aWV3TW9yZURpc3BsYXlhYmxlLFxuICAgICAgICAgICAgdmlld01vcmVEaXNwbGF5ZWQ6IHZpZXdNb3JlRGlzcGxheWFibGUsXG4gICAgICAgICAgICB2aWV3TW9yZURldGFpbHNEaXNwbGF5ZWRMaW1pdDogZGV0YWlsc0Rpc3BsYXllZExpbWl0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJ1aWxkTGVhZkRldGFpbChkZXRhaWw6IE5hdlNlbGVjdG9yTGVhZkRldGFpbHMsIGxldmVsOiBudW1iZXIsIGZvY3VzYWJsZTogYm9vbGVhbik6IEludGVybmFsTmF2U2VsZWN0b3JMZWFmRGV0YWlscyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1aWQ6IGRldGFpbC51aWQsXG4gICAgICAgICAgICBjb3VudGVyOiBkZXRhaWwuY291bnRlciA/PyAwLFxuICAgICAgICAgICAgZGlzcGxheUNvdW50ZXI6IGRldGFpbC5jb3VudGVyICE9PSBudWxsLFxuICAgICAgICAgICAgYWxpYXM6IGRldGFpbC5uYW1lLFxuICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgICAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgICAgICAgYXJpYVBvc2luc2V0OiAxLFxuICAgICAgICAgICAgICAgIGFyaWFMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICAgICAgYXJpYVNldHNpemU6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9jdXNhYmxlLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JSZWFzb246IGRldGFpbC5lcnJvclJlYXNvbixcbiAgICAgICAgICAgIGRpc3BsYXlFcnJvcjogZGV0YWlsLmVycm9yUmVhc29uICE9PSBudWxsLFxuICAgICAgICAgICAgdHlwZTogJ0xFQUZfREVUQUlMUycsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNMZWFmTG9naWNWYWxpZChsZWFmOiBOYXZTZWxlY3RvckxlYWYsIC4uLmV4Y2x1ZGVzOiBMZWFmTG9naWNzW10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuTEVBRl9MT0dJQ1NfUFJJT1JJVFkpXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWV4Y2x1ZGVzLmluY2x1ZGVzKGtleSBhcyBMZWFmTG9naWNzKSlcbiAgICAgICAgICAgIC5ldmVyeSgoWywgbG9naWNdKSA9PiAhbG9naWMobGVhZikpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,102 @@
1
+ import { isInternalNavSelectorEntryACategory, isInternalNavSelectorEntryAGroup, isInternalNavSelectorEntryALeaf, isInternalNavSelectorEntryANode, } from '../nav-selector';
2
+ import { isInternalNavSelectorEntryALeafFocusable } from '../utils/leaf.utils';
3
+ import { NavSelectorAccessibility } from '../utils/nav-selector.accessibility';
4
+ /**
5
+ * NavSelectorFilter is a utility class that provides methods to filter entries
6
+ */
7
+ export class NavSelectorFilter {
8
+ /**
9
+ * Filters the entries based on the search string
10
+ *
11
+ * The search string is normalized and lowercase and trimmed.
12
+ *
13
+ * If a category matches the search string, all its children are unfolded, marked as focusable, and not hidden.
14
+ *
15
+ * If a group matches the search string, the group is unfolded and all its children are unfolded, marked as focusable, and not hidden.
16
+ *
17
+ * If a leaf matches the search string, it is marked as not hidden and focusable.
18
+ *
19
+ * Else the entry marked as hidden and not focusable.
20
+ *
21
+ * It also determines whenever counter and token invalid should be displayed on groups and leaves.
22
+ *
23
+ * @param entries The entries to filter.
24
+ * @param search The search string.
25
+ * @returns The filtered entries.
26
+ */
27
+ static filter(entries, search) {
28
+ const formattedSearch = this.cleanValue(search);
29
+ if (!formattedSearch) {
30
+ return entries;
31
+ }
32
+ return this.filterEntries(entries, formattedSearch);
33
+ }
34
+ static filterEntries(entries, formattedSearch) {
35
+ const newEntries = entries.map(entry => {
36
+ if (this.matches(entry.alias, formattedSearch)) {
37
+ return this.recursivelyUnfoldEntry(entry);
38
+ }
39
+ if (isInternalNavSelectorEntryANode(entry)) {
40
+ const children = this.filterEntries(entry.children, formattedSearch);
41
+ if (children.every(({ hidden }) => hidden)) {
42
+ return {
43
+ ...entry,
44
+ children,
45
+ hidden: true,
46
+ };
47
+ }
48
+ return {
49
+ ...entry,
50
+ hidden: false,
51
+ displayCounter: false,
52
+ displayTokenInvalid: false,
53
+ folded: false,
54
+ children,
55
+ };
56
+ }
57
+ return {
58
+ ...entry,
59
+ focusable: false,
60
+ hidden: true,
61
+ };
62
+ });
63
+ return NavSelectorAccessibility.resetFocus(newEntries);
64
+ }
65
+ static recursivelyUnfoldEntry(entry) {
66
+ if (isInternalNavSelectorEntryAGroup(entry)) {
67
+ const children = entry.children.map(child => this.recursivelyUnfoldEntry(child));
68
+ return {
69
+ ...entry,
70
+ folded: false,
71
+ children,
72
+ displayCounter: false,
73
+ displayTokenInvalid: false,
74
+ };
75
+ }
76
+ else if (isInternalNavSelectorEntryALeaf(entry)) {
77
+ return {
78
+ ...entry,
79
+ hidden: false,
80
+ focusable: isInternalNavSelectorEntryALeafFocusable(entry, { parentFolded: false, minified: false }),
81
+ displayCounter: entry.counterDisplayable,
82
+ };
83
+ }
84
+ else if (isInternalNavSelectorEntryACategory(entry)) {
85
+ const children = entry.children.map(child => this.recursivelyUnfoldEntry(child));
86
+ return {
87
+ ...entry,
88
+ folded: false,
89
+ hidden: false,
90
+ children,
91
+ };
92
+ }
93
+ return entry;
94
+ }
95
+ static matches(alias, formattedSearch) {
96
+ return this.cleanValue(alias).includes(formattedSearch);
97
+ }
98
+ static cleanValue(value) {
99
+ return value.trim().normalize('NFKC').toLowerCase();
100
+ }
101
+ }
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LXNlbGVjdG9yLmZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9uYXYtc2VsZWN0b3Ivc3JjL3V0aWxzL25hdi1zZWxlY3Rvci5maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlILG1DQUFtQyxFQUNuQyxnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLCtCQUErQixHQUNsQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9FLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRS9FOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUMxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFtQyxFQUFFLE1BQWM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkIsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQXFDLE9BQVksRUFBRSxlQUF1QjtRQUNsRyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFDRCxJQUFJLCtCQUErQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDckUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDekMsT0FBTzt3QkFDSCxHQUFHLEtBQUs7d0JBQ1IsUUFBUTt3QkFDUixNQUFNLEVBQUUsSUFBSTtxQkFDZixDQUFDO2dCQUNOLENBQUM7Z0JBQ0QsT0FBTztvQkFDSCxHQUFHLEtBQUs7b0JBQ1IsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsY0FBYyxFQUFFLEtBQUs7b0JBQ3JCLG1CQUFtQixFQUFFLEtBQUs7b0JBQzFCLE1BQU0sRUFBRSxLQUFLO29CQUNiLFFBQVE7aUJBQ1gsQ0FBQztZQUNOLENBQUM7WUFDRCxPQUFPO2dCQUNILEdBQUcsS0FBSztnQkFDUixTQUFTLEVBQUUsS0FBSztnQkFDaEIsTUFBTSxFQUFFLElBQUk7YUFDZixDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQStCO1FBQ2pFLElBQUksZ0NBQWdDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQTRCLENBQUMsQ0FBQztZQUM1RyxPQUFPO2dCQUNILEdBQUcsS0FBSztnQkFDUixNQUFNLEVBQUUsS0FBSztnQkFDYixRQUFRO2dCQUNSLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixtQkFBbUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7UUFDTixDQUFDO2FBQU0sSUFBSSwrQkFBK0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hELE9BQU87Z0JBQ0gsR0FBRyxLQUFLO2dCQUNSLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFNBQVMsRUFBRSx3Q0FBd0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDcEcsY0FBYyxFQUFFLEtBQUssQ0FBQyxrQkFBa0I7YUFDM0MsQ0FBQztRQUNOLENBQUM7YUFBTSxJQUFJLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQy9CLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBdUQsQ0FDcEcsQ0FBQztZQUNGLE9BQU87Z0JBQ0gsR0FBRyxLQUFLO2dCQUNSLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFFBQVE7YUFDWCxDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWEsRUFBRSxlQUF1QjtRQUN6RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWE7UUFDbkMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5LFxuICAgIEludGVybmFsTmF2U2VsZWN0b3JHcm91cCxcbiAgICBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZixcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFDYXRlZ29yeSxcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFHcm91cCxcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFMZWFmLFxuICAgIGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QU5vZGUsXG59IGZyb20gJy4uL25hdi1zZWxlY3Rvcic7XG5pbXBvcnQgeyBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFMZWFmRm9jdXNhYmxlIH0gZnJvbSAnLi4vdXRpbHMvbGVhZi51dGlscyc7XG5pbXBvcnQgeyBOYXZTZWxlY3RvckFjY2Vzc2liaWxpdHkgfSBmcm9tICcuLi91dGlscy9uYXYtc2VsZWN0b3IuYWNjZXNzaWJpbGl0eSc7XG5cbi8qKlxuICogTmF2U2VsZWN0b3JGaWx0ZXIgaXMgYSB1dGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBmaWx0ZXIgZW50cmllc1xuICovXG5leHBvcnQgY2xhc3MgTmF2U2VsZWN0b3JGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIGVudHJpZXMgYmFzZWQgb24gdGhlIHNlYXJjaCBzdHJpbmdcbiAgICAgKlxuICAgICAqIFRoZSBzZWFyY2ggc3RyaW5nIGlzIG5vcm1hbGl6ZWQgYW5kIGxvd2VyY2FzZSBhbmQgdHJpbW1lZC5cbiAgICAgKlxuICAgICAqIElmIGEgY2F0ZWdvcnkgbWF0Y2hlcyB0aGUgc2VhcmNoIHN0cmluZywgYWxsIGl0cyBjaGlsZHJlbiBhcmUgdW5mb2xkZWQsIG1hcmtlZCBhcyBmb2N1c2FibGUsIGFuZCBub3QgaGlkZGVuLlxuICAgICAqXG4gICAgICogSWYgYSBncm91cCBtYXRjaGVzIHRoZSBzZWFyY2ggc3RyaW5nLCB0aGUgZ3JvdXAgaXMgdW5mb2xkZWQgYW5kIGFsbCBpdHMgY2hpbGRyZW4gYXJlIHVuZm9sZGVkLCBtYXJrZWQgYXMgZm9jdXNhYmxlLCBhbmQgbm90IGhpZGRlbi5cbiAgICAgKlxuICAgICAqIElmIGEgbGVhZiBtYXRjaGVzIHRoZSBzZWFyY2ggc3RyaW5nLCBpdCBpcyBtYXJrZWQgYXMgbm90IGhpZGRlbiBhbmQgZm9jdXNhYmxlLlxuICAgICAqXG4gICAgICogRWxzZSB0aGUgZW50cnkgbWFya2VkIGFzIGhpZGRlbiBhbmQgbm90IGZvY3VzYWJsZS5cbiAgICAgKlxuICAgICAqIEl0IGFsc28gZGV0ZXJtaW5lcyB3aGVuZXZlciBjb3VudGVyIGFuZCB0b2tlbiBpbnZhbGlkIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gZ3JvdXBzIGFuZCBsZWF2ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50cmllcyBUaGUgZW50cmllcyB0byBmaWx0ZXIuXG4gICAgICogQHBhcmFtIHNlYXJjaCBUaGUgc2VhcmNoIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyBUaGUgZmlsdGVyZWQgZW50cmllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZmlsdGVyKGVudHJpZXM6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdLCBzZWFyY2g6IHN0cmluZyk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkU2VhcmNoID0gdGhpcy5jbGVhblZhbHVlKHNlYXJjaCk7XG4gICAgICAgIGlmICghZm9ybWF0dGVkU2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJFbnRyaWVzKGVudHJpZXMsIGZvcm1hdHRlZFNlYXJjaCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmlsdGVyRW50cmllczxUIGV4dGVuZHMgSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5PihlbnRyaWVzOiBUW10sIGZvcm1hdHRlZFNlYXJjaDogc3RyaW5nKTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10ge1xuICAgICAgICBjb25zdCBuZXdFbnRyaWVzID0gZW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hlcyhlbnRyeS5hbGlhcywgZm9ybWF0dGVkU2VhcmNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2l2ZWx5VW5mb2xkRW50cnkoZW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QU5vZGUoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpbHRlckVudHJpZXMoZW50cnkuY2hpbGRyZW4sIGZvcm1hdHRlZFNlYXJjaCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmV2ZXJ5KCh7IGhpZGRlbiB9KSA9PiBoaWRkZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvdW50ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5JbnZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZm9sZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgICAgICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eS5yZXNldEZvY3VzKG5ld0VudHJpZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHJlY3Vyc2l2ZWx5VW5mb2xkRW50cnkoZW50cnk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeSk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeSB7XG4gICAgICAgIGlmIChpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFHcm91cChlbnRyeSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZW50cnkuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHRoaXMucmVjdXJzaXZlbHlVbmZvbGRFbnRyeShjaGlsZCkgYXMgSW50ZXJuYWxOYXZTZWxlY3RvckxlYWYpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgICAgICAgICBmb2xkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlDb3VudGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5JbnZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBTGVhZihlbnRyeSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmb2N1c2FibGU6IGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWZGb2N1c2FibGUoZW50cnksIHsgcGFyZW50Rm9sZGVkOiBmYWxzZSwgbWluaWZpZWQ6IGZhbHNlIH0pLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlDb3VudGVyOiBlbnRyeS5jb3VudGVyRGlzcGxheWFibGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUNhdGVnb3J5KGVudHJ5KSkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbnRyeS5jaGlsZHJlbi5tYXAoXG4gICAgICAgICAgICAgICAgY2hpbGQgPT4gdGhpcy5yZWN1cnNpdmVseVVuZm9sZEVudHJ5KGNoaWxkKSBhcyBJbnRlcm5hbE5hdlNlbGVjdG9yR3JvdXAgfCBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgICAgICAgZm9sZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hlcyhhbGlhczogc3RyaW5nLCBmb3JtYXR0ZWRTZWFyY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhblZhbHVlKGFsaWFzKS5pbmNsdWRlcyhmb3JtYXR0ZWRTZWFyY2gpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNsZWFuVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50cmltKCkubm9ybWFsaXplKCdORktDJykudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59XG4iXX0=