barsa-user-workspace 0.0.0-watch

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 (56) hide show
  1. package/README.md +24 -0
  2. package/esm2022/barsa-user-workspace.mjs +5 -0
  3. package/esm2022/lib/barsa-user-workspace.module.mjs +82 -0
  4. package/esm2022/lib/coercion/boolean-property.mjs +5 -0
  5. package/esm2022/lib/coercion/number-property.mjs +14 -0
  6. package/esm2022/lib/directives/drag-handle.mjs +29 -0
  7. package/esm2022/lib/directives/placeholder.mjs +31 -0
  8. package/esm2022/lib/directives/resize-handle.mjs +29 -0
  9. package/esm2022/lib/grid/grid.component.mjs +609 -0
  10. package/esm2022/lib/grid-item/grid-item.component.mjs +196 -0
  11. package/esm2022/lib/grid.definitions.mjs +3 -0
  12. package/esm2022/lib/grid.service.mjs +49 -0
  13. package/esm2022/lib/layout-container/layout-container.component.mjs +213 -0
  14. package/esm2022/lib/layout-grid-mapper.pipe.mjs +29 -0
  15. package/esm2022/lib/nav-container/nav-container.component.mjs +27 -0
  16. package/esm2022/lib/report-grid-layout/report-grid-layout.component.mjs +15 -0
  17. package/esm2022/lib/utils/client-rect.mjs +57 -0
  18. package/esm2022/lib/utils/grid.utils.mjs +225 -0
  19. package/esm2022/lib/utils/operators.mjs +17 -0
  20. package/esm2022/lib/utils/passive-listeners.mjs +29 -0
  21. package/esm2022/lib/utils/pointer.utils.mjs +110 -0
  22. package/esm2022/lib/utils/react-grid-layout.utils.mjs +493 -0
  23. package/esm2022/lib/utils/scroll.mjs +233 -0
  24. package/esm2022/lib/utils/transition-duration.mjs +34 -0
  25. package/esm2022/lib/utils.mjs +14 -0
  26. package/esm2022/public-api.mjs +15 -0
  27. package/esm2022/types.mjs +2 -0
  28. package/fesm2022/barsa-user-workspace.mjs +2469 -0
  29. package/fesm2022/barsa-user-workspace.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/barsa-user-workspace.module.d.ts +34 -0
  32. package/lib/coercion/boolean-property.d.ts +7 -0
  33. package/lib/coercion/number-property.d.ts +9 -0
  34. package/lib/directives/drag-handle.d.ts +15 -0
  35. package/lib/directives/placeholder.d.ts +17 -0
  36. package/lib/directives/resize-handle.d.ts +15 -0
  37. package/lib/grid/grid.component.d.ts +147 -0
  38. package/lib/grid-item/grid-item.component.d.ts +83 -0
  39. package/lib/grid.definitions.d.ts +61 -0
  40. package/lib/grid.service.d.ts +15 -0
  41. package/lib/layout-container/layout-container.component.d.ts +79 -0
  42. package/lib/layout-grid-mapper.pipe.d.ts +9 -0
  43. package/lib/nav-container/nav-container.component.d.ts +10 -0
  44. package/lib/report-grid-layout/report-grid-layout.component.d.ts +7 -0
  45. package/lib/utils/client-rect.d.ts +36 -0
  46. package/lib/utils/grid.utils.d.ts +45 -0
  47. package/lib/utils/operators.d.ts +6 -0
  48. package/lib/utils/passive-listeners.d.ts +12 -0
  49. package/lib/utils/pointer.utils.d.ts +29 -0
  50. package/lib/utils/react-grid-layout.utils.d.ts +177 -0
  51. package/lib/utils/scroll.d.ts +28 -0
  52. package/lib/utils/transition-duration.d.ts +6 -0
  53. package/lib/utils.d.ts +6 -0
  54. package/package.json +25 -0
  55. package/public-api.d.ts +12 -0
  56. package/types.d.ts +3 -0
@@ -0,0 +1,233 @@
1
+ import { animationFrameScheduler, fromEvent, interval, NEVER } from 'rxjs';
2
+ import { distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators';
3
+ import { ktdNormalizePassiveListenerOptions } from './passive-listeners';
4
+ import { getMutableClientRect } from './client-rect';
5
+ import { ktdNoEmit } from './operators';
6
+ /**
7
+ * Proximity, as a ratio to width/height at which to start auto-scrolling.
8
+ * The value comes from trying it out manually until it feels right.
9
+ */
10
+ const SCROLL_PROXIMITY_THRESHOLD = 0.05;
11
+ /**
12
+ * Increments the vertical scroll position of a node.
13
+ * @param node Node whose scroll position should change.
14
+ * @param amount Amount of pixels that the `node` should be scrolled.
15
+ */
16
+ function incrementVerticalScroll(node, amount) {
17
+ if (node === window) {
18
+ node.scrollBy(0, amount);
19
+ }
20
+ else {
21
+ // Ideally we could use `Element.scrollBy` here as well, but IE and Edge don't support it.
22
+ node.scrollTop += amount;
23
+ }
24
+ }
25
+ /**
26
+ * Increments the horizontal scroll position of a node.
27
+ * @param node Node whose scroll position should change.
28
+ * @param amount Amount of pixels that the `node` should be scrolled.
29
+ */
30
+ function incrementHorizontalScroll(node, amount) {
31
+ if (node === window) {
32
+ node.scrollBy(amount, 0);
33
+ }
34
+ else {
35
+ // Ideally we could use `Element.scrollBy` here as well, but IE and Edge don't support it.
36
+ node.scrollLeft += amount;
37
+ }
38
+ }
39
+ /**
40
+ * Gets whether the vertical auto-scroll direction of a node.
41
+ * @param clientRect Dimensions of the node.
42
+ * @param pointerY Position of the user's pointer along the y axis.
43
+ */
44
+ function getVerticalScrollDirection(clientRect, pointerY) {
45
+ const { top, bottom, height } = clientRect;
46
+ const yThreshold = height * SCROLL_PROXIMITY_THRESHOLD;
47
+ if (pointerY >= top - yThreshold && pointerY <= top + yThreshold) {
48
+ return 1 /* AutoScrollVerticalDirection.UP */;
49
+ }
50
+ else if (pointerY >= bottom - yThreshold && pointerY <= bottom + yThreshold) {
51
+ return 2 /* AutoScrollVerticalDirection.DOWN */;
52
+ }
53
+ return 0 /* AutoScrollVerticalDirection.NONE */;
54
+ }
55
+ /**
56
+ * Gets whether the horizontal auto-scroll direction of a node.
57
+ * @param clientRect Dimensions of the node.
58
+ * @param pointerX Position of the user's pointer along the x axis.
59
+ */
60
+ function getHorizontalScrollDirection(clientRect, pointerX) {
61
+ const { left, right, width } = clientRect;
62
+ const xThreshold = width * SCROLL_PROXIMITY_THRESHOLD;
63
+ if (pointerX >= left - xThreshold && pointerX <= left + xThreshold) {
64
+ return 1 /* AutoScrollHorizontalDirection.LEFT */;
65
+ }
66
+ else if (pointerX >= right - xThreshold && pointerX <= right + xThreshold) {
67
+ return 2 /* AutoScrollHorizontalDirection.RIGHT */;
68
+ }
69
+ return 0 /* AutoScrollHorizontalDirection.NONE */;
70
+ }
71
+ /**
72
+ * Returns an observable that schedules a loop and apply scroll on the scrollNode into the specified direction/s.
73
+ * This observable doesn't emit, it just performs the 'scroll' side effect.
74
+ * @param scrollNode, node where the scroll would be applied.
75
+ * @param verticalScrollDirection, vertical direction of the scroll.
76
+ * @param horizontalScrollDirection, horizontal direction of the scroll.
77
+ * @param scrollStep, scroll step in CSS pixels that would be applied in every loop.
78
+ */
79
+ function scrollToDirectionInterval$(scrollNode, verticalScrollDirection, horizontalScrollDirection, scrollStep = 2) {
80
+ return interval(0, animationFrameScheduler)
81
+ .pipe(tap(() => {
82
+ if (verticalScrollDirection === 1 /* AutoScrollVerticalDirection.UP */) {
83
+ incrementVerticalScroll(scrollNode, -scrollStep);
84
+ }
85
+ else if (verticalScrollDirection === 2 /* AutoScrollVerticalDirection.DOWN */) {
86
+ incrementVerticalScroll(scrollNode, scrollStep);
87
+ }
88
+ if (horizontalScrollDirection === 1 /* AutoScrollHorizontalDirection.LEFT */) {
89
+ incrementHorizontalScroll(scrollNode, -scrollStep);
90
+ }
91
+ else if (horizontalScrollDirection === 2 /* AutoScrollHorizontalDirection.RIGHT */) {
92
+ incrementHorizontalScroll(scrollNode, scrollStep);
93
+ }
94
+ }), ktdNoEmit());
95
+ }
96
+ /**
97
+ * Given a source$ observable with pointer location, scroll the scrollNode if the pointer is near to it.
98
+ * This observable doesn't emit, it just performs a 'scroll' side effect.
99
+ * @param scrollableParent, parent node in which the scroll would be performed.
100
+ * @param options, configuration options.
101
+ */
102
+ export function ktdScrollIfNearElementClientRect$(scrollableParent, options) {
103
+ let scrollNode;
104
+ let scrollableParentClientRect;
105
+ let scrollableParentScrollWidth;
106
+ if (scrollableParent === document) {
107
+ scrollNode = document.defaultView;
108
+ const { width, height } = getViewportSize();
109
+ scrollableParentClientRect = { width, height, top: 0, right: width, bottom: height, left: 0 };
110
+ scrollableParentScrollWidth = getDocumentScrollWidth();
111
+ }
112
+ else {
113
+ scrollNode = scrollableParent;
114
+ scrollableParentClientRect = getMutableClientRect(scrollableParent);
115
+ scrollableParentScrollWidth = scrollableParent.scrollWidth;
116
+ }
117
+ /**
118
+ * IMPORTANT: By design, only let scroll horizontal if the scrollable parent has explicitly an scroll horizontal.
119
+ * This layout solution is not designed in mind to have any scroll horizontal, but exceptionally we allow it in this
120
+ * specific use case.
121
+ */
122
+ options = options || {};
123
+ if (options.disableHorizontal == null && scrollableParentScrollWidth <= scrollableParentClientRect.width) {
124
+ options.disableHorizontal = true;
125
+ }
126
+ return (source$) => source$.pipe(map(({ pointerX, pointerY }) => {
127
+ let verticalScrollDirection = getVerticalScrollDirection(scrollableParentClientRect, pointerY);
128
+ let horizontalScrollDirection = getHorizontalScrollDirection(scrollableParentClientRect, pointerX);
129
+ // Check if scroll directions are disabled.
130
+ if (options?.disableVertical) {
131
+ verticalScrollDirection = 0 /* AutoScrollVerticalDirection.NONE */;
132
+ }
133
+ if (options?.disableHorizontal) {
134
+ horizontalScrollDirection = 0 /* AutoScrollHorizontalDirection.NONE */;
135
+ }
136
+ return { verticalScrollDirection, horizontalScrollDirection };
137
+ }), distinctUntilChanged((prev, actual) => {
138
+ return prev.verticalScrollDirection === actual.verticalScrollDirection
139
+ && prev.horizontalScrollDirection === actual.horizontalScrollDirection;
140
+ }), switchMap(({ verticalScrollDirection, horizontalScrollDirection }) => {
141
+ if (verticalScrollDirection || horizontalScrollDirection) {
142
+ return scrollToDirectionInterval$(scrollNode, verticalScrollDirection, horizontalScrollDirection, options?.scrollStep);
143
+ }
144
+ else {
145
+ return NEVER;
146
+ }
147
+ }));
148
+ }
149
+ /**
150
+ * Emits on EVERY scroll event and returns the accumulated scroll offset relative to the initial scroll position.
151
+ * @param scrollableParent, node in which scroll events would be listened.
152
+ */
153
+ export function ktdGetScrollTotalRelativeDifference$(scrollableParent) {
154
+ let scrollInitialPosition;
155
+ // Calculate initial scroll position
156
+ if (scrollableParent === document) {
157
+ scrollInitialPosition = getViewportScrollPosition();
158
+ }
159
+ else {
160
+ scrollInitialPosition = {
161
+ top: scrollableParent.scrollTop,
162
+ left: scrollableParent.scrollLeft
163
+ };
164
+ }
165
+ return fromEvent(scrollableParent, 'scroll', ktdNormalizePassiveListenerOptions({ capture: true })).pipe(map(() => {
166
+ let newTop;
167
+ let newLeft;
168
+ if (scrollableParent === document) {
169
+ const viewportScrollPosition = getViewportScrollPosition();
170
+ newTop = viewportScrollPosition.top;
171
+ newLeft = viewportScrollPosition.left;
172
+ }
173
+ else {
174
+ newTop = scrollableParent.scrollTop;
175
+ newLeft = scrollableParent.scrollLeft;
176
+ }
177
+ const topDifference = scrollInitialPosition.top - newTop;
178
+ const leftDifference = scrollInitialPosition.left - newLeft;
179
+ return { top: topDifference, left: leftDifference };
180
+ }));
181
+ }
182
+ /** Returns the viewport's width and height. */
183
+ function getViewportSize() {
184
+ const _window = document.defaultView || window;
185
+ return {
186
+ width: _window.innerWidth,
187
+ height: _window.innerHeight
188
+ };
189
+ }
190
+ /** Gets a ClientRect for the viewport's bounds. */
191
+ function getViewportRect() {
192
+ // Use the document element's bounding rect rather than the window scroll properties
193
+ // (e.g. pageYOffset, scrollY) due to in issue in Chrome and IE where window scroll
194
+ // properties and client coordinates (boundingClientRect, clientX/Y, etc.) are in different
195
+ // conceptual viewports. Under most circumstances these viewports are equivalent, but they
196
+ // can disagree when the page is pinch-zoomed (on devices that support touch).
197
+ // See https://bugs.chromium.org/p/chromium/issues/detail?id=489206#c4
198
+ // We use the documentElement instead of the body because, by default (without a css reset)
199
+ // browsers typically give the document body an 8px margin, which is not included in
200
+ // getBoundingClientRect().
201
+ const scrollPosition = getViewportScrollPosition();
202
+ const { width, height } = getViewportSize();
203
+ return {
204
+ top: scrollPosition.top,
205
+ left: scrollPosition.left,
206
+ bottom: scrollPosition.top + height,
207
+ right: scrollPosition.left + width,
208
+ height,
209
+ width,
210
+ };
211
+ }
212
+ /** Gets the (top, left) scroll position of the viewport. */
213
+ function getViewportScrollPosition() {
214
+ // The top-left-corner of the viewport is determined by the scroll position of the document
215
+ // body, normally just (scrollLeft, scrollTop). However, Chrome and Firefox disagree about
216
+ // whether `document.body` or `document.documentElement` is the scrolled element, so reading
217
+ // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of
218
+ // `document.documentElement` works consistently, where the `top` and `left` values will
219
+ // equal negative the scroll position.
220
+ const windowRef = document.defaultView || window;
221
+ const documentElement = document.documentElement;
222
+ const documentRect = documentElement.getBoundingClientRect();
223
+ const top = -documentRect.top || document.body.scrollTop || windowRef.scrollY ||
224
+ documentElement.scrollTop || 0;
225
+ const left = -documentRect.left || document.body.scrollLeft || windowRef.scrollX ||
226
+ documentElement.scrollLeft || 0;
227
+ return { top, left };
228
+ }
229
+ /** Returns the document scroll width */
230
+ function getDocumentScrollWidth() {
231
+ return Math.max(document.body.scrollWidth, document.documentElement.scrollWidth);
232
+ }
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtdXNlci13b3Jrc3BhY2Uvc3JjL2xpYi91dGlscy9zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4Qzs7O0dBR0c7QUFDSCxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQztBQWN4Qzs7OztHQUlHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxJQUEwQixFQUFFLE1BQWM7SUFDdkUsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDakIsSUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztTQUFNLENBQUM7UUFDSiwwRkFBMEY7UUFDekYsSUFBb0IsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDO0lBQzlDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsSUFBMEIsRUFBRSxNQUFjO0lBQ3pFLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ2pCLElBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7U0FBTSxDQUFDO1FBQ0osMEZBQTBGO1FBQ3pGLElBQW9CLENBQUMsVUFBVSxJ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TixDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQVMseUJBQXlCO0lBRTlCLDJGQUEyRjtJQUMzRiwwRkFBMEY7SUFDMUYsNEZBQTRGO0lBQzVGLG9GQUFvRjtJQUNwRix3RkFBd0Y7SUFDeEYsc0NBQXNDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO0lBQ2pELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFnQixDQUFDO0lBQ2xELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBRTdELE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTztRQUN6RSxlQUFlLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUVuQyxNQUFNLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLE9BQU87UUFDNUUsZUFBZSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7SUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsd0NBQXdDO0FBQ3hDLFNBQVMsc0JBQXNCO0lBQzNCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgZnJvbUV2ZW50LCBpbnRlcnZhbCwgTkVWRVIsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsga3RkTm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyB9IGZyb20gJy4vcGFzc2l2ZS1saXN0ZW5lcnMnO1xuaW1wb3J0IHsgZ2V0TXV0YWJsZUNsaWVudFJlY3QsIEt0ZENsaWVudFJlY3QgfSBmcm9tICcuL2NsaWVudC1yZWN0JztcbmltcG9ydCB7IGt0ZE5vRW1pdCB9IGZyb20gJy4vb3BlcmF0b3JzJztcblxuLyoqXG4gKiBQcm94aW1pdHksIGFzIGEgcmF0aW8gdG8gd2lkdGgvaGVpZ2h0IGF0IHdoaWNoIHRvIHN0YXJ0IGF1dG8tc2Nyb2xsaW5nLlxuICogVGhlIHZhbHVlIGNvbWVzIGZyb20gdHJ5aW5nIGl0IG91dCBtYW51YWxseSB1bnRpbCBpdCBmZWVscyByaWdodC5cbiAqL1xuY29uc3QgU0NST0xMX1BST1hJTUlUWV9USFJFU0hPTEQgPSAwLjA1O1xuXG4vKiogVmVydGljYWwgZGlyZWN0aW9uIGluIHdoaWNoIHdlIGNhbiBhdXRvLXNjcm9sbC4gKi9cbmNvbnN0IGVudW0gQXV0b1Njcm9sbFZlcnRpY2FsRGlyZWN0aW9uIHtOT05FLCBVUCwgRE9XTn1cblxuLyoqIEhvcml6b250YWwgZGlyZWN0aW9uIGluIHdoaWNoIHdlIGNhbiBhdXRvLXNjcm9sbC4gKi9cbmNvbnN0IGVudW0gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24ge05PTkUsIExFRlQsIFJJR0hUfVxuXG5leHBvcnQgaW50ZXJmYWNlIEt0ZFNjcm9sbFBvc2l0aW9uIHtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBsZWZ0OiBudW1iZXI7XG59XG5cblxuLyoqXG4gKiBJbmNyZW1lbnRzIHRoZSB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gb2YgYSBub2RlLlxuICogQHBhcmFtIG5vZGUgTm9kZSB3aG9zZSBzY3JvbGwgcG9zaXRpb24gc2hvdWxkIGNoYW5nZS5cbiAqIEBwYXJhbSBhbW91bnQgQW1vdW50IG9mIHBpeGVscyB0aGF0IHRoZSBgbm9kZWAgc2hvdWxkIGJlIHNjcm9sbGVkLlxuICovXG5mdW5jdGlvbiBpbmNyZW1lbnRWZXJ0aWNhbFNjcm9sbChub2RlOiBIVE1MRWxlbWVudCB8IFdpbmRvdywgYW1vdW50OiBudW1iZXIpIHtcbiAgICBpZiAobm9kZSA9PT0gd2luZG93KSB7XG4gICAgICAgIChub2RlIGFzIFdpbmRvdykuc2Nyb2xsQnkoMCwgYW1vdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZGVhbGx5IHdlIGNvdWxkIHVzZSBgRWxlbWVudC5zY3JvbGxCeWAgaGVyZSBhcyB3ZWxsLCBidXQgSUUgYW5kIEVkZ2UgZG9uJ3Qgc3VwcG9ydCBpdC5cbiAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbFRvcCArPSBhbW91bnQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEluY3JlbWVudHMgdGhlIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uIG9mIGEgbm9kZS5cbiAqIEBwYXJhbSBub2RlIE5vZGUgd2hvc2Ugc2Nyb2xsIHBvc2l0aW9uIHNob3VsZCBjaGFuZ2UuXG4gKiBAcGFyYW0gYW1vdW50IEFtb3VudCBvZiBwaXhlbHMgdGhhdCB0aGUgYG5vZGVgIHNob3VsZCBiZSBzY3JvbGxlZC5cbiAqL1xuZnVuY3Rpb24gaW5jcmVtZW50SG9yaXpvbnRhbFNjcm9sbChub2RlOiBIVE1MRWxlbWVudCB8IFdpbmRvdywgYW1vdW50OiBudW1iZXIpIHtcbiAgICBpZiAobm9kZSA9PT0gd2luZG93KSB7XG4gICAgICAgIChub2RlIGFzIFdpbmRvdykuc2Nyb2xsQnkoYW1vdW50LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZGVhbGx5IHdlIGNvdWxkIHVzZSBgRWxlbWVudC5zY3JvbGxCeWAgaGVyZSBhcyB3ZWxsLCBidXQgSUUgYW5kIEVkZ2UgZG9uJ3Qgc3VwcG9ydCBpdC5cbiAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQgKz0gYW1vdW50O1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEdldHMgd2hldGhlciB0aGUgdmVydGljYWwgYXV0by1zY3JvbGwgZGlyZWN0aW9uIG9mIGEgbm9kZS5cbiAqIEBwYXJhbSBjbGllbnRSZWN0IERpbWVuc2lvbnMgb2YgdGhlIG5vZGUuXG4gKiBAcGFyYW0gcG9pbnRlclkgUG9zaXRpb24gb2YgdGhlIHVzZXIncyBwb2ludGVyIGFsb25nIHRoZSB5IGF4aXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uKGNsaWVudFJlY3Q6IEt0ZENsaWVudFJlY3QsIHBvaW50ZXJZOiBudW1iZXIpIHtcbiAgICBjb25zdCB7dG9wLCBib3R0b20sIGhlaWdodH0gPSBjbGllbnRSZWN0O1xuICAgIGNvbnN0IHlUaHJlc2hvbGQgPSBoZWlnaHQgKiBTQ1JPTExfUFJPWElNSVRZX1RIUkVTSE9MRDtcblxuICAgIGlmIChwb2ludGVyWSA+PSB0b3AgLSB5VGhyZXNob2xkICYmIHBvaW50ZXJZIDw9IHRvcCArIHlUaHJlc2hvbGQpIHtcbiAgICAgICAgcmV0dXJuIEF1dG9TY3JvbGxWZXJ0aWNhbERpcmVjdGlvbi5VUDtcbiAgICB9IGVsc2UgaWYgKHBvaW50ZXJZID49IGJvdHRvbSAtIHlUaHJlc2hvbGQgJiYgcG9pbnRlclkgPD0gYm90dG9tICsgeVRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gQXV0b1Njcm9sbFZlcnRpY2FsRGlyZWN0aW9uLkRPV047XG4gICAgfVxuXG4gICAgcmV0dXJuIEF1dG9TY3JvbGxWZXJ0aWNhbERpcmVjdGlvbi5OT05FO1xufVxuXG4vKipcbiAqIEdldHMgd2hldGhlciB0aGUgaG9yaXpvbnRhbCBhdXRvLXNjcm9sbCBkaXJlY3Rpb24gb2YgYSBub2RlLlxuICogQHBhcmFtIGNsaWVudFJlY3QgRGltZW5zaW9ucyBvZiB0aGUgbm9kZS5cbiAqIEBwYXJhbSBwb2ludGVyWCBQb3NpdGlvbiBvZiB0aGUgdXNlcidzIHBvaW50ZXIgYWxvbmcgdGhlIHggYXhpcy5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbihjbGllbnRSZWN0OiBLdGRDbGllbnRSZWN0LCBwb2ludGVyWDogbnVtYmVyKSB7XG4gICAgY29uc3Qge2xlZnQsIHJpZ2h0LCB3aWR0aH0gPSBjbGllbnRSZWN0O1xuICAgIGNvbnN0IHhUaHJlc2hvbGQgPSB3aWR0aCAqIFNDUk9MTF9QUk9YSU1JVFlfVEhSRVNIT0xEO1xuXG4gICAgaWYgKHBvaW50ZXJYID49IGxlZnQgLSB4VGhyZXNob2xkICYmIHBvaW50ZXJYIDw9IGxlZnQgKyB4VGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbi5MRUZUO1xuICAgIH0gZWxzZSBpZiAocG9pbnRlclggPj0gcmlnaHQgLSB4VGhyZXNob2xkICYmIHBvaW50ZXJYIDw9IHJpZ2h0ICsgeFRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24uUklHSFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLk5PTkU7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRoYXQgc2NoZWR1bGVzIGEgbG9vcCBhbmQgYXBwbHkgc2Nyb2xsIG9uIHRoZSBzY3JvbGxOb2RlIGludG8gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24vcy5cbiAqIFRoaXMgb2JzZXJ2YWJsZSBkb2Vzbid0IGVtaXQsIGl0IGp1c3QgcGVyZm9ybXMgdGhlICdzY3JvbGwnIHNpZGUgZWZmZWN0LlxuICogQHBhcmFtIHNjcm9sbE5vZGUsIG5vZGUgd2hlcmUgdGhlIHNjcm9sbCB3b3VsZCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIHZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uLCB2ZXJ0aWNhbCBkaXJlY3Rpb24gb2YgdGhlIHNjcm9sbC5cbiAqIEBwYXJhbSBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uLCBob3Jpem9udGFsIGRpcmVjdGlvbiBvZiB0aGUgc2Nyb2xsLlxuICogQHBhcmFtIHNjcm9sbFN0ZXAsIHNjcm9sbCBzdGVwIGluIENTUyBwaXhlbHMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIGluIGV2ZXJ5IGxvb3AuXG4gKi9cbmZ1bmN0aW9uIHNjcm9sbFRvRGlyZWN0aW9uSW50ZXJ2YWwkKHNjcm9sbE5vZGU6IEhUTUxFbGVtZW50IHwgV2luZG93LCB2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbjogQXV0b1Njcm9sbFZlcnRpY2FsRGlyZWN0aW9uLCBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uOiBBdXRvU2Nyb2xsSG9yaXpvbnRhbERpcmVjdGlvbiwgc2Nyb2xsU3RlcDogbnVtYmVyID0gMikge1xuICAgIHJldHVybiBpbnRlcnZhbCgwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlcilcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbiA9PT0gQXV0b1Njcm9sbFZlcnRpY2FsRGlyZWN0aW9uLlVQKSB7XG4gICAgICAgICAgICAgICAgICAgIGluY3JlbWVudFZlcnRpY2FsU2Nyb2xsKHNjcm9sbE5vZGUsIC1zY3JvbGxTdGVwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uID09PSBBdXRvU2Nyb2xsVmVydGljYWxEaXJlY3Rpb24uRE9XTikge1xuICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRWZXJ0aWNhbFNjcm9sbChzY3JvbGxOb2RlLCBzY3JvbGxTdGVwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9PT0gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24uTEVGVCkge1xuICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRIb3Jpem9udGFsU2Nyb2xsKHNjcm9sbE5vZGUsIC1zY3JvbGxTdGVwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24gPT09IEF1dG9TY3JvbGxIb3Jpem9udGFsRGlyZWN0aW9uLlJJR0hUKSB7XG4gICAgICAgICAgICAgICAgICAgIGluY3JlbWVudEhvcml6b250YWxTY3JvbGwoc2Nyb2xsTm9kZSwgc2Nyb2xsU3RlcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBrdGROb0VtaXQoKVxuICAgICAgICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEt0ZFNjcm9sbElmTmVhckVsZW1lbnRPcHRpb25zIHtcbiAgICBzY3JvbGxTdGVwPzogbnVtYmVyO1xuICAgIGRpc2FibGVWZXJ0aWNhbD86IGJvb2xlYW47XG4gICAgZGlzYWJsZUhvcml6b250YWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgc291cmNlJCBvYnNlcnZhYmxlIHdpdGggcG9pbnRlciBsb2NhdGlvbiwgc2Nyb2xsIHRoZSBzY3JvbGxOb2RlIGlmIHRoZSBwb2ludGVyIGlzIG5lYXIgdG8gaXQuXG4gKiBUaGlzIG9ic2VydmFibGUgZG9lc24ndCBlbWl0LCBpdCBqdXN0IHBlcmZvcm1zIGEgJ3Njcm9sbCcgc2lkZSBlZmZlY3QuXG4gKiBAcGFyYW0gc2Nyb2xsYWJsZVBhcmVudCwgcGFyZW50IG5vZGUgaW4gd2hpY2ggdGhlIHNjcm9sbCB3b3VsZCBiZSBwZXJmb3JtZWQuXG4gKiBAcGFyYW0gb3B0aW9ucywgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24ga3RkU2Nyb2xsSWZOZWFyRWxlbWVudENsaWVudFJlY3QkKHNjcm9sbGFibGVQYXJlbnQ6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQsIG9wdGlvbnM/OiBLdGRTY3JvbGxJZk5lYXJFbGVtZW50T3B0aW9ucyk6IChzb3VyY2UkOiBPYnNlcnZhYmxlPHsgcG9pbnRlclg6IG51bWJlciwgcG9pbnRlclk6IG51bWJlciB9PikgPT4gT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGxldCBzY3JvbGxOb2RlOiBXaW5kb3cgfCBIVE1MRWxlbWVudDtcbiAgICBsZXQgc2Nyb2xsYWJsZVBhcmVudENsaWVudFJlY3Q6IEt0ZENsaWVudFJlY3Q7XG4gICAgbGV0IHNjcm9sbGFibGVQYXJlbnRTY3JvbGxXaWR0aDogbnVtYmVyO1xuXG4gICAgaWYgKHNjcm9sbGFibGVQYXJlbnQgPT09IGRvY3VtZW50KSB7XG4gICAgICAgIHNjcm9sbE5vZGUgPSBkb2N1bWVudC5kZWZhdWx0VmlldyBhcyBXaW5kb3c7XG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICBzY3JvbGxhYmxlUGFyZW50Q2xpZW50UmVjdCA9IHt3aWR0aCwgaGVpZ2h0LCB0b3A6IDAsIHJpZ2h0OiB3aWR0aCwgYm90dG9tOiBoZWlnaHQsIGxlZnQ6IDB9O1xuICAgICAgICBzY3JvbGxhYmxlUGFyZW50U2Nyb2xsV2lkdGggPSBnZXREb2N1bWVudFNjcm9sbFdpZHRoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2Nyb2xsTm9kZSA9IHNjcm9sbGFibGVQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHNjcm9sbGFibGVQYXJlbnRDbGllbnRSZWN0ID0gZ2V0TXV0YWJsZUNsaWVudFJlY3Qoc2Nyb2xsYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIHNjcm9sbGFibGVQYXJlbnRTY3JvbGxXaWR0aCA9IChzY3JvbGxhYmxlUGFyZW50IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJTVBPUlRBTlQ6IEJ5IGRlc2lnbiwgb25seSBsZXQgc2Nyb2xsIGhvcml6b250YWwgaWYgdGhlIHNjcm9sbGFibGUgcGFyZW50IGhhcyBleHBsaWNpdGx5IGFuIHNjcm9sbCBob3Jpem9udGFsLlxuICAgICAqIFRoaXMgbGF5b3V0IHNvbHV0aW9uIGlzIG5vdCBkZXNpZ25lZCBpbiBtaW5kIHRvIGhhdmUgYW55IHNjcm9sbCBob3Jpem9udGFsLCBidXQgZXhjZXB0aW9uYWxseSB3ZSBhbGxvdyBpdCBpbiB0aGlzXG4gICAgICogc3BlY2lmaWMgdXNlIGNhc2UuXG4gICAgICovXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZUhvcml6b250YWwgPT0gbnVsbCAmJiBzY3JvbGxhYmxlUGFyZW50U2Nyb2xsV2lkdGggPD0gc2Nyb2xsYWJsZVBhcmVudENsaWVudFJlY3Qud2lkdGgpIHtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2UkKSA9PiBzb3VyY2UkLnBpcGUoXG4gICAgICAgIG1hcCgoe3BvaW50ZXJYLCBwb2ludGVyWX0pID0+IHtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbiA9IGdldFZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uKHNjcm9sbGFibGVQYXJlbnRDbGllbnRSZWN0LCBwb2ludGVyWSk7XG4gICAgICAgICAgICBsZXQgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbiA9IGdldEhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24oc2Nyb2xsYWJsZVBhcmVudENsaWVudFJlY3QsIHBvaW50ZXJYKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc2Nyb2xsIGRpcmVjdGlvbnMgYXJlIGRpc2FibGVkLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmRpc2FibGVWZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uID0gQXV0b1Njcm9sbFZlcnRpY2FsRGlyZWN0aW9uLk5PTkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZGlzYWJsZUhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID0gQXV0b1Njcm9sbEhvcml6b250YWxEaXJlY3Rpb24uTk9ORTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHt2ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbiwgaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbn07XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgYWN0dWFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldi52ZXJ0aWNhbFNjcm9sbERpcmVjdGlvbiA9PT0gYWN0dWFsLnZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgJiYgcHJldi5ob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9uID09PSBhY3R1YWwuaG9yaXpvbnRhbFNjcm9sbERpcmVjdGlvbjtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoe3ZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uLCBob3Jpem9udGFsU2Nyb2xsRGlyZWN0aW9ufSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZlcnRpY2FsU2Nyb2xsRGlyZWN0aW9uIHx8IGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2Nyb2xsVG9EaXJlY3Rpb25JbnRlcnZhbCQoc2Nyb2xsTm9kZSwgdmVydGljYWxTY3JvbGxEaXJlY3Rpb24sIGhvcml6b250YWxTY3JvbGxEaXJlY3Rpb24sIG9wdGlvbnM/LnNjcm9sbFN0ZXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTkVWRVI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuLyoqXG4gKiBFbWl0cyBvbiBFVkVSWSBzY3JvbGwgZXZlbnQgYW5kIHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHNjcm9sbCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uLlxuICogQHBhcmFtIHNjcm9sbGFibGVQYXJlbnQsIG5vZGUgaW4gd2hpY2ggc2Nyb2xsIGV2ZW50cyB3b3VsZCBiZSBsaXN0ZW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZEdldFNjcm9sbFRvdGFsUmVsYXRpdmVEaWZmZXJlbmNlJChzY3JvbGxhYmxlUGFyZW50OiBIVE1MRWxlbWVudCB8IERvY3VtZW50KTogT2JzZXJ2YWJsZTx7IHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIgfT4ge1xuICAgIGxldCBzY3JvbGxJbml0aWFsUG9zaXRpb247XG5cbiAgICAvLyBDYWxjdWxhdGUgaW5pdGlhbCBzY3JvbGwgcG9zaXRpb25cbiAgICBpZiAoc2Nyb2xsYWJsZVBhcmVudCA9PT0gZG9jdW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsSW5pdGlhbFBvc2l0aW9uID0gZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNjcm9sbEluaXRpYWxQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHRvcDogKHNjcm9sbGFibGVQYXJlbnQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGxlZnQ6IChzY3JvbGxhYmxlUGFyZW50IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21FdmVudChzY3JvbGxhYmxlUGFyZW50LCAnc2Nyb2xsJywga3RkTm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7Y2FwdHVyZTogdHJ1ZX0pIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKS5waXBlKFxuICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld1RvcDogbnVtYmVyO1xuICAgICAgICAgICAgbGV0IG5ld0xlZnQ6IG51bWJlcjtcblxuICAgICAgICAgICAgaWYgKHNjcm9sbGFibGVQYXJlbnQgPT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTY3JvbGxQb3NpdGlvbiA9IGdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICBuZXdUb3AgPSB2aWV3cG9ydFNjcm9sbFBvc2l0aW9uLnRvcDtcbiAgICAgICAgICAgICAgICBuZXdMZWZ0ID0gdmlld3BvcnRTY3JvbGxQb3NpdGlvbi5sZWZ0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdUb3AgPSAoc2Nyb2xsYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIG5ld0xlZnQgPSAoc2Nyb2xsYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG9wRGlmZmVyZW5jZSA9IHNjcm9sbEluaXRpYWxQb3NpdGlvbi50b3AgLSBuZXdUb3A7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZmVyZW5jZSA9IHNjcm9sbEluaXRpYWxQb3NpdGlvbi5sZWZ0IC0gbmV3TGVmdDtcblxuICAgICAgICAgICAgcmV0dXJuIHt0b3A6IHRvcERpZmZlcmVuY2UsIGxlZnQ6IGxlZnREaWZmZXJlbmNlfTtcbiAgICAgICAgfSlcbiAgICApO1xuXG59XG5cbi8qKiBSZXR1cm5zIHRoZSB2aWV3cG9ydCdzIHdpZHRoIGFuZCBoZWlnaHQuICovXG5mdW5jdGlvbiBnZXRWaWV3cG9ydFNpemUoKTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBfd2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBfd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogX3dpbmRvdy5pbm5lckhlaWdodFxuICAgIH07XG5cbn1cblxuLyoqIEdldHMgYSBDbGllbnRSZWN0IGZvciB0aGUgdmlld3BvcnQncyBib3VuZHMuICovXG5mdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoKTogS3RkQ2xpZW50UmVjdCB7XG4gICAgLy8gVXNlIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgYm91bmRpbmcgcmVjdCByYXRoZXIgdGhhbiB0aGUgd2luZG93IHNjcm9sbCBwcm9wZXJ0aWVzXG4gICAgLy8gKGUuZy4gcGFnZVlPZmZzZXQsIHNjcm9sbFkpIGR1ZSB0byBpbiBpc3N1ZSBpbiBDaHJvbWUgYW5kIElFIHdoZXJlIHdpbmRvdyBzY3JvbGxcbiAgICAvLyBwcm9wZXJ0aWVzIGFuZCBjbGllbnQgY29vcmRpbmF0ZXMgKGJvdW5kaW5nQ2xpZW50UmVjdCwgY2xpZW50WC9ZLCBldGMuKSBhcmUgaW4gZGlmZmVyZW50XG4gICAgLy8gY29uY2VwdHVhbCB2aWV3cG9ydHMuIFVuZGVyIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGVzZSB2aWV3cG9ydHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCB0aGV5XG4gICAgLy8gY2FuIGRpc2FncmVlIHdoZW4gdGhlIHBhZ2UgaXMgcGluY2gtem9vbWVkIChvbiBkZXZpY2VzIHRoYXQgc3VwcG9ydCB0b3VjaCkuXG4gICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ4OTIwNiNjNFxuICAgIC8vIFdlIHVzZSB0aGUgZG9jdW1lbnRFbGVtZW50IGluc3RlYWQgb2YgdGhlIGJvZHkgYmVjYXVzZSwgYnkgZGVmYXVsdCAod2l0aG91dCBhIGNzcyByZXNldClcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZ2l2ZSB0aGUgZG9jdW1lbnQgYm9keSBhbiA4cHggbWFyZ2luLCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW5cbiAgICAvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5cbiAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IGdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBnZXRWaWV3cG9ydFNpemUoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogc2Nyb2xsUG9zaXRpb24udG9wLFxuICAgICAgICBsZWZ0OiBzY3JvbGxQb3NpdGlvbi5sZWZ0LFxuICAgICAgICBib3R0b206IHNjcm9sbFBvc2l0aW9uLnRvcCArIGhlaWdodCxcbiAgICAgICAgcmlnaHQ6IHNjcm9sbFBvc2l0aW9uLmxlZnQgKyB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICB9O1xufVxuXG4vKiogR2V0cyB0aGUgKHRvcCwgbGVmdCkgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSB2aWV3cG9ydC4gKi9cbmZ1bmN0aW9uIGdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTogeyB0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyIH0ge1xuXG4gICAgLy8gVGhlIHRvcC1sZWZ0LWNvcm5lciBvZiB0aGUgdmlld3BvcnQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgIC8vIGJvZHksIG5vcm1hbGx5IGp1c3QgKHNjcm9sbExlZnQsIHNjcm9sbFRvcCkuIEhvd2V2ZXIsIENocm9tZSBhbmQgRmlyZWZveCBkaXNhZ3JlZSBhYm91dFxuICAgIC8vIHdoZXRoZXIgYGRvY3VtZW50LmJvZHlgIG9yIGBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRgIGlzIHRoZSBzY3JvbGxlZCBlbGVtZW50LCBzbyByZWFkaW5nXG4gICAgLy8gYHNjcm9sbFRvcGAgYW5kIGBzY3JvbGxMZWZ0YCBpcyBpbmNvbnNpc3RlbnQuIEhvd2V2ZXIsIHVzaW5nIHRoZSBib3VuZGluZyByZWN0IG9mXG4gICAgLy8gYGRvY3VtZW50LmRvY3VtZW50RWxlbWVudGAgd29ya3MgY29uc2lzdGVudGx5LCB3aGVyZSB0aGUgYHRvcGAgYW5kIGBsZWZ0YCB2YWx1ZXMgd2lsbFxuICAgIC8vIGVxdWFsIG5lZ2F0aXZlIHRoZSBzY3JvbGwgcG9zaXRpb24uXG4gICAgY29uc3Qgd2luZG93UmVmID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCE7XG4gICAgY29uc3QgZG9jdW1lbnRSZWN0ID0gZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgdG9wID0gLWRvY3VtZW50UmVjdC50b3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgd2luZG93UmVmLnNjcm9sbFkgfHxcbiAgICAgICAgZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCAwO1xuXG4gICAgY29uc3QgbGVmdCA9IC1kb2N1bWVudFJlY3QubGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgd2luZG93UmVmLnNjcm9sbFggfHxcbiAgICAgICAgZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgMDtcblxuICAgIHJldHVybiB7dG9wLCBsZWZ0fTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGRvY3VtZW50IHNjcm9sbCB3aWR0aCAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnRTY3JvbGxXaWR0aCgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoKTtcbn1cblxuIl19
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Transition duration utilities.
3
+ * This file is taken from Angular Material repository.
4
+ */
5
+ /* eslint-disable @katoid/prefix-exported-code */
6
+ /** Parses a CSS time value to milliseconds. */
7
+ function parseCssTimeUnitsToMs(value) {
8
+ // Some browsers will return it in seconds, whereas others will return milliseconds.
9
+ const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;
10
+ return parseFloat(value) * multiplier;
11
+ }
12
+ /** Gets the transform transition duration, including the delay, of an element in milliseconds. */
13
+ export function getTransformTransitionDurationInMs(element) {
14
+ const computedStyle = getComputedStyle(element);
15
+ const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');
16
+ const property = transitionedProperties.find(prop => prop === 'transform' || prop === 'all');
17
+ // If there's no transition for `all` or `transform`, we shouldn't do anything.
18
+ if (!property) {
19
+ return 0;
20
+ }
21
+ // Get the index of the property that we're interested in and match
22
+ // it up to the same index in `transition-delay` and `transition-duration`.
23
+ const propertyIndex = transitionedProperties.indexOf(property);
24
+ const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');
25
+ const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');
26
+ return parseCssTimeUnitsToMs(rawDurations[propertyIndex]) +
27
+ parseCssTimeUnitsToMs(rawDelays[propertyIndex]);
28
+ }
29
+ /** Parses out multiple values from a computed style into an array. */
30
+ function parseCssPropertyValue(computedStyle, name) {
31
+ const value = computedStyle.getPropertyValue(name);
32
+ return value.split(',').map(part => part.trim());
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbi1kdXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvdXRpbHMvdHJhbnNpdGlvbi1kdXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxpREFBaUQ7QUFFakQsK0NBQStDO0FBQy9DLFNBQVMscUJBQXFCLENBQUMsS0FBYTtJQUMxQyxvRkFBb0Y7SUFDcEYsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLENBQUM7QUFFRCxrR0FBa0c7QUFDbEcsTUFBTSxVQUFVLGtDQUFrQyxDQUFDLE9BQW9CO0lBQ3JFLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELE1BQU0sc0JBQXNCLEdBQUcscUJBQXFCLENBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDM0YsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7SUFFN0YsK0VBQStFO0lBQy9FLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSwyRUFBMkU7SUFDM0UsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRTNFLE9BQU8scUJBQXFCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsU0FBUyxxQkFBcUIsQ0FBQyxhQUFrQyxFQUFFLElBQVk7SUFDN0UsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2l0aW9uIGR1cmF0aW9uIHV0aWxpdGllcy5cbiAqIFRoaXMgZmlsZSBpcyB0YWtlbiBmcm9tIEFuZ3VsYXIgTWF0ZXJpYWwgcmVwb3NpdG9yeS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAa2F0b2lkL3ByZWZpeC1leHBvcnRlZC1jb2RlICovXG5cbi8qKiBQYXJzZXMgYSBDU1MgdGltZSB2YWx1ZSB0byBtaWxsaXNlY29uZHMuICovXG5mdW5jdGlvbiBwYXJzZUNzc1RpbWVVbml0c1RvTXModmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFNvbWUgYnJvd3NlcnMgd2lsbCByZXR1cm4gaXQgaW4gc2Vjb25kcywgd2hlcmVhcyBvdGhlcnMgd2lsbCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICBjb25zdCBtdWx0aXBsaWVyID0gdmFsdWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdtcycpID4gLTEgPyAxIDogMTAwMDtcbiAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpICogbXVsdGlwbGllcjtcbn1cblxuLyoqIEdldHMgdGhlIHRyYW5zZm9ybSB0cmFuc2l0aW9uIGR1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIGRlbGF5LCBvZiBhbiBlbGVtZW50IGluIG1pbGxpc2Vjb25kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2Zvcm1UcmFuc2l0aW9uRHVyYXRpb25Jbk1zKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIGNvbnN0IHRyYW5zaXRpb25lZFByb3BlcnRpZXMgPSBwYXJzZUNzc1Byb3BlcnR5VmFsdWUoY29tcHV0ZWRTdHlsZSwgJ3RyYW5zaXRpb24tcHJvcGVydHknKTtcbiAgY29uc3QgcHJvcGVydHkgPSB0cmFuc2l0aW9uZWRQcm9wZXJ0aWVzLmZpbmQocHJvcCA9PiBwcm9wID09PSAndHJhbnNmb3JtJyB8fCBwcm9wID09PSAnYWxsJyk7XG5cbiAgLy8gSWYgdGhlcmUncyBubyB0cmFuc2l0aW9uIGZvciBgYWxsYCBvciBgdHJhbnNmb3JtYCwgd2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nLlxuICBpZiAoIXByb3BlcnR5KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdlJ3JlIGludGVyZXN0ZWQgaW4gYW5kIG1hdGNoXG4gIC8vIGl0IHVwIHRvIHRoZSBzYW1lIGluZGV4IGluIGB0cmFuc2l0aW9uLWRlbGF5YCBhbmQgYHRyYW5zaXRpb24tZHVyYXRpb25gLlxuICBjb25zdCBwcm9wZXJ0eUluZGV4ID0gdHJhbnNpdGlvbmVkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KTtcbiAgY29uc3QgcmF3RHVyYXRpb25zID0gcGFyc2VDc3NQcm9wZXJ0eVZhbHVlKGNvbXB1dGVkU3R5bGUsICd0cmFuc2l0aW9uLWR1cmF0aW9uJyk7XG4gIGNvbnN0IHJhd0RlbGF5cyA9IHBhcnNlQ3NzUHJvcGVydHlWYWx1ZShjb21wdXRlZFN0eWxlLCAndHJhbnNpdGlvbi1kZWxheScpO1xuXG4gIHJldHVybiBwYXJzZUNzc1RpbWVVbml0c1RvTXMocmF3RHVyYXRpb25zW3Byb3BlcnR5SW5kZXhdKSArXG4gICAgICAgICBwYXJzZUNzc1RpbWVVbml0c1RvTXMocmF3RGVsYXlzW3Byb3BlcnR5SW5kZXhdKTtcbn1cblxuLyoqIFBhcnNlcyBvdXQgbXVsdGlwbGUgdmFsdWVzIGZyb20gYSBjb21wdXRlZCBzdHlsZSBpbnRvIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gcGFyc2VDc3NQcm9wZXJ0eVZhbHVlKGNvbXB1dGVkU3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24sIG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWUgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChwYXJ0ID0+IHBhcnQudHJpbSgpKTtcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Removes and item from an array. Returns a new array instance (it doesn't mutate the source array).
3
+ * @param array source array to be returned without the element to remove
4
+ * @param condition function that will return true for the item that we want to remove
5
+ */
6
+ export function ktdArrayRemoveItem(array, condition) {
7
+ const arrayCopy = [...array];
8
+ const index = array.findIndex((item) => condition(item));
9
+ if (index > -1) {
10
+ arrayCopy.splice(index, 1);
11
+ }
12
+ return arrayCopy;
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUksS0FBVSxFQUFFLFNBQStCO0lBQzdFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUmVtb3ZlcyBhbmQgaXRlbSBmcm9tIGFuIGFycmF5LiBSZXR1cm5zIGEgbmV3IGFycmF5IGluc3RhbmNlIChpdCBkb2Vzbid0IG11dGF0ZSB0aGUgc291cmNlIGFycmF5KS5cclxuICogQHBhcmFtIGFycmF5IHNvdXJjZSBhcnJheSB0byBiZSByZXR1cm5lZCB3aXRob3V0IHRoZSBlbGVtZW50IHRvIHJlbW92ZVxyXG4gKiBAcGFyYW0gY29uZGl0aW9uIGZ1bmN0aW9uIHRoYXQgd2lsbCByZXR1cm4gdHJ1ZSBmb3IgdGhlIGl0ZW0gdGhhdCB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGt0ZEFycmF5UmVtb3ZlSXRlbTxUPihhcnJheTogVFtdLCBjb25kaXRpb246IChpdGVtOiBUKSA9PiBib29sZWFuKTogYW55IHtcclxuICAgIGNvbnN0IGFycmF5Q29weSA9IFsuLi5hcnJheV07XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmZpbmRJbmRleCgoaXRlbSkgPT4gY29uZGl0aW9uKGl0ZW0pKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgYXJyYXlDb3B5LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJyYXlDb3B5O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Public API Surface of grid
3
+ */
4
+ export { ktdGridCompact, ktdTrackById } from './lib/utils/grid.utils';
5
+ export * from './lib/directives/drag-handle';
6
+ export * from './lib/directives/resize-handle';
7
+ export * from './lib/directives/placeholder';
8
+ export * from './lib/grid-item/grid-item.component';
9
+ export * from './lib/grid.definitions';
10
+ export * from './lib/grid/grid.component';
11
+ export * from './lib/nav-container/nav-container.component';
12
+ export * from './lib/layout-container/layout-container.component';
13
+ export * from './lib/report-grid-layout/report-grid-layout.component';
14
+ export * from './lib/barsa-user-workspace.module';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBncmlkXG4gKi9cbmV4cG9ydCB7IGt0ZEdyaWRDb21wYWN0LCBrdGRUcmFja0J5SWQgfSBmcm9tICcuL2xpYi91dGlscy9ncmlkLnV0aWxzJztcbmV4cG9ydCB7IEt0ZENsaWVudFJlY3QgfSBmcm9tICcuL2xpYi91dGlscy9jbGllbnQtcmVjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2RyYWctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcmVzaXplLWhhbmRsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL3BsYWNlaG9sZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWQtaXRlbS9ncmlkLWl0ZW0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWQuZGVmaW5pdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3JpZC9ncmlkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9uYXYtY29udGFpbmVyL25hdi1jb250YWluZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xheW91dC1jb250YWluZXIvbGF5b3V0LWNvbnRhaW5lci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVwb3J0LWdyaWQtbGF5b3V0L3JlcG9ydC1ncmlkLWxheW91dC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYmFyc2EtdXNlci13b3Jrc3BhY2UubW9kdWxlJztcblxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgS3RkRGljdGlvbmFyeTxUPiB7XG4gICAgW2tleTogc3RyaW5nXTogVDtcbn1cbiJdfQ==