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.
- package/README.md +24 -0
- package/esm2022/barsa-user-workspace.mjs +5 -0
- package/esm2022/lib/barsa-user-workspace.module.mjs +82 -0
- package/esm2022/lib/coercion/boolean-property.mjs +5 -0
- package/esm2022/lib/coercion/number-property.mjs +14 -0
- package/esm2022/lib/directives/drag-handle.mjs +29 -0
- package/esm2022/lib/directives/placeholder.mjs +31 -0
- package/esm2022/lib/directives/resize-handle.mjs +29 -0
- package/esm2022/lib/grid/grid.component.mjs +609 -0
- package/esm2022/lib/grid-item/grid-item.component.mjs +196 -0
- package/esm2022/lib/grid.definitions.mjs +3 -0
- package/esm2022/lib/grid.service.mjs +49 -0
- package/esm2022/lib/layout-container/layout-container.component.mjs +213 -0
- package/esm2022/lib/layout-grid-mapper.pipe.mjs +29 -0
- package/esm2022/lib/nav-container/nav-container.component.mjs +27 -0
- package/esm2022/lib/report-grid-layout/report-grid-layout.component.mjs +15 -0
- package/esm2022/lib/utils/client-rect.mjs +57 -0
- package/esm2022/lib/utils/grid.utils.mjs +225 -0
- package/esm2022/lib/utils/operators.mjs +17 -0
- package/esm2022/lib/utils/passive-listeners.mjs +29 -0
- package/esm2022/lib/utils/pointer.utils.mjs +110 -0
- package/esm2022/lib/utils/react-grid-layout.utils.mjs +493 -0
- package/esm2022/lib/utils/scroll.mjs +233 -0
- package/esm2022/lib/utils/transition-duration.mjs +34 -0
- package/esm2022/lib/utils.mjs +14 -0
- package/esm2022/public-api.mjs +15 -0
- package/esm2022/types.mjs +2 -0
- package/fesm2022/barsa-user-workspace.mjs +2469 -0
- package/fesm2022/barsa-user-workspace.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/barsa-user-workspace.module.d.ts +34 -0
- package/lib/coercion/boolean-property.d.ts +7 -0
- package/lib/coercion/number-property.d.ts +9 -0
- package/lib/directives/drag-handle.d.ts +15 -0
- package/lib/directives/placeholder.d.ts +17 -0
- package/lib/directives/resize-handle.d.ts +15 -0
- package/lib/grid/grid.component.d.ts +147 -0
- package/lib/grid-item/grid-item.component.d.ts +83 -0
- package/lib/grid.definitions.d.ts +61 -0
- package/lib/grid.service.d.ts +15 -0
- package/lib/layout-container/layout-container.component.d.ts +79 -0
- package/lib/layout-grid-mapper.pipe.d.ts +9 -0
- package/lib/nav-container/nav-container.component.d.ts +10 -0
- package/lib/report-grid-layout/report-grid-layout.component.d.ts +7 -0
- package/lib/utils/client-rect.d.ts +36 -0
- package/lib/utils/grid.utils.d.ts +45 -0
- package/lib/utils/operators.d.ts +6 -0
- package/lib/utils/passive-listeners.d.ts +12 -0
- package/lib/utils/pointer.utils.d.ts +29 -0
- package/lib/utils/react-grid-layout.utils.d.ts +177 -0
- package/lib/utils/scroll.d.ts +28 -0
- package/lib/utils/transition-duration.d.ts +6 -0
- package/lib/utils.d.ts +6 -0
- package/package.json +25 -0
- package/public-api.d.ts +12 -0
- package/types.d.ts +3 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { fromEvent, iif, merge } from 'rxjs';
|
|
2
|
+
import { filter } from 'rxjs/operators';
|
|
3
|
+
import { ktdNormalizePassiveListenerOptions } from './passive-listeners';
|
|
4
|
+
/** Options that can be used to bind a passive event listener. */
|
|
5
|
+
const passiveEventListenerOptions = ktdNormalizePassiveListenerOptions({ passive: true });
|
|
6
|
+
/** Options that can be used to bind an active event listener. */
|
|
7
|
+
const activeEventListenerOptions = ktdNormalizePassiveListenerOptions({ passive: false });
|
|
8
|
+
let isMobile = null;
|
|
9
|
+
export function ktdIsMobileOrTablet() {
|
|
10
|
+
if (isMobile != null) {
|
|
11
|
+
return isMobile;
|
|
12
|
+
}
|
|
13
|
+
// Generic match pattern to identify mobile or tablet devices
|
|
14
|
+
const isMobileDevice = /Android|webOS|BlackBerry|Windows Phone|iPad|iPhone|iPod/i.test(navigator.userAgent);
|
|
15
|
+
// Since IOS 13 is not safe to just check for the generic solution. See: https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct
|
|
16
|
+
const isIOSMobileDevice = /iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
|
|
17
|
+
isMobile = isMobileDevice || isIOSMobileDevice;
|
|
18
|
+
return isMobile;
|
|
19
|
+
}
|
|
20
|
+
export function ktdIsMouseEvent(event) {
|
|
21
|
+
return event.clientX != null;
|
|
22
|
+
}
|
|
23
|
+
export function ktdIsTouchEvent(event) {
|
|
24
|
+
return event.touches != null && event.touches.length != null;
|
|
25
|
+
}
|
|
26
|
+
export function ktdPointerClientX(event) {
|
|
27
|
+
return ktdIsMouseEvent(event) ? event.clientX : event.touches[0].clientX;
|
|
28
|
+
}
|
|
29
|
+
export function ktdPointerClientY(event) {
|
|
30
|
+
return ktdIsMouseEvent(event) ? event.clientY : event.touches[0].clientY;
|
|
31
|
+
}
|
|
32
|
+
export function ktdPointerClient(event) {
|
|
33
|
+
return {
|
|
34
|
+
clientX: ktdIsMouseEvent(event) ? event.clientX : event.touches[0].clientX,
|
|
35
|
+
clientY: ktdIsMouseEvent(event) ? event.clientY : event.touches[0].clientY
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function ktdIsMouseEventOrMousePointerEvent(event) {
|
|
39
|
+
return event.type === 'mousedown'
|
|
40
|
+
|| (event.type === 'pointerdown' && event.pointerType === 'mouse');
|
|
41
|
+
}
|
|
42
|
+
/** Returns true if browser supports pointer events */
|
|
43
|
+
export function ktdSupportsPointerEvents() {
|
|
44
|
+
return !!window.PointerEvent;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Emits when a mousedown or touchstart emits. Avoids conflicts between both events.
|
|
48
|
+
* @param element, html element where to listen the events.
|
|
49
|
+
* @param touchNumber number of the touch to track the event, default to the first one.
|
|
50
|
+
*/
|
|
51
|
+
function ktdMouseOrTouchDown(element, touchNumber = 1) {
|
|
52
|
+
return iif(() => ktdIsMobileOrTablet(), fromEvent(element, 'touchstart', passiveEventListenerOptions).pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber)), fromEvent(element, 'mousedown', activeEventListenerOptions).pipe(filter((mouseEvent) => {
|
|
53
|
+
/**
|
|
54
|
+
* 0 : Left mouse button
|
|
55
|
+
* 1 : Wheel button or middle button (if present)
|
|
56
|
+
* 2 : Right mouse button
|
|
57
|
+
*/
|
|
58
|
+
return mouseEvent.button === 0; // Mouse down to be only fired if is left click
|
|
59
|
+
})));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Emits when a 'mousemove' or a 'touchmove' event gets fired.
|
|
63
|
+
* @param element, html element where to listen the events.
|
|
64
|
+
* @param touchNumber number of the touch to track the event, default to the first one.
|
|
65
|
+
*/
|
|
66
|
+
function ktdMouseOrTouchMove(element, touchNumber = 1) {
|
|
67
|
+
return iif(() => ktdIsMobileOrTablet(), fromEvent(element, 'touchmove', activeEventListenerOptions).pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber)), fromEvent(element, 'mousemove', activeEventListenerOptions));
|
|
68
|
+
}
|
|
69
|
+
export function ktdTouchEnd(element, touchNumber = 1) {
|
|
70
|
+
return merge(fromEvent(element, 'touchend').pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber - 1)), fromEvent(element, 'touchcancel').pipe(filter((touchEvent) => touchEvent.touches.length === touchNumber - 1)));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Emits when a there is a 'mouseup' or the touch ends.
|
|
74
|
+
* @param element, html element where to listen the events.
|
|
75
|
+
* @param touchNumber number of the touch to track the event, default to the first one.
|
|
76
|
+
*/
|
|
77
|
+
function ktdMouserOrTouchEnd(element, touchNumber = 1) {
|
|
78
|
+
return iif(() => ktdIsMobileOrTablet(), ktdTouchEnd(element, touchNumber), fromEvent(element, 'mouseup'));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Emits when a 'pointerdown' event occurs (only for the primary pointer). Fallbacks to 'mousemove' or a 'touchmove' if pointer events are not supported.
|
|
82
|
+
* @param element, html element where to listen the events.
|
|
83
|
+
*/
|
|
84
|
+
export function ktdPointerDown(element) {
|
|
85
|
+
if (!ktdSupportsPointerEvents()) {
|
|
86
|
+
return ktdMouseOrTouchDown(element);
|
|
87
|
+
}
|
|
88
|
+
return fromEvent(element, 'pointerdown', activeEventListenerOptions).pipe(filter((pointerEvent) => pointerEvent.isPrimary));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Emits when a 'pointermove' event occurs (only for the primary pointer). Fallbacks to 'mousemove' or a 'touchmove' if pointer events are not supported.
|
|
92
|
+
* @param element, html element where to listen the events.
|
|
93
|
+
*/
|
|
94
|
+
export function ktdPointerMove(element) {
|
|
95
|
+
if (!ktdSupportsPointerEvents()) {
|
|
96
|
+
return ktdMouseOrTouchMove(element);
|
|
97
|
+
}
|
|
98
|
+
return fromEvent(element, 'pointermove', activeEventListenerOptions).pipe(filter((pointerEvent) => pointerEvent.isPrimary));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Emits when a 'pointerup' event occurs (only for the primary pointer). Fallbacks to 'mousemove' or a 'touchmove' if pointer events are not supported.
|
|
102
|
+
* @param element, html element where to listen the events.
|
|
103
|
+
*/
|
|
104
|
+
export function ktdPointerUp(element) {
|
|
105
|
+
if (!ktdSupportsPointerEvents()) {
|
|
106
|
+
return ktdMouserOrTouchEnd(element);
|
|
107
|
+
}
|
|
108
|
+
return fromEvent(element, 'pointerup').pipe(filter(pointerEvent => pointerEvent.isPrimary));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvdXRpbHMvcG9pbnRlci51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpFLGlFQUFpRTtBQUNqRSxNQUFNLDJCQUEyQixHQUFHLGtDQUFrQyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFeEYsaUVBQWlFO0FBQ2pFLE1BQU0sMEJBQTBCLEdBQUcsa0NBQWtDLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUV4RixJQUFJLFFBQVEsR0FBbUIsSUFBSSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxtQkFBbUI7SUFFL0IsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxNQUFNLGNBQWMsR0FBRywwREFBMEQsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTVHLG9NQUFvTTtJQUNwTSxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLFVBQVUsSUFBSSxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTdJLFFBQVEsR0FBRyxjQUFjLElBQUksaUJBQWlCLENBQUM7SUFFL0MsT0FBTyxRQUFRLENBQUM7QUFD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LENBQUE7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFPO0lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7UUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQWUsT0FBTyxFQUFFLGFBQWEsRUFBRSwwQkFBcUQsQ0FBQyxDQUFDLElBQUksQ0FDOUcsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQ25ELENBQUM7QUFDTixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFPO0lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7UUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQWUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbUV2ZW50LCBpaWYsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBrdGROb3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zIH0gZnJvbSAnLi9wYXNzaXZlLWxpc3RlbmVycyc7XG5cbi8qKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gYmluZCBhIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXIuICovXG5jb25zdCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSBrdGROb3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHtwYXNzaXZlOiB0cnVlfSk7XG5cbi8qKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gYmluZCBhbiBhY3RpdmUgZXZlbnQgbGlzdGVuZXIuICovXG5jb25zdCBhY3RpdmVFdmVudExpc3RlbmVyT3B0aW9ucyA9IGt0ZE5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMoe3Bhc3NpdmU6IGZhbHNlfSk7XG5cbmxldCBpc01vYmlsZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24ga3RkSXNNb2JpbGVPclRhYmxldCgpOiBib29sZWFuIHtcblxuICAgIGlmIChpc01vYmlsZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpc01vYmlsZTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmljIG1hdGNoIHBhdHRlcm4gdG8gaWRlbnRpZnkgbW9iaWxlIG9yIHRhYmxldCBkZXZpY2VzXG4gICAgY29uc3QgaXNNb2JpbGVEZXZpY2UgPSAvQW5kcm9pZHx3ZWJPU3xCbGFja0JlcnJ5fFdpbmRvd3MgUGhvbmV8aVBhZHxpUGhvbmV8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbiAgICAvLyBTaW5jZSBJT1MgMTMgaXMgbm90IHNhZmUgdG8ganVzdCBjaGVjayBmb3IgdGhlIGdlbmVyaWMgc29sdXRpb24uIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTgwMTk0NjMvaG93LXRvLWRldGVjdC1kZXZpY2UtbmFtZS1pbi1zYWZhcmktb24taW9zLTEzLXdoaWxlLWl0LWRvZXNudC1zaG93LXRoZS1jb3JyZWN0XG4gICAgY29uc3QgaXNJT1NNb2JpbGVEZXZpY2UgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pIHx8IChuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMSk7XG5cbiAgICBpc01vYmlsZSA9IGlzTW9iaWxlRGV2aWNlIHx8IGlzSU9TTW9iaWxlRGV2aWNlO1xuXG4gICAgcmV0dXJuIGlzTW9iaWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3RkSXNNb3VzZUV2ZW50KGV2ZW50OiBhbnkpOiBldmVudCBpcyBNb3VzZUV2ZW50IHtcbiAgICByZXR1cm4gKGV2ZW50IGFzIE1vdXNlRXZlbnQpLmNsaWVudFggIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt0ZElzVG91Y2hFdmVudChldmVudDogYW55KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XG4gICAgcmV0dXJuIChldmVudCBhcyBUb3VjaEV2ZW50KS50b3VjaGVzICE9IG51bGwgJiYgKGV2ZW50IGFzIFRvdWNoRXZlbnQpLnRvdWNoZXMubGVuZ3RoICE9IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdGRQb2ludGVyQ2xpZW50WChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBrdGRJc01vdXNlRXZlbnQoZXZlbnQpID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt0ZFBvaW50ZXJDbGllbnRZKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGt0ZElzTW91c2VFdmVudChldmVudCkgPyBldmVudC5jbGllbnRZIDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3RkUG9pbnRlckNsaWVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB7IGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNsaWVudFg6IGt0ZElzTW91c2VFdmVudChldmVudCkgPyBldmVudC5jbGllbnRYIDogZXZlbnQudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBrdGRJc01vdXNlRXZlbnQoZXZlbnQpID8gZXZlbnQuY2xpZW50WSA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WVxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdGRJc01vdXNlRXZlbnRPck1vdXNlUG9pbnRlckV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC50eXBlID09PSAnbW91c2Vkb3duJ1xuICAgICAgICB8fCAoZXZlbnQudHlwZSA9PT0gJ3BvaW50ZXJkb3duJyAmJiAoZXZlbnQgYXMgUG9pbnRlckV2ZW50KS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYnJvd3NlciBzdXBwb3J0cyBwb2ludGVyIGV2ZW50cyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFN1cHBvcnRzUG9pbnRlckV2ZW50cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEVtaXRzIHdoZW4gYSBtb3VzZWRvd24gb3IgdG91Y2hzdGFydCBlbWl0cy4gQXZvaWRzIGNvbmZsaWN0cyBiZXR3ZWVuIGJvdGggZXZlbnRzLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byAgbGlzdGVuIHRoZSBldmVudHMuXG4gKiBAcGFyYW0gdG91Y2hOdW1iZXIgbnVtYmVyIG9mIHRoZSB0b3VjaCB0byB0cmFjayB0aGUgZXZlbnQsIGRlZmF1bHQgdG8gdGhlIGZpcnN0IG9uZS5cbiAqL1xuZnVuY3Rpb24ga3RkTW91c2VPclRvdWNoRG93bihlbGVtZW50LCB0b3VjaE51bWJlciA9IDEpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50PiB7XG4gICAgcmV0dXJuIGlpZihcbiAgICAgICAgKCkgPT4ga3RkSXNNb2JpbGVPclRhYmxldCgpLFxuICAgICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWxlbWVudCwgJ3RvdWNoc3RhcnQnLCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKHRvdWNoRXZlbnQpID0+IHRvdWNoRXZlbnQudG91Y2hlcy5sZW5ndGggPT09IHRvdWNoTnVtYmVyKVxuICAgICAgICApLFxuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWxlbWVudCwgJ21vdXNlZG93bicsIGFjdGl2ZUV2ZW50TGlzdGVuZXJPcHRpb25zIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogMCA6IExlZnQgbW91c2UgYnV0dG9uXG4gICAgICAgICAgICAgICAgICogMSA6IFdoZWVsIGJ1dHRvbiBvciBtaWRkbGUgYnV0dG9uIChpZiBwcmVzZW50KVxuICAgICAgICAgICAgICAgICAqIDIgOiBSaWdodCBtb3VzZSBidXR0b25cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gbW91c2VFdmVudC5idXR0b24gPT09IDA7IC8vIE1vdXNlIGRvd24gdG8gYmUgb25seSBmaXJlZCBpZiBpcyBsZWZ0IGNsaWNrXG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgKTtcbn1cblxuLyoqXG4gKiBFbWl0cyB3aGVuIGEgJ21vdXNlbW92ZScgb3IgYSAndG91Y2htb3ZlJyBldmVudCBnZXRzIGZpcmVkLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byAgbGlzdGVuIHRoZSBldmVudHMuXG4gKiBAcGFyYW0gdG91Y2hOdW1iZXIgbnVtYmVyIG9mIHRoZSB0b3VjaCB0byB0cmFjayB0aGUgZXZlbnQsIGRlZmF1bHQgdG8gdGhlIGZpcnN0IG9uZS5cbiAqL1xuZnVuY3Rpb24ga3RkTW91c2VPclRvdWNoTW92ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgdG91Y2hOdW1iZXIgPSAxKTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudD4ge1xuICAgIHJldHVybiBpaWYoXG4gICAgICAgICgpID0+IGt0ZElzTW9iaWxlT3JUYWJsZXQoKSxcbiAgICAgICAgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGVsZW1lbnQsICd0b3VjaG1vdmUnLCBhY3RpdmVFdmVudExpc3RlbmVyT3B0aW9ucyBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucykucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigodG91Y2hFdmVudCkgPT4gdG91Y2hFdmVudC50b3VjaGVzLmxlbmd0aCA9PT0gdG91Y2hOdW1iZXIpLFxuICAgICAgICApLFxuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWxlbWVudCwgJ21vdXNlbW92ZScsIGFjdGl2ZUV2ZW50TGlzdGVuZXJPcHRpb25zIGFzIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdGRUb3VjaEVuZChlbGVtZW50LCB0b3VjaE51bWJlciA9IDEpOiBPYnNlcnZhYmxlPFRvdWNoRXZlbnQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50PihlbGVtZW50LCAndG91Y2hlbmQnKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh0b3VjaEV2ZW50KSA9PiB0b3VjaEV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSB0b3VjaE51bWJlciAtIDEpXG4gICAgICAgICksXG4gICAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50PihlbGVtZW50LCAndG91Y2hjYW5jZWwnKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh0b3VjaEV2ZW50KSA9PiB0b3VjaEV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSB0b3VjaE51bWJlciAtIDEpXG4gICAgICAgIClcbiAgICApO1xufVxuXG4vKipcbiAqIEVtaXRzIHdoZW4gYSB0aGVyZSBpcyBhICdtb3VzZXVwJyBvciB0aGUgdG91Y2ggZW5kcy5cbiAqIEBwYXJhbSBlbGVtZW50LCBodG1sIGVsZW1lbnQgd2hlcmUgdG8gIGxpc3RlbiB0aGUgZXZlbnRzLlxuICogQHBhcmFtIHRvdWNoTnVtYmVyIG51bWJlciBvZiB0aGUgdG91Y2ggdG8gdHJhY2sgdGhlIGV2ZW50LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBvbmUuXG4gKi9cbmZ1bmN0aW9uIGt0ZE1vdXNlck9yVG91Y2hFbmQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHRvdWNoTnVtYmVyID0gMSk6IE9ic2VydmFibGU8TW91c2VFdmVudCB8IFRvdWNoRXZlbnQ+IHtcbiAgICByZXR1cm4gaWlmKFxuICAgICAgICAoKSA9PiBrdGRJc01vYmlsZU9yVGFibGV0KCksXG4gICAgICAgIGt0ZFRvdWNoRW5kKGVsZW1lbnQsIHRvdWNoTnVtYmVyKSxcbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsZW1lbnQsICdtb3VzZXVwJyksXG4gICAgKTtcbn1cblxuXG4vKipcbiAqIEVtaXRzIHdoZW4gYSAncG9pbnRlcmRvd24nIGV2ZW50IG9jY3VycyAob25seSBmb3IgdGhlIHByaW1hcnkgcG9pbnRlcikuIEZhbGxiYWNrcyB0byAnbW91c2Vtb3ZlJyBvciBhICd0b3VjaG1vdmUnIGlmIHBvaW50ZXIgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byBsaXN0ZW4gdGhlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFBvaW50ZXJEb3duKGVsZW1lbnQpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgUG9pbnRlckV2ZW50PiB7XG4gICAgaWYgKCFrdGRTdXBwb3J0c1BvaW50ZXJFdmVudHMoKSkge1xuICAgICAgICByZXR1cm4ga3RkTW91c2VPclRvdWNoRG93bihlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbUV2ZW50PFBvaW50ZXJFdmVudD4oZWxlbWVudCwgJ3BvaW50ZXJkb3duJywgYWN0aXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpLnBpcGUoXG4gICAgICAgIGZpbHRlcigocG9pbnRlckV2ZW50KSA9PiBwb2ludGVyRXZlbnQuaXNQcmltYXJ5KVxuICAgIClcbn1cblxuLyoqXG4gKiBFbWl0cyB3aGVuIGEgJ3BvaW50ZXJtb3ZlJyBldmVudCBvY2N1cnMgKG9ubHkgZm9yIHRoZSBwcmltYXJ5IHBvaW50ZXIpLiBGYWxsYmFja3MgdG8gJ21vdXNlbW92ZScgb3IgYSAndG91Y2htb3ZlJyBpZiBwb2ludGVyIGV2ZW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBlbGVtZW50LCBodG1sIGVsZW1lbnQgd2hlcmUgdG8gbGlzdGVuIHRoZSBldmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrdGRQb2ludGVyTW92ZShlbGVtZW50KTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudD4ge1xuICAgIGlmICgha3RkU3VwcG9ydHNQb2ludGVyRXZlbnRzKCkpIHtcbiAgICAgICAgcmV0dXJuIGt0ZE1vdXNlT3JUb3VjaE1vdmUoZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50PihlbGVtZW50LCAncG9pbnRlcm1vdmUnLCBhY3RpdmVFdmVudExpc3RlbmVyT3B0aW9ucyBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucykucGlwZShcbiAgICAgICAgZmlsdGVyKChwb2ludGVyRXZlbnQpID0+IHBvaW50ZXJFdmVudC5pc1ByaW1hcnkpLFxuICAgICk7XG59XG5cbi8qKlxuICogRW1pdHMgd2hlbiBhICdwb2ludGVydXAnIGV2ZW50IG9jY3VycyAob25seSBmb3IgdGhlIHByaW1hcnkgcG9pbnRlcikuIEZhbGxiYWNrcyB0byAnbW91c2Vtb3ZlJyBvciBhICd0b3VjaG1vdmUnIGlmIHBvaW50ZXIgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIGVsZW1lbnQsIGh0bWwgZWxlbWVudCB3aGVyZSB0byBsaXN0ZW4gdGhlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFBvaW50ZXJVcChlbGVtZW50KTogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudD4ge1xuICAgIGlmICgha3RkU3VwcG9ydHNQb2ludGVyRXZlbnRzKCkpIHtcbiAgICAgICAgcmV0dXJuIGt0ZE1vdXNlck9yVG91Y2hFbmQoZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tRXZlbnQ8UG9pbnRlckV2ZW50PihlbGVtZW50LCAncG9pbnRlcnVwJykucGlwZShmaWx0ZXIocG9pbnRlckV2ZW50ID0+IHBvaW50ZXJFdmVudC5pc1ByaW1hcnkpKTtcbn1cbiJdfQ==
|