@skyux/core 11.39.0 → 12.0.0-alpha.1
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/documentation.json +600 -536
- package/fesm2022/skyux-core-testing.mjs +26 -26
- package/fesm2022/skyux-core-testing.mjs.map +1 -1
- package/fesm2022/skyux-core.mjs +188 -188
- package/fesm2022/skyux-core.mjs.map +1 -1
- package/lib/modules/content-info-provider/content-info-provider.d.ts +0 -3
- package/lib/modules/dock/dock.service.d.ts +2 -0
- package/package.json +8 -12
- package/esm2022/index.mjs +0 -67
- package/esm2022/lib/modules/adapter-service/adapter.module.mjs +0 -16
- package/esm2022/lib/modules/adapter-service/adapter.service.mjs +0 -205
- package/esm2022/lib/modules/adapter-service/focusable-children-options.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-auto-fit-context.mjs +0 -12
- package/esm2022/lib/modules/affix/affix-config.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-horizontal-alignment.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-offset-change.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-offset.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-placement-change.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-placement.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-position.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-rect.mjs +0 -2
- package/esm2022/lib/modules/affix/affix-utils.mjs +0 -18
- package/esm2022/lib/modules/affix/affix-vertical-alignment.mjs +0 -2
- package/esm2022/lib/modules/affix/affix.directive.mjs +0 -116
- package/esm2022/lib/modules/affix/affix.module.mjs +0 -18
- package/esm2022/lib/modules/affix/affix.service.mjs +0 -48
- package/esm2022/lib/modules/affix/affixer.mjs +0 -426
- package/esm2022/lib/modules/affix/dom-utils.mjs +0 -126
- package/esm2022/lib/modules/breakpoint-observer/breakpoint-observer.mjs +0 -2
- package/esm2022/lib/modules/breakpoint-observer/breakpoint-observer.token.mjs +0 -7
- package/esm2022/lib/modules/breakpoint-observer/breakpoint-utils.mjs +0 -38
- package/esm2022/lib/modules/breakpoint-observer/breakpoint.mjs +0 -6
- package/esm2022/lib/modules/breakpoint-observer/container-breakpoint-observer.mjs +0 -64
- package/esm2022/lib/modules/breakpoint-observer/media-breakpoint-observer.mjs +0 -58
- package/esm2022/lib/modules/breakpoint-observer/provide-breakpoint-observer.mjs +0 -24
- package/esm2022/lib/modules/breakpoint-observer/responsive-host.directive.mjs +0 -55
- package/esm2022/lib/modules/content-info-provider/content-info-descriptor.mjs +0 -2
- package/esm2022/lib/modules/content-info-provider/content-info-provider.mjs +0 -31
- package/esm2022/lib/modules/content-info-provider/content-info.mjs +0 -2
- package/esm2022/lib/modules/default-input-provider/default-input-provider.mjs +0 -26
- package/esm2022/lib/modules/dock/dock-dom-adapter.service.mjs +0 -81
- package/esm2022/lib/modules/dock/dock-insert-component-config.mjs +0 -2
- package/esm2022/lib/modules/dock/dock-item-config.mjs +0 -2
- package/esm2022/lib/modules/dock/dock-item-reference.mjs +0 -2
- package/esm2022/lib/modules/dock/dock-item.mjs +0 -31
- package/esm2022/lib/modules/dock/dock-location.mjs +0 -19
- package/esm2022/lib/modules/dock/dock-options.mjs +0 -2
- package/esm2022/lib/modules/dock/dock.component.mjs +0 -101
- package/esm2022/lib/modules/dock/dock.module.mjs +0 -15
- package/esm2022/lib/modules/dock/dock.service.mjs +0 -97
- package/esm2022/lib/modules/dock/sort-by-stack-order.mjs +0 -13
- package/esm2022/lib/modules/dynamic-component/dynamic-component-location.mjs +0 -27
- package/esm2022/lib/modules/dynamic-component/dynamic-component-options.mjs +0 -2
- package/esm2022/lib/modules/dynamic-component/dynamic-component.module.mjs +0 -17
- package/esm2022/lib/modules/dynamic-component/dynamic-component.service.mjs +0 -113
- package/esm2022/lib/modules/file-reader/file-reader.service.mjs +0 -32
- package/esm2022/lib/modules/format/app-format.mjs +0 -18
- package/esm2022/lib/modules/help/help-global-options-token.mjs +0 -6
- package/esm2022/lib/modules/help/help-global-options.mjs +0 -2
- package/esm2022/lib/modules/help/help-open-args.mjs +0 -2
- package/esm2022/lib/modules/help/help-update-args.mjs +0 -2
- package/esm2022/lib/modules/help/help.service.mjs +0 -20
- package/esm2022/lib/modules/id/id.directive.mjs +0 -31
- package/esm2022/lib/modules/id/id.module.mjs +0 -16
- package/esm2022/lib/modules/id/id.service.mjs +0 -24
- package/esm2022/lib/modules/layout-host/layout-host-for-child-args.mjs +0 -2
- package/esm2022/lib/modules/layout-host/layout-host.service.mjs +0 -22
- package/esm2022/lib/modules/live-announcer/live-announcer.service.mjs +0 -81
- package/esm2022/lib/modules/live-announcer/types/live-announcer-args.mjs +0 -2
- package/esm2022/lib/modules/live-announcer/types/live-announcer-politeness.mjs +0 -2
- package/esm2022/lib/modules/log/log.module.mjs +0 -16
- package/esm2022/lib/modules/log/log.service.mjs +0 -148
- package/esm2022/lib/modules/log/types/log-deprecation-args.mjs +0 -2
- package/esm2022/lib/modules/log/types/log-level-token.mjs +0 -6
- package/esm2022/lib/modules/log/types/log-level.mjs +0 -10
- package/esm2022/lib/modules/media-query/media-breakpoints.mjs +0 -24
- package/esm2022/lib/modules/media-query/media-query-listener.mjs +0 -2
- package/esm2022/lib/modules/media-query/media-query.module.mjs +0 -16
- package/esm2022/lib/modules/media-query/media-query.service.mjs +0 -82
- package/esm2022/lib/modules/mutation/mutation-observer-service.mjs +0 -19
- package/esm2022/lib/modules/numeric/numeric-symbol.mjs +0 -2
- package/esm2022/lib/modules/numeric/numeric.module.mjs +0 -19
- package/esm2022/lib/modules/numeric/numeric.options.mjs +0 -24
- package/esm2022/lib/modules/numeric/numeric.pipe.mjs +0 -84
- package/esm2022/lib/modules/numeric/numeric.service.mjs +0 -200
- package/esm2022/lib/modules/overlay/overlay-adapter.service.mjs +0 -74
- package/esm2022/lib/modules/overlay/overlay-config.mjs +0 -2
- package/esm2022/lib/modules/overlay/overlay-context.mjs +0 -10
- package/esm2022/lib/modules/overlay/overlay-instance.mjs +0 -62
- package/esm2022/lib/modules/overlay/overlay-position.mjs +0 -2
- package/esm2022/lib/modules/overlay/overlay.component.mjs +0 -203
- package/esm2022/lib/modules/overlay/overlay.module.mjs +0 -15
- package/esm2022/lib/modules/overlay/overlay.service.mjs +0 -134
- package/esm2022/lib/modules/percent-pipe/percent-pipe.module.mjs +0 -19
- package/esm2022/lib/modules/percent-pipe/percent.pipe.mjs +0 -56
- package/esm2022/lib/modules/resize-observer/resize-observer-media-query.service.mjs +0 -153
- package/esm2022/lib/modules/resize-observer/resize-observer.service.mjs +0 -115
- package/esm2022/lib/modules/screen-reader-label/screen-reader-label.directive.mjs +0 -66
- package/esm2022/lib/modules/scroll-shadow/scroll-shadow-event-args.mjs +0 -2
- package/esm2022/lib/modules/scroll-shadow/scroll-shadow.directive.mjs +0 -123
- package/esm2022/lib/modules/scrollable-host/scrollable-host.service.mjs +0 -223
- package/esm2022/lib/modules/shared/number-format/number-format-utility.mjs +0 -72
- package/esm2022/lib/modules/shared/sky-core-resources.module.mjs +0 -34
- package/esm2022/lib/modules/stacking-context/stacking-context-token.mjs +0 -6
- package/esm2022/lib/modules/stacking-context/stacking-context.mjs +0 -2
- package/esm2022/lib/modules/title/set-title-args.mjs +0 -2
- package/esm2022/lib/modules/title/title.service.mjs +0 -31
- package/esm2022/lib/modules/trim/trim.directive.mjs +0 -64
- package/esm2022/lib/modules/trim/trim.module.mjs +0 -16
- package/esm2022/lib/modules/ui-config/ui-config.service.mjs +0 -21
- package/esm2022/lib/modules/viewkeeper/viewkeeper-boundary-info.mjs +0 -2
- package/esm2022/lib/modules/viewkeeper/viewkeeper-fixed-styles.mjs +0 -2
- package/esm2022/lib/modules/viewkeeper/viewkeeper-host-options.mjs +0 -10
- package/esm2022/lib/modules/viewkeeper/viewkeeper-offset.mjs +0 -2
- package/esm2022/lib/modules/viewkeeper/viewkeeper-options.mjs +0 -2
- package/esm2022/lib/modules/viewkeeper/viewkeeper.directive.mjs +0 -131
- package/esm2022/lib/modules/viewkeeper/viewkeeper.mjs +0 -296
- package/esm2022/lib/modules/viewkeeper/viewkeeper.module.mjs +0 -16
- package/esm2022/lib/modules/viewkeeper/viewkeeper.service.mjs +0 -39
- package/esm2022/lib/modules/window/window-ref.mjs +0 -30
- package/esm2022/skyux-core.mjs +0 -5
- package/esm2022/testing/legacy/core-testing.module.mjs +0 -32
- package/esm2022/testing/legacy/mock-media-query.service.mjs +0 -47
- package/esm2022/testing/legacy/mock-ui-config.service.mjs +0 -62
- package/esm2022/testing/legacy/resize-observer-mock.mjs +0 -50
- package/esm2022/testing/modules/file-reader/file-reader-testing.service.mjs +0 -19
- package/esm2022/testing/modules/file-reader/provide-file-reader-testing.mjs +0 -22
- package/esm2022/testing/modules/help/help-testing-controller.mjs +0 -28
- package/esm2022/testing/modules/help/help-testing.module.mjs +0 -32
- package/esm2022/testing/modules/help/help-testing.service.mjs +0 -37
- package/esm2022/testing/modules/media-query/breakpoint-observer-testing.mjs +0 -26
- package/esm2022/testing/modules/media-query/media-query-testing-controller.mjs +0 -22
- package/esm2022/testing/modules/media-query/provide-media-query-testing.mjs +0 -26
- package/esm2022/testing/modules/overlay/overlay-harness-filters.mjs +0 -2
- package/esm2022/testing/modules/overlay/overlay-harness.mjs +0 -20
- package/esm2022/testing/public-api.mjs +0 -15
- package/esm2022/testing/shared/component-harness.mjs +0 -13
- package/esm2022/testing/shared/harness-filters.mjs +0 -2
- package/esm2022/testing/shared/harness-utility.mjs +0 -7
- package/esm2022/testing/shared/input-harness.mjs +0 -63
- package/esm2022/testing/shared/queryable-component-harness.mjs +0 -43
- package/esm2022/testing/skyux-core-testing.mjs +0 -5
- package/esm2022/version.mjs +0 -19
@@ -1,426 +0,0 @@
|
|
1
|
-
import { Subject, Subscription } from 'rxjs';
|
2
|
-
import { SkyAffixAutoFitContext } from './affix-auto-fit-context';
|
3
|
-
import { getInversePlacement, getNextPlacement } from './affix-utils';
|
4
|
-
import { getElementOffset, getOuterRect, getOverflowParents, getVisibleRectForElement, isOffsetFullyVisibleWithinParent, isOffsetPartiallyVisibleWithinParent, } from './dom-utils';
|
5
|
-
const DEFAULT_AFFIX_CONFIG = {
|
6
|
-
autoFitContext: SkyAffixAutoFitContext.OverflowParent,
|
7
|
-
enableAutoFit: false,
|
8
|
-
horizontalAlignment: 'center',
|
9
|
-
isSticky: false,
|
10
|
-
placement: 'above',
|
11
|
-
};
|
12
|
-
export class SkyAffixer {
|
13
|
-
/**
|
14
|
-
* Fires when the affixed element's offset changes.
|
15
|
-
*/
|
16
|
-
get offsetChange() {
|
17
|
-
return this.#offsetChangeObs;
|
18
|
-
}
|
19
|
-
/**
|
20
|
-
* Fires when the base element's nearest overflow parent is scrolling. This is useful if you need
|
21
|
-
* to perform an additional action during the scroll event but don't want to generate another
|
22
|
-
* event listener.
|
23
|
-
*/
|
24
|
-
get overflowScroll() {
|
25
|
-
return this.#overflowScrollObs;
|
26
|
-
}
|
27
|
-
/**
|
28
|
-
* Fires when the placement value changes. A `null` value indicates that a suitable
|
29
|
-
* placement could not be found.
|
30
|
-
*/
|
31
|
-
get placementChange() {
|
32
|
-
return this.#placementChangeObs;
|
33
|
-
}
|
34
|
-
get #config() {
|
35
|
-
return this.#_config;
|
36
|
-
}
|
37
|
-
set #config(value) {
|
38
|
-
const merged = {
|
39
|
-
...DEFAULT_AFFIX_CONFIG,
|
40
|
-
...value,
|
41
|
-
};
|
42
|
-
// Make sure none of the values are undefined.
|
43
|
-
let key;
|
44
|
-
for (key in merged) {
|
45
|
-
if (merged[key] === undefined) {
|
46
|
-
merged[key] = DEFAULT_AFFIX_CONFIG[key];
|
47
|
-
}
|
48
|
-
}
|
49
|
-
this.#_config = merged;
|
50
|
-
}
|
51
|
-
#affixedElement;
|
52
|
-
#baseElement;
|
53
|
-
#currentOffset;
|
54
|
-
#currentPlacement;
|
55
|
-
#layoutViewport;
|
56
|
-
#offsetChange;
|
57
|
-
#offsetChangeObs;
|
58
|
-
#overflowParents = [];
|
59
|
-
#overflowScroll;
|
60
|
-
#overflowScrollObs;
|
61
|
-
#placementChange;
|
62
|
-
#placementChangeObs;
|
63
|
-
#renderer;
|
64
|
-
#scrollChange = new Subject();
|
65
|
-
#viewportListeners;
|
66
|
-
#viewportRuler;
|
67
|
-
#zone;
|
68
|
-
#_config = DEFAULT_AFFIX_CONFIG;
|
69
|
-
#scrollChangeListener = () => this.#scrollChange.next();
|
70
|
-
constructor(affixedElement, renderer, viewportRuler, zone, layoutViewport) {
|
71
|
-
this.#affixedElement = affixedElement;
|
72
|
-
this.#renderer = renderer;
|
73
|
-
this.#layoutViewport = layoutViewport;
|
74
|
-
this.#viewportRuler = viewportRuler;
|
75
|
-
this.#zone = zone;
|
76
|
-
this.#offsetChange = new Subject();
|
77
|
-
this.#overflowScroll = new Subject();
|
78
|
-
this.#placementChange = new Subject();
|
79
|
-
this.#offsetChangeObs = this.#offsetChange.asObservable();
|
80
|
-
this.#overflowScrollObs = this.#overflowScroll.asObservable();
|
81
|
-
this.#placementChangeObs = this.#placementChange.asObservable();
|
82
|
-
}
|
83
|
-
/**
|
84
|
-
* Affixes an element to a base element.
|
85
|
-
* @param baseElement The base element.
|
86
|
-
* @param config Configuration for the affix action.
|
87
|
-
*/
|
88
|
-
affixTo(baseElement, config) {
|
89
|
-
this.#reset();
|
90
|
-
this.#config = config;
|
91
|
-
this.#baseElement = baseElement;
|
92
|
-
this.#overflowParents = getOverflowParents(baseElement);
|
93
|
-
this.#affix();
|
94
|
-
if (this.#config.isSticky) {
|
95
|
-
this.#addViewportListeners();
|
96
|
-
}
|
97
|
-
}
|
98
|
-
getConfig() {
|
99
|
-
return this.#config;
|
100
|
-
}
|
101
|
-
/**
|
102
|
-
* Re-runs the affix calculation.
|
103
|
-
*/
|
104
|
-
reaffix() {
|
105
|
-
// Reset current placement to preferred placement.
|
106
|
-
this.#currentPlacement = this.#config.placement;
|
107
|
-
this.#affix();
|
108
|
-
}
|
109
|
-
/**
|
110
|
-
* Destroys the affixer.
|
111
|
-
*/
|
112
|
-
destroy() {
|
113
|
-
this.#reset();
|
114
|
-
this.#placementChange.complete();
|
115
|
-
this.#offsetChange.complete();
|
116
|
-
this.#overflowScroll.complete();
|
117
|
-
this.#scrollChange.complete();
|
118
|
-
}
|
119
|
-
#affix() {
|
120
|
-
const offset = this.#getOffset();
|
121
|
-
const offsetParentRect = this.#getOffsetParentRect();
|
122
|
-
offset.top = offset.top - offsetParentRect.top;
|
123
|
-
offset.left = offset.left - offsetParentRect.left;
|
124
|
-
offset.bottom = offset.bottom - offsetParentRect.top;
|
125
|
-
offset.right = offset.right - offsetParentRect.left;
|
126
|
-
if (this.#isNewOffset(offset)) {
|
127
|
-
this.#renderer.setStyle(this.#affixedElement, 'top', `${offset.top}px`);
|
128
|
-
this.#renderer.setStyle(this.#affixedElement, 'left', `${offset.left}px`);
|
129
|
-
this.#offsetChange.next({ offset });
|
130
|
-
}
|
131
|
-
}
|
132
|
-
#getOffsetParentRect() {
|
133
|
-
// Firefox sets the offsetParent to document.body if the element uses fixed positioning.
|
134
|
-
if (this.#config.position === 'absolute' &&
|
135
|
-
this.#affixedElement.offsetParent) {
|
136
|
-
return getOuterRect(this.#affixedElement.offsetParent);
|
137
|
-
}
|
138
|
-
else {
|
139
|
-
const layoutRect = getOuterRect(this.#layoutViewport);
|
140
|
-
return {
|
141
|
-
top: layoutRect.top,
|
142
|
-
left: layoutRect.left,
|
143
|
-
height: layoutRect.height,
|
144
|
-
width: layoutRect.width,
|
145
|
-
bottom: layoutRect.top - layoutRect.height,
|
146
|
-
right: layoutRect.left - layoutRect.width,
|
147
|
-
};
|
148
|
-
}
|
149
|
-
}
|
150
|
-
#getOffset() {
|
151
|
-
const parent = this.#getAutoFitContextParent();
|
152
|
-
const maxAttempts = 4;
|
153
|
-
let attempts = 0;
|
154
|
-
let isAffixedElementFullyVisible = false;
|
155
|
-
let offset;
|
156
|
-
let placement = this.#config.placement;
|
157
|
-
do {
|
158
|
-
offset = this.#getPreferredOffset(placement);
|
159
|
-
isAffixedElementFullyVisible = isOffsetFullyVisibleWithinParent(this.#viewportRuler, parent, offset, this.#config.autoFitOverflowOffset);
|
160
|
-
if (!this.#config.enableAutoFit) {
|
161
|
-
break;
|
162
|
-
}
|
163
|
-
if (!isAffixedElementFullyVisible) {
|
164
|
-
placement =
|
165
|
-
attempts % 2 === 0
|
166
|
-
? getInversePlacement(placement)
|
167
|
-
: getNextPlacement(placement);
|
168
|
-
}
|
169
|
-
attempts++;
|
170
|
-
} while (!isAffixedElementFullyVisible && attempts < maxAttempts);
|
171
|
-
if (isAffixedElementFullyVisible) {
|
172
|
-
if (this.#isBaseElementVisible()) {
|
173
|
-
this.#notifyPlacementChange(placement);
|
174
|
-
}
|
175
|
-
else {
|
176
|
-
this.#notifyPlacementChange(null);
|
177
|
-
}
|
178
|
-
return offset;
|
179
|
-
}
|
180
|
-
if (this.#config.enableAutoFit) {
|
181
|
-
this.#notifyPlacementChange(null);
|
182
|
-
}
|
183
|
-
// No suitable placement was found, so revert to preferred placement.
|
184
|
-
return this.#getPreferredOffset(this.#config.placement);
|
185
|
-
}
|
186
|
-
#getPreferredOffset(placement) {
|
187
|
-
if (!this.#baseElement) {
|
188
|
-
return { top: 0, left: 0, bottom: 0, right: 0 };
|
189
|
-
}
|
190
|
-
const affixedRect = getOuterRect(this.#affixedElement);
|
191
|
-
const baseRect = this.#baseElement.getBoundingClientRect();
|
192
|
-
const horizontalAlignment = this.#config.horizontalAlignment;
|
193
|
-
const verticalAlignment = this.#config.verticalAlignment;
|
194
|
-
const enableAutoFit = this.#config.enableAutoFit;
|
195
|
-
let top;
|
196
|
-
let left;
|
197
|
-
if (placement === 'above' || placement === 'below') {
|
198
|
-
if (placement === 'above') {
|
199
|
-
top = baseRect.top - affixedRect.height;
|
200
|
-
switch (verticalAlignment) {
|
201
|
-
case 'top':
|
202
|
-
top = top + affixedRect.height;
|
203
|
-
break;
|
204
|
-
case 'middle':
|
205
|
-
top = top + affixedRect.height / 2;
|
206
|
-
break;
|
207
|
-
case 'bottom':
|
208
|
-
default:
|
209
|
-
break;
|
210
|
-
}
|
211
|
-
}
|
212
|
-
else {
|
213
|
-
top = baseRect.bottom;
|
214
|
-
switch (verticalAlignment) {
|
215
|
-
case 'top':
|
216
|
-
default:
|
217
|
-
break;
|
218
|
-
case 'middle':
|
219
|
-
top = top - affixedRect.height / 2;
|
220
|
-
break;
|
221
|
-
case 'bottom':
|
222
|
-
top = top - affixedRect.height;
|
223
|
-
break;
|
224
|
-
}
|
225
|
-
}
|
226
|
-
switch (horizontalAlignment) {
|
227
|
-
case 'left':
|
228
|
-
left = baseRect.left;
|
229
|
-
break;
|
230
|
-
case 'center':
|
231
|
-
default:
|
232
|
-
left = baseRect.left + baseRect.width / 2 - affixedRect.width / 2;
|
233
|
-
break;
|
234
|
-
case 'right':
|
235
|
-
left = baseRect.right - affixedRect.width;
|
236
|
-
break;
|
237
|
-
}
|
238
|
-
}
|
239
|
-
else {
|
240
|
-
if (placement === 'left') {
|
241
|
-
left = baseRect.left - affixedRect.width;
|
242
|
-
}
|
243
|
-
else {
|
244
|
-
left = baseRect.right;
|
245
|
-
}
|
246
|
-
switch (verticalAlignment) {
|
247
|
-
case 'top':
|
248
|
-
top = baseRect.top;
|
249
|
-
break;
|
250
|
-
case 'middle':
|
251
|
-
default:
|
252
|
-
top = baseRect.top + baseRect.height / 2 - affixedRect.height / 2;
|
253
|
-
break;
|
254
|
-
case 'bottom':
|
255
|
-
top = baseRect.bottom - affixedRect.height;
|
256
|
-
break;
|
257
|
-
}
|
258
|
-
}
|
259
|
-
const offset = { top, left, bottom: 0, right: 0 };
|
260
|
-
if (enableAutoFit) {
|
261
|
-
const adjustments = this.#adjustOffsetToOverflowParent({ top, left }, placement, this.#baseElement);
|
262
|
-
offset.top = adjustments.top;
|
263
|
-
offset.left = adjustments.left;
|
264
|
-
}
|
265
|
-
offset.bottom = offset.top + affixedRect.height;
|
266
|
-
offset.right = offset.left + affixedRect.width;
|
267
|
-
return offset;
|
268
|
-
}
|
269
|
-
/**
|
270
|
-
* Slightly adjust the offset to fit within the scroll parent's boundaries if
|
271
|
-
* the affixed element would otherwise be clipped.
|
272
|
-
*/
|
273
|
-
#adjustOffsetToOverflowParent(offset, placement, baseElement) {
|
274
|
-
const affixedRect = getOuterRect(this.#affixedElement);
|
275
|
-
const baseRect = baseElement.getBoundingClientRect();
|
276
|
-
const parent = this.#getAutoFitContextParent();
|
277
|
-
let parentOffset;
|
278
|
-
if (this.#config.autoFitContext === SkyAffixAutoFitContext.OverflowParent) {
|
279
|
-
if (this.#config.autoFitOverflowOffset) {
|
280
|
-
// When the config contains a specific offset.
|
281
|
-
parentOffset = getElementOffset(parent, this.#config.autoFitOverflowOffset);
|
282
|
-
}
|
283
|
-
else if (isOffsetFullyVisibleWithinParent(this.#viewportRuler, parent, baseRect)) {
|
284
|
-
// When the base element is fully visible within the parent, aim for the visible portion of the parent element.
|
285
|
-
parentOffset = getVisibleRectForElement(this.#viewportRuler, parent);
|
286
|
-
}
|
287
|
-
else {
|
288
|
-
// Anywhere in the parent element.
|
289
|
-
parentOffset = getOuterRect(parent);
|
290
|
-
}
|
291
|
-
}
|
292
|
-
else {
|
293
|
-
const viewportRect = this.#viewportRuler.getViewportRect();
|
294
|
-
parentOffset = {
|
295
|
-
top: -viewportRect.top,
|
296
|
-
left: -viewportRect.left,
|
297
|
-
bottom: viewportRect.height + viewportRect.top,
|
298
|
-
right: viewportRect.width + viewportRect.left,
|
299
|
-
};
|
300
|
-
}
|
301
|
-
// A pixel value representing the leeway between the edge of the overflow parent and the edge
|
302
|
-
// of the base element before it disappears from view.
|
303
|
-
// If the visible portion of the base element is less than this pixel value, the auto-fit
|
304
|
-
// functionality attempts to find another placement.
|
305
|
-
const defaultPixelTolerance = 40;
|
306
|
-
let pixelTolerance;
|
307
|
-
const originalOffsetTop = offset.top;
|
308
|
-
const originalOffsetLeft = offset.left;
|
309
|
-
switch (placement) {
|
310
|
-
case 'above':
|
311
|
-
case 'below':
|
312
|
-
// Keep the affixed element within the overflow parent.
|
313
|
-
if (offset.left < parentOffset.left) {
|
314
|
-
offset.left = parentOffset.left;
|
315
|
-
}
|
316
|
-
else if (offset.left + affixedRect.width > parentOffset.right) {
|
317
|
-
offset.left = parentOffset.right - affixedRect.width;
|
318
|
-
}
|
319
|
-
// Use a smaller pixel tolerance if the base element width is less than the default.
|
320
|
-
pixelTolerance = Math.min(defaultPixelTolerance, baseRect.width);
|
321
|
-
// Make sure the affixed element never detaches from the base element.
|
322
|
-
if (offset.left + pixelTolerance > baseRect.right ||
|
323
|
-
offset.left + affixedRect.width - pixelTolerance < baseRect.left) {
|
324
|
-
offset.left = originalOffsetLeft;
|
325
|
-
}
|
326
|
-
break;
|
327
|
-
case 'left':
|
328
|
-
case 'right':
|
329
|
-
// Keep the affixed element within the overflow parent.
|
330
|
-
if (offset.top < parentOffset.top) {
|
331
|
-
offset.top = parentOffset.top;
|
332
|
-
}
|
333
|
-
else if (offset.top + affixedRect.height > parentOffset.bottom) {
|
334
|
-
offset.top = parentOffset.bottom - affixedRect.height;
|
335
|
-
}
|
336
|
-
// Use a smaller pixel tolerance if the base element height is less than the default.
|
337
|
-
pixelTolerance = Math.min(defaultPixelTolerance, baseRect.height);
|
338
|
-
// Make sure the affixed element never detaches from the base element.
|
339
|
-
if (offset.top + pixelTolerance > baseRect.bottom ||
|
340
|
-
offset.top + affixedRect.height - pixelTolerance < baseRect.top) {
|
341
|
-
offset.top = originalOffsetTop;
|
342
|
-
}
|
343
|
-
break;
|
344
|
-
}
|
345
|
-
return offset;
|
346
|
-
}
|
347
|
-
#getImmediateOverflowParent() {
|
348
|
-
return this.#overflowParents[0];
|
349
|
-
}
|
350
|
-
#getAutoFitContextParent() {
|
351
|
-
const bodyElement = this.#overflowParents[this.#overflowParents.length - 1];
|
352
|
-
return this.#config.autoFitContext === SkyAffixAutoFitContext.OverflowParent
|
353
|
-
? this.#getImmediateOverflowParent()
|
354
|
-
: bodyElement;
|
355
|
-
}
|
356
|
-
#notifyPlacementChange(placement) {
|
357
|
-
if (this.#currentPlacement !== placement) {
|
358
|
-
this.#currentPlacement = placement ?? undefined;
|
359
|
-
this.#placementChange.next({
|
360
|
-
placement,
|
361
|
-
});
|
362
|
-
}
|
363
|
-
}
|
364
|
-
#reset() {
|
365
|
-
this.#removeViewportListeners();
|
366
|
-
this.#overflowParents = [];
|
367
|
-
this.#config =
|
368
|
-
this.#baseElement =
|
369
|
-
this.#currentPlacement =
|
370
|
-
this.#currentOffset =
|
371
|
-
undefined;
|
372
|
-
}
|
373
|
-
#isNewOffset(offset) {
|
374
|
-
if (this.#currentOffset === undefined) {
|
375
|
-
this.#currentOffset = offset;
|
376
|
-
return true;
|
377
|
-
}
|
378
|
-
if (this.#currentOffset.top === offset.top &&
|
379
|
-
this.#currentOffset.left === offset.left) {
|
380
|
-
return false;
|
381
|
-
}
|
382
|
-
this.#currentOffset = offset;
|
383
|
-
return true;
|
384
|
-
}
|
385
|
-
#isBaseElementVisible() {
|
386
|
-
// Can't get here if the base element is undefined.
|
387
|
-
/* istanbul ignore if */
|
388
|
-
if (!this.#baseElement) {
|
389
|
-
return false;
|
390
|
-
}
|
391
|
-
const baseRect = this.#baseElement.getBoundingClientRect();
|
392
|
-
return isOffsetPartiallyVisibleWithinParent(this.#viewportRuler, this.#getImmediateOverflowParent(), {
|
393
|
-
top: baseRect.top,
|
394
|
-
left: baseRect.left,
|
395
|
-
right: baseRect.right,
|
396
|
-
bottom: baseRect.bottom,
|
397
|
-
}, this.#config.autoFitOverflowOffset);
|
398
|
-
}
|
399
|
-
#addViewportListeners() {
|
400
|
-
this.#viewportListeners = new Subscription();
|
401
|
-
// Resize and orientation changes.
|
402
|
-
this.#viewportListeners.add(this.#viewportRuler.change().subscribe(() => {
|
403
|
-
this.#affix();
|
404
|
-
}));
|
405
|
-
this.#viewportListeners.add(this.#scrollChange.subscribe(() => {
|
406
|
-
this.#affix();
|
407
|
-
this.#overflowScroll.next();
|
408
|
-
}));
|
409
|
-
// Listen for scroll events on the window, visual viewport, and any overflow parents.
|
410
|
-
// https://developer.chrome.com/blog/visual-viewport-api/#events-only-fire-when-the-visual-viewport-changes
|
411
|
-
this.#zone.runOutsideAngular(() => {
|
412
|
-
[window, window.visualViewport, ...this.#overflowParents].forEach((parentElement) => {
|
413
|
-
parentElement?.addEventListener('scroll', this.#scrollChangeListener);
|
414
|
-
});
|
415
|
-
});
|
416
|
-
}
|
417
|
-
#removeViewportListeners() {
|
418
|
-
this.#viewportListeners?.unsubscribe();
|
419
|
-
this.#zone.runOutsideAngular(() => {
|
420
|
-
[window, window.visualViewport, ...this.#overflowParents].forEach((parentElement) => {
|
421
|
-
parentElement?.removeEventListener('scroll', this.#scrollChangeListener);
|
422
|
-
});
|
423
|
-
});
|
424
|
-
}
|
425
|
-
}
|
426
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaXhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jb3JlL3NyYy9saWIvbW9kdWxlcy9hZmZpeC9hZmZpeGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLGdDQUFnQyxFQUNoQyxvQ0FBb0MsR0FDckMsTUFBTSxhQUFhLENBQUM7QUFrQnJCLE1BQU0sb0JBQW9CLEdBQTBCO0lBQ2xELGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxjQUFjO0lBQ3JELGFBQWEsRUFBRSxLQUFLO0lBQ3BCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsUUFBUSxFQUFFLEtBQUs7SUFDZixTQUFTLEVBQUUsT0FBTztDQUNuQixDQUFDO0FBRUYsTUFBTSxPQUFPLFVBQVU7SUFDckI7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFpQztRQUMzQyxNQUFN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QUFDLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FDL0QsQ0FBQyxhQUFhLEVBQUUsRUFBRTtnQkFDaEIsYUFBYSxFQUFFLG1CQUFtQixDQUNoQyxRQUFRLEVBQ1IsSUFBSSxDQUFDLHFCQUFxQixDQUMzQixDQUFDO1lBQ0osQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpZXdwb3J0UnVsZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBOZ1pvbmUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2t5QWZmaXhBdXRvRml0Q29udGV4dCB9IGZyb20gJy4vYWZmaXgtYXV0by1maXQtY29udGV4dCc7XG5pbXBvcnQgeyBTa3lBZmZpeENvbmZpZyB9IGZyb20gJy4vYWZmaXgtY29uZmlnJztcbmltcG9ydCB7IFNreUFmZml4T2Zmc2V0IH0gZnJvbSAnLi9hZmZpeC1vZmZzZXQnO1xuaW1wb3J0IHsgU2t5QWZmaXhPZmZzZXRDaGFuZ2UgfSBmcm9tICcuL2FmZml4LW9mZnNldC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5QWZmaXhQbGFjZW1lbnQgfSBmcm9tICcuL2FmZml4LXBsYWNlbWVudCc7XG5pbXBvcnQgeyBTa3lBZmZpeFBsYWNlbWVudENoYW5nZSB9IGZyb20gJy4vYWZmaXgtcGxhY2VtZW50LWNoYW5nZSc7XG5pbXBvcnQgeyBBZmZpeFJlY3QgfSBmcm9tICcuL2FmZml4LXJlY3QnO1xuaW1wb3J0IHsgZ2V0SW52ZXJzZVBsYWNlbWVudCwgZ2V0TmV4dFBsYWNlbWVudCB9IGZyb20gJy4vYWZmaXgtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0RWxlbWVudE9mZnNldCxcbiAgZ2V0T3V0ZXJSZWN0LFxuICBnZXRPdmVyZmxvd1BhcmVudHMsXG4gIGdldFZpc2libGVSZWN0Rm9yRWxlbWVudCxcbiAgaXNPZmZzZXRGdWxseVZpc2libGVXaXRoaW5QYXJlbnQsXG4gIGlzT2Zmc2V0UGFydGlhbGx5VmlzaWJsZVdpdGhpblBhcmVudCxcbn0gZnJvbSAnLi9kb20tdXRpbHMnO1xuXG4vKipcbiAqIE1ha2Ugc3BlY2lmaWMgcHJvcGVydGllcyByZXF1aXJlZCwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvXG4gKiBkbyBudWxsIGNoZWNrcyB0aHJvdWdob3V0IHRoaXMgZmlsZS5cbiAqL1xudHlwZSBBZmZpeENvbmZpZ09yRGVmYXVsdHMgPSBTa3lBZmZpeENvbmZpZyAmXG4gIFJlcXVpcmVkPFxuICAgIFBpY2s8XG4gICAgICBTa3lBZmZpeENvbmZpZyxcbiAgICAgIHwgJ2F1dG9GaXRDb250ZXh0J1xuICAgICAgfCAnZW5hYmxlQXV0b0ZpdCdcbiAgICAgIHwgJ2hvcml6b250YWxBbGlnbm1lbnQnXG4gICAgICB8ICdpc1N0aWNreSdcbiAgICAgIHwgJ3BsYWNlbWVudCdcbiAgICA+XG4gID47XG5cbmNvbnN0IERFRkFVTFRfQUZGSVhfQ09ORklHOiBBZmZpeENvbmZpZ09yRGVmYXVsdHMgPSB7XG4gIGF1dG9GaXRDb250ZXh0OiBTa3lBZmZpeEF1dG9GaXRDb250ZXh0Lk92ZXJmbG93UGFyZW50LFxuICBlbmFibGVBdXRvRml0OiBmYWxzZSxcbiAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2NlbnRlcicsXG4gIGlzU3RpY2t5OiBmYWxzZSxcbiAgcGxhY2VtZW50OiAnYWJvdmUnLFxufTtcblxuZXhwb3J0IGNsYXNzIFNreUFmZml4ZXIge1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYWZmaXhlZCBlbGVtZW50J3Mgb2Zmc2V0IGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG9mZnNldENoYW5nZSgpOiBPYnNlcnZhYmxlPFNreUFmZml4T2Zmc2V0Q2hhbmdlPiB7XG4gICAgcmV0dXJuIHRoaXMuI29mZnNldENoYW5nZU9icztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBiYXNlIGVsZW1lbnQncyBuZWFyZXN0IG92ZXJmbG93IHBhcmVudCBpcyBzY3JvbGxpbmcuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBuZWVkXG4gICAqIHRvIHBlcmZvcm0gYW4gYWRkaXRpb25hbCBhY3Rpb24gZHVyaW5nIHRoZSBzY3JvbGwgZXZlbnQgYnV0IGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgYW5vdGhlclxuICAgKiBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3ZlcmZsb3dTY3JvbGwoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuI292ZXJmbG93U2Nyb2xsT2JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHBsYWNlbWVudCB2YWx1ZSBjaGFuZ2VzLiBBIGBudWxsYCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhIHN1aXRhYmxlXG4gICAqIHBsYWNlbWVudCBjb3VsZCBub3QgYmUgZm91bmQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlbWVudENoYW5nZSgpOiBPYnNlcnZhYmxlPFNreUFmZml4UGxhY2VtZW50Q2hhbmdlPiB7XG4gICAgcmV0dXJuIHRoaXMuI3BsYWNlbWVudENoYW5nZU9icztcbiAgfVxuXG4gIGdldCAjY29uZmlnKCk6IEFmZml4Q29uZmlnT3JEZWZhdWx0cyB7XG4gICAgcmV0dXJuIHRoaXMuI19jb25maWc7XG4gIH1cblxuICBzZXQgI2NvbmZpZyh2YWx1ZTogU2t5QWZmaXhDb25maWcgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXJnZWQ6IEFmZml4Q29uZmlnT3JEZWZhdWx0cyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfQUZGSVhfQ09ORklHLFxuICAgICAgLi4udmFsdWUsXG4gICAgfTtcblxuICAgIC8vIE1ha2Ugc3VyZSBub25lIG9mIHRoZSB2YWx1ZXMgYXJlIHVuZGVmaW5lZC5cbiAgICBsZXQga2V5OiBrZXlvZiB0eXBlb2YgbWVyZ2VkO1xuICAgIGZvciAoa2V5IGluIG1lcmdlZCkge1xuICAgICAgaWYgKG1lcmdlZFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKG1lcmdlZCBhcyBhbnkpW2tleV0gPSBERUZBVUxUX0FGRklYX0NPTkZJR1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuI19jb25maWcgPSBtZXJnZWQ7XG4gIH1cblxuICAjYWZmaXhlZEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICNiYXNlRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgI2N1cnJlbnRPZmZzZXQ6IFNreUFmZml4T2Zmc2V0IHwgdW5kZWZpbmVkO1xuXG4gICNjdXJyZW50UGxhY2VtZW50OiBTa3lBZmZpeFBsYWNlbWVudCB8IHVuZGVmaW5lZDtcblxuICAjbGF5b3V0Vmlld3BvcnQ6IEhUTUxFbGVtZW50O1xuXG4gICNvZmZzZXRDaGFuZ2U6IFN1YmplY3Q8U2t5QWZmaXhPZmZzZXRDaGFuZ2U+O1xuXG4gICNvZmZzZXRDaGFuZ2VPYnM6IE9ic2VydmFibGU8U2t5QWZmaXhPZmZzZXRDaGFuZ2U+O1xuXG4gICNvdmVyZmxvd1BhcmVudHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAjb3ZlcmZsb3dTY3JvbGw6IFN1YmplY3Q8dm9pZD47XG5cbiAgI292ZXJmbG93U2Nyb2xsT2JzOiBPYnNlcnZhYmxlPHZvaWQ+O1xuXG4gICNwbGFjZW1lbnRDaGFuZ2U6IFN1YmplY3Q8U2t5QWZmaXhQbGFjZW1lbnRDaGFuZ2U+O1xuXG4gICNwbGFjZW1lbnRDaGFuZ2VPYnM6IE9ic2VydmFibGU8U2t5QWZmaXhQbGFjZW1lbnRDaGFuZ2U+O1xuXG4gICNyZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gICNzY3JvbGxDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICN2aWV3cG9ydExpc3RlbmVyczogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICN2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyO1xuXG4gICN6b25lOiBOZ1pvbmU7XG5cbiAgI19jb25maWc6IEFmZml4Q29uZmlnT3JEZWZhdWx0cyA9IERFRkFVTFRfQUZGSVhfQ09ORklHO1xuXG4gICNzY3JvbGxDaGFuZ2VMaXN0ZW5lcjogKCkgPT4gdm9pZCA9ICgpID0+IHRoaXMuI3Njcm9sbENoYW5nZS5uZXh0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYWZmaXhlZEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICB6b25lOiBOZ1pvbmUsXG4gICAgbGF5b3V0Vmlld3BvcnQ6IEhUTUxFbGVtZW50LFxuICApIHtcbiAgICB0aGlzLiNhZmZpeGVkRWxlbWVudCA9IGFmZml4ZWRFbGVtZW50O1xuICAgIHRoaXMuI3JlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgdGhpcy4jbGF5b3V0Vmlld3BvcnQgPSBsYXlvdXRWaWV3cG9ydDtcbiAgICB0aGlzLiN2aWV3cG9ydFJ1bGVyID0gdmlld3BvcnRSdWxlcjtcbiAgICB0aGlzLiN6b25lID0gem9uZTtcblxuICAgIHRoaXMuI29mZnNldENoYW5nZSA9IG5ldyBTdWJqZWN0PFNreUFmZml4T2Zmc2V0Q2hhbmdlPigpO1xuICAgIHRoaXMuI292ZXJmbG93U2Nyb2xsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLiNwbGFjZW1lbnRDaGFuZ2UgPSBuZXcgU3ViamVjdDxTa3lBZmZpeFBsYWNlbWVudENoYW5nZT4oKTtcblxuICAgIHRoaXMuI29mZnNldENoYW5nZU9icyA9IHRoaXMuI29mZnNldENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLiNvdmVyZmxvd1Njcm9sbE9icyA9IHRoaXMuI292ZXJmbG93U2Nyb2xsLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuI3BsYWNlbWVudENoYW5nZU9icyA9IHRoaXMuI3BsYWNlbWVudENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZmZpeGVzIGFuIGVsZW1lbnQgdG8gYSBiYXNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudCBUaGUgYmFzZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZmZpeCBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYWZmaXhUbyhiYXNlRWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbmZpZz86IFNreUFmZml4Q29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy4jcmVzZXQoKTtcblxuICAgIHRoaXMuI2NvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLiNiYXNlRWxlbWVudCA9IGJhc2VFbGVtZW50O1xuICAgIHRoaXMuI292ZXJmbG93UGFyZW50cyA9IGdldE92ZXJmbG93UGFyZW50cyhiYXNlRWxlbWVudCk7XG5cbiAgICB0aGlzLiNhZmZpeCgpO1xuXG4gICAgaWYgKHRoaXMuI2NvbmZpZy5pc1N0aWNreSkge1xuICAgICAgdGhpcy4jYWRkVmlld3BvcnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uZmlnKCk6IFNreUFmZml4Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy4jY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXJ1bnMgdGhlIGFmZml4IGNhbGN1bGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWZmaXgoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgY3VycmVudCBwbGFjZW1lbnQgdG8gcHJlZmVycmVkIHBsYWNlbWVudC5cbiAgICB0aGlzLiNjdXJyZW50UGxhY2VtZW50ID0gdGhpcy4jY29uZmlnLnBsYWNlbWVudDtcbiAgICB0aGlzLiNhZmZpeCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBhZmZpeGVyLlxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jcmVzZXQoKTtcbiAgICB0aGlzLiNwbGFjZW1lbnRDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLiNvZmZzZXRDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLiNvdmVyZmxvd1Njcm9sbC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI3Njcm9sbENoYW5nZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgI2FmZml4KCk6IHZvaWQge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuI2dldE9mZnNldCgpO1xuXG4gICAgY29uc3Qgb2Zmc2V0UGFyZW50UmVjdCA9IHRoaXMuI2dldE9mZnNldFBhcmVudFJlY3QoKTtcbiAgICBvZmZzZXQudG9wID0gb2Zmc2V0LnRvcCAtIG9mZnNldFBhcmVudFJlY3QudG9wO1xuICAgIG9mZnNldC5sZWZ0ID0gb2Zmc2V0LmxlZnQgLSBvZmZzZXRQYXJlbnRSZWN0LmxlZnQ7XG4gICAgb2Zmc2V0LmJvdHRvbSA9IG9mZnNldC5ib3R0b20gLSBvZmZzZXRQYXJlbnRSZWN0LnRvcDtcbiAgICBvZmZzZXQucmlnaHQgPSBvZmZzZXQucmlnaHQgLSBvZmZzZXRQYXJlbnRSZWN0LmxlZnQ7XG5cbiAgICBpZiAodGhpcy4jaXNOZXdPZmZzZXQob2Zmc2V0KSkge1xuICAgICAgdGhpcy4jcmVuZGVyZXIuc2V0U3R5bGUodGhpcy4jYWZmaXhlZEVsZW1lbnQsICd0b3AnLCBgJHtvZmZzZXQudG9wfXB4YCk7XG4gICAgICB0aGlzLiNyZW5kZXJlci5zZXRTdHlsZSh0aGlzLiNhZmZpeGVkRWxlbWVudCwgJ2xlZnQnLCBgJHtvZmZzZXQubGVmdH1weGApO1xuXG4gICAgICB0aGlzLiNvZmZzZXRDaGFuZ2UubmV4dCh7IG9mZnNldCB9KTtcbiAgICB9XG4gIH1cblxuICAjZ2V0T2Zmc2V0UGFyZW50UmVjdCgpOiBBZmZpeFJlY3Qge1xuICAgIC8vIEZpcmVmb3ggc2V0cyB0aGUgb2Zmc2V0UGFyZW50IHRvIGRvY3VtZW50LmJvZHkgaWYgdGhlIGVsZW1lbnQgdXNlcyBmaXhlZCBwb3NpdGlvbmluZy5cbiAgICBpZiAoXG4gICAgICB0aGlzLiNjb25maWcucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiZcbiAgICAgIHRoaXMuI2FmZml4ZWRFbGVtZW50Lm9mZnNldFBhcmVudFxuICAgICkge1xuICAgICAgcmV0dXJuIGdldE91dGVyUmVjdCh0aGlzLiNhZmZpeGVkRWxlbWVudC5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYXlvdXRSZWN0ID0gZ2V0T3V0ZXJSZWN0KHRoaXMuI2xheW91dFZpZXdwb3J0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvcDogbGF5b3V0UmVjdC50b3AsXG4gICAgICAgIGxlZnQ6IGxheW91dFJlY3QubGVmdCxcbiAgICAgICAgaGVpZ2h0OiBsYXlvdXRSZWN0LmhlaWdodCxcbiAgICAgICAgd2lkdGg6IGxheW91dFJlY3Qud2lkdGgsXG4gICAgICAgIGJvdHRvbTogbGF5b3V0UmVjdC50b3AgLSBsYXlvdXRSZWN0LmhlaWdodCxcbiAgICAgICAgcmlnaHQ6IGxheW91dFJlY3QubGVmdCAtIGxheW91dFJlY3Qud2lkdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gICNnZXRPZmZzZXQoKTogUmVxdWlyZWQ8U2t5QWZmaXhPZmZzZXQ+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLiNnZXRBdXRvRml0Q29udGV4dFBhcmVudCgpO1xuXG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSA0O1xuICAgIGxldCBhdHRlbXB0cyA9IDA7XG5cbiAgICBsZXQgaXNBZmZpeGVkRWxlbWVudEZ1bGx5VmlzaWJsZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQ6IFJlcXVpcmVkPFNreUFmZml4T2Zmc2V0PjtcbiAgICBsZXQgcGxhY2VtZW50ID0gdGhpcy4jY29uZmlnLnBsYWNlbWVudDtcblxuICAgIGRvIHtcbiAgICAgIG9mZnNldCA9IHRoaXMuI2dldFByZWZlcnJlZE9mZnNldChwbGFjZW1lbnQpO1xuICAgICAgaXNBZmZpeGVkRWxlbWVudEZ1bGx5VmlzaWJsZSA9IGlzT2Zmc2V0RnVsbHlWaXNpYmxlV2l0aGluUGFyZW50KFxuICAgICAgICB0aGlzLiN2aWV3cG9ydFJ1bGVyLFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgdGhpcy4jY29uZmlnLmF1dG9GaXRPdmVyZmxvd09mZnNldCxcbiAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy4jY29uZmlnLmVuYWJsZUF1dG9GaXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNBZmZpeGVkRWxlbWVudEZ1bGx5VmlzaWJsZSkge1xuICAgICAgICBwbGFjZW1lbnQgPVxuICAgICAgICAgIGF0dGVtcHRzICUgMiA9PT0gMFxuICAgICAgICAgICAgPyBnZXRJbnZlcnNlUGxhY2VtZW50KHBsYWNlbWVudClcbiAgICAgICAgICAgIDogZ2V0TmV4dFBsYWNlbWVudChwbGFjZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBhdHRlbXB0cysrO1xuICAgIH0gd2hpbGUgKCFpc0FmZml4ZWRFbGVtZW50RnVsbHlWaXNpYmxlICYmIGF0dGVtcHRzIDwgbWF4QXR0ZW1wdHMpO1xuXG4gICAgaWYgKGlzQWZmaXhlZEVsZW1lbnRGdWxseVZpc2libGUpIHtcbiAgICAgIGlmICh0aGlzLiNpc0Jhc2VFbGVtZW50VmlzaWJsZSgpKSB7XG4gICAgICAgIHRoaXMuI25vdGlmeVBsYWNlbWVudENoYW5nZShwbGFjZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jbm90aWZ5UGxhY2VtZW50Q2hhbmdlKG51bGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLiNjb25maWcuZW5hYmxlQXV0b0ZpdCkge1xuICAgICAgdGhpcy4jbm90aWZ5UGxhY2VtZW50Q2hhbmdlKG51bGwpO1xuICAgIH1cblxuICAgIC8vIE5vIHN1aXRhYmxlIHBsYWNlbWVudCB3YXMgZm91bmQsIHNvIHJldmVydCB0byBwcmVmZXJyZWQgcGxhY2VtZW50LlxuICAgIHJldHVybiB0aGlzLiNnZXRQcmVmZXJyZWRPZmZzZXQodGhpcy4jY29uZmlnLnBsYWNlbWVudCk7XG4gIH1cblxuICAjZ2V0UHJlZmVycmVkT2Zmc2V0KHBsYWNlbWVudDogU2t5QWZmaXhQbGFjZW1lbnQpOiBSZXF1aXJlZDxTa3lBZmZpeE9mZnNldD4ge1xuICAgIGlmICghdGhpcy4jYmFzZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB7IHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiAwLCByaWdodDogMCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGFmZml4ZWRSZWN0ID0gZ2V0T3V0ZXJSZWN0KHRoaXMuI2FmZml4ZWRFbGVtZW50KTtcbiAgICBjb25zdCBiYXNlUmVjdCA9IHRoaXMuI2Jhc2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgaG9yaXpvbnRhbEFsaWdubWVudCA9IHRoaXMuI2NvbmZpZy5ob3Jpem9udGFsQWxpZ25tZW50O1xuICAgIGNvbnN0IHZlcnRpY2FsQWxpZ25tZW50ID0gdGhpcy4jY29uZmlnLnZlcnRpY2FsQWxpZ25tZW50O1xuICAgIGNvbnN0IGVuYWJsZUF1dG9GaXQgPSB0aGlzLiNjb25maWcuZW5hYmxlQXV0b0ZpdDtcblxuICAgIGxldCB0b3A6IG51bWJlcjtcbiAgICBsZXQgbGVmdDogbnVtYmVyO1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ2Fib3ZlJyB8fCBwbGFjZW1lbnQgPT09ICdiZWxvdycpIHtcbiAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdhYm92ZScpIHtcbiAgICAgICAgdG9wID0gYmFzZVJlY3QudG9wIC0gYWZmaXhlZFJlY3QuaGVpZ2h0O1xuXG4gICAgICAgIHN3aXRjaCAodmVydGljYWxBbGlnbm1lbnQpIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgdG9wID0gdG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgICAgIHRvcCA9IHRvcCArIGFmZml4ZWRSZWN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wID0gYmFzZVJlY3QuYm90dG9tO1xuXG4gICAgICAgIHN3aXRjaCAodmVydGljYWxBbGlnbm1lbnQpIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdtaWRkbGUnOlxuICAgICAgICAgICAgdG9wID0gdG9wIC0gYWZmaXhlZFJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB0b3AgPSB0b3AgLSBhZmZpeGVkUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGhvcml6b250YWxBbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgbGVmdCA9IGJhc2VSZWN0LmxlZnQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBsZWZ0ID0gYmFzZVJlY3QubGVmdCArIGJhc2VSZWN0LndpZHRoIC8gMiAtIGFmZml4ZWRSZWN0LndpZHRoIC8gMjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCA9IGJhc2VSZWN0LnJpZ2h0IC0gYWZmaXhlZFJlY3Qud2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgICAgICBsZWZ0ID0gYmFzZVJlY3QubGVmdCAtIGFmZml4ZWRSZWN0LndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVmdCA9IGJhc2VSZWN0LnJpZ2h0O1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHZlcnRpY2FsQWxpZ25tZW50KSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdG9wID0gYmFzZVJlY3QudG9wO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ21pZGRsZSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdG9wID0gYmFzZVJlY3QudG9wICsgYmFzZVJlY3QuaGVpZ2h0IC8gMiAtIGFmZml4ZWRSZWN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgPSBiYXNlUmVjdC5ib3R0b20gLSBhZmZpeGVkUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb2Zmc2V0OiBSZXF1aXJlZDxTa3lBZmZpeE9mZnNldD4gPSB7IHRvcCwgbGVmdCwgYm90dG9tOiAwLCByaWdodDogMCB9O1xuXG4gICAgaWYgKGVuYWJsZUF1dG9GaXQpIHtcbiAgICAgIGNvbnN0IGFkanVzdG1lbnRzID0gdGhpcy4jYWRqdXN0T2Zmc2V0VG9PdmVyZmxvd1BhcmVudChcbiAgICAgICAgeyB0b3AsIGxlZnQgfSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICB0aGlzLiNiYXNlRWxlbWVudCxcbiAgICAgICk7XG4gICAgICBvZmZzZXQudG9wID0gYWRqdXN0bWVudHMudG9wO1xuICAgICAgb2Zmc2V0LmxlZnQgPSBhZGp1c3RtZW50cy5sZWZ0O1xuICAgIH1cblxuICAgIG9mZnNldC5ib3R0b20gPSBvZmZzZXQudG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0O1xuICAgIG9mZnNldC5yaWdodCA9IG9mZnNldC5sZWZ0ICsgYWZmaXhlZFJlY3Qud2lkdGg7XG5cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNsaWdodGx5IGFkanVzdCB0aGUgb2Zmc2V0IHRvIGZpdCB3aXRoaW4gdGhlIHNjcm9sbCBwYXJlbnQncyBib3VuZGFyaWVzIGlmXG4gICAqIHRoZSBhZmZpeGVkIGVsZW1lbnQgd291bGQgb3RoZXJ3aXNlIGJlIGNsaXBwZWQuXG4gICAqL1xuICAjYWRqdXN0T2Zmc2V0VG9PdmVyZmxvd1BhcmVudChcbiAgICBvZmZzZXQ6IHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9LFxuICAgIHBsYWNlbWVudDogU2t5QWZmaXhQbGFjZW1lbnQsXG4gICAgYmFzZUVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICApOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgYWZmaXhlZFJlY3QgPSBnZXRPdXRlclJlY3QodGhpcy4jYWZmaXhlZEVsZW1lbnQpO1xuICAgIGNvbnN0IGJhc2VSZWN0ID0gYmFzZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLiNnZXRBdXRvRml0Q29udGV4dFBhcmVudCgpO1xuICAgIGxldCBwYXJlbnRPZmZzZXQ6IFJlcXVpcmVkPFNreUFmZml4T2Zmc2V0PjtcbiAgICBpZiAodGhpcy4jY29uZmlnLmF1dG9GaXRDb250ZXh0ID09PSBTa3lBZmZpeEF1dG9GaXRDb250ZXh0Lk92ZXJmbG93UGFyZW50KSB7XG4gICAgICBpZiAodGhpcy4jY29uZmlnLmF1dG9GaXRPdmVyZmxvd09mZnNldCkge1xuICAgICAgICAvLyBXaGVuIHRoZSBjb25maWcgY29udGFpbnMgYSBzcGVjaWZpYyBvZmZzZXQuXG4gICAgICAgIHBhcmVudE9mZnNldCA9IGdldEVsZW1lbnRPZmZzZXQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHRoaXMuI2NvbmZpZy5hdXRvRml0T3ZlcmZsb3dPZmZzZXQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc09mZnNldEZ1bGx5VmlzaWJsZVdpdGhpblBhcmVudCh0aGlzLiN2aWV3cG9ydFJ1bGVyLCBwYXJlbnQsIGJhc2VSZWN0KVxuICAgICAgKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGJhc2UgZWxlbWVudCBpcyBmdWxseSB2aXNpYmxlIHdpdGhpbiB0aGUgcGFyZW50LCBhaW0gZm9yIHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHBhcmVudCBlbGVtZW50LlxuICAgICAgICBwYXJlbnRPZmZzZXQgPSBnZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQodGhpcy4jdmlld3BvcnRSdWxlciwgcGFyZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFueXdoZXJlIGluIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICAgICAgcGFyZW50T2Zmc2V0ID0gZ2V0T3V0ZXJSZWN0KHBhcmVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0UmVjdCA9IHRoaXMuI3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRSZWN0KCk7XG4gICAgICBwYXJlbnRPZmZzZXQgPSB7XG4gICAgICAgIHRvcDogLXZpZXdwb3J0UmVjdC50b3AsXG4gICAgICAgIGxlZnQ6IC12aWV3cG9ydFJlY3QubGVmdCxcbiAgICAgICAgYm90dG9tOiB2aWV3cG9ydFJlY3QuaGVpZ2h0ICsgdmlld3BvcnRSZWN0LnRvcCxcbiAgICAgICAgcmlnaHQ6IHZpZXdwb3J0UmVjdC53aWR0aCArIHZpZXdwb3J0UmVjdC5sZWZ0LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBIHBpeGVsIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGVld2F5IGJldHdlZW4gdGhlIGVkZ2Ugb2YgdGhlIG92ZXJmbG93IHBhcmVudCBhbmQgdGhlIGVkZ2VcbiAgICAvLyBvZiB0aGUgYmFzZSBlbGVtZW50IGJlZm9yZSBpdCBkaXNhcHBlYXJzIGZyb20gdmlldy5cbiAgICAvLyBJZiB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBiYXNlIGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoaXMgcGl4ZWwgdmFsdWUsIHRoZSBhdXRvLWZpdFxuICAgIC8vIGZ1bmN0aW9uYWxpdHkgYXR0ZW1wdHMgdG8gZmluZCBhbm90aGVyIHBsYWNlbWVudC5cbiAgICBjb25zdCBkZWZhdWx0UGl4ZWxUb2xlcmFuY2UgPSA0MDtcbiAgICBsZXQgcGl4ZWxUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIGNvbnN0IG9yaWdpbmFsT2Zmc2V0VG9wID0gb2Zmc2V0LnRvcDtcbiAgICBjb25zdCBvcmlnaW5hbE9mZnNldExlZnQgPSBvZmZzZXQubGVmdDtcblxuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICBjYXNlICdhYm92ZSc6XG4gICAgICBjYXNlICdiZWxvdyc6XG4gICAgICAgIC8vIEtlZXAgdGhlIGFmZml4ZWQgZWxlbWVudCB3aXRoaW4gdGhlIG92ZXJmbG93IHBhcmVudC5cbiAgICAgICAgaWYgKG9mZnNldC5sZWZ0IDwgcGFyZW50T2Zmc2V0LmxlZnQpIHtcbiAgICAgICAgICBvZmZzZXQubGVmdCA9IHBhcmVudE9mZnNldC5sZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldC5sZWZ0ICsgYWZmaXhlZFJlY3Qud2lkdGggPiBwYXJlbnRPZmZzZXQucmlnaHQpIHtcbiAgICAgICAgICBvZmZzZXQubGVmdCA9IHBhcmVudE9mZnNldC5yaWdodCAtIGFmZml4ZWRSZWN0LndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGEgc21hbGxlciBwaXhlbCB0b2xlcmFuY2UgaWYgdGhlIGJhc2UgZWxlbWVudCB3aWR0aCBpcyBsZXNzIHRoYW4gdGhlIGRlZmF1bHQuXG4gICAgICAgIHBpeGVsVG9sZXJhbmNlID0gTWF0aC5taW4oZGVmYXVsdFBpeGVsVG9sZXJhbmNlLCBiYXNlUmVjdC53aWR0aCk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBhZmZpeGVkIGVsZW1lbnQgbmV2ZXIgZGV0YWNoZXMgZnJvbSB0aGUgYmFzZSBlbGVtZW50LlxuICAgICAgICBpZiAoXG4gICAgICAgICAgb2Zmc2V0LmxlZnQgKyBwaXhlbFRvbGVyYW5jZSA+IGJhc2VSZWN0LnJpZ2h0IHx8XG4gICAgICAgICAgb2Zmc2V0LmxlZnQgKyBhZmZpeGVkUmVjdC53aWR0aCAtIHBpeGVsVG9sZXJhbmNlIDwgYmFzZVJlY3QubGVmdFxuICAgICAgICApIHtcbiAgICAgICAgICBvZmZzZXQubGVmdCA9IG9yaWdpbmFsT2Zmc2V0TGVmdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgLy8gS2VlcCB0aGUgYWZmaXhlZCBlbGVtZW50IHdpdGhpbiB0aGUgb3ZlcmZsb3cgcGFyZW50LlxuICAgICAgICBpZiAob2Zmc2V0LnRvcCA8IHBhcmVudE9mZnNldC50b3ApIHtcbiAgICAgICAgICBvZmZzZXQudG9wID0gcGFyZW50T2Zmc2V0LnRvcDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQudG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0ID4gcGFyZW50T2Zmc2V0LmJvdHRvbSkge1xuICAgICAgICAgIG9mZnNldC50b3AgPSBwYXJlbnRPZmZzZXQuYm90dG9tIC0gYWZmaXhlZFJlY3QuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGEgc21hbGxlciBwaXhlbCB0b2xlcmFuY2UgaWYgdGhlIGJhc2UgZWxlbWVudCBoZWlnaHQgaXMgbGVzcyB0aGFuIHRoZSBkZWZhdWx0LlxuICAgICAgICBwaXhlbFRvbGVyYW5jZSA9IE1hdGgubWluKGRlZmF1bHRQaXhlbFRvbGVyYW5jZSwgYmFzZVJlY3QuaGVpZ2h0KTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGFmZml4ZWQgZWxlbWVudCBuZXZlciBkZXRhY2hlcyBmcm9tIHRoZSBiYXNlIGVsZW1lbnQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvZmZzZXQudG9wICsgcGl4ZWxUb2xlcmFuY2UgPiBiYXNlUmVjdC5ib3R0b20gfHxcbiAgICAgICAgICBvZmZzZXQudG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0IC0gcGl4ZWxUb2xlcmFuY2UgPCBiYXNlUmVjdC50b3BcbiAgICAgICAgKSB7XG4gICAgICAgICAgb2Zmc2V0LnRvcCA9IG9yaWdpbmFsT2Zmc2V0VG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gICNnZXRJbW1lZGlhdGVPdmVyZmxvd1BhcmVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuI292ZXJmbG93UGFyZW50c1swXTtcbiAgfVxuXG4gICNnZXRBdXRvRml0Q29udGV4dFBhcmVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYm9keUVsZW1lbnQgPSB0aGlzLiNvdmVyZmxvd1BhcmVudHNbdGhpcy4jb3ZlcmZsb3dQYXJlbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgcmV0dXJuIHRoaXMuI2NvbmZpZy5hdXRvRml0Q29udGV4dCA9PT0gU2t5QWZmaXhBdXRvRml0Q29udGV4dC5PdmVyZmxvd1BhcmVudFxuICAgICAgPyB0aGlzLiNnZXRJbW1lZGlhdGVPdmVyZmxvd1BhcmVudCgpXG4gICAgICA6IGJvZHlFbGVtZW50O1xuICB9XG5cbiAgI25vdGlmeVBsYWNlbWVudENoYW5nZShwbGFjZW1lbnQ6IFNreUFmZml4UGxhY2VtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNjdXJyZW50UGxhY2VtZW50ICE9PSBwbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy4jcGxhY2VtZW50Q2hhbmdlLm5leHQoe1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAjcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy4jcmVtb3ZlVmlld3BvcnRMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuI292ZXJmbG93UGFyZW50cyA9IFtdO1xuXG4gICAgdGhpcy4jY29uZmlnID1cbiAgICAgIHRoaXMuI2Jhc2VFbGVtZW50ID1cbiAgICAgIHRoaXMuI2N1cnJlbnRQbGFjZW1lbnQgPVxuICAgICAgdGhpcy4jY3VycmVudE9mZnNldCA9XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgfVxuXG4gICNpc05ld09mZnNldChvZmZzZXQ6IFNreUFmZml4T2Zmc2V0KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuI2N1cnJlbnRPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy4jY3VycmVudE9mZnNldCA9IG9mZnNldDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuI2N1cnJlbnRPZmZzZXQudG9wID09PSBvZmZzZXQudG9wICYmXG4gICAgICB0aGlzLiNjdXJyZW50T2Zmc2V0LmxlZnQgPT09IG9mZnNldC5sZWZ0XG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy4jY3VycmVudE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgI2lzQmFzZUVsZW1lbnRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIENhbid0IGdldCBoZXJlIGlmIHRoZSBiYXNlIGVsZW1lbnQgaXMgdW5kZWZpbmVkLlxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdGhpcy4jYmFzZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlUmVjdCA9IHRoaXMuI2Jhc2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgcmV0dXJuIGlzT2Zmc2V0UGFydGlhbGx5VmlzaWJsZVdpdGhpblBhcmVudChcbiAgICAgIHRoaXMuI3ZpZXdwb3J0UnVsZXIsXG4gICAgICB0aGlzLiNnZXRJbW1lZGlhdGVPdmVyZmxvd1BhcmVudCgpLFxuICAgICAge1xuICAgICAgICB0b3A6IGJhc2VSZWN0LnRvcCxcbiAgICAgICAgbGVmdDogYmFzZVJlY3QubGVmdCxcbiAgICAgICAgcmlnaHQ6IGJhc2VSZWN0LnJpZ2h0LFxuICAgICAgICBib3R0b206IGJhc2VSZWN0LmJvdHRvbSxcbiAgICAgIH0sXG4gICAgICB0aGlzLiNjb25maWcuYXV0b0ZpdE92ZXJmbG93T2Zmc2V0LFxuICAgICk7XG4gIH1cblxuICAjYWRkVmlld3BvcnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy4jdmlld3BvcnRMaXN0ZW5lcnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAvLyBSZXNpemUgYW5kIG9yaWVudGF0aW9uIGNoYW5nZXMuXG4gICAgdGhpcy4jdmlld3BvcnRMaXN0ZW5lcnMuYWRkKFxuICAgICAgdGhpcy4jdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLiNhZmZpeCgpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuI3ZpZXdwb3J0TGlzdGVuZXJzLmFkZChcbiAgICAgIHRoaXMuI3Njcm9sbENoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLiNhZmZpeCgpO1xuICAgICAgICB0aGlzLiNvdmVyZmxvd1Njcm9sbC5uZXh0KCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzIG9uIHRoZSB3aW5kb3csIHZpc3VhbCB2aWV3cG9ydCwgYW5kIGFueSBvdmVyZmxvdyBwYXJlbnRzLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vYmxvZy92aXN1YWwtdmlld3BvcnQtYXBpLyNldmVudHMtb25seS1maXJlLXdoZW4tdGhlLXZpc3VhbC12aWV3cG9ydC1jaGFuZ2VzXG4gICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBbd2luZG93LCB3aW5kb3cudmlzdWFsVmlld3BvcnQsIC4uLnRoaXMuI292ZXJmbG93UGFyZW50c10uZm9yRWFjaChcbiAgICAgICAgKHBhcmVudEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBwYXJlbnRFbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLiNzY3JvbGxDaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgI3JlbW92ZVZpZXdwb3J0TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZpZXdwb3J0TGlzdGVuZXJzPy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBbd2luZG93LCB3aW5kb3cudmlzdWFsVmlld3BvcnQsIC4uLnRoaXMuI292ZXJmbG93UGFyZW50c10uZm9yRWFjaChcbiAgICAgICAgKHBhcmVudEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBwYXJlbnRFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgJ3Njcm9sbCcsXG4gICAgICAgICAgICB0aGlzLiNzY3JvbGxDaGFuZ2VMaXN0ZW5lcixcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
@@ -1,126 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Returns the offset values of a given element.
|
3
|
-
* @param element The HTML element.
|
4
|
-
* @param bufferOffset An optional offset to add/subtract to the element's actual offset.
|
5
|
-
*/
|
6
|
-
export function getElementOffset(element, bufferOffset) {
|
7
|
-
const bufferOffsetBottom = bufferOffset?.bottom || 0;
|
8
|
-
const bufferOffsetLeft = bufferOffset?.left || 0;
|
9
|
-
const bufferOffsetRight = bufferOffset?.right || 0;
|
10
|
-
const bufferOffsetTop = bufferOffset?.top || 0;
|
11
|
-
let top;
|
12
|
-
let left;
|
13
|
-
let right;
|
14
|
-
let bottom;
|
15
|
-
const clientRect = element.getBoundingClientRect();
|
16
|
-
left = clientRect.left;
|
17
|
-
top = clientRect.top;
|
18
|
-
right = clientRect.right;
|
19
|
-
bottom = clientRect.bottom;
|
20
|
-
bottom -= bufferOffsetBottom;
|
21
|
-
left += bufferOffsetLeft;
|
22
|
-
right -= bufferOffsetRight;
|
23
|
-
top += bufferOffsetTop;
|
24
|
-
return {
|
25
|
-
bottom,
|
26
|
-
left,
|
27
|
-
right,
|
28
|
-
top,
|
29
|
-
};
|
30
|
-
}
|
31
|
-
/**
|
32
|
-
* Returns an AffixRect that represents the outer dimensions of a given element.
|
33
|
-
*/
|
34
|
-
export function getOuterRect(element) {
|
35
|
-
const rect = element.getBoundingClientRect();
|
36
|
-
const computedStyle = window.getComputedStyle(element, undefined);
|
37
|
-
const marginTop = parseFloat(computedStyle.marginTop);
|
38
|
-
const marginLeft = parseFloat(computedStyle.marginLeft);
|
39
|
-
const marginRight = parseFloat(computedStyle.marginRight);
|
40
|
-
const marginBottom = parseFloat(computedStyle.marginBottom);
|
41
|
-
return {
|
42
|
-
top: rect.top - marginTop,
|
43
|
-
left: rect.left - marginLeft,
|
44
|
-
bottom: rect.top + rect.height + marginBottom,
|
45
|
-
right: rect.left + rect.width + marginLeft + marginRight,
|
46
|
-
width: rect.width + marginLeft + marginRight,
|
47
|
-
height: rect.height + marginTop + marginBottom,
|
48
|
-
};
|
49
|
-
}
|
50
|
-
/**
|
51
|
-
* Returns the visible rect for a given element.
|
52
|
-
*/
|
53
|
-
export function getVisibleRectForElement(viewportRuler, element) {
|
54
|
-
const elementRect = getOuterRect(element);
|
55
|
-
const viewportRect = viewportRuler.getViewportRect();
|
56
|
-
const visibleRect = {
|
57
|
-
top: Math.max(elementRect.top, 0),
|
58
|
-
left: Math.max(elementRect.left, 0),
|
59
|
-
bottom: Math.min(elementRect.bottom, viewportRect.height),
|
60
|
-
right: Math.min(elementRect.right, viewportRect.width),
|
61
|
-
};
|
62
|
-
return {
|
63
|
-
...visibleRect,
|
64
|
-
width: visibleRect.right - visibleRect.left,
|
65
|
-
height: visibleRect.bottom - visibleRect.top,
|
66
|
-
};
|
67
|
-
}
|
68
|
-
export function getOverflowParents(child) {
|
69
|
-
const bodyElement = window.document.body;
|
70
|
-
const results = [];
|
71
|
-
let parentElement = child?.parentNode;
|
72
|
-
while (parentElement !== undefined && parentElement instanceof HTMLElement) {
|
73
|
-
if (parentElement.matches('body')) {
|
74
|
-
break;
|
75
|
-
}
|
76
|
-
const computedStyle = window.getComputedStyle(parentElement, undefined);
|
77
|
-
const overflowY = computedStyle.overflowY.toLowerCase();
|
78
|
-
const largerThanTheDocumentElement = window.document.documentElement.scrollWidth < parentElement.scrollWidth ||
|
79
|
-
window.document.documentElement.scrollHeight < parentElement.scrollHeight;
|
80
|
-
const hasOverflowRules = overflowY === 'auto' || overflowY === 'hidden' || overflowY === 'scroll';
|
81
|
-
if (largerThanTheDocumentElement || hasOverflowRules) {
|
82
|
-
results.push(parentElement);
|
83
|
-
}
|
84
|
-
if (computedStyle.position === 'fixed') {
|
85
|
-
break;
|
86
|
-
}
|
87
|
-
parentElement = parentElement.parentNode;
|
88
|
-
}
|
89
|
-
results.push(bodyElement);
|
90
|
-
return results;
|
91
|
-
}
|
92
|
-
/**
|
93
|
-
* Confirms offset is fully visible within a parent element.
|
94
|
-
*/
|
95
|
-
export function isOffsetFullyVisibleWithinParent(viewportRuler, parent, offset, bufferOffset) {
|
96
|
-
let parentOffset;
|
97
|
-
if (parent.matches('body')) {
|
98
|
-
const viewportRect = viewportRuler.getViewportRect();
|
99
|
-
parentOffset = {
|
100
|
-
top: 0,
|
101
|
-
left: 0,
|
102
|
-
right: viewportRect.width,
|
103
|
-
bottom: viewportRect.height,
|
104
|
-
};
|
105
|
-
}
|
106
|
-
else if (bufferOffset) {
|
107
|
-
parentOffset = getElementOffset(parent, bufferOffset);
|
108
|
-
}
|
109
|
-
else {
|
110
|
-
parentOffset = getVisibleRectForElement(viewportRuler, parent);
|
111
|
-
}
|
112
|
-
return (parentOffset.top <= offset.top &&
|
113
|
-
parentOffset.right >= offset.right &&
|
114
|
-
parentOffset.bottom >= offset.bottom &&
|
115
|
-
parentOffset.left <= offset.left);
|
116
|
-
}
|
117
|
-
export function isOffsetPartiallyVisibleWithinParent(viewportRuler, parent, offset, bufferOffset) {
|
118
|
-
const parentOffset = bufferOffset
|
119
|
-
? getElementOffset(parent, bufferOffset)
|
120
|
-
: getVisibleRectForElement(viewportRuler, parent);
|
121
|
-
return !(parentOffset.top >= offset.bottom ||
|
122
|
-
parentOffset.right <= offset.left ||
|
123
|
-
parentOffset.bottom <= offset.top ||
|
124
|
-
parentOffset.left >= offset.right);
|
125
|
-
}
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2NvcmUvc3JjL2xpYi9tb2R1bGVzL2FmZml4L2RvbS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixPQUFvQixFQUNwQixZQUE2QjtJQUU3QixNQUFNLGtCQUFrQixHQUFHLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNuRCxNQUFNLGVBQWUsR0FBRyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUUvQyxJQUFJLEdBQVcsQ0FBQztJQUNoQixJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLEtBQWEsQ0FBQztJQUNsQixJQUFJLE1BQWMsQ0FBQztJQUVuQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNuRCxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUN2QixHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUNyQixLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUN6QixNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUUzQixNQUFNLElBQUksa0JBQWtCLENBQUM7SUFDN0IsSUFBSSxJQUFJLGdCQUFnQixDQUFDO0lBQ3pCLEtBQUssSUFBSSxpQkFBaUIsQ0FBQztJQUMzQixHQUFHLElBQUksZUFBZSxDQUFDO0lBRXZCLE9BQU87UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLEtBQUs7UUFDTCxHQUFHO0tBQ0osQ0FBQztBQUNKLENBQUM7QUFFRDs7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QkFBd0IsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE9BQU8sQ0FDTCxZQUFZLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHO1FBQzlCLFlBQVksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUs7UUFDbEMsWUFBWSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTTtRQUNwQyxZQUFZLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQ2pDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLG9DQUFvQyxDQUNsRCxhQUE0QixFQUM1QixNQUFtQixFQUNuQixNQUFnQyxFQUNoQyxZQUE2QjtJQUU3QixNQUFNLFlBQVksR0FBRyxZQUFZO1FBQy9CLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFcEQsT0FBTyxDQUFDLENBQ04sWUFBWSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTTtRQUNqQyxZQUFZLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJO1FBQ2pDLFlBQVksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUc7UUFDakMsWUFBWSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUNsQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpZXdwb3J0UnVsZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5cbmltcG9ydCB7IFNreUFmZml4T2Zmc2V0IH0gZnJvbSAnLi9hZmZpeC1vZmZzZXQnO1xuaW1wb3J0IHsgQWZmaXhSZWN0IH0gZnJvbSAnLi9hZmZpeC1yZWN0JztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvZmZzZXQgdmFsdWVzIG9mIGEgZ2l2ZW4gZWxlbWVudC5cbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQuXG4gKiBAcGFyYW0gYnVmZmVyT2Zmc2V0IEFuIG9wdGlvbmFsIG9mZnNldCB0byBhZGQvc3VidHJhY3QgdG8gdGhlIGVsZW1lbnQncyBhY3R1YWwgb2Zmc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudE9mZnNldChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGJ1ZmZlck9mZnNldD86IFNreUFmZml4T2Zmc2V0LFxuKTogUmVxdWlyZWQ8U2t5QWZmaXhPZmZzZXQ+IHtcbiAgY29uc3QgYnVmZmVyT2Zmc2V0Qm90dG9tID0gYnVmZmVyT2Zmc2V0Py5ib3R0b20gfHwgMDtcbiAgY29uc3QgYnVmZmVyT2Zmc2V0TGVmdCA9IGJ1ZmZlck9mZnNldD8ubGVmdCB8fCAwO1xuICBjb25zdCBidWZmZXJPZmZzZXRSaWdodCA9IGJ1ZmZlck9mZnNldD8ucmlnaHQgfHwgMDtcbiAgY29uc3QgYnVmZmVyT2Zmc2V0VG9wID0gYnVmZmVyT2Zmc2V0Py50b3AgfHwgMDtcblxuICBsZXQgdG9wOiBudW1iZXI7XG4gIGxldCBsZWZ0OiBudW1iZXI7XG4gIGxldCByaWdodDogbnVtYmVyO1xuICBsZXQgYm90dG9tOiBudW1iZXI7XG5cbiAgY29uc3QgY2xpZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGxlZnQgPSBjbGllbnRSZWN0LmxlZnQ7XG4gIHRvcCA9IGNsaWVudFJlY3QudG9wO1xuICByaWdodCA9IGNsaWVudFJlY3QucmlnaHQ7XG4gIGJvdHRvbSA9IGNsaWVudFJlY3QuYm90dG9tO1xuXG4gIGJvdHRvbSAtPSBidWZmZXJPZmZzZXRCb3R0b207XG4gIGxlZnQgKz0gYnVmZmVyT2Zmc2V0TGVmdDtcbiAgcmlnaHQgLT0gYnVmZmVyT2Zmc2V0UmlnaHQ7XG4gIHRvcCArPSBidWZmZXJPZmZzZXRUb3A7XG5cbiAgcmV0dXJuIHtcbiAgICBib3R0b20sXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICB0b3AsXG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBBZmZpeFJlY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvdXRlciBkaW1lbnNpb25zIG9mIGEgZ2l2ZW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE91dGVyUmVjdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IFJlcXVpcmVkPEFmZml4UmVjdD4ge1xuICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IG1hcmdpblRvcCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApO1xuICBjb25zdCBtYXJnaW5MZWZ0ID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpO1xuICBjb25zdCBtYXJnaW5SaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCk7XG4gIGNvbnN0IG1hcmdpbkJvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5tYXJnaW5Cb3R0b20pO1xuXG4gIHJldHVybiB7XG4gICAgdG9wOiByZWN0LnRvcCAtIG1hcmdpblRvcCxcbiAgICBsZWZ0OiByZWN0LmxlZnQgLSBtYXJnaW5MZWZ0LFxuICAgIGJvdHRvbTogcmVjdC50b3AgKyByZWN0LmhlaWdodCArIG1hcmdpbkJvdHRvbSxcbiAgICByaWdodDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCArIG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCxcbiAgICB3aWR0aDogcmVjdC53aWR0aCArIG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICsgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHZpc2libGUgcmVjdCBmb3IgYSBnaXZlbiBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KFxuICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IFJlcXVpcmVkPEFmZml4UmVjdD4ge1xuICBjb25zdCBlbGVtZW50UmVjdCA9IGdldE91dGVyUmVjdChlbGVtZW50KTtcbiAgY29uc3Qgdmlld3BvcnRSZWN0ID0gdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFJlY3QoKTtcblxuICBjb25zdCB2aXNpYmxlUmVjdCA9IHtcbiAgICB0b3A6IE1hdGgubWF4KGVsZW1lbnRSZWN0LnRvcCwgMCksXG4gICAgbGVmdDogTWF0aC5tYXgoZWxlbWVudFJlY3QubGVmdCwgMCksXG4gICAgYm90dG9tOiBNYXRoLm1pbihlbGVtZW50UmVjdC5ib3R0b20sIHZpZXdwb3J0UmVjdC5oZWlnaHQpLFxuICAgIHJpZ2h0OiBNYXRoLm1pbihlbGVtZW50UmVjdC5yaWdodCwgdmlld3BvcnRSZWN0LndpZHRoKSxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnZpc2libGVSZWN0LFxuICAgIHdpZHRoOiB2aXNpYmxlUmVjdC5yaWdodCAtIHZpc2libGVSZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiB2aXNpYmxlUmVjdC5ib3R0b20gLSB2aXNpYmxlUmVjdC50b3AsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdmVyZmxvd1BhcmVudHMoY2hpbGQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gIGNvbnN0IGJvZHlFbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmJvZHk7XG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICBsZXQgcGFyZW50RWxlbWVudCA9IGNoaWxkPy5wYXJlbnROb2RlO1xuXG4gIHdoaWxlIChwYXJlbnRFbGVtZW50ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHBhcmVudEVsZW1lbnQubWF0Y2hlcygnYm9keScpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50RWxlbWVudCwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBvdmVyZmxvd1kgPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93WS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgbGFyZ2VyVGhhblRoZURvY3VtZW50RWxlbWVudCA9XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoIDwgcGFyZW50RWxlbWVudC5zY3JvbGxXaWR0aCB8fFxuICAgICAgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgPCBwYXJlbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICBjb25zdCBoYXNPdmVyZmxvd1J1bGVzID1cbiAgICAgIG92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IG92ZXJmbG93WSA9PT0gJ2hpZGRlbicgfHwgb3ZlcmZsb3dZID09PSAnc2Nyb2xsJztcblxuICAgIGlmIChsYXJnZXJUaGFuVGhlRG9jdW1lbnRFbGVtZW50IHx8IGhhc092ZXJmbG93UnVsZXMpIHtcbiAgICAgIHJlc3VsdHMucHVzaChwYXJlbnRFbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKGNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICByZXN1bHRzLnB1c2goYm9keUVsZW1lbnQpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIENvbmZpcm1zIG9mZnNldCBpcyBmdWxseSB2aXNpYmxlIHdpdGhpbiBhIHBhcmVudCBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPZmZzZXRGdWxseVZpc2libGVXaXRoaW5QYXJlbnQoXG4gIHZpZXdwb3J0UnVsZXI6IFZpZXdwb3J0UnVsZXIsXG4gIHBhcmVudDogSFRNTEVsZW1lbnQsXG4gIG9mZnNldDogUmVxdWlyZWQ8U2t5QWZmaXhPZmZzZXQ+LFxuICBidWZmZXJPZmZzZXQ/OiBTa3lBZmZpeE9mZnNldCxcbik6IGJvb2xlYW4ge1xuICBsZXQgcGFyZW50T2Zmc2V0OiBSZXF1aXJlZDxTa3lBZmZpeE9mZnNldD47XG5cbiAgaWYgKHBhcmVudC5tYXRjaGVzKCdib2R5JykpIHtcbiAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0UmVjdCgpO1xuICAgIHBhcmVudE9mZnNldCA9IHtcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICByaWdodDogdmlld3BvcnRSZWN0LndpZHRoLFxuICAgICAgYm90dG9tOiB2aWV3cG9ydFJlY3QuaGVpZ2h0LFxuICAgIH07XG4gIH0gZWxzZSBpZiAoYnVmZmVyT2Zmc2V0KSB7XG4gICAgcGFyZW50T2Zmc2V0ID0gZ2V0RWxlbWVudE9mZnNldChwYXJlbnQsIGJ1ZmZlck9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50T2Zmc2V0ID0gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KHZpZXdwb3J0UnVsZXIsIHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHBhcmVudE9mZnNldC50b3AgPD0gb2Zmc2V0LnRvcCAmJlxuICAgIHBhcmVudE9mZnNldC5yaWdodCA+PSBvZmZzZXQucmlnaHQgJiZcbiAgICBwYXJlbnRPZmZzZXQuYm90dG9tID49IG9mZnNldC5ib3R0b20gJiZcbiAgICBwYXJlbnRPZmZzZXQubGVmdCA8PSBvZmZzZXQubGVmdFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPZmZzZXRQYXJ0aWFsbHlWaXNpYmxlV2l0aGluUGFyZW50KFxuICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICBwYXJlbnQ6IEhUTUxFbGVtZW50LFxuICBvZmZzZXQ6IFJlcXVpcmVkPFNreUFmZml4T2Zmc2V0PixcbiAgYnVmZmVyT2Zmc2V0PzogU2t5QWZmaXhPZmZzZXQsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50T2Zmc2V0ID0gYnVmZmVyT2Zmc2V0XG4gICAgPyBnZXRFbGVtZW50T2Zmc2V0KHBhcmVudCwgYnVmZmVyT2Zmc2V0KVxuICAgIDogZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KHZpZXdwb3J0UnVsZXIsIHBhcmVudCk7XG5cbiAgcmV0dXJuICEoXG4gICAgcGFyZW50T2Zmc2V0LnRvcCA+PSBvZmZzZXQuYm90dG9tIHx8XG4gICAgcGFyZW50T2Zmc2V0LnJpZ2h0IDw9IG9mZnNldC5sZWZ0IHx8XG4gICAgcGFyZW50T2Zmc2V0LmJvdHRvbSA8PSBvZmZzZXQudG9wIHx8XG4gICAgcGFyZW50T2Zmc2V0LmxlZnQgPj0gb2Zmc2V0LnJpZ2h0XG4gICk7XG59XG4iXX0=
|
@@ -1,2 +0,0 @@
|
|
1
|
-
export {};
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWtwb2ludC1vYnNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jb3JlL3NyYy9saWIvbW9kdWxlcy9icmVha3BvaW50LW9ic2VydmVyL2JyZWFrcG9pbnQtb2JzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2t5QnJlYWtwb2ludCB9IGZyb20gJy4vYnJlYWtwb2ludCc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2t5QnJlYWtwb2ludE9ic2VydmVyIHtcbiAgZ2V0IGJyZWFrcG9pbnRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxTa3lCcmVha3BvaW50PjtcbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuIl19
|