@scion/components 18.1.1 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dimension/dimension.module.d.ts +2 -0
  2. package/dimension/public_api.d.ts +1 -1
  3. package/fesm2022/scion-components-dimension.mjs +17 -16
  4. package/fesm2022/scion-components-dimension.mjs.map +1 -1
  5. package/fesm2022/scion-components-sashbox.mjs +73 -43
  6. package/fesm2022/scion-components-sashbox.mjs.map +1 -1
  7. package/fesm2022/scion-components-splitter.mjs +40 -33
  8. package/fesm2022/scion-components-splitter.mjs.map +1 -1
  9. package/fesm2022/scion-components-throbber.mjs +39 -39
  10. package/fesm2022/scion-components-throbber.mjs.map +1 -1
  11. package/fesm2022/scion-components-viewport.mjs +86 -71
  12. package/fesm2022/scion-components-viewport.mjs.map +1 -1
  13. package/package.json +4 -16
  14. package/sashbox/sashbox.module.d.ts +2 -0
  15. package/splitter/public_api.d.ts +1 -1
  16. package/splitter/splitter.module.d.ts +2 -0
  17. package/throbber/throbber.module.d.ts +2 -0
  18. package/viewport/public_api.d.ts +1 -1
  19. package/viewport/viewport.component.d.ts +7 -6
  20. package/viewport/viewport.module.d.ts +2 -0
  21. package/esm2022/dimension/bounding-client-rect.signal.mjs +0 -54
  22. package/esm2022/dimension/dimension.directive.mjs +0 -67
  23. package/esm2022/dimension/dimension.mjs +0 -11
  24. package/esm2022/dimension/dimension.module.mjs +0 -34
  25. package/esm2022/dimension/dimension.signal.mjs +0 -63
  26. package/esm2022/dimension/public_api.mjs +0 -19
  27. package/esm2022/dimension/scion-components-dimension.mjs +0 -5
  28. package/esm2022/public-api.mjs +0 -11
  29. package/esm2022/sashbox/element-ref.directive.mjs +0 -31
  30. package/esm2022/sashbox/public_api.mjs +0 -18
  31. package/esm2022/sashbox/sash-initializer.directive.mjs +0 -35
  32. package/esm2022/sashbox/sash.directive.mjs +0 -145
  33. package/esm2022/sashbox/sashbox-accessor.mjs +0 -6
  34. package/esm2022/sashbox/sashbox.component.mjs +0 -282
  35. package/esm2022/sashbox/sashbox.module.mjs +0 -55
  36. package/esm2022/sashbox/scion-components-sashbox.mjs +0 -5
  37. package/esm2022/scion-components.mjs +0 -5
  38. package/esm2022/splitter/public_api.mjs +0 -17
  39. package/esm2022/splitter/scion-components-splitter.mjs +0 -5
  40. package/esm2022/splitter/splitter.component.mjs +0 -226
  41. package/esm2022/splitter/splitter.module.mjs +0 -38
  42. package/esm2022/throbber/ellipsis-throbber/ellipsis-throbber.component.mjs +0 -25
  43. package/esm2022/throbber/public_api.mjs +0 -17
  44. package/esm2022/throbber/ripple-throbber/ripple-throbber.component.mjs +0 -25
  45. package/esm2022/throbber/roller-throbber/roller-throbber.component.mjs +0 -25
  46. package/esm2022/throbber/scion-components-throbber.mjs +0 -5
  47. package/esm2022/throbber/spinner-throbber/spinner-throbber.component.mjs +0 -26
  48. package/esm2022/throbber/throbber.component.mjs +0 -72
  49. package/esm2022/throbber/throbber.module.mjs +0 -32
  50. package/esm2022/viewport/native-scrollbar-track-size-provider.service.mjs +0 -91
  51. package/esm2022/viewport/public_api.mjs +0 -19
  52. package/esm2022/viewport/scion-components-viewport.mjs +0 -5
  53. package/esm2022/viewport/scrollable.directive.mjs +0 -92
  54. package/esm2022/viewport/scrollbar/scrollbar.component.mjs +0 -305
  55. package/esm2022/viewport/viewport.component.mjs +0 -264
  56. package/esm2022/viewport/viewport.module.mjs +0 -42
@@ -1,91 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2024 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { inject, Injectable, NgZone } from '@angular/core';
11
- import { DOCUMENT } from '@angular/common';
12
- import { fromEvent } from 'rxjs';
13
- import { debounceTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';
14
- import { toSignal } from '@angular/core/rxjs-interop';
15
- import { subscribeIn } from '@scion/toolkit/operators';
16
- import * as i0 from "@angular/core";
17
- /**
18
- * Provides the native scrollbar tracksize.
19
- */
20
- export class SciNativeScrollbarTrackSizeProvider {
21
- constructor() {
22
- this._document = inject(DOCUMENT);
23
- this._zone = inject(NgZone);
24
- this.trackSize = this.createNativeScrollbarTrackSizeSignal();
25
- }
26
- /**
27
- * Computes the native scrollbar track size.
28
- *
29
- * @returns native track size, or `null` if the native scrollbars sit on top of the content.
30
- */
31
- computeTrackSize() {
32
- // Create temporary viewport and viewport client with native scrollbars to compute the scrolltrack width.
33
- const viewportDiv = this._document.createElement('div');
34
- setStyle(viewportDiv, {
35
- position: 'absolute',
36
- overflow: 'scroll',
37
- height: '100px',
38
- width: '100px',
39
- border: 0,
40
- visibility: 'hidden',
41
- });
42
- const viewportClientDiv = this._document.createElement('div');
43
- setStyle(viewportClientDiv, {
44
- height: '100%',
45
- width: '100%',
46
- border: 0,
47
- });
48
- viewportDiv.appendChild(viewportClientDiv);
49
- this._document.body.appendChild(viewportDiv);
50
- // Do not use client and offset width/height to calculate the size of the scrollbar, as they are rounded, resulting in unwanted spacing when zooming the page.
51
- const viewportBounds = viewportDiv.getBoundingClientRect();
52
- const viewportClientBounds = viewportClientDiv.getBoundingClientRect();
53
- const trackSize = {
54
- hScrollbarTrackHeight: viewportBounds.height - viewportClientBounds.height,
55
- vScrollbarTrackWidth: viewportBounds.width - viewportClientBounds.width,
56
- };
57
- // Destroy temporary viewport.
58
- this._document.body.removeChild(viewportDiv);
59
- if (trackSize.hScrollbarTrackHeight === 0 && trackSize.vScrollbarTrackWidth === 0) {
60
- return null;
61
- }
62
- return trackSize;
63
- }
64
- createNativeScrollbarTrackSizeSignal() {
65
- // We compute the size of the native scrollbar track when the browser fires the onresize window event.
66
- // This event is also fired on page zoom or when displaying a hidden document. Hidden documents do not have
67
- // a scrollbar track size until being displayed, e.g., after showing hidden iframes.
68
- const trackSize$ = fromEvent(window, 'resize')
69
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), debounceTime(5), startWith(null), // trigger the initial computation
70
- map(() => this.computeTrackSize()), distinctUntilChanged((t1, t2) => t1?.hScrollbarTrackHeight === t2?.hScrollbarTrackHeight && t1?.vScrollbarTrackWidth === t2?.vScrollbarTrackWidth));
71
- return toSignal(trackSize$, { initialValue: null });
72
- }
73
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
74
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, providedIn: 'root' }); }
75
- }
76
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciNativeScrollbarTrackSizeProvider, decorators: [{
77
- type: Injectable,
78
- args: [{ providedIn: 'root' }]
79
- }], ctorParameters: () => [] });
80
- /**
81
- * Applies the given style(s) to the given element.
82
- *
83
- * Specify styles to be modified by passing a dictionary containing CSS property names (hyphen case).
84
- * To remove a style, set its value to `null`.
85
- *
86
- * @ignore
87
- */
88
- function setStyle(element, style) {
89
- Object.keys(style).forEach(key => element.style.setProperty(key, style[key]));
90
- }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXNjcm9sbGJhci10cmFjay1zaXplLXByb3ZpZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi9jb21wb25lbnRzL3ZpZXdwb3J0L3NyYy9uYXRpdmUtc2Nyb2xsYmFyLXRyYWNrLXNpemUtcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUVyRDs7R0FFRztBQUVILE1BQU0sT0FBTyxtQ0FBbUM7SUFVOUM7UUFSUSxjQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLFVBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFRN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUN0Qix5R0FBeUc7UUFDekcsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUNwQixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsT0FBTztZQUNmLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxVQUFVLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7UUFFSCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7UUFFSCxXQUFXLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLDhKQUE4SjtRQUM5SixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQTZCO1lBQzFDLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUMsTUFBTTtZQUMxRSxvQkFBb0IsRUFBRSxjQUFjLENBQUMsS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUs7U0FDeEUsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLENBQUMscUJBQXFCLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sb0NBQW9DO1FBQzFDLHNHQUFzRztRQUN0RywyR0FBMkc7UUFDM0csb0ZBQW9GO1FBQ3BGLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2FBQzNDLElBQUksQ0FDSCxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25ELFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsa0NBQWtDO1FBQ25ELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsS0FBSyxFQUFFLEVBQUUscUJBQXFCLElBQUksRUFBRSxFQUFFLG9CQUFvQixLQUFLLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUNuSixDQUFDO1FBQ0osT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQzs4R0F2RVUsbUNBQW1DO2tIQUFuQyxtQ0FBbUMsY0FEdkIsTUFBTTs7MkZBQ2xCLG1DQUFtQztrQkFEL0MsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7O0FBMkVoQzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxRQUFRLENBQUMsT0FBb0IsRUFBRSxLQUFvQztJQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBTaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7ZnJvbUV2ZW50fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7c3Vic2NyaWJlSW59IGZyb20gJ0BzY2lvbi90b29sa2l0L29wZXJhdG9ycyc7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIG5hdGl2ZSBzY3JvbGxiYXIgdHJhY2tzaXplLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBTY2lOYXRpdmVTY3JvbGxiYXJUcmFja1NpemVQcm92aWRlciB7XG5cbiAgcHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSB0cmFjayBzaXplIG9mIHRoZSBuYXRpdmUgc2Nyb2xsYmFyLCBvciBgbnVsbGAgaWYgdGhlIG5hdGl2ZSBzY3JvbGxiYXJzIHNpdCBvbiB0b3Agb2YgdGhlIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgdHJhY2tTaXplOiBTaWduYWw8TmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50cmFja1NpemUgPSB0aGlzLmNyZWF0ZU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVNpZ25hbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBuYXRpdmUgc2Nyb2xsYmFyIHRyYWNrIHNpemUuXG4gICAqXG4gICAqIEByZXR1cm5zIG5hdGl2ZSB0cmFjayBzaXplLCBvciBgbnVsbGAgaWYgdGhlIG5hdGl2ZSBzY3JvbGxiYXJzIHNpdCBvbiB0b3Agb2YgdGhlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVUcmFja1NpemUoKTogTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbCB7XG4gICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSB2aWV3cG9ydCBhbmQgdmlld3BvcnQgY2xpZW50IHdpdGggbmF0aXZlIHNjcm9sbGJhcnMgdG8gY29tcHV0ZSB0aGUgc2Nyb2xsdHJhY2sgd2lkdGguXG4gICAgY29uc3Qgdmlld3BvcnREaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZXRTdHlsZSh2aWV3cG9ydERpdiwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICBoZWlnaHQ6ICcxMDBweCcsXG4gICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgdmlld3BvcnRDbGllbnREaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZXRTdHlsZSh2aWV3cG9ydENsaWVudERpdiwge1xuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgYm9yZGVyOiAwLFxuICAgIH0pO1xuXG4gICAgdmlld3BvcnREaXYuYXBwZW5kQ2hpbGQodmlld3BvcnRDbGllbnREaXYpO1xuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlld3BvcnREaXYpO1xuXG4gICAgLy8gRG8gbm90IHVzZSBjbGllbnQgYW5kIG9mZnNldCB3aWR0aC9oZWlnaHQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzY3JvbGxiYXIsIGFzIHRoZXkgYXJlIHJvdW5kZWQsIHJlc3VsdGluZyBpbiB1bndhbnRlZCBzcGFjaW5nIHdoZW4gem9vbWluZyB0aGUgcGFnZS5cbiAgICBjb25zdCB2aWV3cG9ydEJvdW5kcyA9IHZpZXdwb3J0RGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50Qm91bmRzID0gdmlld3BvcnRDbGllbnREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdHJhY2tTaXplOiBOYXRpdmVTY3JvbGxiYXJUcmFja1NpemUgPSB7XG4gICAgICBoU2Nyb2xsYmFyVHJhY2tIZWlnaHQ6IHZpZXdwb3J0Qm91bmRzLmhlaWdodCAtIHZpZXdwb3J0Q2xpZW50Qm91bmRzLmhlaWdodCxcbiAgICAgIHZTY3JvbGxiYXJUcmFja1dpZHRoOiB2aWV3cG9ydEJvdW5kcy53aWR0aCAtIHZpZXdwb3J0Q2xpZW50Qm91bmRzLndpZHRoLFxuICAgIH07XG5cbiAgICAvLyBEZXN0cm95IHRlbXBvcmFyeSB2aWV3cG9ydC5cbiAgICB0aGlzLl9kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHZpZXdwb3J0RGl2KTtcbiAgICBpZiAodHJhY2tTaXplLmhTY3JvbGxiYXJUcmFja0hlaWdodCA9PT0gMCAmJiB0cmFja1NpemUudlNjcm9sbGJhclRyYWNrV2lkdGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFja1NpemU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVNpZ25hbCgpOiBTaWduYWw8TmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHwgbnVsbD4ge1xuICAgIC8vIFdlIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIG5hdGl2ZSBzY3JvbGxiYXIgdHJhY2sgd2hlbiB0aGUgYnJvd3NlciBmaXJlcyB0aGUgb25yZXNpemUgd2luZG93IGV2ZW50LlxuICAgIC8vIFRoaXMgZXZlbnQgaXMgYWxzbyBmaXJlZCBvbiBwYWdlIHpvb20gb3Igd2hlbiBkaXNwbGF5aW5nIGEgaGlkZGVuIGRvY3VtZW50LiBIaWRkZW4gZG9jdW1lbnRzIGRvIG5vdCBoYXZlXG4gICAgLy8gYSBzY3JvbGxiYXIgdHJhY2sgc2l6ZSB1bnRpbCBiZWluZyBkaXNwbGF5ZWQsIGUuZy4sIGFmdGVyIHNob3dpbmcgaGlkZGVuIGlmcmFtZXMuXG4gICAgY29uc3QgdHJhY2tTaXplJCA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUpLFxuICAgICAgICBzdGFydFdpdGgobnVsbCksIC8vIHRyaWdnZXIgdGhlIGluaXRpYWwgY29tcHV0YXRpb25cbiAgICAgICAgbWFwKCgpID0+IHRoaXMuY29tcHV0ZVRyYWNrU2l6ZSgpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHQxLCB0MikgPT4gdDE/LmhTY3JvbGxiYXJUcmFja0hlaWdodCA9PT0gdDI/LmhTY3JvbGxiYXJUcmFja0hlaWdodCAmJiB0MT8udlNjcm9sbGJhclRyYWNrV2lkdGggPT09IHQyPy52U2Nyb2xsYmFyVHJhY2tXaWR0aCksXG4gICAgICApO1xuICAgIHJldHVybiB0b1NpZ25hbCh0cmFja1NpemUkLCB7aW5pdGlhbFZhbHVlOiBudWxsfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZShzKSB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBTcGVjaWZ5IHN0eWxlcyB0byBiZSBtb2RpZmllZCBieSBwYXNzaW5nIGEgZGljdGlvbmFyeSBjb250YWluaW5nIENTUyBwcm9wZXJ0eSBuYW1lcyAoaHlwaGVuIGNhc2UpLlxuICogVG8gcmVtb3ZlIGEgc3R5bGUsIHNldCBpdHMgdmFsdWUgdG8gYG51bGxgLlxuICpcbiAqIEBpZ25vcmVcbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHN0eWxlOiB7W3N0eWxlOiBzdHJpbmddOiBhbnkgfCBudWxsfSk6IHZvaWQge1xuICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaChrZXkgPT4gZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHN0eWxlW2tleV0pKTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBuYXRpdmUgc2Nyb2xsYmFyIHRyYWNrIHNpemUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplIHtcbiAgaFNjcm9sbGJhclRyYWNrSGVpZ2h0OiBudW1iZXI7XG4gIHZTY3JvbGxiYXJUcmFja1dpZHRoOiBudW1iZXI7XG59XG4iXX0=
@@ -1,19 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2019 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- /*
11
- * Secondary entrypoint: '@scion/components/viewport'
12
- *
13
- * @see https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md
14
- */
15
- export { SciViewportModule } from './viewport.module';
16
- export { SciViewportComponent } from './viewport.component';
17
- export { SciScrollbarComponent } from './scrollbar/scrollbar.component';
18
- export { SciScrollableDirective } from './scrollable.directive';
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvdmlld3BvcnQvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSDs7OztHQUlHO0FBQ0gsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFDLG9CQUFvQixFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLypcbiAqIFNlY29uZGFyeSBlbnRyeXBvaW50OiAnQHNjaW9uL2NvbXBvbmVudHMvdmlld3BvcnQnXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmctcGFja2Fnci9uZy1wYWNrYWdyL2Jsb2IvbWFzdGVyL2RvY3Mvc2Vjb25kYXJ5LWVudHJ5cG9pbnRzLm1kXG4gKi9cbmV4cG9ydCB7U2NpVmlld3BvcnRNb2R1bGV9IGZyb20gJy4vdmlld3BvcnQubW9kdWxlJztcbmV4cG9ydCB7U2NpVmlld3BvcnRDb21wb25lbnQsIFNjcm9sbGJhclN0eWxlfSBmcm9tICcuL3ZpZXdwb3J0LmNvbXBvbmVudCc7XG5leHBvcnQge1NjaVNjcm9sbGJhckNvbXBvbmVudH0gZnJvbSAnLi9zY3JvbGxiYXIvc2Nyb2xsYmFyLmNvbXBvbmVudCc7XG5leHBvcnQge1NjaVNjcm9sbGFibGVEaXJlY3RpdmV9IGZyb20gJy4vc2Nyb2xsYWJsZS5kaXJlY3RpdmUnO1xuIl19
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public_api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Npb24tY29tcG9uZW50cy12aWV3cG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvdmlld3BvcnQvc3JjL3NjaW9uLWNvbXBvbmVudHMtdmlld3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
@@ -1,92 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2019 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { Directive, effect, ElementRef, inject, input, Renderer2, untracked } from '@angular/core';
11
- import { SciNativeScrollbarTrackSizeProvider } from './native-scrollbar-track-size-provider.service';
12
- import * as i0 from "@angular/core";
13
- /**
14
- * Makes the host element natively scrollable and hides native scrollbars by default, unless native scrollbars
15
- * already sit on top of the viewport (e.g. in OS X).
16
- *
17
- * Because there is no cross-browser API to hide scrollbars without losing native scroll support, we set 'overflow'
18
- * to 'scroll' but shift the native scrollbars out of the visible viewport area. The shift offset is computed upfront.
19
- *
20
- * This directive expects its host element to be the only child in document flow in its parent DOM element. It makes the host element
21
- * fill up the entire space (width and height set to 100%). The parent element must have its CSS `overflow` property set to `hidden`
22
- * to hide the pushed out native scrollbars.
23
- */
24
- export class SciScrollableDirective {
25
- constructor() {
26
- this._host = inject((ElementRef)).nativeElement;
27
- this._renderer = inject(Renderer2);
28
- this._nativeScrollbarTrackSizeProvider = inject(SciNativeScrollbarTrackSizeProvider);
29
- /**
30
- * Controls whether to display native scrollbars.
31
- * Has no effect if the native scrollbar sits on top of the content, e.g. in OS X.
32
- */
33
- this.displayNativeScrollbar = input(false, { alias: 'sciScrollableDisplayNativeScrollbar' });
34
- this.controlDisplayOfNativeScrollbar();
35
- }
36
- /**
37
- * Controls the display of the native scrollbar based on this directive's configuration.
38
- */
39
- controlDisplayOfNativeScrollbar() {
40
- effect(() => {
41
- const displayNativeScrollbar = this.displayNativeScrollbar();
42
- if (displayNativeScrollbar) {
43
- untracked(() => this.useNativeScrollbars());
44
- return;
45
- }
46
- const nativeScrollbarTrackSize = this._nativeScrollbarTrackSizeProvider.trackSize();
47
- if (nativeScrollbarTrackSize) {
48
- untracked(() => this.shiftNativeScrollbars(nativeScrollbarTrackSize));
49
- }
50
- else {
51
- untracked(() => this.useNativeScrollbars());
52
- }
53
- });
54
- }
55
- /**
56
- * Uses the native scrollbars when content overflows.
57
- */
58
- useNativeScrollbars() {
59
- this.setStyle(this._host, {
60
- overflow: 'auto',
61
- width: '100%',
62
- height: '100%',
63
- marginRight: 0,
64
- marginBottom: 0,
65
- });
66
- }
67
- /**
68
- * Shifts the native scrollbars out of the visible viewport area.
69
- */
70
- shiftNativeScrollbars(nativeScrollbarTrackSize) {
71
- this.setStyle(this._host, {
72
- overflow: 'scroll',
73
- width: `calc(100% + ${nativeScrollbarTrackSize.vScrollbarTrackWidth}px`,
74
- height: `calc(100% + ${nativeScrollbarTrackSize.hScrollbarTrackHeight}px`,
75
- marginRight: `-${nativeScrollbarTrackSize.vScrollbarTrackWidth}px`,
76
- marginBottom: `-${nativeScrollbarTrackSize.hScrollbarTrackHeight}px`,
77
- });
78
- }
79
- setStyle(element, style) {
80
- Object.keys(style).forEach(key => this._renderer.setStyle(element, key, style[key]));
81
- }
82
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
83
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: SciScrollableDirective, isStandalone: true, selector: "[sciScrollable]", inputs: { displayNativeScrollbar: { classPropertyName: "displayNativeScrollbar", publicName: "sciScrollableDisplayNativeScrollbar", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
84
- }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollableDirective, decorators: [{
86
- type: Directive,
87
- args: [{
88
- selector: '[sciScrollable]',
89
- standalone: true,
90
- }]
91
- }], ctorParameters: () => [] });
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi9jb21wb25lbnRzL3ZpZXdwb3J0L3NyYy9zY3JvbGxhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUEyQixtQ0FBbUMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDOztBQUc3SDs7Ozs7Ozs7OztHQVVHO0FBS0gsTUFBTSxPQUFPLHNCQUFzQjtJQVlqQztRQVZRLFVBQUssR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUEwQixDQUFBLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDekQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixzQ0FBaUMsR0FBRyxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUV4Rjs7O1dBR0c7UUFDSSwyQkFBc0IsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLHFDQUFxQyxFQUFDLENBQUMsQ0FBQztRQUczRixJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSywrQkFBK0I7UUFDckMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDN0QsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUMzQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztnQkFDNUMsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwRixJQUFJLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7aUJBQ0ksQ0FBQztnQkFDSixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3hCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLE1BQU07WUFDZCxXQUFXLEVBQUUsQ0FBQztZQUNkLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHFCQUFxQixDQUFDLHdCQUFrRDtRQUM5RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDeEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsS0FBSyxFQUFFLGVBQWUsd0JBQXdCLENBQUMsb0JBQW9CLElBQUk7WUFDdkUsTUFBTSxFQUFFLGVBQWUsd0JBQXdCLENBQUMscUJBQXFCLElBQUk7WUFDekUsV0FBVyxFQUFFLElBQUksd0JBQXdCLENBQUMsb0JBQW9CLElBQUk7WUFDbEUsWUFBWSxFQUFFLElBQUksd0JBQXdCLENBQUMscUJBQXFCLElBQUk7U0FDckUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFFBQVEsQ0FBQyxPQUFnQixFQUFFLEtBQWlCO1FBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7OEdBakVVLHNCQUFzQjtrR0FBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQUpsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7RGlyZWN0aXZlLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIFJlbmRlcmVyMiwgdW50cmFja2VkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplLCBTY2lOYXRpdmVTY3JvbGxiYXJUcmFja1NpemVQcm92aWRlcn0gZnJvbSAnLi9uYXRpdmUtc2Nyb2xsYmFyLXRyYWNrLXNpemUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQge0RpY3Rpb25hcnl9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIE1ha2VzIHRoZSBob3N0IGVsZW1lbnQgbmF0aXZlbHkgc2Nyb2xsYWJsZSBhbmQgaGlkZXMgbmF0aXZlIHNjcm9sbGJhcnMgYnkgZGVmYXVsdCwgdW5sZXNzIG5hdGl2ZSBzY3JvbGxiYXJzXG4gKiBhbHJlYWR5IHNpdCBvbiB0b3Agb2YgdGhlIHZpZXdwb3J0IChlLmcuIGluIE9TIFgpLlxuICpcbiAqIEJlY2F1c2UgdGhlcmUgaXMgbm8gY3Jvc3MtYnJvd3NlciBBUEkgdG8gaGlkZSBzY3JvbGxiYXJzIHdpdGhvdXQgbG9zaW5nIG5hdGl2ZSBzY3JvbGwgc3VwcG9ydCwgd2Ugc2V0ICdvdmVyZmxvdydcbiAqIHRvICdzY3JvbGwnIGJ1dCBzaGlmdCB0aGUgbmF0aXZlIHNjcm9sbGJhcnMgb3V0IG9mIHRoZSB2aXNpYmxlIHZpZXdwb3J0IGFyZWEuIFRoZSBzaGlmdCBvZmZzZXQgaXMgY29tcHV0ZWQgdXBmcm9udC5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBleHBlY3RzIGl0cyBob3N0IGVsZW1lbnQgdG8gYmUgdGhlIG9ubHkgY2hpbGQgaW4gZG9jdW1lbnQgZmxvdyBpbiBpdHMgcGFyZW50IERPTSBlbGVtZW50LiBJdCBtYWtlcyB0aGUgaG9zdCBlbGVtZW50XG4gKiBmaWxsIHVwIHRoZSBlbnRpcmUgc3BhY2UgKHdpZHRoIGFuZCBoZWlnaHQgc2V0IHRvIDEwMCUpLiBUaGUgcGFyZW50IGVsZW1lbnQgbXVzdCBoYXZlIGl0cyBDU1MgYG92ZXJmbG93YCBwcm9wZXJ0eSBzZXQgdG8gYGhpZGRlbmBcbiAqIHRvIGhpZGUgdGhlIHB1c2hlZCBvdXQgbmF0aXZlIHNjcm9sbGJhcnMuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzY2lTY3JvbGxhYmxlXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFNjaVNjcm9sbGFibGVEaXJlY3RpdmUge1xuXG4gIHByaXZhdGUgX2hvc3QgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4pLm5hdGl2ZUVsZW1lbnQ7XG4gIHByaXZhdGUgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIHByaXZhdGUgX25hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVByb3ZpZGVyID0gaW5qZWN0KFNjaU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVByb3ZpZGVyKTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0byBkaXNwbGF5IG5hdGl2ZSBzY3JvbGxiYXJzLlxuICAgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBuYXRpdmUgc2Nyb2xsYmFyIHNpdHMgb24gdG9wIG9mIHRoZSBjb250ZW50LCBlLmcuIGluIE9TIFguXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheU5hdGl2ZVNjcm9sbGJhciA9IGlucHV0KGZhbHNlLCB7YWxpYXM6ICdzY2lTY3JvbGxhYmxlRGlzcGxheU5hdGl2ZVNjcm9sbGJhcid9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbnRyb2xEaXNwbGF5T2ZOYXRpdmVTY3JvbGxiYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgZGlzcGxheSBvZiB0aGUgbmF0aXZlIHNjcm9sbGJhciBiYXNlZCBvbiB0aGlzIGRpcmVjdGl2ZSdzIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNvbnRyb2xEaXNwbGF5T2ZOYXRpdmVTY3JvbGxiYXIoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRpc3BsYXlOYXRpdmVTY3JvbGxiYXIgPSB0aGlzLmRpc3BsYXlOYXRpdmVTY3JvbGxiYXIoKTtcbiAgICAgIGlmIChkaXNwbGF5TmF0aXZlU2Nyb2xsYmFyKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnVzZU5hdGl2ZVNjcm9sbGJhcnMoKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplID0gdGhpcy5fbmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplUHJvdmlkZXIudHJhY2tTaXplKCk7XG4gICAgICBpZiAobmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnNoaWZ0TmF0aXZlU2Nyb2xsYmFycyhuYXRpdmVTY3JvbGxiYXJUcmFja1NpemUpKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy51c2VOYXRpdmVTY3JvbGxiYXJzKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgdGhlIG5hdGl2ZSBzY3JvbGxiYXJzIHdoZW4gY29udGVudCBvdmVyZmxvd3MuXG4gICAqL1xuICBwcml2YXRlIHVzZU5hdGl2ZVNjcm9sbGJhcnMoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdHlsZSh0aGlzLl9ob3N0LCB7XG4gICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgbWFyZ2luUmlnaHQ6IDAsXG4gICAgICBtYXJnaW5Cb3R0b206IDAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hpZnRzIHRoZSBuYXRpdmUgc2Nyb2xsYmFycyBvdXQgb2YgdGhlIHZpc2libGUgdmlld3BvcnQgYXJlYS5cbiAgICovXG4gIHByaXZhdGUgc2hpZnROYXRpdmVTY3JvbGxiYXJzKG5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZTogTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdHlsZSh0aGlzLl9ob3N0LCB7XG4gICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICB3aWR0aDogYGNhbGMoMTAwJSArICR7bmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplLnZTY3JvbGxiYXJUcmFja1dpZHRofXB4YCxcbiAgICAgIGhlaWdodDogYGNhbGMoMTAwJSArICR7bmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplLmhTY3JvbGxiYXJUcmFja0hlaWdodH1weGAsXG4gICAgICBtYXJnaW5SaWdodDogYC0ke25hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZS52U2Nyb2xsYmFyVHJhY2tXaWR0aH1weGAsXG4gICAgICBtYXJnaW5Cb3R0b206IGAtJHtuYXRpdmVTY3JvbGxiYXJUcmFja1NpemUuaFNjcm9sbGJhclRyYWNrSGVpZ2h0fXB4YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3R5bGUoZWxlbWVudDogRWxlbWVudCwgc3R5bGU6IERpY3Rpb25hcnkpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaChrZXkgPT4gdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwga2V5LCBzdHlsZVtrZXldKSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,305 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2019 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { DOCUMENT } from '@angular/common';
11
- import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, HostBinding, inject, input, NgZone, untracked, viewChild } from '@angular/core';
12
- import { fromEvent, merge, mergeWith, of, timer } from 'rxjs';
13
- import { debounceTime, first, map, startWith, switchMap, takeUntil, takeWhile, withLatestFrom } from 'rxjs/operators';
14
- import { fromMutation$, fromResize$ } from '@scion/toolkit/observable';
15
- import { filterArray, subscribeIn } from '@scion/toolkit/operators';
16
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
17
- import * as i0 from "@angular/core";
18
- /**
19
- * Renders a vertical or horizontal scrollbar.
20
- *
21
- * The scrollbar features the following functionality:
22
- * - allows to move the thumb by mouse or touch
23
- * - enlarges the thumb if the mouse pointer is near the thumb
24
- * - allows paging on mousedown on the scroll track
25
- *
26
- * ### Styling:
27
- *
28
- * To customize the default look of SCION components or support different themes, configure the `@scion/components` SCSS module in `styles.scss`.
29
- * To style a specific `sci-scrollbar` component, the following CSS variables can be set directly on the component.
30
- *
31
- * - sci-scrollbar-color: Sets the color of the scrollbar.
32
- *
33
- * Example:
34
- *
35
- * ```css
36
- *
37
- * sci-scrollbar {
38
- * --sci-scrollbar-color: blue;
39
- * }
40
- * ```
41
- */
42
- export class SciScrollbarComponent {
43
- /**
44
- * Timeout for debouncing viewport resize events that trigger the scroll position computation.
45
- *
46
- * Debouncing is particularly important in the context of Angular animations, since they continuously
47
- * trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
48
- * expands a panel that contains a viewport.
49
- *
50
- * @internal
51
- */
52
- static { this.VIEWPORT_RESIZE_DEBOUNCE_TIME = 50; }
53
- get vertical() {
54
- return this._vertical();
55
- }
56
- get horizontal() {
57
- return !this._vertical();
58
- }
59
- get scrolling() {
60
- return this._lastDragPosition !== null;
61
- }
62
- constructor() {
63
- this._host = inject((ElementRef)).nativeElement;
64
- this._document = inject(DOCUMENT);
65
- this._zone = inject(NgZone);
66
- this._destroyRef = inject(DestroyRef);
67
- this._lastDragPosition = null;
68
- this._overflow = false;
69
- this._thumbSizeFr = 0;
70
- this._thumbPositionFr = 0;
71
- this._thumbElement = viewChild.required('thumb_handle');
72
- this._vertical = computed(() => this.direction() === 'vscroll');
73
- /**
74
- * Specifies the direction of the scrollbar.
75
- *
76
- * By default, if not specified, renders a vertical scrollbar.
77
- */
78
- this.direction = input('vscroll');
79
- /**
80
- * The viewport to provide scrollbars for.
81
- */
82
- this.viewport = input.required();
83
- this.installScrollPositionRenderer();
84
- }
85
- /**
86
- * Computes the scroll position and updates CSS variables to render the scroll position in the UI.
87
- */
88
- renderScrollPosition() {
89
- NgZone.assertNotInAngularZone();
90
- const viewportSize = this.viewportSize;
91
- const viewportClientSize = this.viewportClientSize;
92
- const thumbPositionFr = this.scrollPosition / viewportClientSize;
93
- const thumbSizeFr = viewportSize / viewportClientSize;
94
- const overflow = viewportClientSize > viewportSize;
95
- if (thumbPositionFr !== this._thumbPositionFr || thumbSizeFr !== this._thumbSizeFr) {
96
- this._thumbPositionFr = thumbPositionFr;
97
- this._thumbSizeFr = thumbSizeFr;
98
- this.setCssVariable('--ɵsci-scrollbar-thumb-position-fr', thumbPositionFr);
99
- this.setCssVariable('--ɵsci-scrollbar-thumb-size-fr', thumbSizeFr);
100
- }
101
- if (overflow !== this._overflow) {
102
- this._overflow = overflow;
103
- overflow ? this._host.classList.add('overflow') : this._host.classList.remove('overflow');
104
- }
105
- }
106
- /**
107
- * Clears CSS variables used for rendering the scroll position in the UI.
108
- */
109
- unsetScrollPosition() {
110
- NgZone.assertNotInAngularZone();
111
- this._thumbPositionFr = 0;
112
- this._thumbSizeFr = 0;
113
- this._overflow = false;
114
- this.setCssVariable('--ɵsci-scrollbar-thumb-position-fr', 0);
115
- this.setCssVariable('--ɵsci-scrollbar-thumb-size-fr', 0);
116
- this._host.classList.remove('overflow');
117
- }
118
- onTouchStart(event) {
119
- event.preventDefault();
120
- this._lastDragPosition = this.vertical ? event.touches[0].screenY : event.touches[0].screenX;
121
- }
122
- onTouchMove(event) {
123
- event.preventDefault();
124
- const newDragPositionPx = this.vertical ? event.touches[0].screenY : event.touches[0].screenX;
125
- const scrollbarPanPx = newDragPositionPx - this._lastDragPosition;
126
- const viewportPanPx = this.toViewportPanPx(scrollbarPanPx);
127
- this._lastDragPosition = newDragPositionPx;
128
- this.moveViewportClient(viewportPanPx);
129
- }
130
- onTouchEnd(event) {
131
- event.preventDefault();
132
- this._lastDragPosition = null;
133
- }
134
- onMouseDown(mousedownEvent) {
135
- if (mousedownEvent.button !== 0) {
136
- return;
137
- }
138
- mousedownEvent.preventDefault();
139
- this._lastDragPosition = this.vertical ? mousedownEvent.screenY : mousedownEvent.screenX;
140
- // Listen for 'mousemove' events
141
- const mousemoveListener = merge(fromEvent(this._document, 'mousemove'), fromEvent(this._document, 'sci-mousemove'))
142
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed(this._destroyRef))
143
- .subscribe(mousemoveEvent => {
144
- NgZone.assertNotInAngularZone();
145
- mousemoveEvent.preventDefault();
146
- const newDragPositionPx = this.vertical ? mousemoveEvent.screenY : mousemoveEvent.screenX;
147
- const scrollbarPanPx = newDragPositionPx - this._lastDragPosition;
148
- const viewportPanPx = this.toViewportPanPx(scrollbarPanPx);
149
- this._lastDragPosition = newDragPositionPx;
150
- this.moveViewportClient(viewportPanPx);
151
- });
152
- // Listen for 'mouseup' events; use 'capture phase' and 'stop propagation' to not close overlays
153
- merge(fromEvent(this._document, 'mouseup', { capture: true }), fromEvent(this._document, 'sci-mouseup'))
154
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), first(), takeUntilDestroyed(this._destroyRef))
155
- .subscribe(mouseupEvent => {
156
- NgZone.assertNotInAngularZone();
157
- mouseupEvent.stopPropagation();
158
- mousemoveListener.unsubscribe();
159
- this._lastDragPosition = null;
160
- });
161
- }
162
- onScrollTrackMouseDown(event, direction) {
163
- const signum = (direction === 'up' ? -1 : +1);
164
- this.scrollWhileMouseDown(this.toViewportPanPx(signum * this.thumbSize), event);
165
- }
166
- /**
167
- * Renders the current scroll position when the viewport is scrolled.
168
- */
169
- installScrollPositionRenderer() {
170
- effect(onCleanup => {
171
- const viewport = this.viewport();
172
- untracked(() => {
173
- if (!viewport) {
174
- this.unsetScrollPosition();
175
- return;
176
- }
177
- const subscription = viewportScroll$(viewport)
178
- .pipe(mergeWith(viewportSize$(viewport, { debounceTime: SciScrollbarComponent.VIEWPORT_RESIZE_DEBOUNCE_TIME })), mergeWith(viewportClientSize$(viewport, { debounceTime: SciScrollbarComponent.VIEWPORT_RESIZE_DEBOUNCE_TIME })), subscribeIn(fn => this._zone.runOutsideAngular(fn)))
179
- .subscribe(() => this.renderScrollPosition());
180
- onCleanup(() => subscription.unsubscribe());
181
- });
182
- });
183
- }
184
- /**
185
- * Projects the given scrollbar scroll pixels into viewport scroll pixels.
186
- */
187
- toViewportPanPx(scrollbarPanPx) {
188
- const scrollRangePx = this.trackSize - this.thumbSize;
189
- const scrollRatio = scrollbarPanPx / scrollRangePx;
190
- return scrollRatio * (this.viewportClientSize - this.viewportSize);
191
- }
192
- /**
193
- * Moves the viewport client by the specified numbers of pixels.
194
- */
195
- moveViewportClient(viewportPanPx) {
196
- if (this.vertical) {
197
- this.viewport().scrollTop += viewportPanPx;
198
- }
199
- else {
200
- this.viewport().scrollLeft += viewportPanPx;
201
- }
202
- }
203
- /**
204
- * Indicates if the content overflows.
205
- */
206
- get overflow() {
207
- return this._overflow;
208
- }
209
- /**
210
- * Scrolls continuously while holding the mouse pressed, or until the mouse leaves the scrolltrack.
211
- */
212
- scrollWhileMouseDown(viewportScrollPx, mousedownEvent) {
213
- // The `EventTarget` type of `Event.target` is not yet compatible with `FromEventTarget` used in `fromEvent`.
214
- // This will be fixed in rxjs version 7.0.0. Refer to https://github.com/ReactiveX/rxjs/commit/5f022d784570684632e6fd5ae247fc259ee34c4b
215
- // for more details.
216
- const scrollTrackElement = mousedownEvent.target;
217
- // scroll continuously every 50ms after an initial delay of 250ms
218
- timer(250, 50)
219
- .pipe(
220
- // continue chain with latest mouse event
221
- withLatestFrom(merge(of(mousedownEvent), fromEvent(scrollTrackElement, 'mousemove')), (tick, event) => event),
222
- // start immediately
223
- startWith(mousedownEvent),
224
- // stop scrolling if the thumb hits the mouse pointer position
225
- takeWhile((event) => scrollTrackElement === this._document.elementFromPoint(event.clientX, event.clientY)), debounceTime(10),
226
- // stop scrolling on mouseout or mouseup
227
- takeUntil(merge(fromEvent(scrollTrackElement, 'mouseout'), fromEvent(scrollTrackElement, 'mouseup'))))
228
- .subscribe(() => {
229
- this.moveViewportClient(viewportScrollPx);
230
- });
231
- }
232
- setCssVariable(key, value) {
233
- this._host.style.setProperty(key, value);
234
- }
235
- get viewportSize() {
236
- return this.viewport() ? (this.vertical ? this.viewport().clientHeight : this.viewport().clientWidth) : 0;
237
- }
238
- get viewportClientSize() {
239
- return this.viewport() ? (this.vertical ? this.viewport().scrollHeight : this.viewport().scrollWidth) : 0;
240
- }
241
- get scrollPosition() {
242
- return this.viewport() ? (this.vertical ? this.viewport().scrollTop : this.viewport().scrollLeft) : 0;
243
- }
244
- get thumbSize() {
245
- const thumbElement = this._thumbElement().nativeElement;
246
- return this.vertical ? thumbElement.clientHeight : thumbElement.clientWidth;
247
- }
248
- get trackSize() {
249
- return this.vertical ? this._host.clientHeight : this._host.clientWidth;
250
- }
251
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
252
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.0.1", type: SciScrollbarComponent, isStandalone: true, selector: "sci-scrollbar", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, viewport: { classPropertyName: "viewport", publicName: "viewport", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class.vertical": "this.vertical", "class.horizontal": "this.horizontal", "class.scrolling": "this.scrolling" } }, viewQueries: [{ propertyName: "_thumbElement", first: true, predicate: ["thumb_handle"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- scrolltrack to move the viewport client upwards (paging) -->\n<div class=\"scrolltrack-start\" (mousedown)=\"onScrollTrackMouseDown($event, 'up')\"></div>\n\n<!-- scrollthumb -->\n<div #thumb_handle\n class=\"thumb-handle\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\"\n (mousedown)=\"onMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n (touchcancel)=\"onTouchEnd($event)\">\n <div class=\"thumb\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\">\n </div>\n</div>\n\n<!-- scrolltrack to move the viewport client downwards (paging) -->\n<div class=\"scrolltrack-end\" (mousedown)=\"onScrollTrackMouseDown($event, 'down')\"></div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;border:2px solid transparent;box-sizing:border-box;--\\275sci-scrollbar-thumb-position-fr: 0;--\\275sci-scrollbar-thumb-size-fr: 0}:host.vertical{flex-direction:column}:host.horizontal{flex-direction:row}:host>div.scrolltrack-start{flex-grow:var(--\\275sci-scrollbar-thumb-position-fr)}:host>div.thumb-handle{flex-basis:20px;display:flex;flex-grow:var(--\\275sci-scrollbar-thumb-size-fr);align-items:center}:host>div.thumb-handle.vertical{flex-direction:column}:host>div.thumb-handle.horizontal{flex-direction:row}:host>div.thumb-handle>div.thumb{flex:auto;border-radius:4px;background-color:var(--sci-scrollbar-color);opacity:.4;transition-duration:125ms;transition-property:width,height;transition-timing-function:ease-out}:host>div.thumb-handle>div.thumb.vertical{width:60%}:host>div.thumb-handle>div.thumb.horizontal{height:60%}:host>div.scrolltrack-end{flex-grow:calc(1 - (var(--\\275sci-scrollbar-thumb-position-fr) + var(--\\275sci-scrollbar-thumb-size-fr)))}:host-context:not(.overflow){display:none}:host-context:hover>div.thumb-handle>div.thumb,:host-context(.scrolling)>div.thumb-handle>div.thumb{background-color:var(--sci-scrollbar-color);opacity:.75}:host-context:hover>div.thumb-handle>div.thumb.vertical,:host-context(.scrolling)>div.thumb-handle>div.thumb.vertical{width:100%}:host-context:hover>div.thumb-handle>div.thumb.horizontal,:host-context(.scrolling)>div.thumb-handle>div.thumb.horizontal{height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
253
- }
254
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollbarComponent, decorators: [{
255
- type: Component,
256
- args: [{ selector: 'sci-scrollbar', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<!-- scrolltrack to move the viewport client upwards (paging) -->\n<div class=\"scrolltrack-start\" (mousedown)=\"onScrollTrackMouseDown($event, 'up')\"></div>\n\n<!-- scrollthumb -->\n<div #thumb_handle\n class=\"thumb-handle\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\"\n (mousedown)=\"onMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n (touchcancel)=\"onTouchEnd($event)\">\n <div class=\"thumb\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\">\n </div>\n</div>\n\n<!-- scrolltrack to move the viewport client downwards (paging) -->\n<div class=\"scrolltrack-end\" (mousedown)=\"onScrollTrackMouseDown($event, 'down')\"></div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;border:2px solid transparent;box-sizing:border-box;--\\275sci-scrollbar-thumb-position-fr: 0;--\\275sci-scrollbar-thumb-size-fr: 0}:host.vertical{flex-direction:column}:host.horizontal{flex-direction:row}:host>div.scrolltrack-start{flex-grow:var(--\\275sci-scrollbar-thumb-position-fr)}:host>div.thumb-handle{flex-basis:20px;display:flex;flex-grow:var(--\\275sci-scrollbar-thumb-size-fr);align-items:center}:host>div.thumb-handle.vertical{flex-direction:column}:host>div.thumb-handle.horizontal{flex-direction:row}:host>div.thumb-handle>div.thumb{flex:auto;border-radius:4px;background-color:var(--sci-scrollbar-color);opacity:.4;transition-duration:125ms;transition-property:width,height;transition-timing-function:ease-out}:host>div.thumb-handle>div.thumb.vertical{width:60%}:host>div.thumb-handle>div.thumb.horizontal{height:60%}:host>div.scrolltrack-end{flex-grow:calc(1 - (var(--\\275sci-scrollbar-thumb-position-fr) + var(--\\275sci-scrollbar-thumb-size-fr)))}:host-context:not(.overflow){display:none}:host-context:hover>div.thumb-handle>div.thumb,:host-context(.scrolling)>div.thumb-handle>div.thumb{background-color:var(--sci-scrollbar-color);opacity:.75}:host-context:hover>div.thumb-handle>div.thumb.vertical,:host-context(.scrolling)>div.thumb-handle>div.thumb.vertical{width:100%}:host-context:hover>div.thumb-handle>div.thumb.horizontal,:host-context(.scrolling)>div.thumb-handle>div.thumb.horizontal{height:100%}\n"] }]
257
- }], ctorParameters: () => [], propDecorators: { vertical: [{
258
- type: HostBinding,
259
- args: ['class.vertical']
260
- }], horizontal: [{
261
- type: HostBinding,
262
- args: ['class.horizontal']
263
- }], scrolling: [{
264
- type: HostBinding,
265
- args: ['class.scrolling']
266
- }] } });
267
- /**
268
- * Emits whenever the viewport scrolls.
269
- */
270
- function viewportScroll$(viewport) {
271
- return fromEvent(viewport, 'scroll', { passive: true }).pipe(map(() => undefined));
272
- }
273
- /**
274
- * Emits on subscription, and then each time the size of the viewport changes.
275
- */
276
- function viewportSize$(viewport, options) {
277
- return fromResize$(viewport)
278
- .pipe(
279
- // Debouncing is particularly important in the context of Angular animations, since they continuously
280
- // trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
281
- // expands a panel that contains a viewport.
282
- debounceTime(options.debounceTime), map(() => undefined));
283
- }
284
- /**
285
- * Emits on subscription, and then each time the size or style property of the viewport client changes.
286
- */
287
- function viewportClientSize$(viewport, options) {
288
- return children$(viewport)
289
- .pipe(switchMap(children => merge(...children.map(child => merge(fromResize$(child),
290
- // Observe style mutations since some transformations change the scroll position without necessarily triggering a dimension change,
291
- // e.g., `scale` or `translate` used by some virtual scroll implementations
292
- fromMutation$(child, { subtree: false, childList: false, attributeFilter: ['style'] }))))),
293
- // Debouncing is particularly important in the context of Angular animations, since they continuously
294
- // trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
295
- // expands a panel that contains a viewport.
296
- debounceTime(options.debounceTime), map(() => undefined));
297
- }
298
- /**
299
- * Emits the children of the passed element, and then each time child elements are added or removed.
300
- */
301
- function children$(element) {
302
- return fromMutation$(element, { subtree: false, childList: true })
303
- .pipe(startWith(undefined), map(() => Array.from(element.children)), filterArray((child) => child instanceof HTMLElement));
304
- }
305
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvdmlld3BvcnQvc3JjL3Njcm9sbGJhci9zY3JvbGxiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvc2Nyb2xsYmFyL3Njcm9sbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNySyxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BILE9BQU8sRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUFFOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBUUgsTUFBTSxPQUFPLHFCQUFxQjtJQUVo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USxDQUFDO1NBQ3ZCLElBQUksQ0FDSCxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUN4RCxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ2xCLG1JQUFtSTtJQUNuSSwyRUFBMkU7SUFDM0UsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FDdEYsQ0FBQyxDQUFDO0lBQ0gscUdBQXFHO0lBQ3JHLHVHQUF1RztJQUN2Ryw0Q0FBNEM7SUFDNUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFDbEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUNyQixDQUFDO0FBQ04sQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBb0I7SUFDckMsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDN0QsSUFBSSxDQUNILFNBQVMsQ0FBQyxTQUFpQixDQUFDLEVBQzVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUN2QyxXQUFXLENBQUMsQ0FBQyxLQUFjLEVBQXdCLEVBQUUsQ0FBQyxLQUFLLFlBQVksV0FBVyxDQUFDLENBQ3BGLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIGluamVjdCwgaW5wdXQsIE5nWm9uZSwgdW50cmFja2VkLCB2aWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIG1lcmdlLCBtZXJnZVdpdGgsIE9ic2VydmFibGUsIG9mLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlyc3QsIG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFrZVdoaWxlLCB3aXRoTGF0ZXN0RnJvbX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmcm9tTXV0YXRpb24kLCBmcm9tUmVzaXplJH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb2JzZXJ2YWJsZSc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbi8qKlxuICogUmVuZGVycyBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgc2Nyb2xsYmFyLlxuICpcbiAqIFRoZSBzY3JvbGxiYXIgZmVhdHVyZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbmFsaXR5OlxuICogLSBhbGxvd3MgdG8gbW92ZSB0aGUgdGh1bWIgYnkgbW91c2Ugb3IgdG91Y2hcbiAqIC0gZW5sYXJnZXMgdGhlIHRodW1iIGlmIHRoZSBtb3VzZSBwb2ludGVyIGlzIG5lYXIgdGhlIHRodW1iXG4gKiAtIGFsbG93cyBwYWdpbmcgb24gbW91c2Vkb3duIG9uIHRoZSBzY3JvbGwgdHJhY2tcbiAqXG4gKiAjIyMgU3R5bGluZzpcbiAqXG4gKiBUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgbG9vayBvZiBTQ0lPTiBjb21wb25lbnRzIG9yIHN1cHBvcnQgZGlmZmVyZW50IHRoZW1lcywgY29uZmlndXJlIHRoZSBgQHNjaW9uL2NvbXBvbmVudHNgIFNDU1MgbW9kdWxlIGluIGBzdHlsZXMuc2Nzc2AuXG4gKiBUbyBzdHlsZSBhIHNwZWNpZmljIGBzY2ktc2Nyb2xsYmFyYCBjb21wb25lbnQsIHRoZSBmb2xsb3dpbmcgQ1NTIHZhcmlhYmxlcyBjYW4gYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQuXG4gKlxuICogLSBzY2ktc2Nyb2xsYmFyLWNvbG9yOiAgICBTZXRzIHRoZSBjb2xvciBvZiB0aGUgc2Nyb2xsYmFyLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgY3NzXG4gKlxuICogc2NpLXNjcm9sbGJhciB7XG4gKiAgIC0tc2NpLXNjcm9sbGJhci1jb2xvcjogYmx1ZTtcbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzY2ktc2Nyb2xsYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9zY3JvbGxiYXIuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2NpU2Nyb2xsYmFyQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogVGltZW91dCBmb3IgZGVib3VuY2luZyB2aWV3cG9ydCByZXNpemUgZXZlbnRzIHRoYXQgdHJpZ2dlciB0aGUgc2Nyb2xsIHBvc2l0aW9uIGNvbXB1dGF0aW9uLlxuICAgKlxuICAgKiBEZWJvdW5jaW5nIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgaW4gdGhlIGNvbnRleHQgb2YgQW5ndWxhciBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGNvbnRpbnVvdXNseVxuICAgKiB0cmlnZ2VyIHJlc2l6ZSBldmVudHMuIERlYm91bmNpbmcgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGZsaWNrZXJpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyXG4gICAqIGV4cGFuZHMgYSBwYW5lbCB0aGF0IGNvbnRhaW5zIGEgdmlld3BvcnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWSUVXUE9SVF9SRVNJWkVfREVCT1VOQ0VfVElNRSA9IDUwO1xuXG4gIHByaXZhdGUgX2hvc3QgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pLm5hdGl2ZUVsZW1lbnQ7XG4gIHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgX2xhc3REcmFnUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9vdmVyZmxvdyA9IGZhbHNlO1xuICBwcml2YXRlIF90aHVtYlNpemVGciA9IDA7XG4gIHByaXZhdGUgX3RodW1iUG9zaXRpb25GciA9IDA7XG5cbiAgcHJpdmF0ZSBfdGh1bWJFbGVtZW50ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PigndGh1bWJfaGFuZGxlJyk7XG4gIHByaXZhdGUgX3ZlcnRpY2FsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ3ZzY3JvbGwnKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnZlcnRpY2FsJylcbiAgcHVibGljIGdldCB2ZXJ0aWNhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmVydGljYWwoKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaG9yaXpvbnRhbCcpXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3ZlcnRpY2FsKCk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNjcm9sbGluZycpXG4gIHB1YmxpYyBnZXQgc2Nyb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGxiYXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGlmIG5vdCBzcGVjaWZpZWQsIHJlbmRlcnMgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIuXG4gICAqL1xuICBwdWJsaWMgZGlyZWN0aW9uID0gaW5wdXQ8J3ZzY3JvbGwnIHwgJ2hzY3JvbGwnPigndnNjcm9sbCcpO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgdG8gcHJvdmlkZSBzY3JvbGxiYXJzIGZvci5cbiAgICovXG4gIHB1YmxpYyB2aWV3cG9ydCA9IGlucHV0LnJlcXVpcmVkPEhUTUxFbGVtZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5zdGFsbFNjcm9sbFBvc2l0aW9uUmVuZGVyZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCB1cGRhdGVzIENTUyB2YXJpYWJsZXMgdG8gcmVuZGVyIHRoZSBzY3JvbGwgcG9zaXRpb24gaW4gdGhlIFVJLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJTY3JvbGxQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMudmlld3BvcnRTaXplO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50U2l6ZSA9IHRoaXMudmlld3BvcnRDbGllbnRTaXplO1xuICAgIGNvbnN0IHRodW1iUG9zaXRpb25GciA9IHRoaXMuc2Nyb2xsUG9zaXRpb24gLyB2aWV3cG9ydENsaWVudFNpemU7XG4gICAgY29uc3QgdGh1bWJTaXplRnIgPSB2aWV3cG9ydFNpemUgLyB2aWV3cG9ydENsaWVudFNpemU7XG4gICAgY29uc3Qgb3ZlcmZsb3cgPSB2aWV3cG9ydENsaWVudFNpemUgPiB2aWV3cG9ydFNpemU7XG5cbiAgICBpZiAodGh1bWJQb3NpdGlvbkZyICE9PSB0aGlzLl90aHVtYlBvc2l0aW9uRnIgfHwgdGh1bWJTaXplRnIgIT09IHRoaXMuX3RodW1iU2l6ZUZyKSB7XG4gICAgICB0aGlzLl90aHVtYlBvc2l0aW9uRnIgPSB0aHVtYlBvc2l0aW9uRnI7XG4gICAgICB0aGlzLl90aHVtYlNpemVGciA9IHRodW1iU2l6ZUZyO1xuICAgICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItcG9zaXRpb24tZnInLCB0aHVtYlBvc2l0aW9uRnIpO1xuICAgICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItc2l6ZS1mcicsIHRodW1iU2l6ZUZyKTtcbiAgICB9XG5cbiAgICBpZiAob3ZlcmZsb3cgIT09IHRoaXMuX292ZXJmbG93KSB7XG4gICAgICB0aGlzLl9vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgb3ZlcmZsb3cgPyB0aGlzLl9ob3N0LmNsYXNzTGlzdC5hZGQoJ292ZXJmbG93JykgOiB0aGlzLl9ob3N0LmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJmbG93Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBDU1MgdmFyaWFibGVzIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHRoZSBVSS5cbiAgICovXG4gIHByaXZhdGUgdW5zZXRTY3JvbGxQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgIHRoaXMuX3RodW1iUG9zaXRpb25GciA9IDA7XG4gICAgdGhpcy5fdGh1bWJTaXplRnIgPSAwO1xuICAgIHRoaXMuX292ZXJmbG93ID0gZmFsc2U7XG4gICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItcG9zaXRpb24tZnInLCAwKTtcbiAgICB0aGlzLnNldENzc1ZhcmlhYmxlKCctLcm1c2NpLXNjcm9sbGJhci10aHVtYi1zaXplLWZyJywgMCk7XG4gICAgdGhpcy5faG9zdC5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyZmxvdycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fbGFzdERyYWdQb3NpdGlvbiA9IHRoaXMudmVydGljYWwgPyBldmVudC50b3VjaGVzWzBdLnNjcmVlblkgOiBldmVudC50b3VjaGVzWzBdLnNjcmVlblg7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub3VjaE1vdmUoZXZlbnQ6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgbmV3RHJhZ1Bvc2l0aW9uUHggPSB0aGlzLnZlcnRpY2FsID8gZXZlbnQudG91Y2hlc1swXS5zY3JlZW5ZIDogZXZlbnQudG91Y2hlc1swXS5zY3JlZW5YO1xuICAgIGNvbnN0IHNjcm9sbGJhclBhblB4ID0gbmV3RHJhZ1Bvc2l0aW9uUHggLSB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uITtcbiAgICBjb25zdCB2aWV3cG9ydFBhblB4ID0gdGhpcy50b1ZpZXdwb3J0UGFuUHgoc2Nyb2xsYmFyUGFuUHgpO1xuICAgIHRoaXMuX2xhc3REcmFnUG9zaXRpb24gPSBuZXdEcmFnUG9zaXRpb25QeDtcbiAgICB0aGlzLm1vdmVWaWV3cG9ydENsaWVudCh2aWV3cG9ydFBhblB4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1vdXNlRG93bihtb3VzZWRvd25FdmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChtb3VzZWRvd25FdmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtb3VzZWRvd25FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX2xhc3REcmFnUG9zaXRpb24gPSB0aGlzLnZlcnRpY2FsID8gbW91c2Vkb3duRXZlbnQuc2NyZWVuWSA6IG1vdXNlZG93bkV2ZW50LnNjcmVlblg7XG5cbiAgICAvLyBMaXN0ZW4gZm9yICdtb3VzZW1vdmUnIGV2ZW50c1xuICAgIGNvbnN0IG1vdXNlbW92ZUxpc3RlbmVyID0gbWVyZ2UoZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuX2RvY3VtZW50LCAnbW91c2Vtb3ZlJyksIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ3NjaS1tb3VzZW1vdmUnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobW91c2Vtb3ZlRXZlbnQgPT4ge1xuICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgICAgICBtb3VzZW1vdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXdEcmFnUG9zaXRpb25QeCA9IHRoaXMudmVydGljYWwgPyBtb3VzZW1vdmVFdmVudC5zY3JlZW5ZIDogbW91c2Vtb3ZlRXZlbnQuc2NyZWVuWDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsYmFyUGFuUHggPSBuZXdEcmFnUG9zaXRpb25QeCAtIHRoaXMuX2xhc3REcmFnUG9zaXRpb24hO1xuICAgICAgICBjb25zdCB2aWV3cG9ydFBhblB4ID0gdGhpcy50b1ZpZXdwb3J0UGFuUHgoc2Nyb2xsYmFyUGFuUHgpO1xuICAgICAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbmV3RHJhZ1Bvc2l0aW9uUHg7XG4gICAgICAgIHRoaXMubW92ZVZpZXdwb3J0Q2xpZW50KHZpZXdwb3J0UGFuUHgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yICdtb3VzZXVwJyBldmVudHM7IHVzZSAnY2FwdHVyZSBwaGFzZScgYW5kICdzdG9wIHByb3BhZ2F0aW9uJyB0byBub3QgY2xvc2Ugb3ZlcmxheXNcbiAgICBtZXJnZShmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJywge2NhcHR1cmU6IHRydWV9KSwgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuX2RvY3VtZW50LCAnc2NpLW1vdXNldXAnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobW91c2V1cEV2ZW50ID0+IHtcbiAgICAgICAgTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKTtcbiAgICAgICAgbW91c2V1cEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBtb3VzZW1vdmVMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2Nyb2xsVHJhY2tNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIGNvbnN0IHNpZ251bSA9IChkaXJlY3Rpb24gPT09ICd1cCcgPyAtMSA6ICsxKTtcbiAgICB0aGlzLnNjcm9sbFdoaWxlTW91c2VEb3duKHRoaXMudG9WaWV3cG9ydFBhblB4KHNpZ251bSAqIHRoaXMudGh1bWJTaXplKSwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIHdoZW4gdGhlIHZpZXdwb3J0IGlzIHNjcm9sbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2Nyb2xsUG9zaXRpb25SZW5kZXJlcigpOiB2b2lkIHtcbiAgICBlZmZlY3Qob25DbGVhbnVwID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydCgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICAgICAgdGhpcy51bnNldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdmlld3BvcnRTY3JvbGwkKHZpZXdwb3J0KVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWVyZ2VXaXRoKHZpZXdwb3J0U2l6ZSQodmlld3BvcnQsIHtkZWJvdW5jZVRpbWU6IFNjaVNjcm9sbGJhckNvbXBvbmVudC5WSUVXUE9SVF9SRVNJWkVfREVCT1VOQ0VfVElNRX0pKSxcbiAgICAgICAgICAgIG1lcmdlV2l0aCh2aWV3cG9ydENsaWVudFNpemUkKHZpZXdwb3J0LCB7ZGVib3VuY2VUaW1lOiBTY2lTY3JvbGxiYXJDb21wb25lbnQuVklFV1BPUlRfUkVTSVpFX0RFQk9VTkNFX1RJTUV9KSksXG4gICAgICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW5kZXJTY3JvbGxQb3NpdGlvbigpKTtcbiAgICAgICAgb25DbGVhbnVwKCgpID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3RzIHRoZSBnaXZlbiBzY3JvbGxiYXIgc2Nyb2xsIHBpeGVscyBpbnRvIHZpZXdwb3J0IHNjcm9sbCBwaXhlbHMuXG4gICAqL1xuICBwcml2YXRlIHRvVmlld3BvcnRQYW5QeChzY3JvbGxiYXJQYW5QeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxSYW5nZVB4ID0gdGhpcy50cmFja1NpemUgLSB0aGlzLnRodW1iU2l6ZTtcbiAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbGJhclBhblB4IC8gc2Nyb2xsUmFuZ2VQeDtcbiAgICByZXR1cm4gc2Nyb2xsUmF0aW8gKiAodGhpcy52aWV3cG9ydENsaWVudFNpemUgLSB0aGlzLnZpZXdwb3J0U2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIHZpZXdwb3J0IGNsaWVudCBieSB0aGUgc3BlY2lmaWVkIG51bWJlcnMgb2YgcGl4ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlVmlld3BvcnRDbGllbnQodmlld3BvcnRQYW5QeDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgIHRoaXMudmlld3BvcnQoKS5zY3JvbGxUb3AgKz0gdmlld3BvcnRQYW5QeDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnZpZXdwb3J0KCkuc2Nyb2xsTGVmdCArPSB2aWV3cG9ydFBhblB4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGNvbnRlbnQgb3ZlcmZsb3dzLlxuICAgKi9cbiAgcHVibGljIGdldCBvdmVyZmxvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmZsb3c7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBjb250aW51b3VzbHkgd2hpbGUgaG9sZGluZyB0aGUgbW91c2UgcHJlc3NlZCwgb3IgdW50aWwgdGhlIG1vdXNlIGxlYXZlcyB0aGUgc2Nyb2xsdHJhY2suXG4gICAqL1xuICBwcml2YXRlIHNjcm9sbFdoaWxlTW91c2VEb3duKHZpZXdwb3J0U2Nyb2xsUHg6IG51bWJlciwgbW91c2Vkb3duRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBUaGUgYEV2ZW50VGFyZ2V0YCB0eXBlIG9mIGBFdmVudC50YXJnZXRgIGlzIG5vdCB5ZXQgY29tcGF0aWJsZSB3aXRoIGBGcm9tRXZlbnRUYXJnZXRgIHVzZWQgaW4gYGZyb21FdmVudGAuXG4gICAgLy8gVGhpcyB3aWxsIGJlIGZpeGVkIGluIHJ4anMgdmVyc2lvbiA3LjAuMC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2NvbW1pdC81ZjAyMmQ3ODQ1NzA2ODQ2MzJlNmZkNWFlMjQ3ZmMyNTllZTM0YzRiXG4gICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICBjb25zdCBzY3JvbGxUcmFja0VsZW1lbnQgPSBtb3VzZWRvd25FdmVudC50YXJnZXQgYXMgRWxlbWVudDtcblxuICAgIC8vIHNjcm9sbCBjb250aW51b3VzbHkgZXZlcnkgNTBtcyBhZnRlciBhbiBpbml0aWFsIGRlbGF5IG9mIDI1MG1zXG4gICAgdGltZXIoMjUwLCA1MClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBjb250aW51ZSBjaGFpbiB3aXRoIGxhdGVzdCBtb3VzZSBldmVudFxuICAgICAgICB3aXRoTGF0ZXN0RnJvbShtZXJnZShvZihtb3VzZWRvd25FdmVudCksIGZyb21FdmVudDxNb3VzZUV2ZW50PihzY3JvbGxUcmFja0VsZW1lbnQsICdtb3VzZW1vdmUnKSksICh0aWNrLCBldmVudCkgPT4gZXZlbnQpLFxuICAgICAgICAvLyBzdGFydCBpbW1lZGlhdGVseVxuICAgICAgICBzdGFydFdpdGgobW91c2Vkb3duRXZlbnQpLFxuICAgICAgICAvLyBzdG9wIHNjcm9sbGluZyBpZiB0aGUgdGh1bWIgaGl0cyB0aGUgbW91c2UgcG9pbnRlciBwb3NpdGlvblxuICAgICAgICB0YWtlV2hpbGUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiBzY3JvbGxUcmFja0VsZW1lbnQgPT09IHRoaXMuX2RvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTApLFxuICAgICAgICAvLyBzdG9wIHNjcm9sbGluZyBvbiBtb3VzZW91dCBvciBtb3VzZXVwXG4gICAgICAgIHRha2VVbnRpbChtZXJnZShmcm9tRXZlbnQoc2Nyb2xsVHJhY2tFbGVtZW50LCAnbW91c2VvdXQnKSwgZnJvbUV2ZW50KHNjcm9sbFRyYWNrRWxlbWVudCwgJ21vdXNldXAnKSkpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubW92ZVZpZXdwb3J0Q2xpZW50KHZpZXdwb3J0U2Nyb2xsUHgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldENzc1ZhcmlhYmxlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5faG9zdC5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHZpZXdwb3J0U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0KCkgPyAodGhpcy52ZXJ0aWNhbCA/IHRoaXMudmlld3BvcnQoKS5jbGllbnRIZWlnaHQgOiB0aGlzLnZpZXdwb3J0KCkuY2xpZW50V2lkdGgpIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHZpZXdwb3J0Q2xpZW50U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0KCkgPyAodGhpcy52ZXJ0aWNhbCA/IHRoaXMudmlld3BvcnQoKS5zY3JvbGxIZWlnaHQgOiB0aGlzLnZpZXdwb3J0KCkuc2Nyb2xsV2lkdGgpIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNjcm9sbFBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnQoKSA/ICh0aGlzLnZlcnRpY2FsID8gdGhpcy52aWV3cG9ydCgpLnNjcm9sbFRvcCA6IHRoaXMudmlld3BvcnQoKS5zY3JvbGxMZWZ0KSA6IDA7XG4gIH1cblxuICBwcml2YXRlIGdldCB0aHVtYlNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aHVtYkVsZW1lbnQgPSB0aGlzLl90aHVtYkVsZW1lbnQoKS5uYXRpdmVFbGVtZW50O1xuICAgIHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGh1bWJFbGVtZW50LmNsaWVudEhlaWdodCA6IHRodW1iRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRyYWNrU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGhpcy5faG9zdC5jbGllbnRIZWlnaHQgOiB0aGlzLl9ob3N0LmNsaWVudFdpZHRoO1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IHNjcm9sbHMuXG4gKi9cbmZ1bmN0aW9uIHZpZXdwb3J0U2Nyb2xsJCh2aWV3cG9ydDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgcmV0dXJuIGZyb21FdmVudCh2aWV3cG9ydCwgJ3Njcm9sbCcsIHtwYXNzaXZlOiB0cnVlfSkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG59XG5cbi8qKlxuICogRW1pdHMgb24gc3Vic2NyaXB0aW9uLCBhbmQgdGhlbiBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHZpZXdwb3J0U2l6ZSQodmlld3BvcnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zOiB7ZGVib3VuY2VUaW1lOiBudW1iZXJ9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIHJldHVybiBmcm9tUmVzaXplJCh2aWV3cG9ydClcbiAgICAucGlwZShcbiAgICAgIC8vIERlYm91bmNpbmcgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBBbmd1bGFyIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgY29udGludW91c2x5XG4gICAgICAvLyB0cmlnZ2VyIHJlc2l6ZSBldmVudHMuIERlYm91bmNpbmcgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGZsaWNrZXJpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyXG4gICAgICAvLyBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgICAgZGVib3VuY2VUaW1lKG9wdGlvbnMuZGVib3VuY2VUaW1lKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICk7XG59XG5cbi8qKlxuICogRW1pdHMgb24gc3Vic2NyaXB0aW9uLCBhbmQgdGhlbiBlYWNoIHRpbWUgdGhlIHNpemUgb3Igc3R5bGUgcHJvcGVydHkgb2YgdGhlIHZpZXdwb3J0IGNsaWVudCBjaGFuZ2VzLlxuICovXG5mdW5jdGlvbiB2aWV3cG9ydENsaWVudFNpemUkKHZpZXdwb3J0OiBIVE1MRWxlbWVudCwgb3B0aW9uczoge2RlYm91bmNlVGltZTogbnVtYmVyfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICByZXR1cm4gY2hpbGRyZW4kKHZpZXdwb3J0KVxuICAgIC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGNoaWxkcmVuID0+IG1lcmdlKC4uLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBtZXJnZShcbiAgICAgICAgZnJvbVJlc2l6ZSQoY2hpbGQpLFxuICAgICAgICAvLyBPYnNlcnZlIHN0eWxlIG11dGF0aW9ucyBzaW5jZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aXRob3V0IG5lY2Vzc2FyaWx5IHRyaWdnZXJpbmcgYSBkaW1lbnNpb24gY2hhbmdlLFxuICAgICAgICAvLyBlLmcuLCBgc2NhbGVgIG9yIGB0cmFuc2xhdGVgIHVzZWQgYnkgc29tZSB2aXJ0dWFsIHNjcm9sbCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgZnJvbU11dGF0aW9uJChjaGlsZCwge3N1YnRyZWU6IGZhbHNlLCBjaGlsZExpc3Q6IGZhbHNlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXX0pKSxcbiAgICAgICkpKSxcbiAgICAgIC8vIERlYm91bmNpbmcgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBBbmd1bGFyIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgY29udGludW91c2x5XG4gICAgICAvLyB0cmlnZ2VyIHJlc2l6ZSBldmVudHMuIERlYm91bmNpbmcgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGZsaWNrZXJpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyXG4gICAgICAvLyBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgICAgZGVib3VuY2VUaW1lKG9wdGlvbnMuZGVib3VuY2VUaW1lKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICk7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBwYXNzZWQgZWxlbWVudCwgYW5kIHRoZW4gZWFjaCB0aW1lIGNoaWxkIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBjaGlsZHJlbiQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEhUTUxFbGVtZW50W10+IHtcbiAgcmV0dXJuIGZyb21NdXRhdGlvbiQoZWxlbWVudCwge3N1YnRyZWU6IGZhbHNlLCBjaGlsZExpc3Q6IHRydWV9KVxuICAgIC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCBhcyB2b2lkKSxcbiAgICAgIG1hcCgoKSA9PiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGRyZW4pKSxcbiAgICAgIGZpbHRlckFycmF5KChjaGlsZDogRWxlbWVudCk6IGNoaWxkIGlzIEhUTUxFbGVtZW50ID0+IGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpLFxuICAgICk7XG59XG4iLCI8IS0tIHNjcm9sbHRyYWNrIHRvIG1vdmUgdGhlIHZpZXdwb3J0IGNsaWVudCB1cHdhcmRzIChwYWdpbmcpIC0tPlxuPGRpdiBjbGFzcz1cInNjcm9sbHRyYWNrLXN0YXJ0XCIgKG1vdXNlZG93bik9XCJvblNjcm9sbFRyYWNrTW91c2VEb3duKCRldmVudCwgJ3VwJylcIj48L2Rpdj5cblxuPCEtLSBzY3JvbGx0aHVtYiAtLT5cbjxkaXYgI3RodW1iX2hhbmRsZVxuICAgICBjbGFzcz1cInRodW1iLWhhbmRsZVwiXG4gICAgIFtjbGFzcy52ZXJ0aWNhbF09XCJ2ZXJ0aWNhbFwiXG4gICAgIFtjbGFzcy5ob3Jpem9udGFsXT1cImhvcml6b250YWxcIlxuICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAodG91Y2hzdGFydCk9XCJvblRvdWNoU3RhcnQoJGV2ZW50KVwiXG4gICAgICh0b3VjaG1vdmUpPVwib25Ub3VjaE1vdmUoJGV2ZW50KVwiXG4gICAgICh0b3VjaGVuZCk9XCJvblRvdWNoRW5kKCRldmVudClcIlxuICAgICAodG91Y2hjYW5jZWwpPVwib25Ub3VjaEVuZCgkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJ0aHVtYlwiXG4gICAgICAgW2NsYXNzLnZlcnRpY2FsXT1cInZlcnRpY2FsXCJcbiAgICAgICBbY2xhc3MuaG9yaXpvbnRhbF09XCJob3Jpem9udGFsXCI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gc2Nyb2xsdHJhY2sgdG8gbW92ZSB0aGUgdmlld3BvcnQgY2xpZW50IGRvd253YXJkcyAocGFnaW5nKSAtLT5cbjxkaXYgY2xhc3M9XCJzY3JvbGx0cmFjay1lbmRcIiAobW91c2Vkb3duKT1cIm9uU2Nyb2xsVHJhY2tNb3VzZURvd24oJGV2ZW50LCAnZG93bicpXCI+PC9kaXY+XG4iXX0=