@firestitch/filter 12.9.2 → 12.10.0

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 (203) hide show
  1. package/app/classes/actions-controller.d.ts +38 -38
  2. package/app/components/action-button/action-button.component.d.ts +7 -7
  3. package/app/components/action-kebab-actions/action-kebab-actions.component.d.ts +7 -7
  4. package/app/components/actions/actions.component.d.ts +8 -8
  5. package/app/components/filter/filter.component.d.ts +192 -192
  6. package/app/components/filter-chip/filter-chip.component.d.ts +26 -26
  7. package/app/components/filter-chip-content/filter-chip-content.component.d.ts +18 -18
  8. package/app/components/filter-chips/filter-chips.component.d.ts +8 -8
  9. package/app/components/filter-drawer/filter-drawer.component.d.ts +30 -30
  10. package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +15 -15
  11. package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +13 -13
  12. package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +20 -20
  13. package/app/components/filters-item/base-item/base-item.component.d.ts +23 -23
  14. package/app/components/filters-item/checkbox/checkbox.component.d.ts +11 -11
  15. package/app/components/filters-item/chips/chips.component.d.ts +13 -13
  16. package/app/components/filters-item/date/date.component.d.ts +19 -19
  17. package/app/components/filters-item/date-range/date-range.component.d.ts +14 -14
  18. package/app/components/filters-item/filter-item.component.d.ts +15 -15
  19. package/app/components/filters-item/range/range.component.d.ts +15 -15
  20. package/app/components/filters-item/select/backdrop/backdrop.component.d.ts +6 -6
  21. package/app/components/filters-item/select/groups/groups.component.d.ts +12 -12
  22. package/app/components/filters-item/select/multiple/multiple.component.d.ts +15 -15
  23. package/app/components/filters-item/select/select.component.d.ts +16 -16
  24. package/app/components/filters-item/select/simple/simple.component.d.ts +14 -14
  25. package/app/components/filters-item/text/text.component.d.ts +19 -19
  26. package/app/components/filters-item/week/week.component.d.ts +12 -12
  27. package/app/components/saved-filter-edit/saved-filter-edit.component.d.ts +18 -18
  28. package/app/components/saved-filters-menu/saved-filters-menu.component.d.ts +23 -23
  29. package/app/consts/query-param-delimiter.d.ts +1 -1
  30. package/app/directives/focus-to-item/focus-to-item.directive.d.ts +27 -27
  31. package/app/directives/status-bar/status-bar.directive.d.ts +5 -5
  32. package/app/enums/action-mode.enum.d.ts +5 -5
  33. package/app/enums/action-type.enum.d.ts +7 -7
  34. package/app/enums/item-date-mode.enum.d.ts +5 -5
  35. package/app/enums/item-type.enum.d.ts +15 -15
  36. package/app/fs-filter.module.d.ts +64 -64
  37. package/app/helpers/build-query-params.d.ts +3 -3
  38. package/app/helpers/compare.d.ts +2 -2
  39. package/app/helpers/create-filter-item.d.ts +13 -13
  40. package/app/helpers/find-value.d.ts +1 -1
  41. package/app/helpers/get-range-name.d.ts +1 -1
  42. package/app/helpers/parse-date.d.ts +1 -1
  43. package/app/helpers/parse-item-value-from-stored.d.ts +1 -1
  44. package/app/helpers/query-param-transformers.d.ts +2 -2
  45. package/app/helpers/restore-items.d.ts +12 -12
  46. package/app/helpers/try-convert-to-number.d.ts +1 -1
  47. package/app/injectors/filter-config.d.ts +2 -2
  48. package/app/injectors/filter-drawer-data.d.ts +2 -2
  49. package/app/injectors/filter-drawer-overlay.d.ts +2 -2
  50. package/app/interfaces/action.interface.d.ts +69 -69
  51. package/app/interfaces/config.interface.d.ts +61 -61
  52. package/app/interfaces/external-params.interface.d.ts +3 -3
  53. package/app/interfaces/filter.interface.d.ts +4 -4
  54. package/app/interfaces/items/autocomplete-chips.interface.d.ts +12 -12
  55. package/app/interfaces/items/autocomplete.interface.d.ts +6 -6
  56. package/app/interfaces/items/base.interface.d.ts +27 -27
  57. package/app/interfaces/items/checkbox.interface.d.ts +7 -7
  58. package/app/interfaces/items/chips.interface.d.ts +6 -6
  59. package/app/interfaces/items/date-range.interface.d.ts +8 -8
  60. package/app/interfaces/items/date.interface.d.ts +7 -7
  61. package/app/interfaces/items/range.interface.d.ts +13 -13
  62. package/app/interfaces/items/select.interface.d.ts +20 -20
  63. package/app/interfaces/items/text.interface.d.ts +9 -9
  64. package/app/interfaces/items/week.interface.d.ts +7 -7
  65. package/app/interfaces/saved-filters.interface.d.ts +18 -18
  66. package/app/interfaces/update-filter-item.interface.d.ts +4 -4
  67. package/app/models/action-menu-item.model.d.ts +23 -23
  68. package/app/models/action.model.d.ts +45 -45
  69. package/app/models/filter-config.d.ts +30 -30
  70. package/app/models/items/autocomplete/base-autocomplete-item.d.ts +12 -12
  71. package/app/models/items/autocomplete-chips-item.d.ts +19 -19
  72. package/app/models/items/autocomplete-item.d.ts +10 -10
  73. package/app/models/items/base-item.d.ts +75 -75
  74. package/app/models/items/checkbox-item.d.ts +16 -16
  75. package/app/models/items/chips-item.d.ts +17 -17
  76. package/app/models/items/date/base-date-item.d.ts +14 -14
  77. package/app/models/items/date-item.d.ts +7 -7
  78. package/app/models/items/date-range/base-date-range-item.d.ts +21 -21
  79. package/app/models/items/date-range-item.d.ts +5 -5
  80. package/app/models/items/date-time-item.d.ts +6 -6
  81. package/app/models/items/date-time-range-item.d.ts +5 -5
  82. package/app/models/items/range-item.d.ts +22 -22
  83. package/app/models/items/select/base-select-item.d.ts +13 -13
  84. package/app/models/items/select/multiple-select-item.d.ts +13 -13
  85. package/app/models/items/select/simple-select-item.d.ts +12 -12
  86. package/app/models/items/select-item.d.ts +7 -7
  87. package/app/models/items/text-item.d.ts +14 -14
  88. package/app/models/items/week-item.d.ts +17 -17
  89. package/app/pipes/remove-isolate-value.pipe.d.ts +8 -8
  90. package/app/providers/filter-meta.d.ts +5 -5
  91. package/app/services/external-params/persistance-params-controller.service.d.ts +22 -22
  92. package/app/services/external-params/query-params-controller.service.d.ts +24 -24
  93. package/app/services/external-params/saved-filters-controller.service.d.ts +40 -40
  94. package/app/services/external-params-controller.service.d.ts +42 -42
  95. package/app/services/filter-overlay.service.d.ts +34 -34
  96. package/app/services/focus-controller.service.d.ts +18 -18
  97. package/app/services/items-store.service.d.ts +65 -65
  98. package/bundles/firestitch-filter.umd.js +5375 -5375
  99. package/bundles/firestitch-filter.umd.js.map +1 -1
  100. package/esm2015/app/classes/actions-controller.js +122 -122
  101. package/esm2015/app/components/action-button/action-button.component.js +23 -23
  102. package/esm2015/app/components/action-kebab-actions/action-kebab-actions.component.js +21 -21
  103. package/esm2015/app/components/actions/actions.component.js +29 -29
  104. package/esm2015/app/components/filter/filter.component.js +617 -617
  105. package/esm2015/app/components/filter-chip/filter-chip.component.js +90 -90
  106. package/esm2015/app/components/filter-chip-content/filter-chip-content.component.js +83 -83
  107. package/esm2015/app/components/filter-chips/filter-chips.component.js +24 -24
  108. package/esm2015/app/components/filter-drawer/filter-drawer.component.js +75 -75
  109. package/esm2015/app/components/filter-drawer-actions/filter-drawer-actions.component.js +42 -42
  110. package/esm2015/app/components/filters-item/autocomplete/autocomplete.component.js +29 -29
  111. package/esm2015/app/components/filters-item/autocompletechips/autocompletechips.component.js +51 -51
  112. package/esm2015/app/components/filters-item/base-item/base-item.component.js +58 -58
  113. package/esm2015/app/components/filters-item/checkbox/checkbox.component.js +24 -24
  114. package/esm2015/app/components/filters-item/chips/chips.component.js +31 -31
  115. package/esm2015/app/components/filters-item/date/date.component.js +44 -44
  116. package/esm2015/app/components/filters-item/date-range/date-range.component.js +35 -35
  117. package/esm2015/app/components/filters-item/filter-item.component.js +47 -47
  118. package/esm2015/app/components/filters-item/range/range.component.js +48 -48
  119. package/esm2015/app/components/filters-item/select/backdrop/backdrop.component.js +16 -16
  120. package/esm2015/app/components/filters-item/select/groups/groups.component.js +32 -32
  121. package/esm2015/app/components/filters-item/select/multiple/multiple.component.js +60 -60
  122. package/esm2015/app/components/filters-item/select/select.component.js +43 -43
  123. package/esm2015/app/components/filters-item/select/simple/simple.component.js +46 -46
  124. package/esm2015/app/components/filters-item/text/text.component.js +53 -53
  125. package/esm2015/app/components/filters-item/week/week.component.js +27 -27
  126. package/esm2015/app/components/saved-filter-edit/saved-filter-edit.component.js +54 -54
  127. package/esm2015/app/components/saved-filters-menu/saved-filters-menu.component.js +57 -57
  128. package/esm2015/app/consts/query-param-delimiter.js +1 -1
  129. package/esm2015/app/directives/focus-to-item/focus-to-item.directive.js +129 -129
  130. package/esm2015/app/directives/status-bar/status-bar.directive.js +12 -12
  131. package/esm2015/app/enums/action-mode.enum.js +6 -6
  132. package/esm2015/app/enums/action-type.enum.js +8 -8
  133. package/esm2015/app/enums/item-date-mode.enum.js +6 -6
  134. package/esm2015/app/enums/item-type.enum.js +16 -16
  135. package/esm2015/app/fs-filter.module.js +234 -234
  136. package/esm2015/app/helpers/build-query-params.js +31 -31
  137. package/esm2015/app/helpers/compare.js +37 -37
  138. package/esm2015/app/helpers/create-filter-item.js +54 -54
  139. package/esm2015/app/helpers/find-value.js +12 -12
  140. package/esm2015/app/helpers/get-range-name.js +8 -8
  141. package/esm2015/app/helpers/parse-date.js +7 -7
  142. package/esm2015/app/helpers/parse-item-value-from-stored.js +81 -81
  143. package/esm2015/app/helpers/query-param-transformers.js +8 -8
  144. package/esm2015/app/helpers/restore-items.js +48 -48
  145. package/esm2015/app/helpers/try-convert-to-number.js +5 -5
  146. package/esm2015/app/injectors/filter-config.js +2 -2
  147. package/esm2015/app/injectors/filter-drawer-data.js +2 -2
  148. package/esm2015/app/injectors/filter-drawer-overlay.js +2 -2
  149. package/esm2015/app/interfaces/action.interface.js +1 -1
  150. package/esm2015/app/interfaces/config.interface.js +1 -1
  151. package/esm2015/app/interfaces/external-params.interface.js +1 -1
  152. package/esm2015/app/interfaces/filter.interface.js +1 -1
  153. package/esm2015/app/interfaces/items/autocomplete-chips.interface.js +1 -1
  154. package/esm2015/app/interfaces/items/autocomplete.interface.js +1 -1
  155. package/esm2015/app/interfaces/items/base.interface.js +1 -1
  156. package/esm2015/app/interfaces/items/checkbox.interface.js +1 -1
  157. package/esm2015/app/interfaces/items/chips.interface.js +1 -1
  158. package/esm2015/app/interfaces/items/date-range.interface.js +1 -1
  159. package/esm2015/app/interfaces/items/date.interface.js +1 -1
  160. package/esm2015/app/interfaces/items/range.interface.js +1 -1
  161. package/esm2015/app/interfaces/items/select.interface.js +1 -1
  162. package/esm2015/app/interfaces/items/text.interface.js +1 -1
  163. package/esm2015/app/interfaces/items/week.interface.js +1 -1
  164. package/esm2015/app/interfaces/saved-filters.interface.js +1 -1
  165. package/esm2015/app/interfaces/update-filter-item.interface.js +1 -1
  166. package/esm2015/app/models/action-menu-item.model.js +66 -66
  167. package/esm2015/app/models/action.model.js +102 -102
  168. package/esm2015/app/models/filter-config.js +65 -65
  169. package/esm2015/app/models/items/autocomplete/base-autocomplete-item.js +13 -13
  170. package/esm2015/app/models/items/autocomplete-chips-item.js +61 -61
  171. package/esm2015/app/models/items/autocomplete-item.js +30 -30
  172. package/esm2015/app/models/items/base-item.js +233 -233
  173. package/esm2015/app/models/items/checkbox-item.js +47 -47
  174. package/esm2015/app/models/items/chips-item.js +83 -83
  175. package/esm2015/app/models/items/date/base-date-item.js +47 -47
  176. package/esm2015/app/models/items/date-item.js +18 -18
  177. package/esm2015/app/models/items/date-range/base-date-range-item.js +136 -136
  178. package/esm2015/app/models/items/date-range-item.js +6 -6
  179. package/esm2015/app/models/items/date-time-item.js +9 -9
  180. package/esm2015/app/models/items/date-time-range-item.js +6 -6
  181. package/esm2015/app/models/items/range-item.js +88 -88
  182. package/esm2015/app/models/items/select/base-select-item.js +33 -33
  183. package/esm2015/app/models/items/select/multiple-select-item.js +90 -90
  184. package/esm2015/app/models/items/select/simple-select-item.js +62 -62
  185. package/esm2015/app/models/items/select-item.js +12 -12
  186. package/esm2015/app/models/items/text-item.js +29 -29
  187. package/esm2015/app/models/items/week-item.js +98 -98
  188. package/esm2015/app/pipes/remove-isolate-value.pipe.js +22 -22
  189. package/esm2015/app/providers/filter-meta.js +9 -9
  190. package/esm2015/app/services/external-params/persistance-params-controller.service.js +57 -57
  191. package/esm2015/app/services/external-params/query-params-controller.service.js +66 -66
  192. package/esm2015/app/services/external-params/saved-filters-controller.service.js +164 -164
  193. package/esm2015/app/services/external-params-controller.service.js +162 -162
  194. package/esm2015/app/services/filter-overlay.service.js +115 -115
  195. package/esm2015/app/services/focus-controller.service.js +29 -29
  196. package/esm2015/app/services/items-store.service.js +340 -340
  197. package/esm2015/firestitch-filter.js +4 -4
  198. package/esm2015/public_api.js +36 -36
  199. package/fesm2015/firestitch-filter.js +4290 -4290
  200. package/fesm2015/firestitch-filter.js.map +1 -1
  201. package/firestitch-filter.d.ts +5 -5
  202. package/package.json +1 -1
  203. package/public_api.d.ts +40 -40
@@ -1,341 +1,341 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
3
- import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
4
- import { pickBy } from 'lodash-es';
5
- import { ItemType } from '../enums/item-type.enum';
6
- import { SimpleSelectItem } from '../models/items/select/simple-select-item';
7
- import { SORT_BY_FIELD, SORT_DIRECTION_FIELD } from '../models/filter-config';
8
- import { createFilterItem } from '../helpers/create-filter-item';
9
- import { RangeItem } from '../models/items/range-item';
10
- import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
11
- import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
12
- import * as i0 from "@angular/core";
13
- export class FsFilterItemsStore {
14
- constructor() {
15
- this.sortByItem = null;
16
- this.sortDirectionItem = null;
17
- this.keywordItem = null;
18
- this._ready$ = new BehaviorSubject(false);
19
- this._items = [];
20
- this._visibleItems$ = new BehaviorSubject([]);
21
- this._itemsByName = new Map();
22
- this._itemsValuesLoaded = false;
23
- this._hasKeyword = false;
24
- this._itemsChange$ = new Subject();
25
- this._destroy$ = new Subject();
26
- this._lazyInit();
27
- }
28
- get items() {
29
- return this._items;
30
- }
31
- get visibleItems() {
32
- return this._visibleItems$.getValue();
33
- }
34
- get visibleItems$() {
35
- return this._visibleItems$.asObservable();
36
- }
37
- set visibleItems(items) {
38
- this._visibleItems$.next(items);
39
- }
40
- get hasKeyword() {
41
- return this._hasKeyword;
42
- }
43
- get itemsChange$() {
44
- return this._itemsChange$.pipe(debounceTime(30));
45
- }
46
- get ready$() {
47
- return this._ready$.asObservable();
48
- }
49
- ngOnDestroy() {
50
- this.destroyItems();
51
- this._destroy$.next();
52
- this._destroy$.complete();
53
- }
54
- setConfig(config) {
55
- this._itemsByName.clear();
56
- this._config = config;
57
- this.initItems(config.items);
58
- }
59
- getItemByName(name) {
60
- return this._itemsByName.get(name);
61
- }
62
- initItems(items) {
63
- this._itemsValuesLoaded = false;
64
- if (Array.isArray(items)) {
65
- this._createItems(items);
66
- }
67
- }
68
- filtersClear() {
69
- var _a;
70
- this.items.forEach((item) => {
71
- if (item instanceof RangeItem) {
72
- item.clearRange(null, item.defaultValue);
73
- }
74
- else if (item instanceof BaseDateRangeItem) {
75
- item.clearDateRange(null, item.defaultValue);
76
- }
77
- else {
78
- item.clear(item.defaultValue);
79
- }
80
- });
81
- if (this.sortByItem) {
82
- if (this._config.sort) {
83
- this.sortByItem.model = this._config.sort.value;
84
- }
85
- else {
86
- this.sortByItem.clear(this.sortByItem.defaultValue);
87
- }
88
- }
89
- if (this.sortDirectionItem) {
90
- if (this._config.sort) {
91
- this.sortDirectionItem.model = this._config.sort.direction;
92
- }
93
- else {
94
- this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
95
- }
96
- }
97
- (_a = this.keywordItem) === null || _a === void 0 ? void 0 : _a.clear();
98
- }
99
- loadAsyncValues() {
100
- this.items
101
- .filter((item) => item.hasPendingValues)
102
- .forEach((item) => item.loadAsyncValues());
103
- }
104
- loadAsyncDefaults() {
105
- // default values can be asynchronous, and we must load them if there is no persisted value instead
106
- const defaultValuesToBeLoaded = this.items
107
- .filter((item) => {
108
- return item.defaultValueFn
109
- && (item.persistedValue === null || item.persistedValue === undefined);
110
- });
111
- // special hack for isolate multiple select
112
- // values for this type of select must be preloaded
113
- // Read more in class MultipleSelectItem._init()
114
- const valuesToBeLoaded = this.items
115
- .filter((item) => {
116
- return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
117
- });
118
- if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
119
- forkJoin([
120
- ...defaultValuesToBeLoaded
121
- .map((item) => item.loadDefaultValue()),
122
- ...valuesToBeLoaded
123
- .map((item) => {
124
- item.loadAsyncValues();
125
- return item.loading$
126
- .pipe();
127
- })
128
- ])
129
- .pipe(finalize(() => {
130
- this._ready$.next(true);
131
- }), takeUntil(this._destroy$))
132
- .subscribe();
133
- }
134
- else {
135
- this._ready$.next(true);
136
- }
137
- }
138
- getSort() {
139
- let sortBy = this.getSortByValue();
140
- sortBy = sortBy === '__all' ? null : sortBy;
141
- let sortDirection = this.getSortDirectionValue();
142
- sortDirection = sortDirection === '__all' ? null : sortDirection;
143
- return {
144
- value: sortBy,
145
- direction: sortDirection,
146
- };
147
- }
148
- getSortByValue() {
149
- return this.sortByItem ? this.sortByItem.model : null;
150
- }
151
- getSortDirectionValue() {
152
- return this.sortDirectionItem ? this.sortDirectionItem.model : null;
153
- }
154
- updateSort(sort) {
155
- if (sort.sortBy) {
156
- this.sortByItem.model = sort.sortBy;
157
- }
158
- if (sort.sortDirection) {
159
- this.sortDirectionItem.model = sort.sortDirection;
160
- }
161
- }
162
- values(onlyPresented = false) {
163
- return this.items.reduce((acc, item) => {
164
- const value = item.value;
165
- if (!onlyPresented || value !== null) {
166
- acc[item.name] = value;
167
- }
168
- return acc;
169
- }, {});
170
- }
171
- valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
172
- const params = {};
173
- (items || this.items).forEach((filterItem) => {
174
- const values = persisted
175
- ? filterItem.persistanceObject
176
- : filterItem.queryObject;
177
- Object.assign(params, values);
178
- });
179
- if (onlyPresented) {
180
- return pickBy(params, (val) => {
181
- return val !== void 0;
182
- });
183
- }
184
- return params;
185
- }
186
- initItemValues(p) {
187
- this.items
188
- .forEach((item) => {
189
- item.initValues(p[item.name]);
190
- });
191
- this._initSortingItems(p);
192
- this.loadAsyncDefaults();
193
- this._subscribeToItemsChanges();
194
- }
195
- updateItemsWithValues(values) {
196
- this.items
197
- .forEach((item) => {
198
- if (values[item.name]) {
199
- item.model = values[item.name];
200
- }
201
- else {
202
- if (item instanceof RangeItem) {
203
- item.clearRange(null, item.defaultValue);
204
- }
205
- else if (item instanceof BaseDateRangeItem) {
206
- item.clearDateRange(null, item.defaultValue);
207
- }
208
- else {
209
- item.clear();
210
- }
211
- }
212
- });
213
- if (this.sortByItem) {
214
- this.sortByItem.clear();
215
- }
216
- if (this.sortDirectionItem) {
217
- this.sortDirectionItem.clear();
218
- }
219
- }
220
- destroyItems() {
221
- var _a, _b;
222
- this.items
223
- .forEach((item) => item.destroy());
224
- (_a = this.sortByItem) === null || _a === void 0 ? void 0 : _a.destroy();
225
- (_b = this.sortDirectionItem) === null || _b === void 0 ? void 0 : _b.destroy();
226
- this._items = [];
227
- this.sortByItem = null;
228
- this.sortDirectionItem = null;
229
- }
230
- /**
231
- * Some items might need to load async values before they will be shown
232
- */
233
- prepareItems() {
234
- if (!this._itemsValuesLoaded) {
235
- this._itemsValuesLoaded = true;
236
- this.loadAsyncValues();
237
- }
238
- }
239
- updateVisibleItems() {
240
- this.visibleItems = this.items
241
- .filter((item) => !item.isTypeKeyword && !item.hide);
242
- }
243
- _createItems(items) {
244
- this._items = items
245
- .filter((item) => !item.disable)
246
- .filter((item) => {
247
- if (this._itemsByName.has(item.name)) {
248
- throw Error('Filter init error. Items name must be unique.');
249
- }
250
- else {
251
- this._itemsByName.set(item.name, null);
252
- return true;
253
- }
254
- })
255
- .map((item) => {
256
- const filterItem = createFilterItem(item, { case: this._config.case });
257
- if (filterItem.type === ItemType.Keyword) {
258
- this._hasKeyword = true;
259
- }
260
- this._itemsByName.set(item.name, filterItem);
261
- return filterItem;
262
- });
263
- this._createSortingItems();
264
- }
265
- _subscribeToItemsChanges() {
266
- var _a;
267
- this.items
268
- .forEach((item) => {
269
- item.valueChange$
270
- .pipe(takeUntil(item.destroy$))
271
- .subscribe(() => {
272
- this._itemsChange$.next(item);
273
- });
274
- });
275
- if ((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) {
276
- this.sortByItem.valueChange$
277
- .pipe(takeUntil(this.sortByItem.destroy$))
278
- .subscribe(() => {
279
- this._itemsChange$.next(this.sortByItem);
280
- });
281
- this.sortDirectionItem.valueChange$
282
- .pipe(takeUntil(this.sortDirectionItem.destroy$))
283
- .subscribe(() => {
284
- this._itemsChange$.next(this.sortDirectionItem);
285
- });
286
- }
287
- }
288
- _lazyInit() {
289
- this.ready$
290
- .pipe(filter((state) => state), takeUntil(this._destroy$))
291
- .subscribe(() => {
292
- this.updateVisibleItems();
293
- this._setKeywordItem();
294
- });
295
- }
296
- _initSortingItems(p) {
297
- if (this.sortByItem && this.sortDirectionItem) {
298
- this.sortByItem.initValues(p[this.sortByItem.name]);
299
- this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
300
- }
301
- }
302
- _createSortingItems() {
303
- var _a;
304
- if (((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) > 0) {
305
- const sortByItem = {
306
- name: SORT_BY_FIELD,
307
- type: ItemType.Select,
308
- label: 'Sort By',
309
- values: this._config.sortValues
310
- };
311
- if (this._config.sort && this._config.sort.value) {
312
- sortByItem.default = this._config.sort.value;
313
- }
314
- this.sortByItem = new SimpleSelectItem(sortByItem, null);
315
- const sortDirectionItem = {
316
- name: SORT_DIRECTION_FIELD,
317
- type: ItemType.Select,
318
- label: 'Sort Direction',
319
- values: [
320
- { name: 'Ascending', value: 'asc' },
321
- { name: 'Descending', value: 'desc' }
322
- ]
323
- };
324
- if (this._config.sort && this._config.sort.direction) {
325
- sortDirectionItem.default = this._config.sort.direction;
326
- }
327
- this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null);
328
- }
329
- }
330
- _setKeywordItem() {
331
- this.keywordItem = this
332
- .items
333
- .find((item) => item.isTypeKeyword);
334
- }
335
- }
336
- FsFilterItemsStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
337
- FsFilterItemsStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore });
338
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, decorators: [{
339
- type: Injectable
340
- }], ctorParameters: function () { return []; } });
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
3
+ import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
4
+ import { pickBy } from 'lodash-es';
5
+ import { ItemType } from '../enums/item-type.enum';
6
+ import { SimpleSelectItem } from '../models/items/select/simple-select-item';
7
+ import { SORT_BY_FIELD, SORT_DIRECTION_FIELD } from '../models/filter-config';
8
+ import { createFilterItem } from '../helpers/create-filter-item';
9
+ import { RangeItem } from '../models/items/range-item';
10
+ import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
11
+ import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
12
+ import * as i0 from "@angular/core";
13
+ export class FsFilterItemsStore {
14
+ constructor() {
15
+ this.sortByItem = null;
16
+ this.sortDirectionItem = null;
17
+ this.keywordItem = null;
18
+ this._ready$ = new BehaviorSubject(false);
19
+ this._items = [];
20
+ this._visibleItems$ = new BehaviorSubject([]);
21
+ this._itemsByName = new Map();
22
+ this._itemsValuesLoaded = false;
23
+ this._hasKeyword = false;
24
+ this._itemsChange$ = new Subject();
25
+ this._destroy$ = new Subject();
26
+ this._lazyInit();
27
+ }
28
+ get items() {
29
+ return this._items;
30
+ }
31
+ get visibleItems() {
32
+ return this._visibleItems$.getValue();
33
+ }
34
+ get visibleItems$() {
35
+ return this._visibleItems$.asObservable();
36
+ }
37
+ set visibleItems(items) {
38
+ this._visibleItems$.next(items);
39
+ }
40
+ get hasKeyword() {
41
+ return this._hasKeyword;
42
+ }
43
+ get itemsChange$() {
44
+ return this._itemsChange$.pipe(debounceTime(30));
45
+ }
46
+ get ready$() {
47
+ return this._ready$.asObservable();
48
+ }
49
+ ngOnDestroy() {
50
+ this.destroyItems();
51
+ this._destroy$.next();
52
+ this._destroy$.complete();
53
+ }
54
+ setConfig(config) {
55
+ this._itemsByName.clear();
56
+ this._config = config;
57
+ this.initItems(config.items);
58
+ }
59
+ getItemByName(name) {
60
+ return this._itemsByName.get(name);
61
+ }
62
+ initItems(items) {
63
+ this._itemsValuesLoaded = false;
64
+ if (Array.isArray(items)) {
65
+ this._createItems(items);
66
+ }
67
+ }
68
+ filtersClear() {
69
+ var _a;
70
+ this.items.forEach((item) => {
71
+ if (item instanceof RangeItem) {
72
+ item.clearRange(null, item.defaultValue);
73
+ }
74
+ else if (item instanceof BaseDateRangeItem) {
75
+ item.clearDateRange(null, item.defaultValue);
76
+ }
77
+ else {
78
+ item.clear(item.defaultValue);
79
+ }
80
+ });
81
+ if (this.sortByItem) {
82
+ if (this._config.sort) {
83
+ this.sortByItem.model = this._config.sort.value;
84
+ }
85
+ else {
86
+ this.sortByItem.clear(this.sortByItem.defaultValue);
87
+ }
88
+ }
89
+ if (this.sortDirectionItem) {
90
+ if (this._config.sort) {
91
+ this.sortDirectionItem.model = this._config.sort.direction;
92
+ }
93
+ else {
94
+ this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
95
+ }
96
+ }
97
+ (_a = this.keywordItem) === null || _a === void 0 ? void 0 : _a.clear();
98
+ }
99
+ loadAsyncValues() {
100
+ this.items
101
+ .filter((item) => item.hasPendingValues)
102
+ .forEach((item) => item.loadAsyncValues());
103
+ }
104
+ loadAsyncDefaults() {
105
+ // default values can be asynchronous, and we must load them if there is no persisted value instead
106
+ const defaultValuesToBeLoaded = this.items
107
+ .filter((item) => {
108
+ return item.defaultValueFn
109
+ && (item.persistedValue === null || item.persistedValue === undefined);
110
+ });
111
+ // special hack for isolate multiple select
112
+ // values for this type of select must be preloaded
113
+ // Read more in class MultipleSelectItem._init()
114
+ const valuesToBeLoaded = this.items
115
+ .filter((item) => {
116
+ return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
117
+ });
118
+ if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
119
+ forkJoin([
120
+ ...defaultValuesToBeLoaded
121
+ .map((item) => item.loadDefaultValue()),
122
+ ...valuesToBeLoaded
123
+ .map((item) => {
124
+ item.loadAsyncValues();
125
+ return item.loading$
126
+ .pipe();
127
+ })
128
+ ])
129
+ .pipe(finalize(() => {
130
+ this._ready$.next(true);
131
+ }), takeUntil(this._destroy$))
132
+ .subscribe();
133
+ }
134
+ else {
135
+ this._ready$.next(true);
136
+ }
137
+ }
138
+ getSort() {
139
+ let sortBy = this.getSortByValue();
140
+ sortBy = sortBy === '__all' ? null : sortBy;
141
+ let sortDirection = this.getSortDirectionValue();
142
+ sortDirection = sortDirection === '__all' ? null : sortDirection;
143
+ return {
144
+ value: sortBy,
145
+ direction: sortDirection,
146
+ };
147
+ }
148
+ getSortByValue() {
149
+ return this.sortByItem ? this.sortByItem.model : null;
150
+ }
151
+ getSortDirectionValue() {
152
+ return this.sortDirectionItem ? this.sortDirectionItem.model : null;
153
+ }
154
+ updateSort(sort) {
155
+ if (sort.sortBy) {
156
+ this.sortByItem.model = sort.sortBy;
157
+ }
158
+ if (sort.sortDirection) {
159
+ this.sortDirectionItem.model = sort.sortDirection;
160
+ }
161
+ }
162
+ values(onlyPresented = false) {
163
+ return this.items.reduce((acc, item) => {
164
+ const value = item.value;
165
+ if (!onlyPresented || value !== null) {
166
+ acc[item.name] = value;
167
+ }
168
+ return acc;
169
+ }, {});
170
+ }
171
+ valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
172
+ const params = {};
173
+ (items || this.items).forEach((filterItem) => {
174
+ const values = persisted
175
+ ? filterItem.persistanceObject
176
+ : filterItem.queryObject;
177
+ Object.assign(params, values);
178
+ });
179
+ if (onlyPresented) {
180
+ return pickBy(params, (val) => {
181
+ return val !== void 0;
182
+ });
183
+ }
184
+ return params;
185
+ }
186
+ initItemValues(p) {
187
+ this.items
188
+ .forEach((item) => {
189
+ item.initValues(p[item.name]);
190
+ });
191
+ this._initSortingItems(p);
192
+ this.loadAsyncDefaults();
193
+ this._subscribeToItemsChanges();
194
+ }
195
+ updateItemsWithValues(values) {
196
+ this.items
197
+ .forEach((item) => {
198
+ if (values[item.name]) {
199
+ item.model = values[item.name];
200
+ }
201
+ else {
202
+ if (item instanceof RangeItem) {
203
+ item.clearRange(null, item.defaultValue);
204
+ }
205
+ else if (item instanceof BaseDateRangeItem) {
206
+ item.clearDateRange(null, item.defaultValue);
207
+ }
208
+ else {
209
+ item.clear();
210
+ }
211
+ }
212
+ });
213
+ if (this.sortByItem) {
214
+ this.sortByItem.clear();
215
+ }
216
+ if (this.sortDirectionItem) {
217
+ this.sortDirectionItem.clear();
218
+ }
219
+ }
220
+ destroyItems() {
221
+ var _a, _b;
222
+ this.items
223
+ .forEach((item) => item.destroy());
224
+ (_a = this.sortByItem) === null || _a === void 0 ? void 0 : _a.destroy();
225
+ (_b = this.sortDirectionItem) === null || _b === void 0 ? void 0 : _b.destroy();
226
+ this._items = [];
227
+ this.sortByItem = null;
228
+ this.sortDirectionItem = null;
229
+ }
230
+ /**
231
+ * Some items might need to load async values before they will be shown
232
+ */
233
+ prepareItems() {
234
+ if (!this._itemsValuesLoaded) {
235
+ this._itemsValuesLoaded = true;
236
+ this.loadAsyncValues();
237
+ }
238
+ }
239
+ updateVisibleItems() {
240
+ this.visibleItems = this.items
241
+ .filter((item) => !item.isTypeKeyword && !item.hide);
242
+ }
243
+ _createItems(items) {
244
+ this._items = items
245
+ .filter((item) => !item.disable)
246
+ .filter((item) => {
247
+ if (this._itemsByName.has(item.name)) {
248
+ throw Error('Filter init error. Items name must be unique.');
249
+ }
250
+ else {
251
+ this._itemsByName.set(item.name, null);
252
+ return true;
253
+ }
254
+ })
255
+ .map((item) => {
256
+ const filterItem = createFilterItem(item, { case: this._config.case });
257
+ if (filterItem.type === ItemType.Keyword) {
258
+ this._hasKeyword = true;
259
+ }
260
+ this._itemsByName.set(item.name, filterItem);
261
+ return filterItem;
262
+ });
263
+ this._createSortingItems();
264
+ }
265
+ _subscribeToItemsChanges() {
266
+ var _a;
267
+ this.items
268
+ .forEach((item) => {
269
+ item.valueChange$
270
+ .pipe(takeUntil(item.destroy$))
271
+ .subscribe(() => {
272
+ this._itemsChange$.next(item);
273
+ });
274
+ });
275
+ if ((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) {
276
+ this.sortByItem.valueChange$
277
+ .pipe(takeUntil(this.sortByItem.destroy$))
278
+ .subscribe(() => {
279
+ this._itemsChange$.next(this.sortByItem);
280
+ });
281
+ this.sortDirectionItem.valueChange$
282
+ .pipe(takeUntil(this.sortDirectionItem.destroy$))
283
+ .subscribe(() => {
284
+ this._itemsChange$.next(this.sortDirectionItem);
285
+ });
286
+ }
287
+ }
288
+ _lazyInit() {
289
+ this.ready$
290
+ .pipe(filter((state) => state), takeUntil(this._destroy$))
291
+ .subscribe(() => {
292
+ this.updateVisibleItems();
293
+ this._setKeywordItem();
294
+ });
295
+ }
296
+ _initSortingItems(p) {
297
+ if (this.sortByItem && this.sortDirectionItem) {
298
+ this.sortByItem.initValues(p[this.sortByItem.name]);
299
+ this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
300
+ }
301
+ }
302
+ _createSortingItems() {
303
+ var _a;
304
+ if (((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) > 0) {
305
+ const sortByItem = {
306
+ name: SORT_BY_FIELD,
307
+ type: ItemType.Select,
308
+ label: 'Sort By',
309
+ values: this._config.sortValues
310
+ };
311
+ if (this._config.sort && this._config.sort.value) {
312
+ sortByItem.default = this._config.sort.value;
313
+ }
314
+ this.sortByItem = new SimpleSelectItem(sortByItem, null);
315
+ const sortDirectionItem = {
316
+ name: SORT_DIRECTION_FIELD,
317
+ type: ItemType.Select,
318
+ label: 'Sort Direction',
319
+ values: [
320
+ { name: 'Ascending', value: 'asc' },
321
+ { name: 'Descending', value: 'desc' }
322
+ ]
323
+ };
324
+ if (this._config.sort && this._config.sort.direction) {
325
+ sortDirectionItem.default = this._config.sort.direction;
326
+ }
327
+ this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null);
328
+ }
329
+ }
330
+ _setKeywordItem() {
331
+ this.keywordItem = this
332
+ .items
333
+ .find((item) => item.isTypeKeyword);
334
+ }
335
+ }
336
+ FsFilterItemsStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
337
+ FsFilterItemsStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore });
338
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, decorators: [{
339
+ type: Injectable
340
+ }], ctorParameters: function () { return []; } });
341
341
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU1uQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFN0UsT0FBTyxFQUFrQixhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFJcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7O0FBVWpGLE1BQU0sT0FBTyxrQkFBa0I7SUFrQjdCO1FBaEJPLGVBQVUsR0FBZ0MsSUFBSSxDQUFDO1FBQy9DLHNCQUFpQixHQUFnQyxJQUFJLENBQUM7UUFDdEQsZ0JBQVcsR0FBYSxJQUFJLENBQUM7UUFFNUIsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLFdBQU0sR0FBa0MsRUFBRSxDQUFDO1FBQzNDLG1CQUFjLEdBQUcsSUFBSSxlQUFl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Q0wsQ0FBQztZQUVGLE1BQU0saUJBQWlCLEdBQUc7Z0JBQ3hCLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDckIsS0FBSyxFQUFFLGdCQUFnQjtnQkFDdkIsTUFBTSxFQUFFO29CQUNOLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO29CQUNuQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtpQkFDdEM7YUFDeUIsQ0FBQztZQUU3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDcEQsaUJBQWlCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUN6RDtZQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixDQUMzQyxpQkFBaUIsRUFDakIsSUFBSSxDQUNMLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSTthQUNwQixLQUFLO2FBQ0wsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFhLENBQUM7SUFDcEQsQ0FBQzs7Z0hBL1lVLGtCQUFrQjtvSEFBbEIsa0JBQWtCOzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IHBpY2tCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7XG4gIEZpbHRlclNvcnQsXG4gIElGaWx0ZXJDb25maWdJdGVtLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi9lbnVtcy9pdGVtLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBCYXNlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9iYXNlLWl0ZW0nO1xuaW1wb3J0IHsgU2ltcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3Qvc2ltcGxlLXNlbGVjdC1pdGVtJztcbmltcG9ydCB7IElGaWx0ZXJDb25maWdTZWxlY3RJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pdGVtcy9zZWxlY3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnLCBTT1JUX0JZX0ZJRUxELCBTT1JUX0RJUkVDVElPTl9GSUVMRCB9IGZyb20gJy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IGNyZWF0ZUZpbHRlckl0ZW0gfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZS1maWx0ZXItaXRlbSc7XG5pbXBvcnQgeyBSYW5nZUl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvcmFuZ2UtaXRlbSc7XG5pbXBvcnQgeyBCYXNlRGF0ZVJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9kYXRlLXJhbmdlL2Jhc2UtZGF0ZS1yYW5nZS1pdGVtJztcbmltcG9ydCB7IElTb3J0aW5nQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGV4dEl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvdGV4dC1pdGVtJztcbmltcG9ydCB7IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0ZXJuYWwtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNdWx0aXBsZVNlbGVjdEl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC1pdGVtJztcblxuXG5pbnRlcmZhY2UgSVZhbHVlQXNRdWVyeSB7XG4gIG9ubHlQcmVzZW50ZWQ/OiBib29sZWFuO1xuICBpdGVtcz86IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdO1xuICBwZXJzaXN0ZWQ/OiBib29sZWFuO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRnNGaWx0ZXJJdGVtc1N0b3JlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwdWJsaWMgc29ydEJ5SXRlbTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+ID0gbnVsbDtcbiAgcHVibGljIHNvcnREaXJlY3Rpb25JdGVtOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4gPSBudWxsO1xuICBwdWJsaWMga2V5d29yZEl0ZW06IFRleHRJdGVtID0gbnVsbDtcblxuICBwcml2YXRlIF9yZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfaXRlbXM6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdID0gW107XG4gIHByaXZhdGUgX3Zpc2libGVJdGVtcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdPihbXSk7XG4gIHByaXZhdGUgX2l0ZW1zQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPj4oKTtcblxuICBwcml2YXRlIF9pdGVtc1ZhbHVlc0xvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9oYXNLZXl3b3JkID0gZmFsc2U7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG5cbiAgcHJpdmF0ZSBfaXRlbXNDaGFuZ2UkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2xhenlJbml0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcygpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVJdGVtcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUl0ZW1zJCgpOiBPYnNlcnZhYmxlPEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVJdGVtcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZpc2libGVJdGVtcyhpdGVtczogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10pIHtcbiAgICB0aGlzLl92aXNpYmxlSXRlbXMkLm5leHQoaXRlbXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNLZXl3b3JkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNLZXl3b3JkO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtc0NoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zQ2hhbmdlJC5waXBlKGRlYm91bmNlVGltZSgzMCkpO1xuICB9XG5cbiAgcHVibGljIGdldCByZWFkeSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lJdGVtcygpO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuX2l0ZW1zQnlOYW1lLmNsZWFyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaW5pdEl0ZW1zKGNvbmZpZy5pdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc0J5TmFtZS5nZXQobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKGl0ZW1zOiBJRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUl0ZW1zKGl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyc0NsZWFyKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEJhc2VEYXRlUmFuZ2VJdGVtKSB7XG4gICAgICAgIGl0ZW0uY2xlYXJEYXRlUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jbGVhcihpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQudmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydEJ5SXRlbS5jbGVhcih0aGlzLnNvcnRCeUl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0KSB7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSB0aGlzLl9jb25maWcuc29ydC5kaXJlY3Rpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uY2xlYXIodGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua2V5d29yZEl0ZW0/LmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgbG9hZEFzeW5jVmFsdWVzKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaGFzUGVuZGluZ1ZhbHVlcylcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLmxvYWRBc3luY1ZhbHVlcygpKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkQXN5bmNEZWZhdWx0cygpOiB2b2lkIHtcbiAgICAvLyBkZWZhdWx0IHZhbHVlcyBjYW4gYmUgYXN5bmNocm9ub3VzLCBhbmQgd2UgbXVzdCBsb2FkIHRoZW0gaWYgdGhlcmUgaXMgbm8gcGVyc2lzdGVkIHZhbHVlIGluc3RlYWRcbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzVG9CZUxvYWRlZCA9IHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uZGVmYXVsdFZhbHVlRm5cbiAgICAgICAgICAmJiAoaXRlbS5wZXJzaXN0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBpdGVtLnBlcnNpc3RlZFZhbHVlID09PSB1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAvLyBzcGVjaWFsIGhhY2sgZm9yIGlzb2xhdGUgbXVsdGlwbGUgc2VsZWN0XG4gICAgLy8gdmFsdWVzIGZvciB0aGlzIHR5cGUgb2Ygc2VsZWN0IG11c3QgYmUgcHJlbG9hZGVkXG4gICAgLy8gUmVhZCBtb3JlIGluIGNsYXNzIE11bHRpcGxlU2VsZWN0SXRlbS5faW5pdCgpXG4gICAgY29uc3QgdmFsdWVzVG9CZUxvYWRlZCA9IHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIChpdGVtIGluc3RhbmNlb2YgTXVsdGlwbGVTZWxlY3RJdGVtKSAmJiBpdGVtLmhhc1BlbmRpbmdWYWx1ZXMgJiYgaXRlbS5pc29sYXRlO1xuICAgICAgfSk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlc1RvQmVMb2FkZWQubGVuZ3RoID4gMCB8fCB2YWx1ZXNUb0JlTG9hZGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvcmtKb2luKFxuICAgICAgICBbXG4gICAgICAgICAgLi4uZGVmYXVsdFZhbHVlc1RvQmVMb2FkZWRcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0ubG9hZERlZmF1bHRWYWx1ZSgpKSxcblxuICAgICAgICAgIC4uLnZhbHVlc1RvQmVMb2FkZWRcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgaXRlbS5sb2FkQXN5bmNWYWx1ZXMoKTtcblxuICAgICAgICAgICAgICByZXR1cm4gaXRlbS5sb2FkaW5nJFxuICAgICAgICAgICAgICAgIC5waXBlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICBdLFxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeSQubmV4dCh0cnVlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVhZHkkLm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnQoKTogRmlsdGVyU29ydCB7XG4gICAgbGV0IHNvcnRCeSA9IHRoaXMuZ2V0U29ydEJ5VmFsdWUoKTtcbiAgICBzb3J0QnkgPSBzb3J0QnkgPT09ICdfX2FsbCcgPyBudWxsIDogc29ydEJ5O1xuXG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb25WYWx1ZSgpO1xuICAgIHNvcnREaXJlY3Rpb24gPSBzb3J0RGlyZWN0aW9uID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnREaXJlY3Rpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHNvcnRCeSxcbiAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydEJ5VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydEJ5SXRlbSA/IHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydERpcmVjdGlvblZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID8gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0OiBJU29ydGluZ0NoYW5nZUV2ZW50KSB7XG4gICAgaWYgKHNvcnQuc29ydEJ5KSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSBzb3J0LnNvcnRCeTtcbiAgICB9XG5cbiAgICBpZiAoc29ydC5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gc29ydC5zb3J0RGlyZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXMob25seVByZXNlbnRlZCA9IGZhbHNlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0udmFsdWU7XG5cbiAgICAgIGlmICghb25seVByZXNlbnRlZCB8fCB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBhY2NbaXRlbS5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXNBc1F1ZXJ5KHtcbiAgICBvbmx5UHJlc2VudGVkID0gdHJ1ZSxcbiAgICBpdGVtcyA9IG51bGwsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gIH06IElWYWx1ZUFzUXVlcnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgIChpdGVtcyB8fCB0aGlzLml0ZW1zKS5mb3JFYWNoKChmaWx0ZXJJdGVtOiBCYXNlSXRlbTxhbnk+KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBwZXJzaXN0ZWRcbiAgICAgICAgPyBmaWx0ZXJJdGVtLnBlcnNpc3RhbmNlT2JqZWN0XG4gICAgICAgIDogZmlsdGVySXRlbS5xdWVyeU9iamVjdDtcblxuICAgICAgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHZhbHVlcyk7XG4gICAgfSk7XG5cbiAgICBpZiAob25seVByZXNlbnRlZCkge1xuICAgICAgcmV0dXJuIHBpY2tCeShwYXJhbXMsICh2YWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gdm9pZCAwO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHB1YmxpYyBpbml0SXRlbVZhbHVlcyhwOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLmluaXRWYWx1ZXMocFtpdGVtLm5hbWVdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faW5pdFNvcnRpbmdJdGVtcyhwKTtcbiAgICB0aGlzLmxvYWRBc3luY0RlZmF1bHRzKCk7XG4gICAgdGhpcy5fc3Vic2NyaWJlVG9JdGVtc0NoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtc1dpdGhWYWx1ZXModmFsdWVzOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodmFsdWVzW2l0ZW0ubmFtZV0pIHtcbiAgICAgICAgICBpdGVtLm1vZGVsID0gdmFsdWVzW2l0ZW0ubmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXJSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQmFzZURhdGVSYW5nZUl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXJEYXRlUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtLmNsZWFyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHsgdGhpcy5zb3J0QnlJdGVtLmNsZWFyKCk7IH1cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkgeyB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKCk7IH1cbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95SXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0uZGVzdHJveSgpKTtcbiAgICB0aGlzLnNvcnRCeUl0ZW0/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtPy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgIHRoaXMuc29ydEJ5SXRlbSA9IG51bGw7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU29tZSBpdGVtcyBtaWdodCBuZWVkIHRvIGxvYWQgYXN5bmMgdmFsdWVzIGJlZm9yZSB0aGV5IHdpbGwgYmUgc2hvd25cbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSXRlbXMoKSB7XG4gICAgaWYgKCF0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCkge1xuICAgICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLmxvYWRBc3luY1ZhbHVlcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVWaXNpYmxlSXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlSXRlbXMgPSB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1R5cGVLZXl3b3JkICYmICFpdGVtLmhpZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSXRlbXMoaXRlbXM6IElGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5kaXNhYmxlKVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5faXRlbXNCeU5hbWUuaGFzKGl0ZW0ubmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignRmlsdGVyIGluaXQgZXJyb3IuIEl0ZW1zIG5hbWUgbXVzdCBiZSB1bmlxdWUuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faXRlbXNCeU5hbWUuc2V0KGl0ZW0ubmFtZSwgbnVsbCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVySXRlbSA9IGNyZWF0ZUZpbHRlckl0ZW0oaXRlbSwgeyBjYXNlOiB0aGlzLl9jb25maWcuY2FzZSB9KTtcblxuICAgICAgICBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5LZXl3b3JkKSB7XG4gICAgICAgICAgdGhpcy5faGFzS2V5d29yZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pdGVtc0J5TmFtZS5zZXQoaXRlbS5uYW1lLCBmaWx0ZXJJdGVtKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVySXRlbTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3JlYXRlU29ydGluZ0l0ZW1zKCk7XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVUb0l0ZW1zQ2hhbmdlcygpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLnZhbHVlQ2hhbmdlJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKGl0ZW0uZGVzdHJveSQpLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zQ2hhbmdlJC5uZXh0KGl0ZW0pO1xuICAgICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9jb25maWcuc29ydFZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnNvcnRCeUl0ZW0uZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2l0ZW1zQ2hhbmdlJC5uZXh0KHRoaXMuc29ydEJ5SXRlbSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLnZhbHVlQ2hhbmdlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xhenlJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVhZHkkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUl0ZW1zKCk7XG4gICAgICAgIHRoaXMuX3NldEtleXdvcmRJdGVtKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRTb3J0aW5nSXRlbXMocDogSUZpbHRlckV4dGVybmFsUGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSAmJiB0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0uaW5pdFZhbHVlcyhwW3RoaXMuc29ydEJ5SXRlbS5uYW1lXSk7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmluaXRWYWx1ZXMocFt0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm5hbWVdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVTb3J0aW5nSXRlbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0VmFsdWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0QnlJdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0JZX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBCeScsXG4gICAgICAgIHZhbHVlczogdGhpcy5fY29uZmlnLnNvcnRWYWx1ZXNcbiAgICAgIH0gYXMgSUZpbHRlckNvbmZpZ1NlbGVjdEl0ZW07XG5cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0ICYmIHRoaXMuX2NvbmZpZy5zb3J0LnZhbHVlKSB7XG4gICAgICAgIHNvcnRCeUl0ZW0uZGVmYXVsdCA9IHRoaXMuX2NvbmZpZy5zb3J0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnRCeUl0ZW0gPSBuZXcgU2ltcGxlU2VsZWN0SXRlbShcbiAgICAgICAgc29ydEJ5SXRlbSxcbiAgICAgICAgbnVsbCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb25JdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0RJUkVDVElPTl9GSUVMRCxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgICAgICBsYWJlbDogJ1NvcnQgRGlyZWN0aW9uJyxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQXNjZW5kaW5nJywgdmFsdWU6ICdhc2MnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRGVzY2VuZGluZycsIHZhbHVlOiAnZGVzYycgfVxuICAgICAgICBdXG4gICAgICB9IGFzIElGaWx0ZXJDb25maWdTZWxlY3RJdGVtO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQgJiYgdGhpcy5fY29uZmlnLnNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgIHNvcnREaXJlY3Rpb25JdGVtLmRlZmF1bHQgPSB0aGlzLl9jb25maWcuc29ydC5kaXJlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0gPSBuZXcgU2ltcGxlU2VsZWN0SXRlbShcbiAgICAgICAgc29ydERpcmVjdGlvbkl0ZW0sXG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0S2V5d29yZEl0ZW0oKSB7XG4gICAgdGhpcy5rZXl3b3JkSXRlbSA9IHRoaXNcbiAgICAgIC5pdGVtc1xuICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXNUeXBlS2V5d29yZCkgYXMgVGV4dEl0ZW07XG4gIH1cbn1cbiJdfQ==