@seniorsistemas/platform-components 5.3.2 → 5.3.3-develop-73308358

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 (245) hide show
  1. package/esm2022/modules/advanced-filter/advanced-filter.module.mjs +75 -0
  2. package/esm2022/modules/advanced-filter/components/advanced-filter/advanced-filter.component.mjs +128 -0
  3. package/esm2022/modules/advanced-filter/components/form-filter/form-filter.component.mjs +651 -0
  4. package/esm2022/modules/advanced-filter/index.mjs +6 -0
  5. package/esm2022/modules/advanced-filter/locale/fallback.mjs +73 -0
  6. package/esm2022/modules/advanced-filter/models/context.mjs +2 -0
  7. package/esm2022/modules/advanced-filter/models/depends-on.mjs +2 -0
  8. package/esm2022/modules/advanced-filter/models/enum-item.mjs +2 -0
  9. package/esm2022/modules/advanced-filter/models/filter-type.mjs +14 -0
  10. package/esm2022/modules/advanced-filter/models/filter-value.mjs +2 -0
  11. package/esm2022/modules/advanced-filter/models/filter.mjs +41 -0
  12. package/esm2022/modules/advanced-filter/models/form-filter.mjs +28 -0
  13. package/esm2022/modules/advanced-filter/models/index.mjs +11 -0
  14. package/esm2022/modules/advanced-filter/models/scope.mjs +6 -0
  15. package/esm2022/modules/advanced-filter/models/search.mjs +2 -0
  16. package/esm2022/modules/advanced-filter/models/tab-view.mjs +18 -0
  17. package/esm2022/modules/advanced-filter/models/ticked-filter.mjs +2 -0
  18. package/esm2022/modules/advanced-filter/pipes/map-values.pipe.mjs +14 -0
  19. package/esm2022/modules/advanced-filter/pipes/translate.pipe.mjs +19 -0
  20. package/esm2022/modules/advanced-filter/services/advanced-filter.service.mjs +146 -0
  21. package/esm2022/modules/advanced-filter/services/calendar-options.service.mjs +77 -0
  22. package/esm2022/modules/advanced-filter/services/constants.mjs +6 -0
  23. package/esm2022/modules/advanced-filter/shared/constants.mjs +3 -0
  24. package/esm2022/modules/advanced-filter/utils/comparator.mjs +53 -0
  25. package/esm2022/modules/advanced-filter/utils/filter-id/index.mjs +8 -0
  26. package/esm2022/modules/advanced-filter/utils/filter-value/index.mjs +26 -0
  27. package/esm2022/modules/advanced-filter/utils/filterOperators.mjs +9 -0
  28. package/esm2022/modules/advanced-filter/utils/form-field/index.mjs +52 -0
  29. package/esm2022/modules/advanced-filter/utils/index.mjs +57 -0
  30. package/esm2022/modules/advanced-filter/utils/json-path.mjs +13 -0
  31. package/esm2022/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.mjs +14 -0
  32. package/esm2022/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.mjs +29 -0
  33. package/esm2022/modules/cyclic-json-interceptor/index.mjs +2 -0
  34. package/esm2022/modules/feature-toggle/constants/endpoint.constant.mjs +26 -0
  35. package/esm2022/modules/feature-toggle/feature-toggle.module.mjs +15 -0
  36. package/esm2022/modules/feature-toggle/feature-toggle.service.mjs +42 -0
  37. package/esm2022/modules/feature-toggle/index.mjs +4 -0
  38. package/esm2022/modules/feature-toggle/models/feature.mjs +2 -0
  39. package/esm2022/modules/http-interceptor/http-interceptor.module.mjs +16 -0
  40. package/esm2022/modules/http-interceptor/http-interceptor.service.mjs +42 -0
  41. package/esm2022/modules/http-interceptor/index.mjs +4 -0
  42. package/esm2022/modules/http-interceptor/rest-url.service.mjs +15 -0
  43. package/esm2022/modules/http-interceptor/x-services-url.service.mjs +18 -0
  44. package/esm2022/modules/permissions/permissions.config.mjs +17 -0
  45. package/esm2022/modules/permissions/permissions.module.mjs +43 -0
  46. package/esm2022/modules/permissions/permissions.service.mjs +169 -0
  47. package/esm2022/modules/spotlight/component/spotlight.component.mjs +274 -0
  48. package/esm2022/modules/spotlight/index.mjs +3 -0
  49. package/esm2022/modules/spotlight/locale/fallback.mjs +5 -0
  50. package/esm2022/modules/spotlight/models/display-type.enum.mjs +6 -0
  51. package/esm2022/modules/spotlight/models/index.mjs +10 -0
  52. package/esm2022/modules/spotlight/models/spotlight-control-list.interface.mjs +2 -0
  53. package/esm2022/modules/spotlight/models/spotlight-control.interface.mjs +11 -0
  54. package/esm2022/modules/spotlight/models/spotlight-notification.interface.mjs +2 -0
  55. package/esm2022/modules/spotlight/models/spotlight-screen-list.interface.mjs +2 -0
  56. package/esm2022/modules/spotlight/models/spotlight-screen.interface.mjs +2 -0
  57. package/esm2022/modules/spotlight/models/spotlight-status.enum.mjs +8 -0
  58. package/esm2022/modules/spotlight/models/spotlight-user.interface.mjs +2 -0
  59. package/esm2022/modules/spotlight/models/spotlight-users-list.interface.mjs +2 -0
  60. package/esm2022/modules/spotlight/models/spotlight.interface.mjs +2 -0
  61. package/esm2022/modules/spotlight/models/user-action.enum.mjs +7 -0
  62. package/esm2022/modules/spotlight/pipes/translate.pipe.mjs +19 -0
  63. package/esm2022/modules/spotlight/service/spotlight.service.mjs +34 -0
  64. package/esm2022/modules/spotlight/spotlight.module.mjs +53 -0
  65. package/esm2022/modules/translations/translations.module.mjs +192 -0
  66. package/esm2022/public-api.mjs +10 -0
  67. package/esm2022/seniorsistemas-platform-components.mjs +5 -0
  68. package/fesm2022/seniorsistemas-platform-components.mjs +2432 -0
  69. package/fesm2022/seniorsistemas-platform-components.mjs.map +1 -0
  70. package/index.d.ts +5 -0
  71. package/modules/advanced-filter/advanced-filter.module.d.ts +19 -0
  72. package/modules/advanced-filter/components/advanced-filter/advanced-filter.component.d.ts +4 -3
  73. package/modules/advanced-filter/components/form-filter/form-filter.component.d.ts +15 -12
  74. package/modules/advanced-filter/index.d.ts +1 -0
  75. package/modules/advanced-filter/models/tab-view.d.ts +1 -1
  76. package/modules/advanced-filter/pipes/map-values.pipe.d.ts +3 -0
  77. package/modules/advanced-filter/pipes/translate.pipe.d.ts +4 -3
  78. package/modules/advanced-filter/services/advanced-filter.service.d.ts +7 -3
  79. package/modules/advanced-filter/services/calendar-options.service.d.ts +4 -3
  80. package/modules/advanced-filter/services/constants.d.ts +4 -4
  81. package/modules/advanced-filter/utils/comparator.d.ts +1 -1
  82. package/modules/advanced-filter/utils/form-field/index.d.ts +1 -1
  83. package/modules/advanced-filter/utils/json-path.d.ts +1 -1
  84. package/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.d.ts +4 -0
  85. package/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.d.ts +3 -0
  86. package/modules/feature-toggle/feature-toggle.module.d.ts +5 -0
  87. package/modules/feature-toggle/feature-toggle.service.d.ts +4 -3
  88. package/modules/http-interceptor/http-interceptor.module.d.ts +4 -0
  89. package/modules/http-interceptor/http-interceptor.service.d.ts +3 -3
  90. package/modules/http-interceptor/rest-url.service.d.ts +3 -0
  91. package/modules/http-interceptor/x-services-url.service.d.ts +3 -0
  92. package/modules/permissions/permissions.config.d.ts +7 -1
  93. package/modules/permissions/permissions.module.d.ts +4 -0
  94. package/modules/permissions/permissions.service.d.ts +6 -12
  95. package/modules/spotlight/component/spotlight.component.d.ts +6 -7
  96. package/modules/spotlight/pipes/translate.pipe.d.ts +4 -3
  97. package/modules/spotlight/service/spotlight.service.d.ts +4 -3
  98. package/modules/spotlight/spotlight.module.d.ts +11 -0
  99. package/modules/translations/translations.module.d.ts +9 -5
  100. package/package.json +20 -54
  101. package/public-api.d.ts +1 -0
  102. package/bundles/seniorsistemas-platform-components.umd.js +0 -2745
  103. package/bundles/seniorsistemas-platform-components.umd.js.map +0 -1
  104. package/bundles/seniorsistemas-platform-components.umd.min.js +0 -17
  105. package/bundles/seniorsistemas-platform-components.umd.min.js.map +0 -1
  106. package/esm2015/modules/advanced-filter/advanced-filter.module.js +0 -47
  107. package/esm2015/modules/advanced-filter/components/advanced-filter/advanced-filter.component.js +0 -136
  108. package/esm2015/modules/advanced-filter/components/form-filter/form-filter.component.js +0 -578
  109. package/esm2015/modules/advanced-filter/index.js +0 -5
  110. package/esm2015/modules/advanced-filter/locale/fallback.js +0 -73
  111. package/esm2015/modules/advanced-filter/models/context.js +0 -1
  112. package/esm2015/modules/advanced-filter/models/depends-on.js +0 -1
  113. package/esm2015/modules/advanced-filter/models/enum-item.js +0 -1
  114. package/esm2015/modules/advanced-filter/models/filter-type.js +0 -14
  115. package/esm2015/modules/advanced-filter/models/filter-value.js +0 -1
  116. package/esm2015/modules/advanced-filter/models/filter.js +0 -23
  117. package/esm2015/modules/advanced-filter/models/form-filter.js +0 -19
  118. package/esm2015/modules/advanced-filter/models/index.js +0 -5
  119. package/esm2015/modules/advanced-filter/models/scope.js +0 -6
  120. package/esm2015/modules/advanced-filter/models/search.js +0 -1
  121. package/esm2015/modules/advanced-filter/models/tab-view.js +0 -18
  122. package/esm2015/modules/advanced-filter/models/ticked-filter.js +0 -1
  123. package/esm2015/modules/advanced-filter/pipes/map-values.pipe.js +0 -12
  124. package/esm2015/modules/advanced-filter/pipes/translate.pipe.js +0 -22
  125. package/esm2015/modules/advanced-filter/services/advanced-filter.service.js +0 -141
  126. package/esm2015/modules/advanced-filter/services/calendar-options.service.js +0 -81
  127. package/esm2015/modules/advanced-filter/services/constants.js +0 -6
  128. package/esm2015/modules/advanced-filter/shared/constants.js +0 -3
  129. package/esm2015/modules/advanced-filter/utils/comparator.js +0 -55
  130. package/esm2015/modules/advanced-filter/utils/filter-id/index.js +0 -8
  131. package/esm2015/modules/advanced-filter/utils/filter-value/index.js +0 -24
  132. package/esm2015/modules/advanced-filter/utils/filterOperators.js +0 -11
  133. package/esm2015/modules/advanced-filter/utils/form-field/index.js +0 -50
  134. package/esm2015/modules/advanced-filter/utils/index.js +0 -57
  135. package/esm2015/modules/advanced-filter/utils/json-path.js +0 -12
  136. package/esm2015/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.js +0 -14
  137. package/esm2015/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.js +0 -27
  138. package/esm2015/modules/cyclic-json-interceptor/index.js +0 -2
  139. package/esm2015/modules/feature-toggle/constants/endpoint.constant.js +0 -26
  140. package/esm2015/modules/feature-toggle/feature-toggle.module.js +0 -15
  141. package/esm2015/modules/feature-toggle/feature-toggle.service.js +0 -48
  142. package/esm2015/modules/feature-toggle/index.js +0 -3
  143. package/esm2015/modules/feature-toggle/models/feature.js +0 -1
  144. package/esm2015/modules/http-interceptor/http-interceptor.module.js +0 -16
  145. package/esm2015/modules/http-interceptor/http-interceptor.service.js +0 -47
  146. package/esm2015/modules/http-interceptor/index.js +0 -4
  147. package/esm2015/modules/http-interceptor/rest-url.service.js +0 -14
  148. package/esm2015/modules/http-interceptor/x-services-url.service.js +0 -17
  149. package/esm2015/modules/permissions/permissions.config.js +0 -11
  150. package/esm2015/modules/permissions/permissions.module.js +0 -42
  151. package/esm2015/modules/permissions/permissions.service.js +0 -196
  152. package/esm2015/modules/spotlight/component/spotlight.component.js +0 -274
  153. package/esm2015/modules/spotlight/index.js +0 -3
  154. package/esm2015/modules/spotlight/locale/fallback.js +0 -5
  155. package/esm2015/modules/spotlight/models/display-type.enum.js +0 -6
  156. package/esm2015/modules/spotlight/models/index.js +0 -4
  157. package/esm2015/modules/spotlight/models/spotlight-control-list.interface.js +0 -1
  158. package/esm2015/modules/spotlight/models/spotlight-control.interface.js +0 -3
  159. package/esm2015/modules/spotlight/models/spotlight-notification.interface.js +0 -1
  160. package/esm2015/modules/spotlight/models/spotlight-screen-list.interface.js +0 -1
  161. package/esm2015/modules/spotlight/models/spotlight-screen.interface.js +0 -1
  162. package/esm2015/modules/spotlight/models/spotlight-status.enum.js +0 -8
  163. package/esm2015/modules/spotlight/models/spotlight-user.interface.js +0 -1
  164. package/esm2015/modules/spotlight/models/spotlight-users-list.interface.js +0 -1
  165. package/esm2015/modules/spotlight/models/spotlight.interface.js +0 -1
  166. package/esm2015/modules/spotlight/models/user-action.enum.js +0 -7
  167. package/esm2015/modules/spotlight/pipes/translate.pipe.js +0 -22
  168. package/esm2015/modules/spotlight/service/spotlight.service.js +0 -38
  169. package/esm2015/modules/spotlight/spotlight.module.js +0 -37
  170. package/esm2015/modules/translations/translations.module.js +0 -182
  171. package/esm2015/public-api.js +0 -9
  172. package/esm2015/seniorsistemas-platform-components.js +0 -16
  173. package/esm5/modules/advanced-filter/advanced-filter.module.js +0 -54
  174. package/esm5/modules/advanced-filter/components/advanced-filter/advanced-filter.component.js +0 -144
  175. package/esm5/modules/advanced-filter/components/form-filter/form-filter.component.js +0 -626
  176. package/esm5/modules/advanced-filter/index.js +0 -5
  177. package/esm5/modules/advanced-filter/locale/fallback.js +0 -73
  178. package/esm5/modules/advanced-filter/models/context.js +0 -1
  179. package/esm5/modules/advanced-filter/models/depends-on.js +0 -1
  180. package/esm5/modules/advanced-filter/models/enum-item.js +0 -1
  181. package/esm5/modules/advanced-filter/models/filter-type.js +0 -14
  182. package/esm5/modules/advanced-filter/models/filter-value.js +0 -1
  183. package/esm5/modules/advanced-filter/models/filter.js +0 -25
  184. package/esm5/modules/advanced-filter/models/form-filter.js +0 -25
  185. package/esm5/modules/advanced-filter/models/index.js +0 -5
  186. package/esm5/modules/advanced-filter/models/scope.js +0 -6
  187. package/esm5/modules/advanced-filter/models/search.js +0 -1
  188. package/esm5/modules/advanced-filter/models/tab-view.js +0 -29
  189. package/esm5/modules/advanced-filter/models/ticked-filter.js +0 -1
  190. package/esm5/modules/advanced-filter/pipes/map-values.pipe.js +0 -16
  191. package/esm5/modules/advanced-filter/pipes/translate.pipe.js +0 -23
  192. package/esm5/modules/advanced-filter/services/advanced-filter.service.js +0 -152
  193. package/esm5/modules/advanced-filter/services/calendar-options.service.js +0 -82
  194. package/esm5/modules/advanced-filter/services/constants.js +0 -6
  195. package/esm5/modules/advanced-filter/shared/constants.js +0 -3
  196. package/esm5/modules/advanced-filter/utils/comparator.js +0 -55
  197. package/esm5/modules/advanced-filter/utils/filter-id/index.js +0 -8
  198. package/esm5/modules/advanced-filter/utils/filter-value/index.js +0 -25
  199. package/esm5/modules/advanced-filter/utils/filterOperators.js +0 -11
  200. package/esm5/modules/advanced-filter/utils/form-field/index.js +0 -52
  201. package/esm5/modules/advanced-filter/utils/index.js +0 -57
  202. package/esm5/modules/advanced-filter/utils/json-path.js +0 -12
  203. package/esm5/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.js +0 -17
  204. package/esm5/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.js +0 -30
  205. package/esm5/modules/cyclic-json-interceptor/index.js +0 -2
  206. package/esm5/modules/feature-toggle/constants/endpoint.constant.js +0 -27
  207. package/esm5/modules/feature-toggle/feature-toggle.module.js +0 -18
  208. package/esm5/modules/feature-toggle/feature-toggle.service.js +0 -51
  209. package/esm5/modules/feature-toggle/index.js +0 -3
  210. package/esm5/modules/feature-toggle/models/feature.js +0 -1
  211. package/esm5/modules/http-interceptor/http-interceptor.module.js +0 -19
  212. package/esm5/modules/http-interceptor/http-interceptor.service.js +0 -49
  213. package/esm5/modules/http-interceptor/index.js +0 -4
  214. package/esm5/modules/http-interceptor/rest-url.service.js +0 -17
  215. package/esm5/modules/http-interceptor/x-services-url.service.js +0 -20
  216. package/esm5/modules/permissions/permissions.config.js +0 -17
  217. package/esm5/modules/permissions/permissions.module.js +0 -46
  218. package/esm5/modules/permissions/permissions.service.js +0 -212
  219. package/esm5/modules/spotlight/component/spotlight.component.js +0 -300
  220. package/esm5/modules/spotlight/index.js +0 -3
  221. package/esm5/modules/spotlight/locale/fallback.js +0 -5
  222. package/esm5/modules/spotlight/models/display-type.enum.js +0 -6
  223. package/esm5/modules/spotlight/models/index.js +0 -4
  224. package/esm5/modules/spotlight/models/spotlight-control-list.interface.js +0 -1
  225. package/esm5/modules/spotlight/models/spotlight-control.interface.js +0 -7
  226. package/esm5/modules/spotlight/models/spotlight-notification.interface.js +0 -1
  227. package/esm5/modules/spotlight/models/spotlight-screen-list.interface.js +0 -1
  228. package/esm5/modules/spotlight/models/spotlight-screen.interface.js +0 -1
  229. package/esm5/modules/spotlight/models/spotlight-status.enum.js +0 -8
  230. package/esm5/modules/spotlight/models/spotlight-user.interface.js +0 -1
  231. package/esm5/modules/spotlight/models/spotlight-users-list.interface.js +0 -1
  232. package/esm5/modules/spotlight/models/spotlight.interface.js +0 -1
  233. package/esm5/modules/spotlight/models/user-action.enum.js +0 -7
  234. package/esm5/modules/spotlight/pipes/translate.pipe.js +0 -23
  235. package/esm5/modules/spotlight/service/spotlight.service.js +0 -39
  236. package/esm5/modules/spotlight/spotlight.module.js +0 -40
  237. package/esm5/modules/translations/translations.module.js +0 -226
  238. package/esm5/public-api.js +0 -9
  239. package/esm5/seniorsistemas-platform-components.js +0 -16
  240. package/fesm2015/seniorsistemas-platform-components.js +0 -2284
  241. package/fesm2015/seniorsistemas-platform-components.js.map +0 -1
  242. package/fesm5/seniorsistemas-platform-components.js +0 -2507
  243. package/fesm5/seniorsistemas-platform-components.js.map +0 -1
  244. package/seniorsistemas-platform-components.d.ts +0 -15
  245. package/seniorsistemas-platform-components.metadata.json +0 -1
@@ -0,0 +1,651 @@
1
+ import { ToastService } from "@seniorsistemas/angular-components/toast";
2
+ import { ChangeDetectorRef, Component, EventEmitter, HostListener, Input, Output, inject } from '@angular/core';
3
+ import { BehaviorSubject, from, Subject } from 'rxjs';
4
+ import { filter as rxFilter, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
5
+ import { FilterType, Scope } from '../../models';
6
+ import { ContextTab, TabView } from '../../models/tab-view';
7
+ import { AdvancedFilterService } from '../../services/advanced-filter.service';
8
+ import { FormFilter } from '../../models/form-filter';
9
+ import { filterOperators, fromJson, getFilterId, getSearchType, getTabId, jsonPath, parseFilterValue, toFilterFormat, toUserFormat } from '../../utils/index';
10
+ import { createFormControl } from '../../utils/form-field';
11
+ import { clone, equals } from 'ramda';
12
+ import { compare, isSupportedType, isValidOperator } from '../../utils/comparator';
13
+ import { AutocompleteField, CalendarField, RadioButtonField, CurrencyField, FieldType, NumberField, SelectField, TextField } from '@seniorsistemas/angular-components/dynamic-form';
14
+ import { searchDisplayName, searchKeyName } from '../../shared/constants';
15
+ import { TranslateService } from '@ngx-translate/core';
16
+ import { CalendarOptionsService } from '../../services/calendar-options.service';
17
+ import * as i0 from "@angular/core";
18
+ import * as i1 from "primeng/tabview";
19
+ import * as i2 from "@angular/common";
20
+ import * as i3 from "@seniorsistemas/angular-components/dynamic-form";
21
+ import * as i4 from "@seniorsistemas/angular-components/empty-state";
22
+ import * as i5 from "../../pipes/map-values.pipe";
23
+ const TRANSLATE_PREFIX = 'platform.filter_service';
24
+ const TOAST_LIFE = 5000;
25
+ export class FormFilterComponent {
26
+ filterService = inject(AdvancedFilterService);
27
+ translate = inject(TranslateService);
28
+ toastService = inject(ToastService);
29
+ calendarOptionsService = inject(CalendarOptionsService);
30
+ changeDetectorRef = inject(ChangeDetectorRef);
31
+ destroy$ = new Subject();
32
+ errorState;
33
+ tabs;
34
+ contexts = [];
35
+ formFilters = [];
36
+ oldFormFilters = [];
37
+ actualFormFilters = [];
38
+ general = new TabView({ name: 'Geral' });
39
+ totalFiltersActive = 0;
40
+ isMobile = false;
41
+ tabViewOrientation = 'left';
42
+ error = false;
43
+ activeIndex = 0;
44
+ errorMessages = {
45
+ min: this.translate.instant(`${TRANSLATE_PREFIX}.error_min_value`),
46
+ max: this.translate.instant(`${TRANSLATE_PREFIX}.error_max_value`),
47
+ pattern: this.translate.instant(`${TRANSLATE_PREFIX}.invalid_pattern`)
48
+ };
49
+ showMessages = true;
50
+ isModal = false;
51
+ contextId = '';
52
+ totalFiltersActiveOutput = new EventEmitter();
53
+ errorOutput = new EventEmitter();
54
+ showDialogOutput = new EventEmitter();
55
+ closeModalOutput = new EventEmitter();
56
+ onResizeWindow(event) {
57
+ const { innerWidth } = event.target;
58
+ this.isMobile = innerWidth <= 640;
59
+ this.tabViewOrientation = this.isMobile ? 'top' : 'left';
60
+ }
61
+ ngOnInit() {
62
+ this.isMobile = innerWidth <= 640;
63
+ this.tabViewOrientation = this.isMobile ? 'top' : 'left';
64
+ this.subscribeContextsObservable();
65
+ this.subscribeFiltersObservable();
66
+ window.addEventListener('message', event => {
67
+ const data = event.data;
68
+ const message = data.message && data.message.split(':')[1];
69
+ if (message === 'addContext') {
70
+ this.filterService.addContexts(...data.payload);
71
+ }
72
+ });
73
+ }
74
+ ngOnDestroy() {
75
+ this.destroy$.next(true);
76
+ }
77
+ hasChanges() {
78
+ if (!this.oldFormFilters?.length) {
79
+ return true;
80
+ }
81
+ const filtered = this.formFilters.filter((currentFilter, index) => {
82
+ const oldFilter = this.oldFormFilters[index];
83
+ const oldValue = oldFilter ? oldFilter.value : undefined;
84
+ return !equals(currentFilter.value, oldValue);
85
+ });
86
+ return filtered.length > 0;
87
+ }
88
+ onApplyFilters() {
89
+ this.hasChanges() && this.closeModalOutput.emit();
90
+ }
91
+ getFilters() {
92
+ this.hasChanges() && this.filterService.tryAgain(this.contexts);
93
+ }
94
+ applyFilters(showToast = false) {
95
+ if (this.hasChanges()) {
96
+ this.showDialogOutput.emit(false);
97
+ this.counterUpdate();
98
+ const filters = this.getFiltersValues(this.formFilters);
99
+ this.filterService.saveTickedFilters(filters);
100
+ }
101
+ else if (showToast) {
102
+ const message = {
103
+ severity: 'info',
104
+ duration: TOAST_LIFE,
105
+ text: this.translate.instant(`${TRANSLATE_PREFIX}.applied_filter_nochange`, { activeFilters: this.totalFiltersActive })
106
+ };
107
+ this.sendMessage(message);
108
+ }
109
+ this.oldFormFilters = clone(this.formFilters);
110
+ }
111
+ getDefaultValue(defaultValue, isMultiple) {
112
+ if (defaultValue === undefined || (isMultiple && defaultValue[0] === '')) {
113
+ return [];
114
+ }
115
+ return defaultValue;
116
+ }
117
+ clearFilters() {
118
+ const keys = Object.keys(this.formFilters);
119
+ keys.forEach(key => this.cleanFieldAndSetDefaultValue(key));
120
+ }
121
+ sendCloseMessage() {
122
+ window.parent.postMessage({
123
+ message: 'dashboard:close-modal',
124
+ payload: {
125
+ modalName: 'advanced-filter-1'
126
+ }
127
+ }, '*');
128
+ }
129
+ sendMessage(message) {
130
+ if (this.showMessages) {
131
+ this.toastService.show(message);
132
+ }
133
+ else {
134
+ window.parent.postMessage({
135
+ message: 'dashboard:toastr',
136
+ payload: {
137
+ type: 'success',
138
+ message: message.detail
139
+ }
140
+ }, '*');
141
+ }
142
+ }
143
+ saveFilters(forceSave = false) {
144
+ const filters = this.parseToUserFilters(this.formFilters);
145
+ const savedFilterSuccess = () => {
146
+ if (!forceSave) {
147
+ const message = {
148
+ severity: 'info',
149
+ duration: TOAST_LIFE,
150
+ text: this.translate.instant(`${TRANSLATE_PREFIX}.saved_filters_success`, { activeFilters: this.totalFiltersActive })
151
+ };
152
+ this.sendMessage(message);
153
+ }
154
+ this.counterUpdate();
155
+ };
156
+ const savedFiltersError = () => {
157
+ const message = {
158
+ severity: 'error',
159
+ duration: TOAST_LIFE,
160
+ text: this.translate.instant(`${TRANSLATE_PREFIX}.saved_filters_error`, { activeFilters: this.totalFiltersActive })
161
+ };
162
+ this.sendMessage(message);
163
+ };
164
+ this.filterService
165
+ .saveFilters(filters)
166
+ .subscribe(savedFilterSuccess, savedFiltersError);
167
+ }
168
+ saveFiltersWithCallbackFunction(callbackFunction) {
169
+ const filters = this.parseToUserFilters(this.formFilters);
170
+ this.filterService
171
+ .saveFilters(filters)
172
+ .subscribe(callbackFunction);
173
+ }
174
+ counterUpdate() {
175
+ this.totalFiltersActive = this.countActiveFilters(this.tabs);
176
+ this.totalFiltersActiveOutput.emit(this.totalFiltersActive);
177
+ }
178
+ countActiveFilters(tabs) {
179
+ let totalFiltersActive = 0;
180
+ tabs.forEach(tabView => {
181
+ const { value } = tabView.form;
182
+ tabView.activeFilters = Object.keys(value).reduce((appliedFilters, key) => {
183
+ const filterValue = value[key];
184
+ const isArray = Array.isArray(filterValue);
185
+ const isValidArray = isArray && filterValue.length > 0;
186
+ if (isValidArray || (!isArray && filterValue)) {
187
+ appliedFilters++;
188
+ }
189
+ return appliedFilters;
190
+ }, 0);
191
+ totalFiltersActive += tabView.activeFilters;
192
+ });
193
+ return totalFiltersActive;
194
+ }
195
+ parseToUserFilters(filters) {
196
+ return filters.reduce((all, filter) => {
197
+ const { type, services, name, value, domain, contexts } = filter;
198
+ const filterValue = toUserFormat(value, type);
199
+ const values = services.map(service => ({ name, service, value: filterValue, domain, contexts }));
200
+ return [...all, ...values];
201
+ }, []);
202
+ }
203
+ getFiltersValues(filters) {
204
+ const filtersAsObject = filters;
205
+ const ids = Object.keys(filtersAsObject);
206
+ return ids.reduce((all, filterId) => {
207
+ const { type, services, name, value, domain } = filtersAsObject[filterId];
208
+ const filterValue = toFilterFormat(value, type);
209
+ const values = services.map(service => ({ name, service, value: filterValue, domain }));
210
+ return [...all, ...values];
211
+ }, []);
212
+ }
213
+ subscribeContextsObservable() {
214
+ const { contextsObserver } = this.filterService;
215
+ contextsObserver.pipe(takeUntil(this.destroy$)).subscribe((contexts) => (this.contexts = contexts));
216
+ }
217
+ errorStateAction() {
218
+ this.filterService.tryAgain(this.contexts);
219
+ }
220
+ subscribeFiltersObservable() {
221
+ const { filtersObserver } = this.filterService;
222
+ filtersObserver
223
+ .pipe(takeUntil(this.destroy$))
224
+ .subscribe(({ filters, applyFilter, error, message }) => {
225
+ this.errorOutput.emit(error);
226
+ this.error = error;
227
+ this.errorState = message;
228
+ if (!error) {
229
+ this.createForm(filters, applyFilter);
230
+ }
231
+ });
232
+ }
233
+ createForm(filters, applyFilter) {
234
+ this.tabs = this.createTabs(filters);
235
+ this.counterUpdate();
236
+ this.setDependencies(this.formFilters);
237
+ this.createChildArray();
238
+ if (filters.length > 0 && applyFilter) {
239
+ this.applyFilters();
240
+ }
241
+ }
242
+ setDependencies(filters) {
243
+ const filtersMap = {};
244
+ filters.forEach(f => {
245
+ const id = getFilterId(f.domain, f.name);
246
+ filtersMap[id] = f;
247
+ });
248
+ const names = Object.keys(filtersMap);
249
+ const dependencies = from(names).pipe(map(key => filtersMap[key]), rxFilter(({ dependsOn }) => dependsOn && dependsOn.length > 0), tap(({ dependsOn, domain, filterControl }) => {
250
+ const invalidFilters = dependsOn
251
+ .filter(dep => dep.required)
252
+ .filter(dep => {
253
+ const id = getFilterId(domain, dep.filterName);
254
+ const formFilter = filtersMap[id];
255
+ if (!formFilter) {
256
+ return true;
257
+ }
258
+ const { value, type } = formFilter;
259
+ const { comparator } = dep;
260
+ if (comparator && isValidOperator(comparator.operator) && isSupportedType(type)) {
261
+ const fieldValue = parseFilterValue(value, type);
262
+ return !compare(comparator.operator, comparator.value, fieldValue);
263
+ }
264
+ return dep.required ? !formFilter.value : formFilter.value;
265
+ });
266
+ if (invalidFilters.length > 0) {
267
+ filterControl.disable();
268
+ }
269
+ }), map(({ domain, dependsOn, filterControl }) => ({ domain, dependsOn, filterControl })));
270
+ dependencies.subscribe(({ dependsOn, domain, filterControl }) => from(dependsOn)
271
+ .pipe(rxFilter(dep => dep.required), map(({ filterName }) => getFilterId(domain, filterName)), map(filterId => filtersMap[filterId]), mergeMap(formFilter => from(formFilter.valueChanges || [])), map(val => {
272
+ const comparation = dependsOn.every(dep => {
273
+ const filterId = getFilterId(domain, dep.filterName);
274
+ if (this.formFilters[filterId]) {
275
+ const type = this.formFilters[filterId].type;
276
+ const { comparator } = dep;
277
+ if (comparator && isValidOperator(comparator.operator) && isSupportedType(type)) {
278
+ const value = parseFilterValue(val, type);
279
+ return compare(comparator.operator, comparator.value, value);
280
+ }
281
+ return true;
282
+ }
283
+ return true;
284
+ });
285
+ return !this.IsEmpty(val) && comparation ? 'enable' : 'disable';
286
+ }))
287
+ .subscribe(status => filterControl[status]()));
288
+ }
289
+ addGeneralField(filter) {
290
+ const { name, domain, type } = filter;
291
+ const controlName = getFilterId(domain, name);
292
+ const fieldControl = createFormControl(filter);
293
+ fieldControl.valueChanges
294
+ .pipe(takeUntil(this.destroy$), map(v => parseFilterValue(v, type)), tap(value => (this.formFilters[controlName].value = value)))
295
+ .subscribe(val => this.tabs.forEach(tab => {
296
+ const control = tab.form.controls[name];
297
+ if (control && tab.domain === domain) {
298
+ control.setValue(val, { emitEvent: false });
299
+ }
300
+ }));
301
+ const newFilter = { ...filter, ...{ name: controlName } };
302
+ const newField = this.createField(newFilter);
303
+ this.general.form.addControl(controlName, fieldControl);
304
+ this.general.fields.push(newField);
305
+ }
306
+ /*
307
+ * Verifica os contextos de cada filtro, caso todos os contextos foram informados:
308
+ * @return true
309
+ * Caso não tenha nenhum contexto, considera-se por padrão que é todos:
310
+ * @return true
311
+ */
312
+ containsAllContexts(myContexts) {
313
+ if (!myContexts.length) {
314
+ return true;
315
+ }
316
+ const allContexts = this.contexts.map(data => data.contextId);
317
+ return equals(myContexts.sort(), allContexts.sort());
318
+ }
319
+ /**
320
+ *
321
+ * @todo Refatorar. O método possui muitas responsabilidades
322
+ *
323
+ */
324
+ createTabs(filters) {
325
+ return filters.reduce((tabs, filter) => {
326
+ const { domain, services, name, type, scope, contexts, dependsOn, value, search, defaultValue } = filter;
327
+ const isNotMultiple = search && getSearchType(search).output.maxSelectedItems === 1;
328
+ const field = this.createField(filter);
329
+ const filterId = getFilterId(domain, name);
330
+ const filterConfig = {
331
+ domain,
332
+ contexts,
333
+ services,
334
+ name,
335
+ dependsOn,
336
+ value: fromJson(value, type, isNotMultiple),
337
+ type,
338
+ isMultiple: !isNotMultiple,
339
+ defaultValue: fromJson(defaultValue, type, isNotMultiple)
340
+ };
341
+ this.formFilters[filterId] = new FormFilter(filterConfig);
342
+ const formFilter = this.formFilters[filterId];
343
+ if (scope === Scope.DOMAIN && this.containsAllContexts(contexts)) {
344
+ this.addGeneralField(filter);
345
+ }
346
+ contexts.forEach(contextId => {
347
+ if ((contextId === this.contextId) || (this.contextId === '')) {
348
+ const tabId = getTabId(domain, contextId);
349
+ const fieldControl = createFormControl(filter);
350
+ if (!tabs.has(tabId)) {
351
+ const { contextLabel } = this.contexts.find(context => context.contextId === contextId);
352
+ const tab = new ContextTab({ domain, name: contextLabel });
353
+ tabs.set(tabId, tab);
354
+ }
355
+ fieldControl.valueChanges
356
+ .pipe(takeUntil(this.destroy$))
357
+ .subscribe((val) => this.updateFilterValue(tabId, name, val, domain, type));
358
+ const contextTab = tabs.get(tabId);
359
+ contextTab.fields.push(field);
360
+ contextTab.form.addControl(filter.name, fieldControl);
361
+ if (!formFilter.filterControl) {
362
+ formFilter.filterControl = fieldControl;
363
+ }
364
+ }
365
+ });
366
+ return tabs;
367
+ }, new Map());
368
+ }
369
+ updateFilterValue(tabId, filterName, value, domain, type) {
370
+ const controlOpts = { emitEvent: false };
371
+ const fieldValue = parseFilterValue(value, type);
372
+ const filterId = getFilterId(domain, filterName);
373
+ const generalFieldControl = this.general.form.controls[filterId];
374
+ this.tabs.forEach(({ form }, key) => {
375
+ const control = form.controls[filterName];
376
+ if (tabId !== key && control) {
377
+ control.setValue(value, controlOpts);
378
+ }
379
+ });
380
+ const { childs } = this.formFilters[filterId];
381
+ childs && childs.forEach((child) => this.cleanFieldAndSetDefaultValue(child.filter.key));
382
+ generalFieldControl && generalFieldControl.setValue(value, controlOpts);
383
+ this.formFilters[filterId].value = fieldValue;
384
+ }
385
+ cleanFieldAndSetDefaultValue(key) {
386
+ const { isMultiple, defaultValue, filterControl, type } = this.formFilters[key];
387
+ const finalValue = this.getDefaultValue(defaultValue, isMultiple);
388
+ if (filterControl) {
389
+ if (type === 'DATE' || (type === 'SEARCH' && isMultiple)) {
390
+ filterControl.setValue(finalValue);
391
+ }
392
+ if (type === 'INTEGER' || type === 'DOUBLE' || type === 'MONEY') {
393
+ finalValue === '' ? filterControl.setValue(null) : filterControl.setValue(finalValue);
394
+ }
395
+ else {
396
+ filterControl.setValue(finalValue, { onlySelf: true });
397
+ }
398
+ }
399
+ }
400
+ createChildArray() {
401
+ const keys = Object.keys(this.formFilters);
402
+ keys.forEach(key => {
403
+ const { dependsOn, domain } = this.formFilters[key];
404
+ dependsOn.forEach((field) => {
405
+ const filterId = getFilterId(domain, field.filterName);
406
+ if (this.formFilters[filterId]) {
407
+ if (!this.formFilters[filterId].childs) {
408
+ this.formFilters[filterId].childs = [];
409
+ }
410
+ this.formFilters[filterId].childs.push({ filter: { key, required: field.required } });
411
+ }
412
+ });
413
+ });
414
+ }
415
+ createField(filter) {
416
+ const { name, label, enumItems, type, mask } = filter;
417
+ const translatedEnumItems = enumItems && enumItems.map((item) => ({ label: this.translate.instant(item.label), value: item.value }));
418
+ const field = { name, label: this.translate.instant(label), placeholder: '' };
419
+ const creators = {
420
+ [FilterType.STRING]: () => new TextField({ ...field, mask: mask ? () => mask : null, type: FieldType.String }),
421
+ [FilterType.MONEY]: () => new CurrencyField({ ...field, type: FieldType.Money }),
422
+ [FilterType.BOOLEAN]: () => this.createRadioButton({ ...field }),
423
+ [FilterType.DATE]: () => this.createCalendar({ ...field, type: FieldType.Date }),
424
+ [FilterType.DATETIME]: () => this.createCalendar({ ...field, type: FieldType.DateTime }),
425
+ [FilterType.TIME]: () => this.createCalendar({ ...field, type: FieldType.Time }),
426
+ [FilterType.ENUMERATION]: () => new SelectField({
427
+ ...field,
428
+ placeholder: this.translate.instant('platform.filter_service.select'),
429
+ options: [...translatedEnumItems],
430
+ type: FieldType.Enum
431
+ }),
432
+ [FilterType.INTEGER]: () => new NumberField({
433
+ ...field,
434
+ numberLocaleOptions: this.optionsInteger(),
435
+ mask: mask ? () => mask : null,
436
+ type: FieldType.Integer
437
+ }),
438
+ [FilterType.DOUBLE]: () => new CurrencyField({ ...field, type: FieldType.Double }),
439
+ [FilterType.SEARCH]: () => this.createAutocompleteField(field, filter)
440
+ };
441
+ return creators[type]();
442
+ }
443
+ createRadioButton(field) {
444
+ const options = [
445
+ { label: this.translate.instant(`${TRANSLATE_PREFIX}.yes`), value: true },
446
+ { label: this.translate.instant(`${TRANSLATE_PREFIX}.no`), value: false }
447
+ ];
448
+ return new RadioButtonField({ ...field, type: FieldType.Radio, options });
449
+ }
450
+ createCalendar(config) {
451
+ const calendar = new CalendarField(config);
452
+ calendar.calendarLocaleOptions = this.calendarOptionsService.getOptions();
453
+ if (!this.isModal)
454
+ calendar.appendTo = 'body';
455
+ return calendar;
456
+ }
457
+ createAutocompleteField(field, { dependsOn, search, domain, name }) {
458
+ const suggestionsObservable = new BehaviorSubject([]);
459
+ const { queryParam } = getSearchType(search).input;
460
+ const { displayFields, keyFields, resultDataJsonPath, displayFieldConcatToken, maxSelectedItems } = getSearchType(search).output;
461
+ const filterId = getFilterId(domain, name);
462
+ const suggestionsError = (messageError) => {
463
+ const messageDetail = messageError ? messageError : this.translate.instant(`${TRANSLATE_PREFIX}.find_suggestions_error`, { activeFilters: this.totalFiltersActive });
464
+ const message = {
465
+ severity: 'error',
466
+ duration: TOAST_LIFE,
467
+ text: messageDetail
468
+ };
469
+ this.sendMessage(message);
470
+ };
471
+ const onSearch = (val) => {
472
+ const params = { [queryParam]: val };
473
+ dependsOn && Object.assign(params, this.getDependenciesValues(dependsOn, domain));
474
+ const searchUrl = search && search.type === 'ENTITY'
475
+ ? this.getEntitySearchUrl(search.entitySearch.input, val, dependsOn)
476
+ : getSearchType(search).input.url;
477
+ this.filterService
478
+ .searchFieldSuggestions(searchUrl, params, search.type)
479
+ .pipe(map(response => jsonPath(response, resultDataJsonPath)), map((suggestions) => this.addSuggestionFields(suggestions, displayFields, keyFields, displayFieldConcatToken, filterId)))
480
+ .subscribe(result => {
481
+ suggestionsObservable.next(result);
482
+ this.changeDetectorRef.detectChanges();
483
+ }, (error) => {
484
+ let messageError = undefined;
485
+ if (error && error.error.message)
486
+ messageError = error.error.message;
487
+ suggestionsError(messageError);
488
+ });
489
+ };
490
+ return new AutocompleteField({
491
+ ...field,
492
+ onSearch,
493
+ appendTo: 'body',
494
+ suggestionsObservable,
495
+ displayField: searchDisplayName,
496
+ dataKey: searchKeyName,
497
+ multiple: maxSelectedItems > 1,
498
+ size: { lg: 12, md: 12, xl: 12 },
499
+ emptyMessage: this.translate.instant(`${TRANSLATE_PREFIX}.search_empty_message`)
500
+ });
501
+ }
502
+ safeReplaceCommas(input, operator) {
503
+ let output = '';
504
+ let parenCount = 0;
505
+ let justAddedOperator = false;
506
+ for (const char of input) {
507
+ let charToAdd = char;
508
+ ({ parenCount, justAddedOperator } = this.updateParenAndOperatorState(char, parenCount, justAddedOperator));
509
+ ({ charToAdd, justAddedOperator } = this.processCommaSubstitution(char, parenCount, justAddedOperator, operator, charToAdd));
510
+ justAddedOperator = this.updateNonCommaOperatorState(char, charToAdd, justAddedOperator);
511
+ output += charToAdd;
512
+ }
513
+ return output;
514
+ }
515
+ updateParenAndOperatorState(char, parenCount, justAddedOperator) {
516
+ if (char === '(') {
517
+ parenCount++;
518
+ justAddedOperator = false;
519
+ }
520
+ else if (char === ')') {
521
+ parenCount--;
522
+ justAddedOperator = false;
523
+ }
524
+ else {
525
+ // Nenhuma ação necessária para outros caracteres
526
+ }
527
+ return { parenCount, justAddedOperator };
528
+ }
529
+ processCommaSubstitution(char, parenCount, justAddedOperator, operator, charToAdd) {
530
+ if (char === ',') {
531
+ if (parenCount === 0) {
532
+ if (!justAddedOperator) {
533
+ charToAdd = ` ${operator} `;
534
+ justAddedOperator = true;
535
+ }
536
+ else {
537
+ charToAdd = '';
538
+ }
539
+ }
540
+ else {
541
+ justAddedOperator = false;
542
+ }
543
+ }
544
+ return { charToAdd, justAddedOperator };
545
+ }
546
+ updateNonCommaOperatorState(char, charToAdd, justAddedOperator) {
547
+ if (char !== ',') {
548
+ if (charToAdd !== char) {
549
+ return false;
550
+ }
551
+ if (char !== '(' && char !== ')') {
552
+ return false;
553
+ }
554
+ }
555
+ return justAddedOperator;
556
+ }
557
+ getEntitySearchUrl(search, value, dependsOn) {
558
+ const { attributes, domainName, entityName, serviceName } = search;
559
+ const url = `${domainName}/${serviceName}/entities/${entityName}/?filter=`;
560
+ const filters = attributes.map(attr => filterOperators[attr.comparator](attr.name, value));
561
+ dependsOn &&
562
+ dependsOn.forEach(obj => {
563
+ const filterId = getFilterId(domainName, obj.filterName);
564
+ const fieldValue = this.formFilters[filterId].value[searchKeyName];
565
+ filters.push(`${obj.entityAttribute} eq '${fieldValue}'`);
566
+ });
567
+ const filtersString = filters.join(',');
568
+ const finalFilter = this.safeReplaceCommas(filtersString, search.operator);
569
+ return url.concat(finalFilter);
570
+ }
571
+ addSuggestionFields(suggestions, displayFields, keyFields, separator, filterId) {
572
+ const addValue = (acc, value, token) => (acc ? `${acc}${token}${value}` : value);
573
+ const result = suggestions.map(suggestion => ({
574
+ ...suggestion,
575
+ [searchDisplayName]: displayFields.reduce((value, display) => {
576
+ return addValue(value, this.translate.instant(suggestion[display]), separator);
577
+ }, ''),
578
+ [searchKeyName]: keyFields.reduce((value, key) => addValue(value, suggestion[key], ', '), '')
579
+ }));
580
+ this.formFilters[filterId].invalidValue = result.length === 0;
581
+ return result.filter(item => {
582
+ const { value } = this.formFilters[filterId];
583
+ if (Array.isArray(value)) {
584
+ const index = value.findIndex((i) => i.$$__keyValue__ === item.$$__keyValue__);
585
+ if (index === -1) {
586
+ return item;
587
+ }
588
+ }
589
+ else {
590
+ return item;
591
+ }
592
+ });
593
+ }
594
+ getDependenciesValues(dependencies, domain) {
595
+ return dependencies.reduce((params, { filterName }) => {
596
+ const filterId = getFilterId(domain, filterName);
597
+ if (this.formFilters[filterId]) {
598
+ const { value, type } = this.formFilters[filterId];
599
+ if (type === 'ENUMERATION') {
600
+ params[filterName] = value;
601
+ }
602
+ else {
603
+ if (Array.isArray(value)) {
604
+ params[filterName] = value.map(arr => arr[searchKeyName]);
605
+ }
606
+ else {
607
+ params[filterName] = value ? value[searchKeyName] : [''];
608
+ }
609
+ }
610
+ this.IsEmpty(params[filterName]) && delete params[filterName];
611
+ }
612
+ return params;
613
+ }, {});
614
+ }
615
+ /*
616
+ * Verifica se o valor informado é falso, em arrays, é verificado cada item
617
+ */
618
+ IsEmpty(value) {
619
+ return Array.isArray(value) ? value.every(data => !data) : !value;
620
+ }
621
+ /**
622
+ * Return format to specify for integer type field
623
+ */
624
+ optionsInteger() {
625
+ return { currencySymbol: '', decimalSeparator: '', thousandsSeparator: '' };
626
+ }
627
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
628
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormFilterComponent, selector: "s-app-form-filter", inputs: { showMessages: "showMessages", isModal: "isModal", contextId: "contextId" }, outputs: { totalFiltersActiveOutput: "totalFiltersActiveOutput", errorOutput: "errorOutput", showDialogOutput: "showDialogOutput", closeModalOutput: "closeModalOutput" }, host: { listeners: { "window:resize": "onResizeWindow($event)" } }, ngImport: i0, template: "<s-empty-state\n *ngIf=\"error\"\n iconClass=\"fa fa-exclamation-triangle\"\n title=\"{{ errorState?.status }} - {{ errorState?.statusText }}\"\n (primaryAction)=\"errorStateAction()\"\n [primaryActionLabel]=\"translate.instant('platform.filter_service.try')\"\n [description]=\"translate.instant('platform.filter_service.error_state')\"\n></s-empty-state>\n\n<div *ngIf=\"!error\">\n <p-tabView *ngIf=\"tabs && tabs.size > 1\"\n [(activeIndex)]=\"activeIndex\">\n\n <p-tabPanel header=\"{{ general.name }}\" *ngIf=\"general.fields.length\">\n <s-dynamic-form\n [errorMessages]=\"errorMessages\"\n [fields]=\"general.fields\"\n [form]=\"general.form\">\n </s-dynamic-form>\n </p-tabPanel>\n\n <p-tabPanel *ngFor=\"let tab of (tabs | mapValues)\"\n header=\"{{ tab.label }}\">\n <s-dynamic-form\n [errorMessages]=\"errorMessages\"\n [fields]=\"tab.fields\"\n [form]=\"tab.form\">\n </s-dynamic-form>\n </p-tabPanel>\n </p-tabView>\n\n <div *ngIf=\"tabs && tabs.size === 1\">\n <s-dynamic-form\n *ngFor=\"let tab of (tabs | mapValues)\"\n [errorMessages]=\"errorMessages\"\n [fields]=\"tab.fields\"\n [form]=\"tab.form\">\n </s-dynamic-form>\n </div>\n</div>\n", styles: [".filter-dialog{width:800px;top:100px}.filter-dialog>.ui-dialog-content{height:300px;padding:10px!important}@media (min-width: 641px) and (max-width: 1024px){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:300px}}@media only screen and (min-device-width: 481px) and (max-device-width: 1024px) and (orientation: portrait){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:90%}}@media (min-width: 320px) and (max-width: 640px){.filter-dialog{width:95%;left:0;top:0;opacity:1;margin:auto;height:93%}.filter-dialog>.ui-dialog-content{height:85%}}@media (min-width: 320px) and (max-width: 640px) and (max-width: 360px){.filter-dialog button{padding:0!important}.filter-dialog>.ui-dialog-content{height:81%}}\n"], dependencies: [{ kind: "component", type: i1.TabView, selector: "p-tabView, p-tabview", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i1.TabPanel, selector: "p-tabPanel, p-tabpanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DynamicFormComponent, selector: "s-dynamic-form", inputs: ["id", "configs", "fields", "form", "errorMessages"] }, { kind: "component", type: i4.EmptyStateComponent, selector: "s-empty-state", inputs: ["id", "title", "iconClass", "description", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "secondaryActionLabel", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "pipe", type: i5.MapValuesPipe, name: "mapValues" }] });
629
+ }
630
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormFilterComponent, decorators: [{
631
+ type: Component,
632
+ args: [{ selector: 's-app-form-filter', template: "<s-empty-state\n *ngIf=\"error\"\n iconClass=\"fa fa-exclamation-triangle\"\n title=\"{{ errorState?.status }} - {{ errorState?.statusText }}\"\n (primaryAction)=\"errorStateAction()\"\n [primaryActionLabel]=\"translate.instant('platform.filter_service.try')\"\n [description]=\"translate.instant('platform.filter_service.error_state')\"\n></s-empty-state>\n\n<div *ngIf=\"!error\">\n <p-tabView *ngIf=\"tabs && tabs.size > 1\"\n [(activeIndex)]=\"activeIndex\">\n\n <p-tabPanel header=\"{{ general.name }}\" *ngIf=\"general.fields.length\">\n <s-dynamic-form\n [errorMessages]=\"errorMessages\"\n [fields]=\"general.fields\"\n [form]=\"general.form\">\n </s-dynamic-form>\n </p-tabPanel>\n\n <p-tabPanel *ngFor=\"let tab of (tabs | mapValues)\"\n header=\"{{ tab.label }}\">\n <s-dynamic-form\n [errorMessages]=\"errorMessages\"\n [fields]=\"tab.fields\"\n [form]=\"tab.form\">\n </s-dynamic-form>\n </p-tabPanel>\n </p-tabView>\n\n <div *ngIf=\"tabs && tabs.size === 1\">\n <s-dynamic-form\n *ngFor=\"let tab of (tabs | mapValues)\"\n [errorMessages]=\"errorMessages\"\n [fields]=\"tab.fields\"\n [form]=\"tab.form\">\n </s-dynamic-form>\n </div>\n</div>\n", styles: [".filter-dialog{width:800px;top:100px}.filter-dialog>.ui-dialog-content{height:300px;padding:10px!important}@media (min-width: 641px) and (max-width: 1024px){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:300px}}@media only screen and (min-device-width: 481px) and (max-device-width: 1024px) and (orientation: portrait){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:90%}}@media (min-width: 320px) and (max-width: 640px){.filter-dialog{width:95%;left:0;top:0;opacity:1;margin:auto;height:93%}.filter-dialog>.ui-dialog-content{height:85%}}@media (min-width: 320px) and (max-width: 640px) and (max-width: 360px){.filter-dialog button{padding:0!important}.filter-dialog>.ui-dialog-content{height:81%}}\n"] }]
633
+ }], propDecorators: { showMessages: [{
634
+ type: Input
635
+ }], isModal: [{
636
+ type: Input
637
+ }], contextId: [{
638
+ type: Input
639
+ }], totalFiltersActiveOutput: [{
640
+ type: Output
641
+ }], errorOutput: [{
642
+ type: Output
643
+ }], showDialogOutput: [{
644
+ type: Output
645
+ }], closeModalOutput: [{
646
+ type: Output
647
+ }], onResizeWindow: [{
648
+ type: HostListener,
649
+ args: ['window:resize', ['$event']]
650
+ }] } });
651
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9tb2R1bGVzL2FkdmFuY2VkLWZpbHRlci9jb21wb25lbnRzL2Zvcm0tZmlsdGVyL2Zvcm0tZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvbW9kdWxlcy9hZHZhbmNlZC1maWx0ZXIvY29tcG9uZW50cy9mb3JtLWZpbHRlci9mb3JtLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkYsT0FBTyxFQUEyRCxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxlQUFlLEVBQ2YsUUFBUSxFQUNSLFdBQVcsRUFDWCxhQUFhLEVBQ2IsUUFBUSxFQUNSLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLFlBQVksRUFD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SUFFRDs7T0FFRztJQUNLLGNBQWM7UUFDcEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzlFLENBQUM7d0dBMXRCVSxtQkFBbUI7NEZBQW5CLG1CQUFtQiw4WENwRGhDLDh2Q0F3Q0E7OzRGRFlhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxtQkFBbUI7OEJBK0JwQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR1AsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcIkBzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdG9hc3RcIjtcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciBhcyByeEZpbHRlciwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENvbnRleHQsIERlcGVuZHNPbiwgRW50aXR5U2VhcmNoSW5wdXQsIEVudW1JdGVtLCBGaWx0ZXIsIEZpbHRlclR5cGUsIFNjb3BlIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbnRleHRUYWIsIFRhYlZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFiLXZpZXcnO1xuaW1wb3J0IHsgQWR2YW5jZWRGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWR2YW5jZWQtZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUZpbHRlciB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLWZpbHRlcic7XG5pbXBvcnQge1xuICBmaWx0ZXJPcGVyYXRvcnMsXG4gIGZyb21Kc29uLFxuICBnZXRGaWx0ZXJJZCxcbiAgZ2V0U2VhcmNoVHlwZSxcbiAgZ2V0VGFiSWQsXG4gIGpzb25QYXRoLFxuICBwYXJzZUZpbHRlclZhbHVlLFxuICB0b0ZpbHRlckZvcm1hdCxcbiAgdG9Vc2VyRm9ybWF0XG59IGZyb20gJy4uLy4uL3V0aWxzL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBjbG9uZSwgZXF1YWxzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgY29tcGFyZSwgaXNTdXBwb3J0ZWRUeXBlLCBpc1ZhbGlkT3BlcmF0b3IgfSBmcm9tICcuLi8uLi91dGlscy9jb21wYXJhdG9yJztcblxuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlRmllbGQsXG4gIENhbGVuZGFyRmllbGQsXG4gIFJhZGlvQnV0dG9uRmllbGQsXG4gIEN1cnJlbmN5RmllbGQsXG4gIEZpZWxkLFxuICBGaWVsZENvbmZpZyxcbiAgRmllbGRUeXBlLFxuICBOdW1iZXJGaWVsZCxcbiAgU2VsZWN0RmllbGQsXG4gIFRleHRGaWVsZCxcbiAgUmF0aW9uQnV0dG9uT3B0aW9uLFxuICBDYWxlbmRhckZpZWxkQ29uZmlnXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtJztcblxuaW1wb3J0IHsgc2VhcmNoRGlzcGxheU5hbWUsIHNlYXJjaEtleU5hbWUgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1vcHRpb25zLnNlcnZpY2UnO1xuXG5jb25zdCBUUkFOU0xBVEVfUFJFRklYID0gJ3BsYXRmb3JtLmZpbHRlcl9zZXJ2aWNlJztcbmNvbnN0IFRPQVNUX0xJRkUgPSA1MDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzLWFwcC1mb3JtLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0tZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJTZXJ2aWNlID0gaW5qZWN0KEFkdmFuY2VkRmlsdGVyU2VydmljZSk7XG4gIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhck9wdGlvbnNTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyT3B0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIGVycm9yU3RhdGU6IEh0dHBFcnJvclJlc3BvbnNlO1xuICB0YWJzOiBNYXA8c3RyaW5nLCBDb250ZXh0VGFiPjtcbiAgY29udGV4dHM6IENvbnRleHRbXSA9IFtdO1xuICBmb3JtRmlsdGVyczogRm9ybUZpbHRlcltdID0gW107XG4gIG9sZEZvcm1GaWx0ZXJzOiBGb3JtRmlsdGVyW10gPSBbXTtcbiAgYWN0dWFsRm9ybUZpbHRlcnM6IGFueVtdID0gW107XG4gIGdlbmVyYWwgPSBuZXcgVGFiVmlldyh7IG5hbWU6ICdHZXJhbCcgfSk7XG4gIHRvdGFsRmlsdGVyc0FjdGl2ZSA9IDA7XG4gIGlzTW9iaWxlID0gZmFsc2U7XG4gIHRhYlZpZXdPcmllbnRhdGlvbiA9ICdsZWZ0JztcbiAgZXJyb3IgPSBmYWxzZTtcbiAgYWN0aXZlSW5kZXggPSAwO1xuXG4gIGVycm9yTWVzc2FnZXMgPSB7XG4gICAgbWluOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LmVycm9yX21pbl92YWx1ZWApLFxuICAgIG1heDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5lcnJvcl9tYXhfdmFsdWVgKSxcbiAgICBwYXR0ZXJuOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LmludmFsaWRfcGF0dGVybmApXG4gIH07XG5cbiAgQElucHV0KCkgc2hvd01lc3NhZ2VzID0gdHJ1ZTtcbiAgQElucHV0KCkgaXNNb2RhbCA9IGZhbHNlO1xuICBASW5wdXQoKSBjb250ZXh0SWQgPSAnJztcblxuXG4gIEBPdXRwdXQoKSB0b3RhbEZpbHRlcnNBY3RpdmVPdXRwdXQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGVycm9yT3V0cHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgc2hvd0RpYWxvZ091dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGNsb3NlTW9kYWxPdXRwdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplV2luZG93KGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IGlubmVyV2lkdGggfSA9IGV2ZW50LnRhcmdldDtcbiAgICB0aGlzLmlzTW9iaWxlID0gaW5uZXJXaWR0aCA8PSA2NDA7XG4gICAgdGhpcy50YWJWaWV3T3JpZW50YXRpb24gPSB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAnbGVmdCc7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzTW9iaWxlID0gaW5uZXJXaWR0aCA8PSA2NDA7XG4gICAgdGhpcy50YWJWaWV3T3JpZW50YXRpb24gPSB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgdGhpcy5zdWJzY3JpYmVDb250ZXh0c09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN1YnNjcmliZUZpbHRlcnNPYnNlcnZhYmxlKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGEubWVzc2FnZSAmJiBkYXRhLm1lc3NhZ2Uuc3BsaXQoJzonKVsxXTtcbiAgICAgIGlmIChtZXNzYWdlID09PSAnYWRkQ29udGV4dCcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFkZENvbnRleHRzKC4uLmRhdGEucGF5bG9hZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBoYXNDaGFuZ2VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vbGRGb3JtRmlsdGVycz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZm9ybUZpbHRlcnMuZmlsdGVyKChjdXJyZW50RmlsdGVyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgb2xkRmlsdGVyID0gdGhpcy5vbGRGb3JtRmlsdGVyc1tpbmRleF07XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZEZpbHRlciA/IG9sZEZpbHRlci52YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAhZXF1YWxzKGN1cnJlbnRGaWx0ZXIudmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25BcHBseUZpbHRlcnMoKSB7XG4gICAgdGhpcy5oYXNDaGFuZ2VzKCkgJiYgdGhpcy5jbG9zZU1vZGFsT3V0cHV0LmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuaGFzQ2hhbmdlcygpICYmIHRoaXMuZmlsdGVyU2VydmljZS50cnlBZ2Fpbih0aGlzLmNvbnRleHRzKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVycyhzaG93VG9hc3QgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmhhc0NoYW5nZXMoKSkge1xuICAgICAgdGhpcy5zaG93RGlhbG9nT3V0cHV0LmVtaXQoZmFsc2UpO1xuICAgICAgdGhpcy5jb3VudGVyVXBkYXRlKCk7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzVmFsdWVzKHRoaXMuZm9ybUZpbHRlcnMpO1xuXG4gICAgICB0aGlzLmZpbHRlclNlcnZpY2Uuc2F2ZVRpY2tlZEZpbHRlcnMoZmlsdGVycyk7XG4gICAgfSBlbHNlIGlmIChzaG93VG9hc3QpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgIGR1cmF0aW9uOiBUT0FTVF9MSUZFLFxuICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LmFwcGxpZWRfZmlsdGVyX25vY2hhbmdlYCwgeyBhY3RpdmVGaWx0ZXJzOiB0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSB9KVxuICAgICAgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuICAgIHRoaXMub2xkRm9ybUZpbHRlcnMgPSBjbG9uZSh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgfVxuXG4gIGdldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWU6IGFueSwgaXNNdWx0aXBsZTogYm9vbGVhbikge1xuICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoaXNNdWx0aXBsZSAmJiBkZWZhdWx0VmFsdWVbMF0gPT09ICcnKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybUZpbHRlcnMpO1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4gdGhpcy5jbGVhbkZpZWxkQW5kU2V0RGVmYXVsdFZhbHVlKGtleSkpO1xuICB9XG5cbiAgc2VuZENsb3NlTWVzc2FnZSgpIHtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFxuICAgICAge1xuICAgICAgICBtZXNzYWdlOiAnZGFzaGJvYXJkOmNsb3NlLW1vZGFsJyxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIG1vZGFsTmFtZTogJ2FkdmFuY2VkLWZpbHRlci0xJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyonXG4gICAgKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlKG1lc3NhZ2U6IGFueSkge1xuICAgIGlmICh0aGlzLnNob3dNZXNzYWdlcykge1xuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkYXNoYm9hcmQ6dG9hc3RyJyxcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmRldGFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyonXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVGaWx0ZXJzKGZvcmNlU2F2ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMucGFyc2VUb1VzZXJGaWx0ZXJzKHRoaXMuZm9ybUZpbHRlcnMpO1xuICAgIGNvbnN0IHNhdmVkRmlsdGVyU3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIGlmICghZm9yY2VTYXZlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICBkdXJhdGlvbjogVE9BU1RfTElGRSxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LnNhdmVkX2ZpbHRlcnNfc3VjY2Vzc2AsIHsgYWN0aXZlRmlsdGVyczogdGhpcy50b3RhbEZpbHRlcnNBY3RpdmUgfSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb3VudGVyVXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNhdmVkRmlsdGVyc0Vycm9yID0gKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgIGR1cmF0aW9uOiBUT0FTVF9MSUZFLFxuICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LnNhdmVkX2ZpbHRlcnNfZXJyb3JgLCB7IGFjdGl2ZUZpbHRlcnM6IHRoaXMudG90YWxGaWx0ZXJzQWN0aXZlIH0pXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH07XG5cbiAgICB0aGlzLmZpbHRlclNlcnZpY2VcbiAgICAgIC5zYXZlRmlsdGVycyhmaWx0ZXJzKVxuICAgICAgLnN1YnNjcmliZShzYXZlZEZpbHRlclN1Y2Nlc3MsIHNhdmVkRmlsdGVyc0Vycm9yKTtcbiAgfVxuXG4gIHNhdmVGaWx0ZXJzV2l0aENhbGxiYWNrRnVuY3Rpb24oY2FsbGJhY2tGdW5jdGlvbjogYW55KSB7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMucGFyc2VUb1VzZXJGaWx0ZXJzKHRoaXMuZm9ybUZpbHRlcnMpO1xuXG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlXG4gICAgICAuc2F2ZUZpbHRlcnMoZmlsdGVycylcbiAgICAgIC5zdWJzY3JpYmUoY2FsbGJhY2tGdW5jdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGNvdW50ZXJVcGRhdGUoKSB7XG4gICAgdGhpcy50b3RhbEZpbHRlcnNBY3RpdmUgPSB0aGlzLmNvdW50QWN0aXZlRmlsdGVycyh0aGlzLnRhYnMpO1xuICAgIHRoaXMudG90YWxGaWx0ZXJzQWN0aXZlT3V0cHV0LmVtaXQodGhpcy50b3RhbEZpbHRlcnNBY3RpdmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudEFjdGl2ZUZpbHRlcnModGFiczogTWFwPHN0cmluZywgQ29udGV4dFRhYj4pIHtcbiAgICBsZXQgdG90YWxGaWx0ZXJzQWN0aXZlID0gMDtcblxuICAgIHRhYnMuZm9yRWFjaCh0YWJWaWV3ID0+IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRhYlZpZXcuZm9ybTtcbiAgICAgIHRhYlZpZXcuYWN0aXZlRmlsdGVycyA9IE9iamVjdC5rZXlzKHZhbHVlKS5yZWR1Y2UoKGFwcGxpZWRGaWx0ZXJzLCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGlzVmFsaWRBcnJheSA9IGlzQXJyYXkgJiYgZmlsdGVyVmFsdWUubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoaXNWYWxpZEFycmF5IHx8ICghaXNBcnJheSAmJiBmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICBhcHBsaWVkRmlsdGVycysrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpZWRGaWx0ZXJzO1xuICAgICAgfSwgMCk7XG4gICAgICB0b3RhbEZpbHRlcnNBY3RpdmUgKz0gdGFiVmlldy5hY3RpdmVGaWx0ZXJzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRvdGFsRmlsdGVyc0FjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUb1VzZXJGaWx0ZXJzKGZpbHRlcnM6IEZvcm1GaWx0ZXJbXSkge1xuICAgIHJldHVybiBmaWx0ZXJzLnJlZHVjZSgoYWxsLCBmaWx0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2VydmljZXMsIG5hbWUsIHZhbHVlLCBkb21haW4sIGNvbnRleHRzIH0gPSBmaWx0ZXIgYXMgdW5rbm93biBhcyBGaWx0ZXI7XG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRvVXNlckZvcm1hdCh2YWx1ZSwgdHlwZSk7XG5cbiAgICAgIGNvbnN0IHZhbHVlcyA9IHNlcnZpY2VzLm1hcChzZXJ2aWNlID0+ICh7IG5hbWUsIHNlcnZpY2UsIHZhbHVlOiBmaWx0ZXJWYWx1ZSwgZG9tYWluLCBjb250ZXh0cyB9KSk7XG5cbiAgICAgIHJldHVybiBbLi4uYWxsLCAuLi52YWx1ZXNdO1xuICAgIH0sIFtdIGFzIGFueVtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyc1ZhbHVlcyhmaWx0ZXJzOiBGb3JtRmlsdGVyW10pIHtcbiAgICBjb25zdCBmaWx0ZXJzQXNPYmplY3QgPSBmaWx0ZXJzIGFzIHVua25vd24gYXMgeyBba2V5OiBzdHJpbmddOiBGaWx0ZXIgfTtcbiAgICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhmaWx0ZXJzQXNPYmplY3QpO1xuXG4gICAgcmV0dXJuIGlkcy5yZWR1Y2UoKGFsbCwgZmlsdGVySWQpID0+IHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2VydmljZXMsIG5hbWUsIHZhbHVlLCBkb21haW4gfSA9IGZpbHRlcnNBc09iamVjdFtmaWx0ZXJJZF07XG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRvRmlsdGVyRm9ybWF0KHZhbHVlLCB0eXBlKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHNlcnZpY2VzLm1hcChzZXJ2aWNlID0+ICh7IG5hbWUsIHNlcnZpY2UsIHZhbHVlOiBmaWx0ZXJWYWx1ZSwgZG9tYWluIH0pKTtcblxuICAgICAgcmV0dXJuIFsuLi5hbGwsIC4uLnZhbHVlc107XG4gICAgfSwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVDb250ZXh0c09ic2VydmFibGUoKSB7XG4gICAgY29uc3QgeyBjb250ZXh0c09ic2VydmVyIH0gPSB0aGlzLmZpbHRlclNlcnZpY2U7XG4gICAgY29udGV4dHNPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChjb250ZXh0czogQ29udGV4dFtdKSA9PiAodGhpcy5jb250ZXh0cyA9IGNvbnRleHRzKSk7XG4gIH1cblxuICBlcnJvclN0YXRlQWN0aW9uKCkge1xuICAgIHRoaXMuZmlsdGVyU2VydmljZS50cnlBZ2Fpbih0aGlzLmNvbnRleHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlRmlsdGVyc09ic2VydmFibGUoKSB7XG4gICAgY29uc3QgeyBmaWx0ZXJzT2JzZXJ2ZXIgfSA9IHRoaXMuZmlsdGVyU2VydmljZTtcblxuICAgIGZpbHRlcnNPYnNlcnZlclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmaWx0ZXJzLCBhcHBseUZpbHRlciwgZXJyb3IsIG1lc3NhZ2UgfSkgPT4ge1xuICAgICAgICB0aGlzLmVycm9yT3V0cHV0LmVtaXQoZXJyb3IpO1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuZXJyb3JTdGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0oZmlsdGVycywgYXBwbHlGaWx0ZXIpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKGZpbHRlcnM6IGFueSwgYXBwbHlGaWx0ZXI6IGFueSkge1xuICAgIHRoaXMudGFicyA9IHRoaXMuY3JlYXRlVGFicyhmaWx0ZXJzKTtcbiAgICB0aGlzLmNvdW50ZXJVcGRhdGUoKTtcbiAgICB0aGlzLnNldERlcGVuZGVuY2llcyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICB0aGlzLmNyZWF0ZUNoaWxkQXJyYXkoKTtcbiAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwICYmIGFwcGx5RmlsdGVyKSB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RGVwZW5kZW5jaWVzKGZpbHRlcnM6IEZvcm1GaWx0ZXJbXSkge1xuICAgICAgY29uc3QgZmlsdGVyc01hcDogUmVjb3JkPHN0cmluZywgRm9ybUZpbHRlcj4gPSB7fTtcbiAgICAgIGZpbHRlcnMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEZpbHRlcklkKGYuZG9tYWluLCBmLm5hbWUpO1xuICAgICAgICAgIGZpbHRlcnNNYXBbaWRdID0gZjtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGZpbHRlcnNNYXApO1xuXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBmcm9tKG5hbWVzKS5waXBlKFxuICAgICAgICAgIG1hcChrZXkgPT4gZmlsdGVyc01hcFtrZXldKSxcbiAgICAgICAgICByeEZpbHRlcigoeyBkZXBlbmRzT24gfSkgPT4gZGVwZW5kc09uICYmIGRlcGVuZHNPbi5sZW5ndGggPiAwKSxcbiAgICAgICAgICB0YXAoKHsgZGVwZW5kc09uLCBkb21haW4sIGZpbHRlckNvbnRyb2wgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbnZhbGlkRmlsdGVycyA9IGRlcGVuZHNPblxuICAgICAgICAgICAgICAgICAgLmZpbHRlcihkZXAgPT4gZGVwLnJlcXVpcmVkKVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcihkZXAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBkZXAuZmlsdGVyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpbHRlciA9IGZpbHRlcnNNYXBbaWRdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUgfSA9IGZvcm1GaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBjb21wYXJhdG9yIH0gPSBkZXA7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmF0b3IgJiYgaXNWYWxpZE9wZXJhdG9yKGNvbXBhcmF0b3Iub3BlcmF0b3IpICYmIGlzU3VwcG9ydGVkVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcGFyc2VGaWx0ZXJWYWx1ZSh2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29tcGFyZShjb21wYXJhdG9yLm9wZXJhdG9yLCBjb21wYXJhdG9yLnZhbHVlLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcC5yZXF1aXJlZCA/ICFmb3JtRmlsdGVyLnZhbHVlIDogZm9ybUZpbHRlci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChpbnZhbGlkRmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBmaWx0ZXJDb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1hcCgoeyBkb21haW4sIGRlcGVuZHNPbiwgZmlsdGVyQ29udHJvbCB9KSA9PiAoeyBkb21haW4sIGRlcGVuZHNPbiwgZmlsdGVyQ29udHJvbCB9KSlcbiAgICAgICk7XG5cbiAgICAgIGRlcGVuZGVuY2llcy5zdWJzY3JpYmUoKHsgZGVwZW5kc09uLCBkb21haW4sIGZpbHRlckNvbnRyb2wgfSkgPT5cbiAgICAgICAgICBmcm9tKGRlcGVuZHNPbilcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICByeEZpbHRlcihkZXAgPT4gZGVwLnJlcXVpcmVkKSxcbiAgICAgICAgICAgICAgICAgIG1hcCgoeyBmaWx0ZXJOYW1lIH0pID0+IGdldEZpbHRlcklkKGRvbWFpbiwgZmlsdGVyTmFtZSkpLFxuICAgICAgICAgICAgICAgICAgbWFwKGZpbHRlcklkID0+IGZpbHRlcnNNYXBbZmlsdGVySWRdKSxcbiAgICAgICAgICAgICAgICAgIG1lcmdlTWFwKGZvcm1GaWx0ZXIgPT4gZnJvbShmb3JtRmlsdGVyLnZhbHVlQ2hhbmdlcyB8fCBbXSkpLFxuICAgICAgICAgICAgICAgICAgbWFwKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGFyYXRpb24gPSBkZXBlbmRzT24uZXZlcnkoZGVwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVySWQgPSBnZXRGaWx0ZXJJZChkb21haW4sIGRlcC5maWx0ZXJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWQgYXMgYW55XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWQgYXMgYW55XS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBjb21wYXJhdG9yIH0gPSBkZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyYXRvciAmJiBpc1ZhbGlkT3BlcmF0b3IoY29tcGFyYXRvci5vcGVyYXRvcikgJiYgaXNTdXBwb3J0ZWRUeXBlKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUZpbHRlclZhbHVlKHZhbCwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoY29tcGFyYXRvci5vcGVyYXRvciwgY29tcGFyYXRvci52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLklzRW1wdHkodmFsKSAmJiBjb21wYXJhdGlvbiA/ICdlbmFibGUnIDogJ2Rpc2FibGUnO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKHN0YXR1cyA9PiBmaWx0ZXJDb250cm9sW3N0YXR1c10oKSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZEdlbmVyYWxGaWVsZChmaWx0ZXI6IEZpbHRlcikge1xuICAgIGNvbnN0IHsgbmFtZSwgZG9tYWluLCB0eXBlIH0gPSBmaWx0ZXI7XG4gICAgY29uc3QgY29udHJvbE5hbWUgPSBnZXRGaWx0ZXJJZChkb21haW4sIG5hbWUpO1xuICAgIGNvbnN0IGZpZWxkQ29udHJvbCA9IGNyZWF0ZUZvcm1Db250cm9sKGZpbHRlcik7XG5cbiAgICBmaWVsZENvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBtYXAodiA9PiBwYXJzZUZpbHRlclZhbHVlKHYsIHR5cGUpKSxcbiAgICAgICAgdGFwKHZhbHVlID0+ICh0aGlzLmZvcm1GaWx0ZXJzW2NvbnRyb2xOYW1lIGFzIGFueV0udmFsdWUgPSB2YWx1ZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbCA9PlxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0YWIuZm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgICBpZiAoY29udHJvbCAmJiB0YWIuZG9tYWluID09PSBkb21haW4pIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IHsgLi4uZmlsdGVyLCAuLi57IG5hbWU6IGNvbnRyb2xOYW1lIH0gfTtcbiAgICBjb25zdCBuZXdGaWVsZCA9IHRoaXMuY3JlYXRlRmllbGQobmV3RmlsdGVyKTtcbiAgICB0aGlzLmdlbmVyYWwuZm9ybS5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBmaWVsZENvbnRyb2wpO1xuICAgIHRoaXMuZ2VuZXJhbC5maWVsZHMucHVzaChuZXdGaWVsZCk7XG4gIH1cblxuICAvKlxuICAgKiBWZXJpZmljYSBvcyBjb250ZXh0b3MgZGUgY2FkYSBmaWx0cm8sIGNhc28gdG9kb3Mgb3MgY29udGV4dG9zIGZvcmFtIGluZm9ybWFkb3M6XG4gICAqIEByZXR1cm4gdHJ1ZVxuICAgKiBDYXNvIG7Do28gdGVuaGEgbmVuaHVtIGNvbnRleHRvLCBjb25zaWRlcmEtc2UgcG9yIHBhZHLDo28gcXVlIMOpIHRvZG9zOlxuICAgKiBAcmV0dXJuIHRydWVcbiAgICovXG4gIHByaXZhdGUgY29udGFpbnNBbGxDb250ZXh0cyhteUNvbnRleHRzOiBzdHJpbmdbXSkge1xuICAgIGlmICghbXlDb250ZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhbGxDb250ZXh0cyA9IHRoaXMuY29udGV4dHMubWFwKGRhdGEgPT4gZGF0YS5jb250ZXh0SWQpO1xuICAgIHJldHVybiBlcXVhbHMobXlDb250ZXh0cy5zb3J0KCksIGFsbENvbnRleHRzLnNvcnQoKSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHRvZG8gUmVmYXRvcmFyLiBPIG3DqXRvZG8gcG9zc3VpIG11aXRhcyByZXNwb25zYWJpbGlkYWRlc1xuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVUYWJzKGZpbHRlcnM6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIGZpbHRlcnMucmVkdWNlKCh0YWJzLCBmaWx0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgZG9tYWluLCBzZXJ2aWNlcywgbmFtZSwgdHlwZSwgc2NvcGUsIGNvbnRleHRzLCBkZXBlbmRzT24sIHZhbHVlLCBzZWFyY2gsIGRlZmF1bHRWYWx1ZSB9ID0gZmlsdGVyO1xuICAgICAgY29uc3QgaXNOb3RNdWx0aXBsZSA9IHNlYXJjaCAmJiBnZXRTZWFyY2hUeXBlKHNlYXJjaCkub3V0cHV0Lm1heFNlbGVjdGVkSXRlbXMgPT09IDE7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuY3JlYXRlRmllbGQoZmlsdGVyKTtcbiAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBuYW1lKTtcbiAgICAgIGNvbnN0IGZpbHRlckNvbmZpZyA9IHtcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBjb250ZXh0cyxcbiAgICAgICAgc2VydmljZXMsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlcGVuZHNPbixcbiAgICAgICAgdmFsdWU6IGZyb21Kc29uKHZhbHVlLCB0eXBlLCBpc05vdE11bHRpcGxlKSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgaXNNdWx0aXBsZTogIWlzTm90TXVsdGlwbGUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZnJvbUpzb24oZGVmYXVsdFZhbHVlLCB0eXBlLCBpc05vdE11bHRpcGxlKVxuICAgICAgfTtcbiAgICAgIHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWQgYXMgYW55XSA9IG5ldyBGb3JtRmlsdGVyKGZpbHRlckNvbmZpZyk7XG4gICAgICBjb25zdCBmb3JtRmlsdGVyID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZCBhcyBhbnldO1xuICAgICAgaWYgKHNjb3BlID09PSBTY29wZS5ET01BSU4gJiYgdGhpcy5jb250YWluc0FsbENvbnRleHRzKGNvbnRleHRzKSkge1xuICAgICAgICB0aGlzLmFkZEdlbmVyYWxGaWVsZChmaWx0ZXIpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0cy5mb3JFYWNoKGNvbnRleHRJZCA9PiB7XG4gICAgICAgIGlmICgoY29udGV4dElkID09PSB0aGlzLmNvbnRleHRJZCkgfHwgKHRoaXMuY29udGV4dElkID09PSAnJykpIHtcbiAgICAgICAgICBjb25zdCB0YWJJZCA9IGdldFRhYklkKGRvbWFpbiwgY29udGV4dElkKTtcbiAgICAgICAgICBjb25zdCBmaWVsZENvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChmaWx0ZXIpO1xuXG4gICAgICAgICAgaWYgKCF0YWJzLmhhcyh0YWJJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29udGV4dExhYmVsIH0gPSB0aGlzLmNvbnRleHRzLmZpbmQoY29udGV4dCA9PiBjb250ZXh0LmNvbnRleHRJZCA9PT0gY29udGV4dElkKTtcbiAgICAgICAgICAgIGNvbnN0IHRhYiA9IG5ldyBDb250ZXh0VGFiKHsgZG9tYWluLCBuYW1lOiBjb250ZXh0TGFiZWwgfSk7XG4gICAgICAgICAgICB0YWJzLnNldCh0YWJJZCwgdGFiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWVsZENvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWw6IGFueSkgPT4gdGhpcy51cGRhdGVGaWx0ZXJWYWx1ZSh0YWJJZCwgbmFtZSwgdmFsLCBkb21haW4sIHR5cGUpKTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRleHRUYWIgPSB0YWJzLmdldCh0YWJJZCk7XG5cblxuICAgICAgICAgIGNvbnRleHRUYWIuZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgIGNvbnRleHRUYWIuZm9ybS5hZGRDb250cm9sKGZpbHRlci5uYW1lLCBmaWVsZENvbnRyb2wpO1xuXG4gICAgICAgICAgaWYgKCFmb3JtRmlsdGVyLmZpbHRlckNvbnRyb2wpIHtcbiAgICAgICAgICAgIGZvcm1GaWx0ZXIuZmlsdGVyQ29udHJvbCA9IGZpZWxkQ29udHJvbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIHJldHVybiB0YWJzO1xuICAgIH0sIG5ldyBNYXA8c3RyaW5nLCBDb250ZXh0VGFiPigpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyVmFsdWUodGFiSWQ6IHN0cmluZywgZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBkb21haW46IHN0cmluZywgdHlwZTogRmlsdGVyVHlwZSkge1xuICAgIGNvbnN0IGNvbnRyb2xPcHRzID0geyBlbWl0RXZlbnQ6IGZhbHNlIH07XG4gICAgY29uc3QgZmllbGRWYWx1ZSA9IHBhcnNlRmlsdGVyVmFsdWUodmFsdWUsIHR5cGUpO1xuICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWx0ZXJOYW1lKTtcbiAgICBjb25zdCBnZW5lcmFsRmllbGRDb250cm9sID0gdGhpcy5nZW5lcmFsLmZvcm0uY29udHJvbHNbZmlsdGVySWRdO1xuXG4gICAgdGhpcy50YWJzLmZvckVhY2goKHsgZm9ybSB9LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2ZpbHRlck5hbWVdO1xuXG4gICAgICBpZiAodGFiSWQgIT09IGtleSAmJiBjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIGNvbnRyb2xPcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB7IGNoaWxkcyB9ID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZCBhcyBhbnldO1xuICAgIGNoaWxkcyAmJiBjaGlsZHMuZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4gdGhpcy5jbGVhbkZpZWxkQW5kU2V0RGVmYXVsdFZhbHVlKGNoaWxkLmZpbHRlci5rZXkpKTtcbiAgICBnZW5lcmFsRmllbGRDb250cm9sICYmIGdlbmVyYWxGaWVsZENvbnRyb2wuc2V0VmFsdWUodmFsdWUsIGNvbnRyb2xPcHRzKTtcbiAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkIGFzIGFueV0udmFsdWUgPSBmaWVsZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkZpZWxkQW5kU2V0RGVmYXVsdFZhbHVlKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBpc011bHRpcGxlLCBkZWZhdWx0VmFsdWUsIGZpbHRlckNvbnRyb2wsIHR5cGUgfSA9IHRoaXMuZm9ybUZpbHRlcnNba2V5IGFzIGFueV07XG4gICAgY29uc3QgZmluYWxWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSwgaXNNdWx0aXBsZSk7XG5cbiAgICBpZiAoZmlsdGVyQ29udHJvbCkge1xuICAgICAgaWYgKHR5cGUgPT09ICdEQVRFJyB8fCAodHlwZSA9PT0gJ1NFQVJDSCcgJiYgaXNNdWx0aXBsZSkpIHtcbiAgICAgICAgZmlsdGVyQ29udHJvbC5zZXRWYWx1ZShmaW5hbFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAnSU5URUdFUicgfHwgdHlwZSA9PT0gJ0RPVUJMRScgfHwgdHlwZSA9PT0gJ01PTkVZJykge1xuICAgICAgICBmaW5hbFZhbHVlID09PSAnJyA/IGZpbHRlckNvbnRyb2wuc2V0VmFsdWUobnVsbCkgOiBmaWx0ZXJDb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyQ29udHJvbC5zZXRWYWx1ZShmaW5hbFZhbHVlLCB7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hpbGRBcnJheSgpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtRmlsdGVycyk7XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCB7IGRlcGVuZHNPbiwgZG9tYWluIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2tleSBhcyBhbnldO1xuICAgICAgZGVwZW5kc09uLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVySWQgPSBnZXRGaWx0ZXJJZChkb21haW4sIGZpZWxkLmZpbHRlck5hbWUpO1xuICAgICAgICBpZiAodGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZCBhcyBhbnldKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkIGFzIGFueV0uY2hpbGRzKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkIGFzIGFueV0uY2hpbGRzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgICh0aGlzLmZvcm1GaWx0ZXJzIGFzIGFueSlbZmlsdGVySWRdLmNoaWxkcy5wdXNoKHsgZmlsdGVyOiB7IGtleSwgcmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkIH0gfSk7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpZWxkKGZpbHRlcjogRmlsdGVyKTogRmllbGQge1xuICAgIGNvbnN0IHsgbmFtZSwgbGFiZWwsIGVudW1JdGVtcywgdHlwZSwgbWFzayB9ID0gZmlsdGVyO1xuICAgIGNvbnN0IHRyYW5zbGF0ZWRFbnVtSXRlbXMgPVxuICAgICAgZW51bUl0ZW1zICYmIGVudW1JdGVtcy5tYXAoKGl0ZW06IEVudW1JdGVtKSA9PiAoeyBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChpdGVtLmxhYmVsKSwgdmFsdWU6IGl0ZW0udmFsdWUgfSkpO1xuICAgIGNvbnN0IGZpZWxkID0geyBuYW1lLCBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChsYWJlbCksIHBsYWNlaG9sZGVyOiAnJyB9O1xuXG4gICAgY29uc3QgY3JlYXRvcnMgPSB7XG4gICAgICBbRmlsdGVyVHlwZS5TVFJJTkddOiAoKSA9PiBuZXcgVGV4dEZpZWxkKHsgLi4uZmllbGQsIG1hc2s6IG1hc2sgPyAoKSA9PiBtYXNrIDogbnVsbCwgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9KSxcbiAgICAgIFtGaWx0ZXJUeXBlLk1PTkVZXTogKCkgPT4gbmV3IEN1cnJlbmN5RmllbGQoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLk1vbmV5IH0pLFxuICAgICAgW0ZpbHRlclR5cGUuQk9PTEVBTl06ICgpID0+IHRoaXMuY3JlYXRlUmFkaW9CdXR0b24oeyAuLi5maWVsZCB9KSxcbiAgICAgIFtGaWx0ZXJUeXBlLkRBVEVdOiAoKSA9PiB0aGlzLmNyZWF0ZUNhbGVuZGFyKHsgLi4uZmllbGQsIHR5cGU6IEZpZWxkVHlwZS5EYXRlIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuREFURVRJTUVdOiAoKSA9PiB0aGlzLmNyZWF0ZUNhbGVuZGFyKHsgLi4uZmllbGQsIHR5cGU6IEZpZWxkVHlwZS5EYXRlVGltZSB9KSxcbiAgICAgIFtGaWx0ZXJUeXBlLlRJTUVdOiAoKSA9PiB0aGlzLmNyZWF0ZUNhbGVuZGFyKHsgLi4uZmllbGQsIHR5cGU6IEZpZWxkVHlwZS5UaW1lIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuRU5VTUVSQVRJT05dOiAoKSA9PlxuICAgICAgICBuZXcgU2VsZWN0RmllbGQoe1xuICAgICAgICAgIC4uLmZpZWxkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdwbGF0Zm9ybS5maWx0ZXJfc2VydmljZS5zZWxlY3QnKSxcbiAgICAgICAgICBvcHRpb25zOiBbLi4udHJhbnNsYXRlZEVudW1JdGVtc10gYXMgYW55LFxuICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5FbnVtXG4gICAgICAgIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuSU5URUdFUl06ICgpID0+XG4gICAgICAgIG5ldyBOdW1iZXJGaWVsZCh7XG4gICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgbnVtYmVyTG9jYWxlT3B0aW9uczogdGhpcy5vcHRpb25zSW50ZWdlcigpLFxuICAgICAgICAgIG1hc2s6IG1hc2sgPyAoKSA9PiBtYXNrIDogbnVsbCxcbiAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlclxuICAgICAgICB9KSxcbiAgICAgIFtGaWx0ZXJUeXBlLkRPVUJMRV06ICgpID0+IG5ldyBDdXJyZW5jeUZpZWxkKHsgLi4uZmllbGQsIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGUgfSksXG4gICAgICBbRmlsdGVyVHlwZS5TRUFSQ0hdOiAoKSA9PiB0aGlzLmNyZWF0ZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkLCBmaWx0ZXIpXG4gICAgfTtcblxuICAgIHJldHVybiBjcmVhdG9yc1t0eXBlXSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSYWRpb0J1dHRvbihmaWVsZDogRmllbGRDb25maWcpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAgeyBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS55ZXNgKSwgdmFsdWU6IHRydWUgfSxcbiAgICAgIHsgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0ubm9gKSwgdmFsdWU6IGZhbHNlIH1cbiAgICBdIGFzIFJhdGlvbkJ1dHRvbk9wdGlvbltdO1xuXG4gICAgcmV0dXJuIG5ldyBSYWRpb0J1dHRvbkZpZWxkKHsgLi4uZmllbGQsIHR5cGU6IEZpZWxkVHlwZS5SYWRpbywgb3B0aW9ucyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2FsZW5kYXIoY29uZmlnOiBDYWxlbmRhckZpZWxkQ29uZmlnKSB7XG4gICAgY29uc3QgY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXJGaWVsZChjb25maWcpO1xuICAgIGNhbGVuZGFyLmNhbGVuZGFyTG9jYWxlT3B0aW9ucyA9IHRoaXMuY2FsZW5kYXJPcHRpb25zU2VydmljZS5nZXRPcHRpb25zKCk7XG4gICAgaWYgKCF0aGlzLmlzTW9kYWwpIGNhbGVuZGFyLmFwcGVuZFRvID0gJ2JvZHknO1xuICAgIHJldHVybiBjYWxlbmRhcjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXV0b2NvbXBsZXRlRmllbGQoZmllbGQ6IEZpZWxkQ29uZmlnLCB7IGRlcGVuZHNPbiwgc2VhcmNoLCBkb21haW4sIG5hbWUgfTogRmlsdGVyKSB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnNPYnNlcnZhYmxlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIGNvbnN0IHsgcXVlcnlQYXJhbSB9ID0gZ2V0U2VhcmNoVHlwZShzZWFyY2gpLmlucHV0O1xuICAgIGNvbnN0IHsgZGlzcGxheUZpZWxkcywga2V5RmllbGRzLCByZXN1bHREYXRhSnNvblBhdGgsIGRpc3BsYXlGaWVsZENvbmNhdFRva2VuLCBtYXhTZWxlY3RlZEl0ZW1zIH0gPSBnZXRTZWFyY2hUeXBlKHNlYXJjaCkub3V0cHV0O1xuICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBuYW1lKTtcbiAgICBjb25zdCBzdWdnZXN0aW9uc0Vycm9yID0gKG1lc3NhZ2VFcnJvcj86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZURldGFpbCA9IG1lc3NhZ2VFcnJvciA/IG1lc3NhZ2VFcnJvciA6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uZmluZF9zdWdnZXN0aW9uc19lcnJvcmAsIHsgYWN0aXZlRmlsdGVyczogdGhpcy50b3RhbEZpbHRlcnNBY3RpdmUgfSlcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBkdXJhdGlvbjogVE9BU1RfTElGRSxcbiAgICAgICAgdGV4dDogbWVzc2FnZURldGFpbFxuICAgICAgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfTtcbiAgICBjb25zdCBvblNlYXJjaCA9ICh2YWw6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcGFyYW1zID0geyBbcXVlcnlQYXJhbV06IHZhbCB9O1xuICAgICAgZGVwZW5kc09uICYmIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB0aGlzLmdldERlcGVuZGVuY2llc1ZhbHVlcyhkZXBlbmRzT24sIGRvbWFpbikpO1xuXG4gICAgICBjb25zdCBzZWFyY2hVcmwgPVxuICAgICAgICBzZWFyY2ggJiYgc2VhcmNoLnR5cGUgPT09ICdFTlRJVFknXG4gICAgICAgICAgPyB0aGlzLmdldEVudGl0eVNlYXJjaFVybChzZWFyY2guZW50aXR5U2VhcmNoLmlucHV0LCB2YWwsIGRlcGVuZHNPbilcbiAgICAgICAgICA6IGdldFNlYXJjaFR5cGUoc2VhcmNoKS5pbnB1dC51cmw7XG5cbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZVxuICAgICAgICAuc2VhcmNoRmllbGRTdWdnZXN0aW9ucyhzZWFyY2hVcmwsIHBhcmFtcywgc2VhcmNoLnR5cGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChyZXNwb25zZSA9PiBqc29uUGF0aChyZXNwb25zZSwgcmVzdWx0RGF0YUpzb25QYXRoKSksXG4gICAgICAgICAgbWFwKChzdWdnZXN0aW9uczogYW55W10pID0+IHRoaXMuYWRkU3VnZ2VzdGlvbkZpZWxkcyhzdWdnZXN0aW9ucywgZGlzcGxheUZpZWxkcywga2V5RmllbGRzLCBkaXNwbGF5RmllbGRDb25jYXRUb2tlbiwgZmlsdGVySWQpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBzdWdnZXN0aW9uc09ic2VydmFibGUubmV4dChyZXN1bHQpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUVycm9yID0gdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmVycm9yLm1lc3NhZ2UpIG1lc3NhZ2VFcnJvciA9IGVycm9yLmVycm9yLm1lc3NhZ2VcbiAgICAgICAgICBzdWdnZXN0aW9uc0Vycm9yKG1lc3NhZ2VFcnJvcilcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgQXV0b2NvbXBsZXRlRmllbGQoe1xuICAgICAgLi4uZmllbGQsXG4gICAgICBvblNlYXJjaCxcbiAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICBzdWdnZXN0aW9uc09ic2VydmFibGUsXG4gICAgICBkaXNwbGF5RmllbGQ6IHNlYXJjaERpc3BsYXlOYW1lLFxuICAgICAgZGF0YUtleTogc2VhcmNoS2V5TmFtZSxcbiAgICAgIG11bHRpcGxlOiBtYXhTZWxlY3RlZEl0ZW1zID4gMSxcbiAgICAgIHNpemU6IHsgbGc6IDEyLCBtZDogMTIsIHhsOiAxMiB9LFxuICAgICAgZW1wdHlNZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LnNlYXJjaF9lbXB0eV9tZXNzYWdlYClcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2FmZVJlcGxhY2VDb21tYXMoaW5wdXQ6IHN0cmluZywgb3BlcmF0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGxldCBwYXJlbkNvdW50ID0gMDtcbiAgICBsZXQganVzdEFkZGVkT3BlcmF0b3IgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgY2hhciBvZiBpbnB1dCkge1xuICAgICAgbGV0IGNoYXJUb0FkZCA9IGNoYXI7XG5cbiAgICAgICh7IHBhcmVuQ291bnQsIGp1c3RBZGRlZE9wZXJhdG9yIH0gPSB0aGlzLnVwZGF0ZVBhcmVuQW5kT3BlcmF0b3JTdGF0ZShjaGFyLCBwYXJlbkNvdW50LCBqdXN0QWRkZWRPcGVyYXRvcikpO1xuICAgICAgKHsgY2hhclRvQWRkLCBqdXN0QWRkZWRPcGVyYXRvciB9ID0gdGhpcy5wcm9jZXNzQ29tbWFTdWJzdGl0dXRpb24oY2hhciwgcGFyZW5Db3VudCwganVzdEFkZGVkT3BlcmF0b3IsIG9wZXJhdG9yLCBjaGFyVG9BZGQpKTtcblxuICAgICAganVzdEFkZGVkT3BlcmF0b3IgPSB0aGlzLnVwZGF0ZU5vbkNvbW1hT3BlcmF0b3JTdGF0ZShjaGFyLCBjaGFyVG9BZGQsIGp1c3RBZGRlZE9wZXJhdG9yKTtcbiAgICAgIG91dHB1dCArPSBjaGFyVG9BZGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFyZW5BbmRPcGVyYXRvclN0YXRlKGNoYXI6IHN0cmluZywgcGFyZW5Db3VudDogbnVtYmVyLCBqdXN0QWRkZWRPcGVyYXRvcjogYm9vbGVhbik6IHsgcGFyZW5Db3VudDogbnVtYmVyLCBqdXN0QWRkZWRPcGVyYXRvcjogYm9vbGVhbiB9IHtcbiAgICBpZiAoY2hhciA9PT0gJygnKSB7XG4gICAgICBwYXJlbkNvdW50Kys7XG4gICAgICBqdXN0QWRkZWRPcGVyYXRvciA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJyknKSB7XG4gICAgICBwYXJlbkNvdW50LS07XG4gICAgICBqdXN0QWRkZWRPcGVyYXRvciA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZW5odW1hIGHDp8OjbyBuZWNlc3PDoXJpYSBwYXJhIG91dHJvcyBjYXJhY3RlcmVzXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGFyZW5Db3VudCwganVzdEFkZGVkT3BlcmF0b3IgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0NvbW1hU3Vic3RpdHV0aW9uKGNoYXI6IHN0cmluZywgcGFyZW5Db3VudDogbnVtYmVyLCBqdXN0QWRkZWRPcGVyYXRvcjogYm9vbGVhbiwgb3BlcmF0b3I6IHN0cmluZywgY2hhclRvQWRkOiBzdHJpbmcpOiB7IGNoYXJUb0FkZDogc3RyaW5nLCBqdXN0QWRkZWRPcGVyYXRvcjogYm9vbGVhbiB9IHtcbiAgICBpZiAoY2hhciA9PT0gJywnKSB7XG4gICAgICBpZiAocGFyZW5Db3VudCA9PT0gMCkge1xuICAgICAgICBpZiAoIWp1c3RBZGRlZE9wZXJhdG9yKSB7XG4gICAgICAgICAgY2hhclRvQWRkID0gYCAke29wZXJhdG9yfSBgO1xuICAgICAgICAgIGp1c3RBZGRlZE9wZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFyVG9BZGQgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganVzdEFkZGVkT3BlcmF0b3IgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY2hhclRvQWRkLCBqdXN0QWRkZWRPcGVyYXRvciB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb25Db21tYU9wZXJhdG9yU3RhdGUoY2hhcjogc3RyaW5nLCBjaGFyVG9BZGQ6IHN0cmluZywganVzdEFkZGVkT3BlcmF0b3I6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoY2hhciAhPT0gJywnKSB7XG4gICAgICBpZiAoY2hhclRvQWRkICE9PSBjaGFyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgIT09ICcoJyAmJiBjaGFyICE9PSAnKScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ganVzdEFkZGVkT3BlcmF0b3I7XG4gIH1cblxuICBwcml2YXRlIGdldEVudGl0eVNlYXJjaFVybChzZWFyY2g6IEVudGl0eVNlYXJjaElucHV0LCB2YWx1ZTogc3RyaW5nLCBkZXBlbmRzT246IERlcGVuZHNPbltdKSB7XG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBkb21haW5OYW1lLCBlbnRpdHlOYW1lLCBzZXJ2aWNlTmFtZSB9ID0gc2VhcmNoO1xuICAgIGNvbnN0IHVybCA9IGAke2RvbWFpbk5hbWV9LyR7c2VydmljZU5hbWV9L2VudGl0aWVzLyR7ZW50aXR5TmFtZX0vP2ZpbHRlcj1gO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IGF0dHJpYnV0ZXMubWFwKGF0dHIgPT5cbiAgICAgIGZpbHRlck9wZXJhdG9yc1thdHRyLmNvbXBhcmF0b3IgYXMga2V5b2YgdHlwZW9mIGZpbHRlck9wZXJhdG9yc10oYXR0ci5uYW1lLCB2YWx1ZSlcbiAgICApO1xuXG4gICAgZGVwZW5kc09uICYmXG4gICAgICBkZXBlbmRzT24uZm9yRWFjaChvYmogPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJJZCA9IGdldEZpbHRlcklkKGRvbWFpbk5hbWUsIG9iai5maWx0ZXJOYW1lKTtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWQgYXMgYW55XS52YWx1ZVtzZWFyY2hLZXlOYW1lXTtcbiAgICAgICAgZmlsdGVycy5wdXNoKGAke29iai5lbnRpdHlBdHRyaWJ1dGV9IGVxICcke2ZpZWxkVmFsdWV9J2ApO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBmaWx0ZXJzU3RyaW5nID0gZmlsdGVycy5qb2luKCcsJyk7XG4gICAgY29uc3QgZmluYWxGaWx0ZXIgPSB0aGlzLnNhZmVSZXBsYWNlQ29tbWFzKGZpbHRlcnNTdHJpbmcsIHNlYXJjaC5vcGVyYXRvcik7XG5cbiAgICByZXR1cm4gdXJsLmNvbmNhdChmaW5hbEZpbHRlcik7XG4gIH1cblxuICBwcml2YXRlIGFkZFN1Z2dlc3Rpb25GaWVsZHMoc3VnZ2VzdGlvbnM6IGFueVtdLCBkaXNwbGF5RmllbGRzOiBzdHJpbmdbXSwga2V5RmllbGRzOiBzdHJpbmdbXSwgc2VwYXJhdG9yOiBzdHJpbmcsIGZpbHRlcklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRWYWx1ZSA9IChhY2M6IHN0cmluZywgdmFsdWU6IGFueSwgdG9rZW46IHN0cmluZykgPT4gKGFjYyA/IGAke2FjY30ke3Rva2VufSR7dmFsdWV9YCA6IHZhbHVlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN1Z2dlc3Rpb25zLm1hcChzdWdnZXN0aW9uID0+ICh7XG4gICAgICAuLi5zdWdnZXN0aW9uLFxuICAgICAgW3NlYXJjaERpc3BsYXlOYW1lXTogZGlzcGxheUZpZWxkcy5yZWR1Y2UoKHZhbHVlLCBkaXNwbGF5KSA9PiB7XG4gICAgICAgIHJldHVybiBhZGRWYWx1ZSh2YWx1ZSwgdGhpcy50cmFuc2xhdGUuaW5zdGFudChzdWdnZXN0aW9uW2Rpc3BsYXldKSwgc2VwYXJhdG9yKTtcbiAgICAgIH0sICcnKSxcbiAgICAgIFtzZWFyY2hLZXlOYW1lXToga2V5RmllbGRzLnJlZHVjZSgodmFsdWUsIGtleSkgPT4gYWRkVmFsdWUodmFsdWUsIHN1Z2dlc3Rpb25ba2V5XSwgJywgJyksICcnKVxuICAgIH0pKTtcbiAgICAodGhpcy5mb3JtRmlsdGVycyBhcyBhbnkpW2ZpbHRlcklkXS5pbnZhbGlkVmFsdWUgPSByZXN1bHQubGVuZ3RoID09PSAwO1xuXG5cbiAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWQgYXMgYW55XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHZhbHVlLmZpbmRJbmRleCgoaTogYW55KSA9PiBpLiQkX19rZXlWYWx1ZV9fID09PSBpdGVtLiQkX19rZXlWYWx1ZV9fKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jaWVzVmFsdWVzKGRlcGVuZGVuY2llczogRGVwZW5kc09uW10sIGRvbWFpbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcy5yZWR1Y2UoKHBhcmFtcywgeyBmaWx0ZXJOYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWx0ZXJOYW1lKTtcbiAgICAgIGlmICgodGhpcy5mb3JtRmlsdGVycyBhcyBhbnkpW2ZpbHRlcklkXSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCB0eXBlIH0gPSAodGhpcy5mb3JtRmlsdGVycyBhcyBhbnkpW2ZpbHRlcklkXTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdFTlVNRVJBVElPTicpIHtcbiAgICAgICAgICBwYXJhbXNbZmlsdGVyTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhcmFtc1tmaWx0ZXJOYW1lXSA9IHZhbHVlLm1hcChhcnIgPT4gYXJyW3NlYXJjaEtleU5hbWVdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1zW2ZpbHRlck5hbWVdID0gdmFsdWUgPyB2YWx1ZVtzZWFyY2hLZXlOYW1lXSA6IFsnJ107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuSXNFbXB0eShwYXJhbXNbZmlsdGVyTmFtZV0pICYmIGRlbGV0ZSBwYXJhbXNbZmlsdGVyTmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICB9XG5cblxuICAvKlxuICAgKiBWZXJpZmljYSBzZSBvIHZhbG9yIGluZm9ybWFkbyDDqSBmYWxzbywgZW0gYXJyYXlzLCDDqSB2ZXJpZmljYWRvIGNhZGEgaXRlbVxuICAgKi9cbiAgcHJpdmF0ZSBJc0VtcHR5KHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5ldmVyeShkYXRhID0+ICFkYXRhKSA6ICF2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gZm9ybWF0IHRvIHNwZWNpZnkgZm9yIGludGVnZXIgdHlwZSBmaWVsZFxuICAgKi9cbiAgcHJpdmF0ZSBvcHRpb25zSW50ZWdlcigpIHtcbiAgICByZXR1cm4geyBjdXJyZW5jeVN5bWJvbDogJycsIGRlY2ltYWxTZXBhcmF0b3I6ICcnLCB0aG91c2FuZHNTZXBhcmF0b3I6ICcnIH07XG4gIH1cbn1cbiIsIjxzLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiZXJyb3JcIlxuICBpY29uQ2xhc3M9XCJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZVwiXG4gIHRpdGxlPVwie3sgZXJyb3JTdGF0ZT8uc3RhdHVzIH19IC0ge3sgZXJyb3JTdGF0ZT8uc3RhdHVzVGV4dCB9fVwiXG4gIChwcmltYXJ5QWN0aW9uKT1cImVycm9yU3RhdGVBY3Rpb24oKVwiXG4gIFtwcmltYXJ5QWN0aW9uTGFiZWxdPVwidHJhbnNsYXRlLmluc3RhbnQoJ3BsYXRmb3JtLmZpbHRlcl9zZXJ2aWNlLnRyeScpXCJcbiAgW2Rlc2NyaXB0aW9uXT1cInRyYW5zbGF0ZS5pbnN0YW50KCdwbGF0Zm9ybS5maWx0ZXJfc2VydmljZS5lcnJvcl9zdGF0ZScpXCJcbj48L3MtZW1wdHktc3RhdGU+XG5cbjxkaXYgKm5nSWY9XCIhZXJyb3JcIj5cbiAgPHAtdGFiVmlldyAqbmdJZj1cInRhYnMgJiYgdGFicy5zaXplID4gMVwiXG4gICAgWyhhY3RpdmVJbmRleCldPVwiYWN0aXZlSW5kZXhcIj5cblxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7IGdlbmVyYWwubmFtZSB9fVwiICpuZ0lmPVwiZ2VuZXJhbC5maWVsZHMubGVuZ3RoXCI+XG4gICAgICA8cy1keW5hbWljLWZvcm1cbiAgICAgICAgW2Vycm9yTWVzc2FnZXNdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgIFtmaWVsZHNdPVwiZ2VuZXJhbC5maWVsZHNcIlxuICAgICAgICBbZm9ybV09XCJnZW5lcmFsLmZvcm1cIj5cbiAgICAgIDwvcy1keW5hbWljLWZvcm0+XG4gICAgPC9wLXRhYlBhbmVsPlxuXG4gICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IHRhYiBvZiAodGFicyB8IG1hcFZhbHVlcylcIlxuICAgICAgaGVhZGVyPVwie3sgdGFiLmxhYmVsIH19XCI+XG4gICAgICA8cy1keW5hbWljLWZvcm1cbiAgICAgICAgW2Vycm9yTWVzc2FnZXNdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgIFtmaWVsZHNdPVwidGFiLmZpZWxkc1wiXG4gICAgICAgIFtmb3JtXT1cInRhYi5mb3JtXCI+XG4gICAgICA8L3MtZHluYW1pYy1mb3JtPlxuICAgIDwvcC10YWJQYW5lbD5cbiAgPC9wLXRhYlZpZXc+XG5cbiAgPGRpdiAqbmdJZj1cInRhYnMgJiYgdGFicy5zaXplID09PSAxXCI+XG4gICAgPHMtZHluYW1pYy1mb3JtXG4gICAgICAqbmdGb3I9XCJsZXQgdGFiIG9mICh0YWJzIHwgbWFwVmFsdWVzKVwiXG4gICAgICBbZXJyb3JNZXNzYWdlc109XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgIFtmaWVsZHNdPVwidGFiLmZpZWxkc1wiXG4gICAgICBbZm9ybV09XCJ0YWIuZm9ybVwiPlxuICAgIDwvcy1keW5hbWljLWZvcm0+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=