@firestitch/list 9.9.9 → 9.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 (193) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +65 -65
  3. package/app/classes/data-controller.d.ts +89 -89
  4. package/app/classes/external-params-controller.d.ts +31 -31
  5. package/app/classes/index.d.ts +2 -2
  6. package/app/classes/list-controller.d.ts +166 -166
  7. package/app/classes/pagination-controller.d.ts +185 -185
  8. package/app/classes/persistance-controller.d.ts +7 -7
  9. package/app/classes/reorder-controller.d.ts +56 -56
  10. package/app/classes/selection-controller.d.ts +141 -141
  11. package/app/classes/sorting-controller.d.ts +64 -63
  12. package/app/components/body/body.component.d.ts +29 -29
  13. package/app/components/body/row/actions/actions.component.d.ts +32 -32
  14. package/app/components/body/row/cell/cell.component.d.ts +20 -20
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +10 -10
  16. package/app/components/body/row/row.component.d.ts +66 -66
  17. package/app/components/customize-cols/customize-cols.component.d.ts +14 -14
  18. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -4
  19. package/app/components/footer/footer-row/footer-row.component.d.ts +10 -8
  20. package/app/components/footer/footer.component.d.ts +10 -8
  21. package/app/components/head/head-cell/head-cell.component.d.ts +11 -11
  22. package/app/components/head/head.component.d.ts +40 -40
  23. package/app/components/list/list.component.d.ts +108 -108
  24. package/app/components/loader/loader.component.d.ts +11 -11
  25. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +10 -10
  26. package/app/components/pagination/pagination.component.d.ts +11 -11
  27. package/app/components/saved-filters/saved-filters.component.d.ts +12 -12
  28. package/app/components/status/status.component.d.ts +18 -18
  29. package/app/directives/cell/cell.directive.d.ts +5 -5
  30. package/app/directives/column/column.directive.d.ts +24 -23
  31. package/app/directives/draggable-list/draggable-list.directive.d.ts +77 -77
  32. package/app/directives/draggable-row/draggable-row.directive.d.ts +18 -18
  33. package/app/directives/empty-state/empty-state.directive.d.ts +2 -2
  34. package/app/directives/footer/footer.directive.d.ts +5 -5
  35. package/app/directives/group-cell/group-cell.directive.d.ts +3 -3
  36. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +7 -7
  37. package/app/directives/header/header.directive.d.ts +5 -5
  38. package/app/enums/button-type.enum.d.ts +7 -7
  39. package/app/enums/page-change-type.enum.d.ts +4 -4
  40. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  41. package/app/enums/row-type.enum.d.ts +5 -5
  42. package/app/enums/state.enum.d.ts +9 -9
  43. package/app/fs-list.module.d.ts +6 -6
  44. package/app/fs-list.providers.d.ts +3 -3
  45. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  46. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  47. package/app/interfaces/external-params.interface.d.ts +13 -13
  48. package/app/interfaces/index.d.ts +3 -3
  49. package/app/interfaces/listconfig.interface.d.ts +220 -220
  50. package/app/interfaces/pagination.interface.d.ts +13 -13
  51. package/app/models/column.model.d.ts +48 -46
  52. package/app/models/row/base-row.d.ts +13 -13
  53. package/app/models/row/child-row.d.ts +12 -12
  54. package/app/models/row/group-row.d.ts +14 -14
  55. package/app/models/row/simple-row.d.ts +5 -5
  56. package/app/models/row-action.model.d.ts +29 -29
  57. package/app/models/row.d.ts +28 -28
  58. package/app/models/styleConfig.model.d.ts +31 -31
  59. package/app/services/group-expand-notifier.service.d.ts +8 -8
  60. package/bundles/firestitch-list.umd.js +5832 -5783
  61. package/bundles/firestitch-list.umd.js.map +1 -1
  62. package/bundles/firestitch-list.umd.min.js +1 -1
  63. package/bundles/firestitch-list.umd.min.js.map +1 -1
  64. package/esm2015/app/classes/actions-controller.js +55 -55
  65. package/esm2015/app/classes/columns-controller.js +185 -185
  66. package/esm2015/app/classes/data-controller.js +318 -311
  67. package/esm2015/app/classes/external-params-controller.js +155 -155
  68. package/esm2015/app/classes/index.js +3 -3
  69. package/esm2015/app/classes/list-controller.js +730 -730
  70. package/esm2015/app/classes/pagination-controller.js +461 -461
  71. package/esm2015/app/classes/persistance-controller.js +22 -22
  72. package/esm2015/app/classes/reorder-controller.js +161 -161
  73. package/esm2015/app/classes/selection-controller.js +444 -444
  74. package/esm2015/app/classes/sorting-controller.js +177 -167
  75. package/esm2015/app/components/body/body.component.js +103 -103
  76. package/esm2015/app/components/body/row/actions/actions.component.js +110 -110
  77. package/esm2015/app/components/body/row/cell/cell.component.js +93 -93
  78. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +34 -34
  79. package/esm2015/app/components/body/row/row.component.js +267 -267
  80. package/esm2015/app/components/customize-cols/customize-cols.component.js +67 -67
  81. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +27 -18
  82. package/esm2015/app/components/footer/footer-row/footer-row.component.js +39 -35
  83. package/esm2015/app/components/footer/footer.component.js +34 -30
  84. package/esm2015/app/components/head/head-cell/head-cell.component.js +35 -35
  85. package/esm2015/app/components/head/head.component.js +99 -99
  86. package/esm2015/app/components/list/list.component.js +357 -357
  87. package/esm2015/app/components/loader/loader.component.js +46 -46
  88. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +75 -75
  89. package/esm2015/app/components/pagination/pagination.component.js +44 -44
  90. package/esm2015/app/components/saved-filters/saved-filters.component.js +36 -36
  91. package/esm2015/app/components/status/status.component.js +77 -77
  92. package/esm2015/app/directives/cell/cell.directive.js +21 -21
  93. package/esm2015/app/directives/column/column.directive.js +97 -93
  94. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +264 -264
  95. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +81 -81
  96. package/esm2015/app/directives/empty-state/empty-state.directive.js +11 -11
  97. package/esm2015/app/directives/footer/footer.directive.js +21 -21
  98. package/esm2015/app/directives/group-cell/group-cell.directive.js +12 -12
  99. package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +32 -32
  100. package/esm2015/app/directives/header/header.directive.js +21 -21
  101. package/esm2015/app/enums/button-type.enum.js +9 -9
  102. package/esm2015/app/enums/page-change-type.enum.js +6 -6
  103. package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
  104. package/esm2015/app/enums/row-type.enum.js +7 -7
  105. package/esm2015/app/enums/state.enum.js +11 -11
  106. package/esm2015/app/fs-list.module.js +140 -140
  107. package/esm2015/app/fs-list.providers.js +4 -4
  108. package/esm2015/app/interfaces/cellconfig.interface.js +1 -1
  109. package/esm2015/app/interfaces/draggable-list.interface.js +1 -1
  110. package/esm2015/app/interfaces/external-params.interface.js +1 -1
  111. package/esm2015/app/interfaces/index.js +1 -1
  112. package/esm2015/app/interfaces/listconfig.interface.js +1 -1
  113. package/esm2015/app/interfaces/pagination.interface.js +1 -1
  114. package/esm2015/app/models/column.model.js +185 -175
  115. package/esm2015/app/models/row/base-row.js +23 -23
  116. package/esm2015/app/models/row/child-row.js +28 -28
  117. package/esm2015/app/models/row/group-row.js +41 -41
  118. package/esm2015/app/models/row/simple-row.js +10 -10
  119. package/esm2015/app/models/row-action.model.js +115 -115
  120. package/esm2015/app/models/row.js +77 -77
  121. package/esm2015/app/models/styleConfig.model.js +86 -86
  122. package/esm2015/app/services/group-expand-notifier.service.js +25 -25
  123. package/esm2015/firestitch-list.js +17 -17
  124. package/esm2015/public_api.js +40 -40
  125. package/esm5/app/classes/actions-controller.js +71 -71
  126. package/esm5/app/classes/columns-controller.js +236 -236
  127. package/esm5/app/classes/data-controller.js +374 -365
  128. package/esm5/app/classes/external-params-controller.js +185 -185
  129. package/esm5/app/classes/index.js +3 -3
  130. package/esm5/app/classes/list-controller.js +749 -749
  131. package/esm5/app/classes/pagination-controller.js +568 -568
  132. package/esm5/app/classes/persistance-controller.js +25 -25
  133. package/esm5/app/classes/reorder-controller.js +195 -195
  134. package/esm5/app/classes/selection-controller.js +465 -465
  135. package/esm5/app/classes/sorting-controller.js +204 -194
  136. package/esm5/app/components/body/body.component.js +104 -104
  137. package/esm5/app/components/body/row/actions/actions.component.js +113 -113
  138. package/esm5/app/components/body/row/cell/cell.component.js +95 -95
  139. package/esm5/app/components/body/row/inline-action/inline-action.component.js +35 -35
  140. package/esm5/app/components/body/row/row.component.js +295 -295
  141. package/esm5/app/components/customize-cols/customize-cols.component.js +69 -69
  142. package/esm5/app/components/footer/footer-row/footer-cell/footer-cell.component.js +29 -20
  143. package/esm5/app/components/footer/footer-row/footer-row.component.js +42 -38
  144. package/esm5/app/components/footer/footer.component.js +35 -31
  145. package/esm5/app/components/head/head-cell/head-cell.component.js +38 -38
  146. package/esm5/app/components/head/head.component.js +106 -106
  147. package/esm5/app/components/list/list.component.js +391 -391
  148. package/esm5/app/components/loader/loader.component.js +47 -47
  149. package/esm5/app/components/manage-saved-filters/manage-saved-filters.component.js +81 -81
  150. package/esm5/app/components/pagination/pagination.component.js +46 -46
  151. package/esm5/app/components/saved-filters/saved-filters.component.js +41 -41
  152. package/esm5/app/components/status/status.component.js +79 -79
  153. package/esm5/app/directives/cell/cell.directive.js +24 -24
  154. package/esm5/app/directives/column/column.directive.js +98 -94
  155. package/esm5/app/directives/draggable-list/draggable-list.directive.js +281 -281
  156. package/esm5/app/directives/draggable-row/draggable-row.directive.js +83 -83
  157. package/esm5/app/directives/empty-state/empty-state.directive.js +14 -14
  158. package/esm5/app/directives/footer/footer.directive.js +24 -24
  159. package/esm5/app/directives/group-cell/group-cell.directive.js +17 -17
  160. package/esm5/app/directives/group-expand-trigger/group-expand-trigger.directive.js +33 -33
  161. package/esm5/app/directives/header/header.directive.js +24 -24
  162. package/esm5/app/enums/button-type.enum.js +9 -9
  163. package/esm5/app/enums/page-change-type.enum.js +6 -6
  164. package/esm5/app/enums/pagination-strategy.enum.js +7 -7
  165. package/esm5/app/enums/row-type.enum.js +7 -7
  166. package/esm5/app/enums/state.enum.js +11 -11
  167. package/esm5/app/fs-list.module.js +145 -145
  168. package/esm5/app/fs-list.providers.js +4 -4
  169. package/esm5/app/interfaces/cellconfig.interface.js +1 -1
  170. package/esm5/app/interfaces/draggable-list.interface.js +1 -1
  171. package/esm5/app/interfaces/external-params.interface.js +1 -1
  172. package/esm5/app/interfaces/index.js +1 -1
  173. package/esm5/app/interfaces/listconfig.interface.js +1 -1
  174. package/esm5/app/interfaces/pagination.interface.js +1 -1
  175. package/esm5/app/models/column.model.js +204 -194
  176. package/esm5/app/models/row/base-row.js +35 -35
  177. package/esm5/app/models/row/child-row.js +43 -43
  178. package/esm5/app/models/row/group-row.js +61 -61
  179. package/esm5/app/models/row/simple-row.js +15 -15
  180. package/esm5/app/models/row-action.model.js +126 -126
  181. package/esm5/app/models/row.js +126 -126
  182. package/esm5/app/models/styleConfig.model.js +91 -91
  183. package/esm5/app/services/group-expand-notifier.service.js +30 -30
  184. package/esm5/firestitch-list.js +17 -17
  185. package/esm5/public_api.js +40 -40
  186. package/fesm2015/firestitch-list.js +5188 -5141
  187. package/fesm2015/firestitch-list.js.map +1 -1
  188. package/fesm5/firestitch-list.js +5817 -5768
  189. package/fesm5/firestitch-list.js.map +1 -1
  190. package/firestitch-list.d.ts +18 -18
  191. package/firestitch-list.metadata.json +1 -1
  192. package/package.json +1 -1
  193. package/public_api.d.ts +33 -33
@@ -1,264 +1,264 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { ChangeDetectorRef, Directive, ElementRef, Input, NgZone } from '@angular/core';
3
- import { Observable, Subject } from 'rxjs';
4
- import { takeUntil } from 'rxjs/operators';
5
- import { ReorderController, ReorderStrategy } from '../../classes/reorder-controller';
6
- let FsListDraggableListDirective = class FsListDraggableListDirective {
7
- constructor(_cdRef, _zone, _containerElement, _reorderController) {
8
- this._cdRef = _cdRef;
9
- this._zone = _zone;
10
- this._containerElement = _containerElement;
11
- this._reorderController = _reorderController;
12
- // Handlers
13
- this._dragToHandler = this.dragTo.bind(this);
14
- this._dragEndHandler = this.dragEnd.bind(this);
15
- this._windowTouchMoveHandler = () => { };
16
- this._dragInProgress = false;
17
- this._dragStart$ = new Subject();
18
- this._dragEnd$ = new Subject();
19
- this._destroy$ = new Subject();
20
- }
21
- get dragStart$() {
22
- return this._dragStart$.pipe(takeUntil(this._destroy$));
23
- }
24
- get dragEnd$() {
25
- return this._dragEnd$.pipe(takeUntil(this._destroy$));
26
- }
27
- get draggableItem() {
28
- return this._rows[this._draggableElementIndex];
29
- }
30
- /**
31
- * Prepare draggable elements and add events
32
- * @param draggableElement
33
- */
34
- dragStart(draggableElement) {
35
- if (this._dragInProgress) {
36
- return;
37
- }
38
- if (this._reorderController.startCallback
39
- && this._reorderController.strategy === ReorderStrategy.Always) {
40
- this._reorderController.startCallback();
41
- }
42
- this._dragInProgress = true;
43
- window.document.body.classList.add('reorder-in-progress');
44
- this._draggableElement = draggableElement;
45
- this.prepareElements();
46
- this.initDraggableElement();
47
- this._draggableElement.classList.add('draggable-elem');
48
- this._zone.runOutsideAngular(() => {
49
- window.addEventListener('touchmove', this._windowTouchMoveHandler, { passive: true });
50
- window.document.addEventListener('mousemove', this._dragToHandler, { passive: true });
51
- window.document.addEventListener('touchmove', this._dragToHandler, { passive: false });
52
- window.document.addEventListener('mouseup', this._dragEndHandler);
53
- window.document.addEventListener('touchend', this._dragEndHandler);
54
- window.document.addEventListener('touchcancel', this._dragEndHandler);
55
- });
56
- this._dragStart$.next();
57
- }
58
- /**
59
- * Move draggable elements and swap items
60
- * @param event
61
- */
62
- dragTo(event) {
63
- this.touchFix(event);
64
- const elemIndex = this.lookupElementUnder(event);
65
- const targetRow = this._rows[elemIndex];
66
- // Can not drag before first group and after last group
67
- const swapWithBoundaryGroupElement = (elemIndex === 0 || elemIndex === this._rows.length - 1)
68
- && targetRow.isGroup
69
- && this.draggableItem.isChild;
70
- if (!swapWithBoundaryGroupElement) {
71
- if (elemIndex !== null) {
72
- if (targetRow.readyToSwap) {
73
- this.swapWithIndex(elemIndex);
74
- this._draggableElementPreview.classList.remove('fs-list-no-drop');
75
- }
76
- else {
77
- this._draggableElementPreview.classList.add('fs-list-no-drop');
78
- }
79
- }
80
- }
81
- const topOffset = (event.y || event.clientY) - (this._draggableElementHeight / 2);
82
- this._draggableElementPreview.style.top = topOffset + 'px';
83
- }
84
- /**
85
- * Remove events and classes after drag finish
86
- */
87
- dragEnd() {
88
- this._dragInProgress = false;
89
- ///
90
- if (this._reorderController.movedCallback) {
91
- this._reorderController.movedCallback(this._reorderController.dataController.reorderData);
92
- }
93
- if (this._reorderController.strategy === ReorderStrategy.Always) {
94
- this._zone.run(() => {
95
- if (this._reorderController.doneCallback) {
96
- const result = this._reorderController.doneCallback(this._reorderController.dataController.reorderData);
97
- this._waitUntilIsNotDone(result);
98
- }
99
- });
100
- }
101
- // this._reorderController.dataController.updateOrderByRows(this._rows);
102
- ///
103
- this._draggableElement.classList.remove('draggable-elem');
104
- window.document.body.classList.remove('reorder-in-progress');
105
- this._draggableElementPreview.remove();
106
- this._draggableElement = null;
107
- this._draggableElementPreview = null;
108
- this._draggableElementHeight = null;
109
- this._draggableElementIndex = null;
110
- window.removeEventListener('touchmove', this._windowTouchMoveHandler);
111
- window.document.removeEventListener('mousemove', this._dragToHandler);
112
- window.document.removeEventListener('touchmove', this._dragToHandler);
113
- window.document.removeEventListener('mouseup', this._dragEndHandler);
114
- window.document.removeEventListener('touchend', this._dragEndHandler);
115
- window.document.removeEventListener('touchcancel', this._dragEndHandler);
116
- this._dragEnd$.next();
117
- }
118
- /**
119
- * looking row elements and save their dims
120
- */
121
- prepareElements() {
122
- this.lookupChildElements();
123
- this.calcElementsDimensions();
124
- }
125
- /**
126
- * Store child rows
127
- */
128
- lookupChildElements() {
129
- this._childRowElements = Array.from(this._containerElement.nativeElement.querySelectorAll('tr'))
130
- .reduce((acc, rowElement, index) => {
131
- const element = { target: rowElement };
132
- if (rowElement === this._draggableElement) {
133
- this._draggableElementIndex = index;
134
- element.active = true;
135
- }
136
- acc.push(element);
137
- return acc;
138
- }, []);
139
- }
140
- /**
141
- * Calc child rows sizes/offsets
142
- */
143
- calcElementsDimensions() {
144
- this._childRowElements.forEach((el, index) => {
145
- const dims = el.target.getBoundingClientRect();
146
- el.top = dims.top;
147
- el.height = dims.height;
148
- el.center = dims.top + (dims.height / 2);
149
- el.index = index;
150
- });
151
- }
152
- /**
153
- * Init draggable element
154
- */
155
- initDraggableElement() {
156
- const el = this._draggableElement.cloneNode(true);
157
- const data = this._draggableElement.getBoundingClientRect();
158
- el.style.width = data.width + 'px';
159
- el.style.left = data.left + 'px';
160
- el.style.top = data.top + 'px';
161
- el.classList.add('draggable');
162
- this._containerElement.nativeElement.insertAdjacentElement('afterbegin', el);
163
- this._draggableElementPreview = el;
164
- this._draggableElementHeight = data.height;
165
- this.updateDraggableDims();
166
- }
167
- /**
168
- * Looking by stored row elemens for overlapped row
169
- * @param event
170
- */
171
- lookupElementUnder(event) {
172
- const top = event.y || event.clientY;
173
- const bottom = event.y || event.clientY;
174
- let elemIndex = null;
175
- for (let i = 0; i < this._childRowElements.length; i++) {
176
- const el = this._childRowElements[i];
177
- if (!el.active) {
178
- if (top < el.center + (el.height / 2) && el.index < this._draggableElementIndex
179
- || bottom > el.center - (el.height / 2) && el.index > this._draggableElementIndex) {
180
- elemIndex = i;
181
- }
182
- }
183
- }
184
- return elemIndex;
185
- }
186
- /**
187
- * Swap rows
188
- * @param index
189
- */
190
- swapWithIndex(index) {
191
- const activeIndex = this._draggableElementIndex;
192
- // Swap rows in global rows stack
193
- this._reorderController
194
- .dataController
195
- .swapRows(this._rows[activeIndex], this._rows[index]);
196
- // Swap visible rows
197
- const activeRow = this._rows[activeIndex];
198
- this._rows[activeIndex] = this._rows[index];
199
- this._rows[index] = activeRow;
200
- const activeElement = this._childRowElements[activeIndex].target;
201
- this._childRowElements[activeIndex].active = false;
202
- this._childRowElements[activeIndex].target = this._childRowElements[index].target;
203
- this._childRowElements[index].target = activeElement;
204
- this._childRowElements[index].active = true;
205
- this._draggableElementIndex = index;
206
- this._cdRef.detectChanges();
207
- }
208
- /**
209
- * Update cell width for draggable elem
210
- */
211
- updateDraggableDims() {
212
- const draggableCells = Array.from(this._draggableElementPreview.querySelectorAll('td'));
213
- Array.from(this._draggableElementPreview.querySelectorAll('td')).forEach((elem, index) => {
214
- const dims = elem.getBoundingClientRect();
215
- draggableCells[index].style.width = dims.width + 'px';
216
- });
217
- }
218
- _waitUntilIsNotDone(doneResult) {
219
- if (doneResult instanceof Observable) {
220
- this._reorderController.disableReorderAction();
221
- doneResult
222
- .pipe(takeUntil(this._destroy$))
223
- .subscribe(() => {
224
- console.log('enable');
225
- this._reorderController.enableReorderAction();
226
- });
227
- }
228
- }
229
- /**
230
- * Fix background when mobile
231
- * @param e
232
- */
233
- touchFix(e) {
234
- if (!('clientX' in e) && !('clientY' in e)) {
235
- const touches = e.touches || e.originalEvent.touches;
236
- if (touches && touches.length) {
237
- e.clientX = touches[0].clientX;
238
- e.clientY = touches[0].clientY;
239
- }
240
- e.preventDefault();
241
- }
242
- }
243
- };
244
- FsListDraggableListDirective.ctorParameters = () => [
245
- { type: ChangeDetectorRef },
246
- { type: NgZone },
247
- { type: ElementRef },
248
- { type: ReorderController }
249
- ];
250
- __decorate([
251
- Input('rows'),
252
- __metadata("design:type", Array)
253
- ], FsListDraggableListDirective.prototype, "_rows", void 0);
254
- FsListDraggableListDirective = __decorate([
255
- Directive({
256
- selector: '[fsListDraggableList]',
257
- }),
258
- __metadata("design:paramtypes", [ChangeDetectorRef,
259
- NgZone,
260
- ElementRef,
261
- ReorderController])
262
- ], FsListDraggableListDirective);
263
- export { FsListDraggableListDirective };
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9kaXJlY3RpdmVzL2RyYWdnYWJsZS1saXN0L2RyYWdnYWJsZS1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBUXRGLElBQWEsNEJBQTRCLEdBQXpDLE1BQWEsNEJBQTRCO0lBd0J2QyxZQUNVLE1BQXlCLEVBQ3pCLEtBQWEsRUFDYixpQkFBNkIsRUFDN0Isa0JBQXFDO1FBSHJDLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQXBCL0MsV0FBVztRQUNILG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FB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QVU7UUFDVCxpQkFBaUI7R0E1QnBDLDRCQUE0QixDQTRUeEM7U0E1VFksNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBSZW9yZGVyQ29udHJvbGxlciwgUmVvcmRlclN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9yZW9yZGVyLWNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi8uLi9tb2RlbHMvcm93JztcclxuaW1wb3J0IHsgRnNMaXN0RHJhZ0NoaWxkUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZHJhZ2dhYmxlLWxpc3QuaW50ZXJmYWNlJztcclxuXHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tmc0xpc3REcmFnZ2FibGVMaXN0XScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGc0xpc3REcmFnZ2FibGVMaXN0RGlyZWN0aXZlIHtcclxuXHJcbiAgLy8gRHJhZ2dhYmxlIEVsZW1lbnRcclxuICBwcml2YXRlIF9kcmFnZ2FibGVFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9kcmFnZ2FibGVFbGVtZW50UHJldmlldzogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudEhlaWdodDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRJbmRleDogbnVtYmVyO1xyXG5cclxuICAvLyBIYW5kbGVyc1xyXG4gIHByaXZhdGUgX2RyYWdUb0hhbmRsZXIgPSB0aGlzLmRyYWdUby5iaW5kKHRoaXMpO1xyXG4gIHByaXZhdGUgX2RyYWdFbmRIYW5kbGVyID0gdGhpcy5kcmFnRW5kLmJpbmQodGhpcyk7XHJcbiAgcHJpdmF0ZSBfd2luZG93VG91Y2hNb3ZlSGFuZGxlciA9ICgpID0+IHt9O1xyXG5cclxuICBwcml2YXRlIF9kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9jaGlsZFJvd0VsZW1lbnRzOiBGc0xpc3REcmFnQ2hpbGRSb3dFbGVtZW50W107XHJcbiAgcHJpdmF0ZSBfZHJhZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBfZHJhZ0VuZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBASW5wdXQoJ3Jvd3MnKVxyXG4gIHByaXZhdGUgX3Jvd3M6IFJvd1tdO1xyXG5cclxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyRWxlbWVudDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgX3Jlb3JkZXJDb250cm9sbGVyOiBSZW9yZGVyQ29udHJvbGxlcixcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBnZXQgZHJhZ1N0YXJ0JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9kcmFnU3RhcnQkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRyYWdFbmQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RyYWdFbmQkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRyYWdnYWJsZUl0ZW0oKTogUm93IHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzW3RoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleF07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcmVwYXJlIGRyYWdnYWJsZSBlbGVtZW50cyBhbmQgYWRkIGV2ZW50c1xyXG4gICAqIEBwYXJhbSBkcmFnZ2FibGVFbGVtZW50XHJcbiAgICovXHJcbiAgcHVibGljIGRyYWdTdGFydChkcmFnZ2FibGVFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgaWYgKHRoaXMuX2RyYWdJblByb2dyZXNzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0YXJ0Q2FsbGJhY2tcclxuICAgICAgJiYgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuc3RyYXRlZ3kgPT09IFJlb3JkZXJTdHJhdGVneS5BbHdheXNcclxuICAgICkge1xyXG4gICAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdGFydENhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Jlb3JkZXItaW4tcHJvZ3Jlc3MnKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50ID0gZHJhZ2dhYmxlRWxlbWVudDtcclxuXHJcbiAgICB0aGlzLnByZXBhcmVFbGVtZW50cygpO1xyXG5cclxuICAgIHRoaXMuaW5pdERyYWdnYWJsZUVsZW1lbnQoKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWdnYWJsZS1lbGVtJyk7XHJcblxyXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndG91Y2htb3ZlJywgdGhpcy5fd2luZG93VG91Y2hNb3ZlSGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlciwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcclxuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XHJcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcclxuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fZHJhZ1N0YXJ0JC5uZXh0KCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgZHJhZ2dhYmxlIGVsZW1lbnRzIGFuZCBzd2FwIGl0ZW1zXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGRyYWdUbyhldmVudCkge1xyXG4gICAgdGhpcy50b3VjaEZpeChldmVudCk7XHJcbiAgICBjb25zdCBlbGVtSW5kZXggPSB0aGlzLmxvb2t1cEVsZW1lbnRVbmRlcihldmVudCk7XHJcbiAgICBjb25zdCB0YXJnZXRSb3cgPSB0aGlzLl9yb3dzW2VsZW1JbmRleF07XHJcblxyXG4gICAgLy8gQ2FuIG5vdCBkcmFnIGJlZm9yZSBmaXJzdCBncm91cCBhbmQgYWZ0ZXIgbGFzdCBncm91cFxyXG4gICAgY29uc3Qgc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCA9XHJcbiAgICAgIChlbGVtSW5kZXggPT09IDAgfHwgZWxlbUluZGV4ID09PSB0aGlzLl9yb3dzLmxlbmd0aCAtIDEpXHJcbiAgICAgICYmIHRhcmdldFJvdy5pc0dyb3VwXHJcbiAgICAgICYmIHRoaXMuZHJhZ2dhYmxlSXRlbS5pc0NoaWxkO1xyXG5cclxuICAgIGlmICghc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCkge1xyXG4gICAgICBpZiAoZWxlbUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldFJvdy5yZWFkeVRvU3dhcCkge1xyXG4gICAgICAgICAgdGhpcy5zd2FwV2l0aEluZGV4KGVsZW1JbmRleClcclxuICAgICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LmNsYXNzTGlzdC5yZW1vdmUoJ2ZzLWxpc3Qtbm8tZHJvcCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5jbGFzc0xpc3QuYWRkKCdmcy1saXN0LW5vLWRyb3AnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b3BPZmZzZXQgPSAoZXZlbnQueSB8fCBldmVudC5jbGllbnRZKSAtICh0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0IC8gMik7XHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5zdHlsZS50b3AgPSAgdG9wT2Zmc2V0ICsgJ3B4JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBldmVudHMgYW5kIGNsYXNzZXMgYWZ0ZXIgZHJhZyBmaW5pc2hcclxuICAgKi9cclxuICBwdWJsaWMgZHJhZ0VuZCgpIHtcclxuICAgIHRoaXMuX2RyYWdJblByb2dyZXNzID0gZmFsc2U7XHJcblxyXG4gICAgLy8vXHJcbiAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIubW92ZWRDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5tb3ZlZENhbGxiYWNrKFxyXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnJlb3JkZXJEYXRhXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0cmF0ZWd5ID09PSBSZW9yZGVyU3RyYXRlZ3kuQWx3YXlzKSB7XHJcbiAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZG9uZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5kb25lQ2FsbGJhY2soXHJcbiAgICAgICAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLmRhdGFDb250cm9sbGVyLnJlb3JkZXJEYXRhXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIHRoaXMuX3dhaXRVbnRpbElzTm90RG9uZShyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIudXBkYXRlT3JkZXJCeVJvd3ModGhpcy5fcm93cyk7XHJcbiAgICAvLy9cclxuXHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnYWJsZS1lbGVtJyk7XHJcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZW9yZGVyLWluLXByb2dyZXNzJyk7XHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50UHJldmlldy5yZW1vdmUoKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50ID0gbnVsbDtcclxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gbnVsbDtcclxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gbnVsbDtcclxuXHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIHRoaXMuX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIpO1xyXG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIpO1xyXG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2RyYWdUb0hhbmRsZXIpO1xyXG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XHJcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XHJcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XHJcblxyXG4gICAgdGhpcy5fZHJhZ0VuZCQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogbG9va2luZyByb3cgZWxlbWVudHMgYW5kIHNhdmUgdGhlaXIgZGltc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJlcGFyZUVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5sb29rdXBDaGlsZEVsZW1lbnRzKCk7XHJcbiAgICB0aGlzLmNhbGNFbGVtZW50c0RpbWVuc2lvbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGNoaWxkIHJvd3NcclxuICAgKi9cclxuICBwcml2YXRlIGxvb2t1cENoaWxkRWxlbWVudHMoKSB7XHJcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLl9jb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgndHInKSlcclxuICAgICAgLnJlZHVjZSgoYWNjOiBhbnlbXSwgcm93RWxlbWVudCwgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSB7IHRhcmdldDogcm93RWxlbWVudCB9O1xyXG5cclxuICAgICAgICBpZiAocm93RWxlbWVudCA9PT0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICBlbGVtZW50LmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhY2MucHVzaChlbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgfSwgW10pIGFzIEZzTGlzdERyYWdDaGlsZFJvd0VsZW1lbnRbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGMgY2hpbGQgcm93cyBzaXplcy9vZmZzZXRzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWxjRWxlbWVudHNEaW1lbnNpb25zKCkge1xyXG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50cy5mb3JFYWNoKChlbDogYW55LCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBkaW1zID0gZWwudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBlbC50b3AgPSBkaW1zLnRvcDtcclxuICAgICAgZWwuaGVpZ2h0ID0gZGltcy5oZWlnaHQ7XHJcbiAgICAgIGVsLmNlbnRlciA9IGRpbXMudG9wICsgKGRpbXMuaGVpZ2h0IC8gMik7XHJcbiAgICAgIGVsLmluZGV4ID0gaW5kZXg7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXQgZHJhZ2dhYmxlIGVsZW1lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGluaXREcmFnZ2FibGVFbGVtZW50KCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIGVsLnN0eWxlLndpZHRoID0gZGF0YS53aWR0aCArICdweCc7XHJcbiAgICBlbC5zdHlsZS5sZWZ0ID0gZGF0YS5sZWZ0ICsgJ3B4JztcclxuICAgIGVsLnN0eWxlLnRvcCA9IGRhdGEudG9wICsgJ3B4JztcclxuXHJcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2FibGUnKTtcclxuXHJcbiAgICB0aGlzLl9jb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgZWwpO1xyXG5cclxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3ID0gZWw7XHJcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0ID0gZGF0YS5oZWlnaHQ7XHJcblxyXG4gICAgdGhpcy51cGRhdGVEcmFnZ2FibGVEaW1zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb29raW5nIGJ5IHN0b3JlZCByb3cgZWxlbWVucyBmb3Igb3ZlcmxhcHBlZCByb3dcclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGxvb2t1cEVsZW1lbnRVbmRlcihldmVudCkge1xyXG4gICAgY29uc3QgdG9wID0gZXZlbnQueSB8fCBldmVudC5jbGllbnRZO1xyXG4gICAgY29uc3QgYm90dG9tID0gZXZlbnQueSB8fCBldmVudC5jbGllbnRZO1xyXG4gICAgbGV0IGVsZW1JbmRleCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpXTtcclxuXHJcbiAgICAgIGlmICghZWwuYWN0aXZlKSB7XHJcbiAgICAgICAgaWYgKHRvcCA8IGVsLmNlbnRlciArIChlbC5oZWlnaHQgLyAyKSAmJiBlbC5pbmRleCA8IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleFxyXG4gICAgICAgICAgfHwgYm90dG9tID4gZWwuY2VudGVyIC0gKGVsLmhlaWdodCAvIDIpICAmJiBlbC5pbmRleCA+IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCkge1xyXG4gICAgICAgICAgZWxlbUluZGV4ID0gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWxlbUluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3dhcCByb3dzXHJcbiAgICogQHBhcmFtIGluZGV4XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzd2FwV2l0aEluZGV4KGluZGV4KSB7XHJcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleDtcclxuXHJcbiAgICAvLyBTd2FwIHJvd3MgaW4gZ2xvYmFsIHJvd3Mgc3RhY2tcclxuICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyXHJcbiAgICAgIC5kYXRhQ29udHJvbGxlclxyXG4gICAgICAuc3dhcFJvd3ModGhpcy5fcm93c1thY3RpdmVJbmRleF0gLCB0aGlzLl9yb3dzW2luZGV4XSk7XHJcblxyXG4gICAgLy8gU3dhcCB2aXNpYmxlIHJvd3NcclxuICAgIGNvbnN0IGFjdGl2ZVJvdyA9IHRoaXMuX3Jvd3NbYWN0aXZlSW5kZXhdO1xyXG4gICAgdGhpcy5fcm93c1thY3RpdmVJbmRleF0gPSB0aGlzLl9yb3dzW2luZGV4XTtcclxuICAgIHRoaXMuX3Jvd3NbaW5kZXhdID0gYWN0aXZlUm93O1xyXG5cclxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2FjdGl2ZUluZGV4XS50YXJnZXQ7XHJcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2FjdGl2ZUluZGV4XS5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2FjdGl2ZUluZGV4XS50YXJnZXQgPSB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2luZGV4XS50YXJnZXQ7XHJcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2luZGV4XS50YXJnZXQgPSBhY3RpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpbmRleF0uYWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IGluZGV4O1xyXG5cclxuICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBjZWxsIHdpZHRoIGZvciBkcmFnZ2FibGUgZWxlbVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dhYmxlRGltcygpIHtcclxuICAgIGNvbnN0IGRyYWdnYWJsZUNlbGxzOiBhbnkgPSBBcnJheS5mcm9tKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJykpO1xyXG5cclxuICAgIEFycmF5LmZyb20oXHJcbiAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJylcclxuICAgICkuZm9yRWFjaCgoZWxlbTogYW55LCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBkaW1zID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgZHJhZ2dhYmxlQ2VsbHNbaW5kZXhdLnN0eWxlLndpZHRoID0gZGltcy53aWR0aCArICdweCc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3dhaXRVbnRpbElzTm90RG9uZShkb25lUmVzdWx0OiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBpZiAoZG9uZVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGlzYWJsZVJlb3JkZXJBY3Rpb24oKTtcclxuXHJcbiAgICAgIGRvbmVSZXN1bHRcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2VuYWJsZScpO1xyXG4gICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZW5hYmxlUmVvcmRlckFjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml4IGJhY2tncm91bmQgd2hlbiBtb2JpbGVcclxuICAgKiBAcGFyYW0gZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG91Y2hGaXgoZSkge1xyXG4gICAgaWYgKCEoJ2NsaWVudFgnIGluIGUpICYmICEoJ2NsaWVudFknIGluIGUpKSB7XHJcbiAgICAgIGNvbnN0IHRvdWNoZXMgPSBlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XHJcbiAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZS5jbGllbnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xyXG4gICAgICAgIGUuY2xpZW50WSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { ChangeDetectorRef, Directive, ElementRef, Input, NgZone } from '@angular/core';
3
+ import { Observable, Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import { ReorderController, ReorderStrategy } from '../../classes/reorder-controller';
6
+ let FsListDraggableListDirective = class FsListDraggableListDirective {
7
+ constructor(_cdRef, _zone, _containerElement, _reorderController) {
8
+ this._cdRef = _cdRef;
9
+ this._zone = _zone;
10
+ this._containerElement = _containerElement;
11
+ this._reorderController = _reorderController;
12
+ // Handlers
13
+ this._dragToHandler = this.dragTo.bind(this);
14
+ this._dragEndHandler = this.dragEnd.bind(this);
15
+ this._windowTouchMoveHandler = () => { };
16
+ this._dragInProgress = false;
17
+ this._dragStart$ = new Subject();
18
+ this._dragEnd$ = new Subject();
19
+ this._destroy$ = new Subject();
20
+ }
21
+ get dragStart$() {
22
+ return this._dragStart$.pipe(takeUntil(this._destroy$));
23
+ }
24
+ get dragEnd$() {
25
+ return this._dragEnd$.pipe(takeUntil(this._destroy$));
26
+ }
27
+ get draggableItem() {
28
+ return this._rows[this._draggableElementIndex];
29
+ }
30
+ /**
31
+ * Prepare draggable elements and add events
32
+ * @param draggableElement
33
+ */
34
+ dragStart(draggableElement) {
35
+ if (this._dragInProgress) {
36
+ return;
37
+ }
38
+ if (this._reorderController.startCallback
39
+ && this._reorderController.strategy === ReorderStrategy.Always) {
40
+ this._reorderController.startCallback();
41
+ }
42
+ this._dragInProgress = true;
43
+ window.document.body.classList.add('reorder-in-progress');
44
+ this._draggableElement = draggableElement;
45
+ this.prepareElements();
46
+ this.initDraggableElement();
47
+ this._draggableElement.classList.add('draggable-elem');
48
+ this._zone.runOutsideAngular(() => {
49
+ window.addEventListener('touchmove', this._windowTouchMoveHandler, { passive: true });
50
+ window.document.addEventListener('mousemove', this._dragToHandler, { passive: true });
51
+ window.document.addEventListener('touchmove', this._dragToHandler, { passive: false });
52
+ window.document.addEventListener('mouseup', this._dragEndHandler);
53
+ window.document.addEventListener('touchend', this._dragEndHandler);
54
+ window.document.addEventListener('touchcancel', this._dragEndHandler);
55
+ });
56
+ this._dragStart$.next();
57
+ }
58
+ /**
59
+ * Move draggable elements and swap items
60
+ * @param event
61
+ */
62
+ dragTo(event) {
63
+ this.touchFix(event);
64
+ const elemIndex = this.lookupElementUnder(event);
65
+ const targetRow = this._rows[elemIndex];
66
+ // Can not drag before first group and after last group
67
+ const swapWithBoundaryGroupElement = (elemIndex === 0 || elemIndex === this._rows.length - 1)
68
+ && targetRow.isGroup
69
+ && this.draggableItem.isChild;
70
+ if (!swapWithBoundaryGroupElement) {
71
+ if (elemIndex !== null) {
72
+ if (targetRow.readyToSwap) {
73
+ this.swapWithIndex(elemIndex);
74
+ this._draggableElementPreview.classList.remove('fs-list-no-drop');
75
+ }
76
+ else {
77
+ this._draggableElementPreview.classList.add('fs-list-no-drop');
78
+ }
79
+ }
80
+ }
81
+ const topOffset = (event.y || event.clientY) - (this._draggableElementHeight / 2);
82
+ this._draggableElementPreview.style.top = topOffset + 'px';
83
+ }
84
+ /**
85
+ * Remove events and classes after drag finish
86
+ */
87
+ dragEnd() {
88
+ this._dragInProgress = false;
89
+ ///
90
+ if (this._reorderController.movedCallback) {
91
+ this._reorderController.movedCallback(this._reorderController.dataController.reorderData);
92
+ }
93
+ if (this._reorderController.strategy === ReorderStrategy.Always) {
94
+ this._zone.run(() => {
95
+ if (this._reorderController.doneCallback) {
96
+ const result = this._reorderController.doneCallback(this._reorderController.dataController.reorderData);
97
+ this._waitUntilIsNotDone(result);
98
+ }
99
+ });
100
+ }
101
+ // this._reorderController.dataController.updateOrderByRows(this._rows);
102
+ ///
103
+ this._draggableElement.classList.remove('draggable-elem');
104
+ window.document.body.classList.remove('reorder-in-progress');
105
+ this._draggableElementPreview.remove();
106
+ this._draggableElement = null;
107
+ this._draggableElementPreview = null;
108
+ this._draggableElementHeight = null;
109
+ this._draggableElementIndex = null;
110
+ window.removeEventListener('touchmove', this._windowTouchMoveHandler);
111
+ window.document.removeEventListener('mousemove', this._dragToHandler);
112
+ window.document.removeEventListener('touchmove', this._dragToHandler);
113
+ window.document.removeEventListener('mouseup', this._dragEndHandler);
114
+ window.document.removeEventListener('touchend', this._dragEndHandler);
115
+ window.document.removeEventListener('touchcancel', this._dragEndHandler);
116
+ this._dragEnd$.next();
117
+ }
118
+ /**
119
+ * looking row elements and save their dims
120
+ */
121
+ prepareElements() {
122
+ this.lookupChildElements();
123
+ this.calcElementsDimensions();
124
+ }
125
+ /**
126
+ * Store child rows
127
+ */
128
+ lookupChildElements() {
129
+ this._childRowElements = Array.from(this._containerElement.nativeElement.querySelectorAll('tr'))
130
+ .reduce((acc, rowElement, index) => {
131
+ const element = { target: rowElement };
132
+ if (rowElement === this._draggableElement) {
133
+ this._draggableElementIndex = index;
134
+ element.active = true;
135
+ }
136
+ acc.push(element);
137
+ return acc;
138
+ }, []);
139
+ }
140
+ /**
141
+ * Calc child rows sizes/offsets
142
+ */
143
+ calcElementsDimensions() {
144
+ this._childRowElements.forEach((el, index) => {
145
+ const dims = el.target.getBoundingClientRect();
146
+ el.top = dims.top;
147
+ el.height = dims.height;
148
+ el.center = dims.top + (dims.height / 2);
149
+ el.index = index;
150
+ });
151
+ }
152
+ /**
153
+ * Init draggable element
154
+ */
155
+ initDraggableElement() {
156
+ const el = this._draggableElement.cloneNode(true);
157
+ const data = this._draggableElement.getBoundingClientRect();
158
+ el.style.width = data.width + 'px';
159
+ el.style.left = data.left + 'px';
160
+ el.style.top = data.top + 'px';
161
+ el.classList.add('draggable');
162
+ this._containerElement.nativeElement.insertAdjacentElement('afterbegin', el);
163
+ this._draggableElementPreview = el;
164
+ this._draggableElementHeight = data.height;
165
+ this.updateDraggableDims();
166
+ }
167
+ /**
168
+ * Looking by stored row elemens for overlapped row
169
+ * @param event
170
+ */
171
+ lookupElementUnder(event) {
172
+ const top = event.y || event.clientY;
173
+ const bottom = event.y || event.clientY;
174
+ let elemIndex = null;
175
+ for (let i = 0; i < this._childRowElements.length; i++) {
176
+ const el = this._childRowElements[i];
177
+ if (!el.active) {
178
+ if (top < el.center + (el.height / 2) && el.index < this._draggableElementIndex
179
+ || bottom > el.center - (el.height / 2) && el.index > this._draggableElementIndex) {
180
+ elemIndex = i;
181
+ }
182
+ }
183
+ }
184
+ return elemIndex;
185
+ }
186
+ /**
187
+ * Swap rows
188
+ * @param index
189
+ */
190
+ swapWithIndex(index) {
191
+ const activeIndex = this._draggableElementIndex;
192
+ // Swap rows in global rows stack
193
+ this._reorderController
194
+ .dataController
195
+ .swapRows(this._rows[activeIndex], this._rows[index]);
196
+ // Swap visible rows
197
+ const activeRow = this._rows[activeIndex];
198
+ this._rows[activeIndex] = this._rows[index];
199
+ this._rows[index] = activeRow;
200
+ const activeElement = this._childRowElements[activeIndex].target;
201
+ this._childRowElements[activeIndex].active = false;
202
+ this._childRowElements[activeIndex].target = this._childRowElements[index].target;
203
+ this._childRowElements[index].target = activeElement;
204
+ this._childRowElements[index].active = true;
205
+ this._draggableElementIndex = index;
206
+ this._cdRef.detectChanges();
207
+ }
208
+ /**
209
+ * Update cell width for draggable elem
210
+ */
211
+ updateDraggableDims() {
212
+ const draggableCells = Array.from(this._draggableElementPreview.querySelectorAll('td'));
213
+ Array.from(this._draggableElementPreview.querySelectorAll('td')).forEach((elem, index) => {
214
+ const dims = elem.getBoundingClientRect();
215
+ draggableCells[index].style.width = dims.width + 'px';
216
+ });
217
+ }
218
+ _waitUntilIsNotDone(doneResult) {
219
+ if (doneResult instanceof Observable) {
220
+ this._reorderController.disableReorderAction();
221
+ doneResult
222
+ .pipe(takeUntil(this._destroy$))
223
+ .subscribe(() => {
224
+ console.log('enable');
225
+ this._reorderController.enableReorderAction();
226
+ });
227
+ }
228
+ }
229
+ /**
230
+ * Fix background when mobile
231
+ * @param e
232
+ */
233
+ touchFix(e) {
234
+ if (!('clientX' in e) && !('clientY' in e)) {
235
+ const touches = e.touches || e.originalEvent.touches;
236
+ if (touches && touches.length) {
237
+ e.clientX = touches[0].clientX;
238
+ e.clientY = touches[0].clientY;
239
+ }
240
+ e.preventDefault();
241
+ }
242
+ }
243
+ };
244
+ FsListDraggableListDirective.ctorParameters = () => [
245
+ { type: ChangeDetectorRef },
246
+ { type: NgZone },
247
+ { type: ElementRef },
248
+ { type: ReorderController }
249
+ ];
250
+ __decorate([
251
+ Input('rows'),
252
+ __metadata("design:type", Array)
253
+ ], FsListDraggableListDirective.prototype, "_rows", void 0);
254
+ FsListDraggableListDirective = __decorate([
255
+ Directive({
256
+ selector: '[fsListDraggableList]',
257
+ }),
258
+ __metadata("design:paramtypes", [ChangeDetectorRef,
259
+ NgZone,
260
+ ElementRef,
261
+ ReorderController])
262
+ ], FsListDraggableListDirective);
263
+ export { FsListDraggableListDirective };
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9kaXJlY3RpdmVzL2RyYWdnYWJsZS1saXN0L2RyYWdnYWJsZS1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBUXRGLElBQWEsNEJBQTRCLEdBQXpDLE1BQWEsNEJBQTRCO0lBd0J2QyxZQUNVLE1BQXlCLEVBQ3pCLEtBQWEsRUFDYixpQkFBNkIsRUFDN0Isa0JBQXFDO1FBSHJDLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQXBCL0MsV0FBVztRQUNILG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyw0QkFBdUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FB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QVU7UUFDVCxpQkFBaUI7R0E1QnBDLDRCQUE0QixDQTRUeEM7U0E1VFksNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlb3JkZXJDb250cm9sbGVyLCBSZW9yZGVyU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3Jlb3JkZXItY29udHJvbGxlcic7XG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi8uLi9tb2RlbHMvcm93JztcbmltcG9ydCB7IEZzTGlzdERyYWdDaGlsZFJvd0VsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RyYWdnYWJsZS1saXN0LmludGVyZmFjZSc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZzTGlzdERyYWdnYWJsZUxpc3RdJyxcbn0pXG5leHBvcnQgY2xhc3MgRnNMaXN0RHJhZ2dhYmxlTGlzdERpcmVjdGl2ZSB7XG5cbiAgLy8gRHJhZ2dhYmxlIEVsZW1lbnRcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlRWxlbWVudEhlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIF9kcmFnZ2FibGVFbGVtZW50SW5kZXg6IG51bWJlcjtcblxuICAvLyBIYW5kbGVyc1xuICBwcml2YXRlIF9kcmFnVG9IYW5kbGVyID0gdGhpcy5kcmFnVG8uYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfZHJhZ0VuZEhhbmRsZXIgPSB0aGlzLmRyYWdFbmQuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBfd2luZG93VG91Y2hNb3ZlSGFuZGxlciA9ICgpID0+IHt9O1xuXG4gIHByaXZhdGUgX2RyYWdJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY2hpbGRSb3dFbGVtZW50czogRnNMaXN0RHJhZ0NoaWxkUm93RWxlbWVudFtdO1xuICBwcml2YXRlIF9kcmFnU3RhcnQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfZHJhZ0VuZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBJbnB1dCgncm93cycpXG4gIHByaXZhdGUgX3Jvd3M6IFJvd1tdO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2NvbnRhaW5lckVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfcmVvcmRlckNvbnRyb2xsZXI6IFJlb3JkZXJDb250cm9sbGVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkcmFnU3RhcnQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnU3RhcnQkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyYWdFbmQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnRW5kJC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcmFnZ2FibGVJdGVtKCk6IFJvdyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NbdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGRyYWdnYWJsZSBlbGVtZW50cyBhbmQgYWRkIGV2ZW50c1xuICAgKiBAcGFyYW0gZHJhZ2dhYmxlRWxlbWVudFxuICAgKi9cbiAgcHVibGljIGRyYWdTdGFydChkcmFnZ2FibGVFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLl9kcmFnSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0YXJ0Q2FsbGJhY2tcbiAgICAgICYmIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0cmF0ZWd5ID09PSBSZW9yZGVyU3RyYXRlZ3kuQWx3YXlzXG4gICAgKSB7XG4gICAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5zdGFydENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZHJhZ0luUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgncmVvcmRlci1pbi1wcm9ncmVzcycpO1xuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCA9IGRyYWdnYWJsZUVsZW1lbnQ7XG5cbiAgICB0aGlzLnByZXBhcmVFbGVtZW50cygpO1xuXG4gICAgdGhpcy5pbml0RHJhZ2dhYmxlRWxlbWVudCgpO1xuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkcmFnZ2FibGUtZWxlbScpO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIHRoaXMuX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9kcmFnVG9IYW5kbGVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlciwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZHJhZ1N0YXJ0JC5uZXh0KCk7XG5cbiAgfVxuXG5cbiAgLyoqXG4gICAqIE1vdmUgZHJhZ2dhYmxlIGVsZW1lbnRzIGFuZCBzd2FwIGl0ZW1zXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHVibGljIGRyYWdUbyhldmVudCkge1xuICAgIHRoaXMudG91Y2hGaXgoZXZlbnQpO1xuICAgIGNvbnN0IGVsZW1JbmRleCA9IHRoaXMubG9va3VwRWxlbWVudFVuZGVyKGV2ZW50KTtcbiAgICBjb25zdCB0YXJnZXRSb3cgPSB0aGlzLl9yb3dzW2VsZW1JbmRleF07XG5cbiAgICAvLyBDYW4gbm90IGRyYWcgYmVmb3JlIGZpcnN0IGdyb3VwIGFuZCBhZnRlciBsYXN0IGdyb3VwXG4gICAgY29uc3Qgc3dhcFdpdGhCb3VuZGFyeUdyb3VwRWxlbWVudCA9XG4gICAgICAoZWxlbUluZGV4ID09PSAwIHx8IGVsZW1JbmRleCA9PT0gdGhpcy5fcm93cy5sZW5ndGggLSAxKVxuICAgICAgJiYgdGFyZ2V0Um93LmlzR3JvdXBcbiAgICAgICYmIHRoaXMuZHJhZ2dhYmxlSXRlbS5pc0NoaWxkO1xuXG4gICAgaWYgKCFzd2FwV2l0aEJvdW5kYXJ5R3JvdXBFbGVtZW50KSB7XG4gICAgICBpZiAoZWxlbUluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0YXJnZXRSb3cucmVhZHlUb1N3YXApIHtcbiAgICAgICAgICB0aGlzLnN3YXBXaXRoSW5kZXgoZWxlbUluZGV4KVxuICAgICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LmNsYXNzTGlzdC5yZW1vdmUoJ2ZzLWxpc3Qtbm8tZHJvcCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LmNsYXNzTGlzdC5hZGQoJ2ZzLWxpc3Qtbm8tZHJvcCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdG9wT2Zmc2V0ID0gKGV2ZW50LnkgfHwgZXZlbnQuY2xpZW50WSkgLSAodGhpcy5fZHJhZ2dhYmxlRWxlbWVudEhlaWdodCAvIDIpO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnN0eWxlLnRvcCA9ICB0b3BPZmZzZXQgKyAncHgnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBldmVudHMgYW5kIGNsYXNzZXMgYWZ0ZXIgZHJhZyBmaW5pc2hcbiAgICovXG4gIHB1YmxpYyBkcmFnRW5kKCkge1xuICAgIHRoaXMuX2RyYWdJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICAvLy9cbiAgICBpZiAodGhpcy5fcmVvcmRlckNvbnRyb2xsZXIubW92ZWRDYWxsYmFjaykge1xuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIubW92ZWRDYWxsYmFjayhcbiAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIucmVvcmRlckRhdGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyLnN0cmF0ZWd5ID09PSBSZW9yZGVyU3RyYXRlZ3kuQWx3YXlzKSB7XG4gICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5kb25lQ2FsbGJhY2spIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5kb25lQ2FsbGJhY2soXG4gICAgICAgICAgICB0aGlzLl9yZW9yZGVyQ29udHJvbGxlci5kYXRhQ29udHJvbGxlci5yZW9yZGVyRGF0YVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLl93YWl0VW50aWxJc05vdERvbmUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGF0YUNvbnRyb2xsZXIudXBkYXRlT3JkZXJCeVJvd3ModGhpcy5fcm93cyk7XG4gICAgLy8vXG5cbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnYWJsZS1lbGVtJyk7XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncmVvcmRlci1pbi1wcm9ncmVzcycpO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudFByZXZpZXcgPSBudWxsO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRIZWlnaHQgPSBudWxsO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IG51bGw7XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIHRoaXMuX3dpbmRvd1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9kcmFnVG9IYW5kbGVyKTtcbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZHJhZ1RvSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kcmFnRW5kSGFuZGxlcik7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fZHJhZ0VuZEhhbmRsZXIpO1xuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX2RyYWdFbmRIYW5kbGVyKTtcblxuICAgIHRoaXMuX2RyYWdFbmQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBsb29raW5nIHJvdyBlbGVtZW50cyBhbmQgc2F2ZSB0aGVpciBkaW1zXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVFbGVtZW50cygpIHtcbiAgICB0aGlzLmxvb2t1cENoaWxkRWxlbWVudHMoKTtcbiAgICB0aGlzLmNhbGNFbGVtZW50c0RpbWVuc2lvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBjaGlsZCByb3dzXG4gICAqL1xuICBwcml2YXRlIGxvb2t1cENoaWxkRWxlbWVudHMoKSB7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5fY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpXG4gICAgICAucmVkdWNlKChhY2M6IGFueVtdLCByb3dFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSB7IHRhcmdldDogcm93RWxlbWVudCB9O1xuXG4gICAgICAgIGlmIChyb3dFbGVtZW50ID09PSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgZWxlbWVudC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjLnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKSBhcyBGc0xpc3REcmFnQ2hpbGRSb3dFbGVtZW50W107XG4gIH1cblxuICAvKipcbiAgICogQ2FsYyBjaGlsZCByb3dzIHNpemVzL29mZnNldHNcbiAgICovXG4gIHByaXZhdGUgY2FsY0VsZW1lbnRzRGltZW5zaW9ucygpIHtcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzLmZvckVhY2goKGVsOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkaW1zID0gZWwudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgZWwudG9wID0gZGltcy50b3A7XG4gICAgICBlbC5oZWlnaHQgPSBkaW1zLmhlaWdodDtcbiAgICAgIGVsLmNlbnRlciA9IGRpbXMudG9wICsgKGRpbXMuaGVpZ2h0IC8gMik7XG4gICAgICBlbC5pbmRleCA9IGluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgaW5pdERyYWdnYWJsZUVsZW1lbnQoKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLl9kcmFnZ2FibGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZHJhZ2dhYmxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGVsLnN0eWxlLndpZHRoID0gZGF0YS53aWR0aCArICdweCc7XG4gICAgZWwuc3R5bGUubGVmdCA9IGRhdGEubGVmdCArICdweCc7XG4gICAgZWwuc3R5bGUudG9wID0gZGF0YS50b3AgKyAncHgnO1xuXG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZHJhZ2dhYmxlJyk7XG5cbiAgICB0aGlzLl9jb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgZWwpO1xuXG4gICAgdGhpcy5fZHJhZ2dhYmxlRWxlbWVudFByZXZpZXcgPSBlbDtcbiAgICB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SGVpZ2h0ID0gZGF0YS5oZWlnaHQ7XG5cbiAgICB0aGlzLnVwZGF0ZURyYWdnYWJsZURpbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29raW5nIGJ5IHN0b3JlZCByb3cgZWxlbWVucyBmb3Igb3ZlcmxhcHBlZCByb3dcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGxvb2t1cEVsZW1lbnRVbmRlcihldmVudCkge1xuICAgIGNvbnN0IHRvcCA9IGV2ZW50LnkgfHwgZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBib3R0b20gPSBldmVudC55IHx8IGV2ZW50LmNsaWVudFk7XG4gICAgbGV0IGVsZW1JbmRleCA9IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NoaWxkUm93RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpXTtcblxuICAgICAgaWYgKCFlbC5hY3RpdmUpIHtcbiAgICAgICAgaWYgKHRvcCA8IGVsLmNlbnRlciArIChlbC5oZWlnaHQgLyAyKSAmJiBlbC5pbmRleCA8IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleFxuICAgICAgICAgIHx8IGJvdHRvbSA+IGVsLmNlbnRlciAtIChlbC5oZWlnaHQgLyAyKSAgJiYgZWwuaW5kZXggPiB0aGlzLl9kcmFnZ2FibGVFbGVtZW50SW5kZXgpIHtcbiAgICAgICAgICBlbGVtSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1JbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHJvd3NcbiAgICogQHBhcmFtIGluZGV4XG4gICAqL1xuICBwcml2YXRlIHN3YXBXaXRoSW5kZXgoaW5kZXgpIHtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleDtcblxuICAgIC8vIFN3YXAgcm93cyBpbiBnbG9iYWwgcm93cyBzdGFja1xuICAgIHRoaXMuX3Jlb3JkZXJDb250cm9sbGVyXG4gICAgICAuZGF0YUNvbnRyb2xsZXJcbiAgICAgIC5zd2FwUm93cyh0aGlzLl9yb3dzW2FjdGl2ZUluZGV4XSAsIHRoaXMuX3Jvd3NbaW5kZXhdKTtcblxuICAgIC8vIFN3YXAgdmlzaWJsZSByb3dzXG4gICAgY29uc3QgYWN0aXZlUm93ID0gdGhpcy5fcm93c1thY3RpdmVJbmRleF07XG4gICAgdGhpcy5fcm93c1thY3RpdmVJbmRleF0gPSB0aGlzLl9yb3dzW2luZGV4XTtcbiAgICB0aGlzLl9yb3dzW2luZGV4XSA9IGFjdGl2ZVJvdztcblxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2FjdGl2ZUluZGV4XS50YXJnZXQ7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1thY3RpdmVJbmRleF0uYWN0aXZlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2FjdGl2ZUluZGV4XS50YXJnZXQgPSB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2luZGV4XS50YXJnZXQ7XG4gICAgdGhpcy5fY2hpbGRSb3dFbGVtZW50c1tpbmRleF0udGFyZ2V0ID0gYWN0aXZlRWxlbWVudDtcbiAgICB0aGlzLl9jaGlsZFJvd0VsZW1lbnRzW2luZGV4XS5hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRJbmRleCA9IGluZGV4O1xuXG4gICAgdGhpcy5fY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjZWxsIHdpZHRoIGZvciBkcmFnZ2FibGUgZWxlbVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnZ2FibGVEaW1zKCkge1xuICAgIGNvbnN0IGRyYWdnYWJsZUNlbGxzOiBhbnkgPSBBcnJheS5mcm9tKHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJykpO1xuXG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuX2RyYWdnYWJsZUVsZW1lbnRQcmV2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJylcbiAgICApLmZvckVhY2goKGVsZW06IGFueSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGRpbXMgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgZHJhZ2dhYmxlQ2VsbHNbaW5kZXhdLnN0eWxlLndpZHRoID0gZGltcy53aWR0aCArICdweCc7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF93YWl0VW50aWxJc05vdERvbmUoZG9uZVJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChkb25lUmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZGlzYWJsZVJlb3JkZXJBY3Rpb24oKTtcblxuICAgICAgZG9uZVJlc3VsdFxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZW5hYmxlJyk7XG4gICAgICAgICAgdGhpcy5fcmVvcmRlckNvbnRyb2xsZXIuZW5hYmxlUmVvcmRlckFjdGlvbigpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRml4IGJhY2tncm91bmQgd2hlbiBtb2JpbGVcbiAgICogQHBhcmFtIGVcbiAgICovXG4gIHByaXZhdGUgdG91Y2hGaXgoZSkge1xuICAgIGlmICghKCdjbGllbnRYJyBpbiBlKSAmJiAhKCdjbGllbnRZJyBpbiBlKSkge1xuICAgICAgY29uc3QgdG91Y2hlcyA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGUuY2xpZW50WCA9IHRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgICAgZS5jbGllbnRZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=