ng-virtual-list 14.12.0 → 14.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -11
- package/esm2020/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +309 -0
- package/{esm2022 → esm2020}/lib/components/ng-list-item/base/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-list-item/const/index.mjs +40 -40
- package/{esm2022 → esm2020}/lib/components/ng-list-item/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-list-item/interfaces/template-context.mjs +1 -1
- package/esm2020/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +200 -0
- package/{esm2022 → esm2020}/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +20 -20
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/create-display-id.mjs +9 -9
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/get-element-by-index.mjs +19 -19
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/index.mjs +4 -4
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/matrix-3d.mjs +12 -12
- package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +278 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.module.mjs +21 -21
- package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +94 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +20 -20
- package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +141 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.mjs +20 -20
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/core/index.mjs +2 -2
- package/esm2020/lib/components/ng-prerender-container/core/prerender-track-box.mjs +201 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/events/index.mjs +5 -5
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
- package/esm2020/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +90 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/ng-prerender-container.module.mjs +20 -20
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/types/cache.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/const/index.mjs +8 -8
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/enums/scrollbar-states.mjs +6 -6
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/scrollbar-drag-data.mjs +1 -1
- package/esm2020/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.mjs +27 -0
- package/esm2020/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +324 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/ng-scroll-bar.module.mjs +19 -19
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/ng-scroll-bar.service.mjs +38 -36
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/types/scrollbar-state.mjs +1 -1
- package/esm2020/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +260 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/const/index.mjs +9 -9
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/scroller-direction.mjs +11 -11
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/scroller-directions.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/index.mjs +3 -3
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
- package/esm2020/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +856 -0
- package/esm2020/lib/components/ng-scroll-view/utils/calculate-direction.mjs +17 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +11 -11
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/get-dir.mjs +9 -9
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/index.mjs +5 -5
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/matrix-3d.mjs +9 -9
- package/esm2020/lib/components/ng-scroll-view/utils/scroll-box.mjs +45 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/scroller-direction.mjs +5 -5
- package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
- package/esm2020/lib/components/ng-scroller/ng-scroller.component.mjs +521 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroller/ng-scroller.module.mjs +22 -22
- package/{esm2022 → esm2020}/lib/components/ng-scroller/utils/index.mjs +2 -2
- package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-metrics.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-params.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-position-params.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/interfaces/index.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/scroll-box.mjs +52 -0
- package/{esm2022 → esm2020}/lib/const/index.mjs +164 -164
- package/esm2020/lib/core/cache-map.mjs +100 -0
- package/{esm2022 → esm2020}/lib/core/const/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/core/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/core/enums/item-display-methods.mjs +13 -13
- package/{esm2022 → esm2020}/lib/core/events/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/core/events/track-box-events.mjs +11 -11
- package/{esm2022 → esm2020}/lib/core/interfaces/get-item-position-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/get-metrics-returns.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/item.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/metrics.mjs +1 -1
- package/esm2020/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
- package/{esm2022 → esm2020}/lib/core/interfaces/update-collection-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/update-collection-returns.mjs +1 -1
- package/esm2020/lib/core/track-box.mjs +1352 -0
- package/esm2020/lib/core/tracker.mjs +209 -0
- package/{esm2022 → esm2020}/lib/core/types/cache-map-events.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/cache-map-listeners.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/cache.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/on-change-event-listener.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/on-tick-event-listener.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/utils/get-service-id-prop.mjs +9 -9
- package/{esm2022 → esm2020}/lib/core/utils/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/directives/index.mjs +3 -3
- package/esm2020/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +67 -0
- package/{esm2022 → esm2020}/lib/directives/locale-sensitive/locale-sensitive.module.mjs +19 -19
- package/esm2020/lib/directives/virtual-click/virtual-click.directive.mjs +66 -0
- package/{esm2022 → esm2020}/lib/directives/virtual-click/virtual-click.module.mjs +19 -19
- package/{esm2022 → esm2020}/lib/enums/alignments.mjs +11 -11
- package/{esm2022 → esm2020}/lib/enums/collapsing-modes.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/collection-modes.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/directions.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/focus-alignments.mjs +13 -13
- package/{esm2022 → esm2020}/lib/enums/index.mjs +11 -11
- package/{esm2022 → esm2020}/lib/enums/selecting-modes-types.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/selecting-modes.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/snap-to-item-aligns.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/snapping-methods.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/spreading-modes.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/text-directions.mjs +13 -13
- package/{esm2022 → esm2020}/lib/interfaces/animation-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/base-virtual-list-item-component.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/item-transformation.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/point.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/rect.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/render-stabilizer-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-event.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-to-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scrolling-settings.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/size.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/collection.model.mjs +2 -2
- package/{esm2022 → esm2020}/lib/models/component.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/display-object-config.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/display-object-measures.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/item-config-map.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/item.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/render-collection.model.mjs +2 -2
- package/{esm2022 → esm2020}/lib/models/render-item-config.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/render-item-measures.model.mjs +2 -2
- package/{esm2022 → esm2020}/lib/models/render-item.model.mjs +2 -2
- package/esm2020/lib/ng-virtual-list-public.service.mjs +122 -0
- package/esm2020/lib/ng-virtual-list.component.mjs +3255 -0
- package/{esm2022 → esm2020}/lib/ng-virtual-list.module.mjs +23 -23
- package/esm2020/lib/ng-virtual-list.service.mjs +430 -0
- package/esm2020/lib/transformations/deck-of-cards-3d.mjs +57 -0
- package/esm2020/lib/transformations/deck-of-cards.mjs +54 -0
- package/esm2020/lib/transformations/event-horizon.mjs +47 -0
- package/{esm2022 → esm2020}/lib/transformations/index.mjs +12 -12
- package/esm2020/lib/transformations/linear.mjs +47 -0
- package/esm2020/lib/transformations/swipe-3d.mjs +51 -0
- package/{esm2022 → esm2020}/lib/types/alignment.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/arithmetic-expression.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/collapsing-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/collection-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/color.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/direction.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/float-or-persentage-value.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/focus-alignment.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/focus-item-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/gradient-color-position.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/gradient-color-positions.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/id.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/item-transform.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/scroll-direction.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/selecting-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/snap-to-item-align.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/snapping-distance.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/snapping-method.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/spreading-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/text-direction.mjs +1 -1
- package/esm2020/lib/utils/animator/animator.mjs +80 -0
- package/{esm2022 → esm2020}/lib/utils/animator/const/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/utils/animator/ease.mjs +6 -6
- package/{esm2022 → esm2020}/lib/utils/animator/index.mjs +4 -4
- package/esm2020/lib/utils/animator/interfaces/animator-params.mjs +2 -0
- package/esm2020/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
- package/{esm2022 → esm2020}/lib/utils/animator/interfaces/index.mjs +1 -1
- package/esm2020/lib/utils/animator/types/easing.mjs +2 -0
- package/{esm2022 → esm2020}/lib/utils/animator/types/index.mjs +1 -1
- package/esm2020/lib/utils/buffer-interpolation.mjs +29 -0
- package/esm2020/lib/utils/cmap.mjs +34 -0
- package/esm2020/lib/utils/debounce.mjs +61 -0
- package/esm2020/lib/utils/disposable-component.mjs +29 -0
- package/esm2020/lib/utils/event-emitter/event-emitter.mjs +106 -0
- package/{esm2022 → esm2020}/lib/utils/event-emitter/index.mjs +2 -2
- package/esm2020/lib/utils/event-emitter/interfaces/event-emitter.mjs +2 -0
- package/{esm2022 → esm2020}/lib/utils/event-emitter/interfaces/index.mjs +1 -1
- package/esm2020/lib/utils/get-scroll-state-version.mjs +12 -0
- package/{esm2022 → esm2020}/lib/utils/get-selector-by-item-id.mjs +4 -4
- package/{esm2022 → esm2020}/lib/utils/index.mjs +4 -4
- package/esm2020/lib/utils/is-collapse-mode.mjs +18 -0
- package/{esm2022 → esm2020}/lib/utils/is-collection-mode.mjs +15 -15
- package/esm2020/lib/utils/is-direction.mjs +15 -0
- package/esm2020/lib/utils/is-persentage-value.mjs +14 -0
- package/esm2020/lib/utils/is-select-mode.mjs +18 -0
- package/{esm2022 → esm2020}/lib/utils/is-spreading-mode.mjs +15 -15
- package/esm2020/lib/utils/list-validators.mjs +27 -0
- package/esm2020/lib/utils/normalize-collection.mjs +42 -0
- package/esm2020/lib/utils/object.mjs +28 -0
- package/esm2020/lib/utils/parse-arithmetic-expression.mjs +53 -0
- package/esm2020/lib/utils/parse-float-or-persentage-value.mjs +17 -0
- package/esm2020/lib/utils/screen-reader-formatter.mjs +43 -0
- package/esm2020/lib/utils/scroll-event.mjs +46 -0
- package/esm2020/lib/utils/scrolling-direction.mjs +28 -0
- package/{esm2022 → esm2020}/lib/utils/snapping-method.mjs +8 -8
- package/esm2020/lib/utils/toggle-class-name.mjs +15 -0
- package/{esm2022 → esm2020}/lib/utils/validation.mjs +55 -55
- package/{esm2022 → esm2020}/ng-virtual-list.mjs +4 -4
- package/{esm2022 → esm2020}/public-api.mjs +19 -19
- package/fesm2015/ng-virtual-list.mjs +10731 -0
- package/fesm2015/ng-virtual-list.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/ng-virtual-list.mjs +10451 -10455
- package/fesm2020/ng-virtual-list.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +83 -83
- package/lib/components/ng-list-item/base/index.d.ts +2 -2
- package/lib/components/ng-list-item/const/index.d.ts +3 -3
- package/lib/components/ng-list-item/interfaces/index.d.ts +2 -2
- package/lib/components/ng-list-item/interfaces/template-context.d.ts +42 -42
- package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +30 -30
- package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +9 -9
- package/lib/components/ng-list-item/utils/create-display-id.d.ts +7 -7
- package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -15
- package/lib/components/ng-list-item/utils/index.d.ts +4 -4
- package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -7
- package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +104 -104
- package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.module.d.ts +10 -10
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +17 -17
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +9 -9
- package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +62 -62
- package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.d.ts +9 -9
- package/lib/components/ng-prerender-container/core/index.d.ts +2 -2
- package/lib/components/ng-prerender-container/core/prerender-track-box.d.ts +35 -35
- package/lib/components/ng-prerender-container/events/index.d.ts +6 -6
- package/lib/components/ng-prerender-container/interfaces/index.d.ts +2 -2
- package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +17 -17
- package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +40 -40
- package/lib/components/ng-prerender-container/ng-prerender-container.module.d.ts +9 -9
- package/lib/components/ng-prerender-container/types/cache.d.ts +13 -13
- package/lib/components/ng-prerender-container/types/index.d.ts +2 -2
- package/lib/components/ng-scroll-bar/const/index.d.ts +3 -3
- package/lib/components/ng-scroll-bar/enums/index.d.ts +2 -2
- package/lib/components/ng-scroll-bar/enums/scrollbar-states.d.ts +5 -5
- package/lib/components/ng-scroll-bar/interfaces/index.d.ts +3 -3
- package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +26 -26
- package/lib/components/ng-scroll-bar/interfaces/scrollbar-drag-data.d.ts +13 -13
- package/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.d.ts +16 -16
- package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +102 -102
- package/lib/components/ng-scroll-bar/ng-scroll-bar.module.d.ts +8 -8
- package/lib/components/ng-scroll-bar/ng-scroll-bar.service.d.ts +22 -22
- package/lib/components/ng-scroll-bar/types/index.d.ts +2 -2
- package/lib/components/ng-scroll-bar/types/scrollbar-state.d.ts +2 -2
- package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +89 -89
- package/lib/components/ng-scroll-view/const/index.d.ts +7 -7
- package/lib/components/ng-scroll-view/enums/index.d.ts +4 -4
- package/lib/components/ng-scroll-view/enums/scroller-direction.d.ts +10 -10
- package/lib/components/ng-scroll-view/enums/scroller-directions.d.ts +8 -8
- package/lib/components/ng-scroll-view/index.d.ts +5 -5
- package/lib/components/ng-scroll-view/interfaces/index.d.ts +2 -2
- package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +22 -22
- package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +124 -124
- package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +10 -7
- package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -7
- package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -7
- package/lib/components/ng-scroll-view/utils/index.d.ts +5 -5
- package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -7
- package/lib/components/ng-scroll-view/utils/scroll-box.d.ts +39 -39
- package/lib/components/ng-scroller/enums/index.d.ts +4 -4
- package/lib/components/ng-scroller/enums/scroller-direction.d.ts +4 -4
- package/lib/components/ng-scroller/enums/scroller-directions.d.ts +3 -3
- package/lib/components/ng-scroller/ng-scroller.component.d.ts +164 -164
- package/lib/components/ng-scroller/ng-scroller.module.d.ts +11 -11
- package/lib/components/ng-scroller/utils/index.d.ts +2 -2
- package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-metrics.d.ts +11 -0
- package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-params.d.ts +19 -0
- package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-position-params.d.ts +10 -0
- package/lib/components/ng-scroller/utils/interfaces/index.d.ts +4 -0
- package/lib/components/ng-scroller/utils/scroll-box.d.ts +23 -40
- package/lib/const/index.d.ts +153 -153
- package/lib/core/cache-map.d.ts +46 -46
- package/lib/core/const/index.d.ts +1 -1
- package/lib/core/enums/index.d.ts +2 -2
- package/lib/core/enums/item-display-methods.d.ts +12 -12
- package/lib/core/events/index.d.ts +2 -2
- package/lib/core/events/track-box-events.d.ts +10 -10
- package/lib/core/interfaces/get-item-position-options.d.ts +10 -10
- package/lib/core/interfaces/get-metrics-returns.d.ts +11 -11
- package/lib/core/interfaces/index.d.ts +8 -8
- package/lib/core/interfaces/item.d.ts +9 -9
- package/lib/core/interfaces/metrics.d.ts +51 -51
- package/lib/core/interfaces/recalculate-metrics-options.d.ts +33 -32
- package/lib/core/interfaces/update-collection-options.d.ts +10 -10
- package/lib/core/interfaces/update-collection-returns.d.ts +14 -14
- package/lib/core/track-box.d.ts +153 -153
- package/lib/core/tracker.d.ts +55 -55
- package/lib/core/types/cache-map-events.d.ts +8 -8
- package/lib/core/types/cache-map-listeners.d.ts +9 -9
- package/lib/core/types/cache.d.ts +12 -12
- package/lib/core/types/index.d.ts +6 -6
- package/lib/core/types/on-change-event-listener.d.ts +7 -7
- package/lib/core/types/on-tick-event-listener.d.ts +7 -7
- package/lib/core/utils/get-service-id-prop.d.ts +7 -7
- package/lib/core/utils/index.d.ts +2 -2
- package/lib/directives/index.d.ts +3 -3
- package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +29 -29
- package/lib/directives/locale-sensitive/locale-sensitive.module.d.ts +8 -8
- package/lib/directives/virtual-click/virtual-click.directive.d.ts +22 -22
- package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -8
- package/lib/enums/alignments.d.ts +10 -10
- package/lib/enums/collapsing-modes.d.ts +20 -20
- package/lib/enums/collection-modes.d.ts +16 -16
- package/lib/enums/directions.d.ts +16 -16
- package/lib/enums/focus-alignments.d.ts +12 -12
- package/lib/enums/index.d.ts +11 -11
- package/lib/enums/selecting-modes-types.d.ts +20 -20
- package/lib/enums/selecting-modes.d.ts +20 -20
- package/lib/enums/snap-to-item-aligns.d.ts +20 -20
- package/lib/enums/snapping-methods.d.ts +16 -16
- package/lib/enums/spreading-modes.d.ts +16 -16
- package/lib/enums/text-directions.d.ts +12 -12
- package/lib/interfaces/animation-params.d.ts +14 -14
- package/lib/interfaces/base-virtual-list-item-component.d.ts +23 -23
- package/lib/interfaces/index.d.ts +11 -11
- package/lib/interfaces/item-transformation.d.ts +22 -22
- package/lib/interfaces/point.d.ts +16 -16
- package/lib/interfaces/rect.d.ts +17 -17
- package/lib/interfaces/render-stabilizer-options.d.ts +12 -12
- package/lib/interfaces/scroll-event.d.ts +58 -58
- package/lib/interfaces/scroll-options.d.ts +28 -28
- package/lib/interfaces/scroll-params.d.ts +17 -17
- package/lib/interfaces/scroll-to-params.d.ts +7 -7
- package/lib/interfaces/scrolling-settings.d.ts +38 -38
- package/lib/interfaces/size.d.ts +16 -16
- package/lib/models/collection.model.d.ts +9 -9
- package/lib/models/component.model.d.ts +3 -3
- package/lib/models/display-object-config.model.d.ts +21 -21
- package/lib/models/display-object-measures.model.d.ts +45 -45
- package/lib/models/index.d.ts +9 -9
- package/lib/models/item-config-map.model.d.ts +35 -35
- package/lib/models/item.model.d.ts +17 -17
- package/lib/models/render-collection.model.d.ts +9 -9
- package/lib/models/render-item-config.model.d.ts +119 -119
- package/lib/models/render-item-measures.model.d.ts +116 -116
- package/lib/models/render-item.model.d.ts +40 -40
- package/lib/ng-virtual-list-public.service.d.ts +92 -92
- package/lib/ng-virtual-list.component.d.ts +771 -770
- package/lib/ng-virtual-list.module.d.ts +12 -12
- package/lib/ng-virtual-list.service.d.ts +153 -153
- package/lib/transformations/deck-of-cards-3d.d.ts +54 -54
- package/lib/transformations/deck-of-cards.d.ts +50 -50
- package/lib/transformations/event-horizon.d.ts +26 -26
- package/lib/transformations/index.d.ts +7 -7
- package/lib/transformations/linear.d.ts +26 -26
- package/lib/transformations/swipe-3d.d.ts +38 -38
- package/lib/types/alignment.d.ts +8 -8
- package/lib/types/arithmetic-expression.d.ts +10 -10
- package/lib/types/collapsing-mode.d.ts +8 -8
- package/lib/types/collection-mode.d.ts +8 -8
- package/lib/types/color.d.ts +4 -4
- package/lib/types/direction.d.ts +8 -8
- package/lib/types/float-or-persentage-value.d.ts +7 -7
- package/lib/types/focus-alignment.d.ts +8 -8
- package/lib/types/focus-item-params.d.ts +13 -13
- package/lib/types/gradient-color-position.d.ts +7 -7
- package/lib/types/gradient-color-positions.d.ts +8 -8
- package/lib/types/id.d.ts +7 -7
- package/lib/types/index.d.ts +20 -20
- package/lib/types/item-transform.d.ts +9 -9
- package/lib/types/scroll-direction.d.ts +8 -8
- package/lib/types/selecting-mode.d.ts +8 -8
- package/lib/types/snap-to-item-align.d.ts +8 -8
- package/lib/types/snapping-distance.d.ts +8 -8
- package/lib/types/snapping-method.d.ts +10 -10
- package/lib/types/spreading-mode.d.ts +8 -8
- package/lib/types/text-direction.d.ts +10 -10
- package/lib/utils/animator/animator.d.ts +16 -16
- package/lib/utils/animator/const/index.d.ts +1 -1
- package/lib/utils/animator/ease.d.ts +2 -2
- package/lib/utils/animator/index.d.ts +6 -6
- package/lib/utils/animator/interfaces/animator-params.d.ts +18 -18
- package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -13
- package/lib/utils/animator/interfaces/index.d.ts +3 -3
- package/lib/utils/animator/types/easing.d.ts +7 -7
- package/lib/utils/animator/types/index.d.ts +2 -2
- package/lib/utils/buffer-interpolation.d.ts +5 -5
- package/lib/utils/cmap.d.ts +16 -16
- package/lib/utils/debounce.d.ts +25 -25
- package/lib/utils/disposable-component.d.ts +15 -15
- package/lib/utils/event-emitter/event-emitter.d.ts +42 -42
- package/lib/utils/event-emitter/index.d.ts +4 -4
- package/lib/utils/event-emitter/interfaces/event-emitter.d.ts +37 -37
- package/lib/utils/event-emitter/interfaces/index.d.ts +2 -2
- package/lib/utils/get-scroll-state-version.d.ts +1 -1
- package/lib/utils/get-selector-by-item-id.d.ts +2 -2
- package/lib/utils/index.d.ts +6 -6
- package/lib/utils/is-collapse-mode.d.ts +8 -8
- package/lib/utils/is-collection-mode.d.ts +8 -8
- package/lib/utils/is-direction.d.ts +8 -8
- package/lib/utils/is-persentage-value.d.ts +7 -7
- package/lib/utils/is-select-mode.d.ts +8 -8
- package/lib/utils/is-spreading-mode.d.ts +8 -8
- package/lib/utils/list-validators.d.ts +2 -2
- package/lib/utils/normalize-collection.d.ts +8 -8
- package/lib/utils/object.d.ts +4 -4
- package/lib/utils/parse-arithmetic-expression.d.ts +8 -8
- package/lib/utils/parse-float-or-persentage-value.d.ts +7 -7
- package/lib/utils/screen-reader-formatter.d.ts +7 -4
- package/lib/utils/scroll-event.d.ts +48 -48
- package/lib/utils/scrolling-direction.d.ts +17 -17
- package/lib/utils/snapping-method.d.ts +3 -3
- package/lib/utils/toggle-class-name.d.ts +7 -7
- package/lib/utils/validation.d.ts +35 -35
- package/package.json +11 -5
- package/public-api.d.ts +16 -16
- package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +0 -315
- package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +0 -200
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +0 -279
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +0 -94
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +0 -142
- package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +0 -198
- package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +0 -93
- package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.mjs +0 -25
- package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +0 -324
- package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +0 -262
- package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +0 -859
- package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +0 -17
- package/esm2022/lib/components/ng-scroll-view/utils/scroll-box.mjs +0 -45
- package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +0 -525
- package/esm2022/lib/components/ng-scroller/utils/scroll-box.mjs +0 -52
- package/esm2022/lib/core/cache-map.mjs +0 -101
- package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +0 -2
- package/esm2022/lib/core/track-box.mjs +0 -1353
- package/esm2022/lib/core/tracker.mjs +0 -207
- package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +0 -68
- package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +0 -67
- package/esm2022/lib/ng-virtual-list-public.service.mjs +0 -120
- package/esm2022/lib/ng-virtual-list.component.mjs +0 -3246
- package/esm2022/lib/ng-virtual-list.service.mjs +0 -431
- package/esm2022/lib/transformations/deck-of-cards-3d.mjs +0 -57
- package/esm2022/lib/transformations/deck-of-cards.mjs +0 -54
- package/esm2022/lib/transformations/event-horizon.mjs +0 -47
- package/esm2022/lib/transformations/linear.mjs +0 -47
- package/esm2022/lib/transformations/swipe-3d.mjs +0 -51
- package/esm2022/lib/utils/animator/animator.mjs +0 -78
- package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +0 -2
- package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +0 -2
- package/esm2022/lib/utils/animator/types/easing.mjs +0 -2
- package/esm2022/lib/utils/buffer-interpolation.mjs +0 -29
- package/esm2022/lib/utils/cmap.mjs +0 -34
- package/esm2022/lib/utils/debounce.mjs +0 -61
- package/esm2022/lib/utils/disposable-component.mjs +0 -27
- package/esm2022/lib/utils/event-emitter/event-emitter.mjs +0 -105
- package/esm2022/lib/utils/event-emitter/interfaces/event-emitter.mjs +0 -2
- package/esm2022/lib/utils/get-scroll-state-version.mjs +0 -12
- package/esm2022/lib/utils/is-collapse-mode.mjs +0 -18
- package/esm2022/lib/utils/is-direction.mjs +0 -15
- package/esm2022/lib/utils/is-persentage-value.mjs +0 -14
- package/esm2022/lib/utils/is-select-mode.mjs +0 -18
- package/esm2022/lib/utils/list-validators.mjs +0 -27
- package/esm2022/lib/utils/normalize-collection.mjs +0 -42
- package/esm2022/lib/utils/object.mjs +0 -28
- package/esm2022/lib/utils/parse-arithmetic-expression.mjs +0 -53
- package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +0 -17
- package/esm2022/lib/utils/screen-reader-formatter.mjs +0 -43
- package/esm2022/lib/utils/scroll-event.mjs +0 -48
- package/esm2022/lib/utils/scrolling-direction.mjs +0 -29
- package/esm2022/lib/utils/toggle-class-name.mjs +0 -15
- package/fesm2022/ng-virtual-list.mjs.map +0 -1
|
@@ -1,525 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, filter, from, of, Subject, takeUntil, tap } from 'rxjs';
|
|
3
|
-
import { ScrollBox } from './utils';
|
|
4
|
-
import { NgScrollBarComponent } from "../ng-scroll-bar/ng-scroll-bar.component";
|
|
5
|
-
import { BEHAVIOR_INSTANT, DEFAULT_MAX_MOTION_BLUR, DEFAULT_MOTION_BLUR, DEFAULT_MOTION_BLUR_ENABLED, DEFAULT_OVERLAPPING_SCROLLBAR, DEFAULT_SCROLLBAR_ENABLED, DEFAULT_SCROLLBAR_INTERACTIVE, DEFAULT_SCROLLBAR_MIN_SIZE, DEFAULT_SCROLLBAR_THICKNESS, LEFT_PROP_NAME, PX, SCROLLER_SCROLL, TOP_PROP_NAME, } from '../../const';
|
|
6
|
-
import { TextDirections } from '../../enums';
|
|
7
|
-
import { NgScrollView, SCROLL_VIEW_INVERSION } from '../ng-scroll-view';
|
|
8
|
-
import { SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SCROLL_VIEW_OVERSCROLL_ENABLED } from '../ng-scroll-view/const';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/common";
|
|
11
|
-
import * as i2 from "../ng-scroll-bar/ng-scroll-bar.component";
|
|
12
|
-
import * as i3 from "../../directives/locale-sensitive/locale-sensitive.directive";
|
|
13
|
-
import * as i4 from "@angular/cdk/scrolling";
|
|
14
|
-
const TOP = 'top', LEFT = 'left', INSTANT = 'instant', MOTION_BLUR = 'motion-blur';
|
|
15
|
-
export const SCROLL_EVENT = new Event(SCROLLER_SCROLL);
|
|
16
|
-
/**
|
|
17
|
-
* The scroller for the NgVirtualList item component
|
|
18
|
-
* Maximum performance for extremely large lists.
|
|
19
|
-
* It is based on algorithms for virtualization of screen objects.
|
|
20
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/components/ng-scroller/ng-scroller.component.ts
|
|
21
|
-
* @author Evgenii Alexandrovich Grebennikov
|
|
22
|
-
* @email djonnyx@gmail.com
|
|
23
|
-
*/
|
|
24
|
-
export class NgScrollerComponent extends NgScrollView {
|
|
25
|
-
scrollBar;
|
|
26
|
-
filter;
|
|
27
|
-
onScrollbarVisible = new EventEmitter();
|
|
28
|
-
_$scrollbarEnabled = new BehaviorSubject(DEFAULT_SCROLLBAR_ENABLED);
|
|
29
|
-
$scrollbarEnabled = this._$scrollbarEnabled.asObservable();
|
|
30
|
-
set scrollbarEnabled(v) {
|
|
31
|
-
if (this._$scrollbarEnabled.getValue() !== v) {
|
|
32
|
-
this._$scrollbarEnabled.next(v);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
get scrollbarEnabled() { return this._$scrollbarEnabled.getValue(); }
|
|
36
|
-
_$scrollbarInteractive = new BehaviorSubject(DEFAULT_SCROLLBAR_INTERACTIVE);
|
|
37
|
-
$scrollbarInteractive = this._$scrollbarInteractive.asObservable();
|
|
38
|
-
set scrollbarInteractive(v) {
|
|
39
|
-
if (this._$scrollbarInteractive.getValue() !== v) {
|
|
40
|
-
this._$scrollbarInteractive.next(v);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
get scrollbarInteractive() { return this._$scrollbarInteractive.getValue(); }
|
|
44
|
-
_$focusedElement = new BehaviorSubject(undefined);
|
|
45
|
-
$focusedElement = this._$focusedElement.asObservable();
|
|
46
|
-
set focusedElement(v) {
|
|
47
|
-
if (this._$focusedElement.getValue() !== v) {
|
|
48
|
-
this._$focusedElement.next(v);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
get focusedElement() { return this._$focusedElement.getValue(); }
|
|
52
|
-
_$overlappingScrollbar = new BehaviorSubject(DEFAULT_OVERLAPPING_SCROLLBAR);
|
|
53
|
-
$overlappingScrollbar = this._$overlappingScrollbar.asObservable();
|
|
54
|
-
set overlappingScrollbar(v) {
|
|
55
|
-
if (this._$overlappingScrollbar.getValue() !== v) {
|
|
56
|
-
this._$overlappingScrollbar.next(v);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
get overlappingScrollbar() { return this._$overlappingScrollbar.getValue(); }
|
|
60
|
-
_$content = new BehaviorSubject(undefined);
|
|
61
|
-
$content = this._$focusedElement.asObservable();
|
|
62
|
-
set content(v) {
|
|
63
|
-
if (this._$content.getValue() !== v) {
|
|
64
|
-
this._$content.next(v);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
get content() { return this._$content.getValue(); }
|
|
68
|
-
_$loading = new BehaviorSubject(false);
|
|
69
|
-
$loading = this._$loading.asObservable();
|
|
70
|
-
set loading(v) {
|
|
71
|
-
if (this._$loading.getValue() !== v) {
|
|
72
|
-
this._$loading.next(v);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
get loading() { return this._$loading.getValue(); }
|
|
76
|
-
_$classes = new BehaviorSubject({});
|
|
77
|
-
$classes = this._$classes.asObservable();
|
|
78
|
-
set classes(v) {
|
|
79
|
-
if (this._$classes.getValue() !== v) {
|
|
80
|
-
this._$classes.next(v);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
get classes() { return this._$classes.getValue(); }
|
|
84
|
-
_$scrollbarMinSize = new BehaviorSubject(DEFAULT_SCROLLBAR_MIN_SIZE);
|
|
85
|
-
$scrollbarMinSize = this._$scrollbarMinSize.asObservable();
|
|
86
|
-
set scrollbarMinSize(v) {
|
|
87
|
-
if (this._$scrollbarMinSize.getValue() !== v) {
|
|
88
|
-
this._$scrollbarMinSize.next(v);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
get scrollbarMinSize() { return this._$scrollbarMinSize.getValue(); }
|
|
92
|
-
_$scrollbarThickness = new BehaviorSubject(DEFAULT_SCROLLBAR_THICKNESS);
|
|
93
|
-
$scrollbarThickness = this._$scrollbarThickness.asObservable();
|
|
94
|
-
set scrollbarThickness(v) {
|
|
95
|
-
if (this._$scrollbarThickness.getValue() !== v) {
|
|
96
|
-
this._$scrollbarThickness.next(v);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
get scrollbarThickness() { return this._$scrollbarThickness.getValue(); }
|
|
100
|
-
_$scrollbarThumbRenderer = new BehaviorSubject(null);
|
|
101
|
-
$scrollbarThumbRenderer = this._$scrollbarThumbRenderer.asObservable();
|
|
102
|
-
set scrollbarThumbRenderer(v) {
|
|
103
|
-
if (this._$scrollbarThumbRenderer.getValue() !== v) {
|
|
104
|
-
this._$scrollbarThumbRenderer.next(v);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
get scrollbarThumbRenderer() { return this._$scrollbarThumbRenderer.getValue(); }
|
|
108
|
-
_$scrollbarThumbParams = new BehaviorSubject(null);
|
|
109
|
-
$scrollbarThumbParams = this._$scrollbarThumbParams.asObservable();
|
|
110
|
-
set scrollbarThumbParams(v) {
|
|
111
|
-
if (this._$scrollbarThumbParams.getValue() !== v) {
|
|
112
|
-
this._$scrollbarThumbParams.next(v);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
get scrollbarThumbParams() { return this._$scrollbarThumbParams.getValue(); }
|
|
116
|
-
_$motionBlur = new BehaviorSubject(DEFAULT_MOTION_BLUR);
|
|
117
|
-
$motionBlur = this._$motionBlur.asObservable();
|
|
118
|
-
set motionBlur(v) {
|
|
119
|
-
if (this._$motionBlur.getValue() !== v) {
|
|
120
|
-
this._$motionBlur.next(v);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
get motionBlur() { return this._$motionBlur.getValue(); }
|
|
124
|
-
_$maxMotionBlur = new BehaviorSubject(DEFAULT_MAX_MOTION_BLUR);
|
|
125
|
-
$maxMotionBlur = this._$maxMotionBlur.asObservable();
|
|
126
|
-
set maxMotionBlur(v) {
|
|
127
|
-
if (this._$maxMotionBlur.getValue() !== v) {
|
|
128
|
-
this._$maxMotionBlur.next(v);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
get maxMotionBlur() { return this._$maxMotionBlur.getValue(); }
|
|
132
|
-
_$motionBlurEnabled = new BehaviorSubject(DEFAULT_MOTION_BLUR_ENABLED);
|
|
133
|
-
$motionBlurEnabled = this._$motionBlurEnabled.asObservable();
|
|
134
|
-
set motionBlurEnabled(v) {
|
|
135
|
-
if (this._$motionBlurEnabled.getValue() !== v) {
|
|
136
|
-
this._$motionBlurEnabled.next(v);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
get motionBlurEnabled() { return this._$motionBlurEnabled.getValue(); }
|
|
140
|
-
_$actualClasses = new BehaviorSubject({});
|
|
141
|
-
$actualClasses = this._$actualClasses.asObservable();
|
|
142
|
-
_$containerClasses = new BehaviorSubject({});
|
|
143
|
-
$containerClasses = this._$containerClasses.asObservable();
|
|
144
|
-
_$thumbGradientPositions = new BehaviorSubject([0, 0]);
|
|
145
|
-
$thumbGradientPositions = this._$thumbGradientPositions.asObservable();
|
|
146
|
-
_$thumbSize = new BehaviorSubject(0);
|
|
147
|
-
$thumbSize = this._$thumbSize.asObservable();
|
|
148
|
-
_$thumbColorPositions = new BehaviorSubject([0, 0]);
|
|
149
|
-
$thumbColorPositions = this._$thumbColorPositions.asObservable();
|
|
150
|
-
_$actualThumbSize = new BehaviorSubject(0);
|
|
151
|
-
$actualThumbSize = this._$actualThumbSize.asObservable();
|
|
152
|
-
_$scrollbarShow = new BehaviorSubject(false);
|
|
153
|
-
$scrollbarShow = this._$scrollbarShow.asObservable();
|
|
154
|
-
_$show = new BehaviorSubject(false);
|
|
155
|
-
$show = this._$show.asObservable();
|
|
156
|
-
_$preparedSignal = new BehaviorSubject(false);
|
|
157
|
-
$preparedSignal = this._$preparedSignal.asObservable();
|
|
158
|
-
_$langTextDir = new BehaviorSubject(TextDirections.LTR);
|
|
159
|
-
$langTextDir = this._$langTextDir.asObservable();
|
|
160
|
-
_$listStyles = new BehaviorSubject({ perspectiveOrigin: 'center' });
|
|
161
|
-
$listStyles = this._$listStyles.asObservable();
|
|
162
|
-
_scrollBox = new ScrollBox();
|
|
163
|
-
get host() {
|
|
164
|
-
return this.scrollViewport?.nativeElement;
|
|
165
|
-
}
|
|
166
|
-
_$scrollbarScroll = new Subject();
|
|
167
|
-
$scrollbarScroll = this._$scrollbarScroll.asObservable();
|
|
168
|
-
_prepared = false;
|
|
169
|
-
set prepared(v) {
|
|
170
|
-
if (this._prepared !== v) {
|
|
171
|
-
this._prepared = v;
|
|
172
|
-
this._$preparedSignal.next(v);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
setX(x, snap = true, normalize = true) {
|
|
176
|
-
if (x !== undefined && !Number.isNaN(x)) {
|
|
177
|
-
this.updateDirection(x, this._x);
|
|
178
|
-
this._x = this._actualX = x;
|
|
179
|
-
const overridden = normalize ? this.normalizeScrollSize() : false;
|
|
180
|
-
this.refreshCoordinate(this._x, this._y);
|
|
181
|
-
if (!overridden) {
|
|
182
|
-
this.measureVelocity();
|
|
183
|
-
}
|
|
184
|
-
this.updateScrollBar();
|
|
185
|
-
this.recalculatePerspective();
|
|
186
|
-
if (snap) {
|
|
187
|
-
this.checkIntersectionComponent();
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
setY(y, snap = true, normalize = true) {
|
|
192
|
-
if (y !== undefined && !Number.isNaN(y)) {
|
|
193
|
-
this.updateDirection(y, this._y);
|
|
194
|
-
this._y = this._actualY = y;
|
|
195
|
-
const overridden = normalize ? this.normalizeScrollSize() : false;
|
|
196
|
-
this.refreshCoordinate(this._x, this._y);
|
|
197
|
-
if (!overridden) {
|
|
198
|
-
this.measureVelocity();
|
|
199
|
-
}
|
|
200
|
-
this.updateScrollBar();
|
|
201
|
-
this.recalculatePerspective();
|
|
202
|
-
if (snap) {
|
|
203
|
-
this.checkIntersectionComponent();
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
set startLayoutOffset(v) {
|
|
208
|
-
if (this._startLayoutOffset !== v) {
|
|
209
|
-
this._startLayoutOffset = v;
|
|
210
|
-
this.refreshCoordinate(this._x, this._y);
|
|
211
|
-
this.recalculatePerspective();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
get startLayoutOffset() { return this._startLayoutOffset; }
|
|
215
|
-
_$viewInitialized = new BehaviorSubject(false);
|
|
216
|
-
$viewInitialized = this._$viewInitialized.asObservable();
|
|
217
|
-
_isScrollbarUserAction = false;
|
|
218
|
-
get isScrollbarUserAction() {
|
|
219
|
-
return this._isScrollbarUserAction;
|
|
220
|
-
}
|
|
221
|
-
_$resizeViewport = new Subject();
|
|
222
|
-
$resizeViewport = this._$resizeViewport.asObservable();
|
|
223
|
-
_$resizeContent = new Subject();
|
|
224
|
-
$resizeContent = this._$resizeContent.asObservable();
|
|
225
|
-
_filterId;
|
|
226
|
-
_filter;
|
|
227
|
-
constructor() {
|
|
228
|
-
super();
|
|
229
|
-
this._filterId = `${this._service.id}-${MOTION_BLUR}`;
|
|
230
|
-
this._filter = `url(#${this._filterId})`;
|
|
231
|
-
}
|
|
232
|
-
ngAfterViewInit() {
|
|
233
|
-
super.ngAfterViewInit();
|
|
234
|
-
const $filter = of(this.filter), $motionBlur = this.$motionBlur, $maxMotionBlur = this.$maxMotionBlur, $motionBlurEnabled = this.$motionBlurEnabled, $isVertical = this.$isVertical;
|
|
235
|
-
const $scrollbarScroll = this.$scrollbarScroll;
|
|
236
|
-
$scrollbarScroll.pipe(takeUntil(this._$unsubscribe), debounceTime(50), tap(() => {
|
|
237
|
-
this.dropVelocity();
|
|
238
|
-
this.fireScrollEvent(false);
|
|
239
|
-
})).subscribe();
|
|
240
|
-
const $averageVelocity = this.$averageVelocity;
|
|
241
|
-
combineLatest([$isVertical, $averageVelocity, $filter, $motionBlurEnabled, $motionBlur, $maxMotionBlur]).pipe(takeUntil(this._$unsubscribe), filter(([, , f, e, mb]) => !!f && (!!e && mb !== 0)), tap(([isVertical, v, filter, , mb, mbMax]) => {
|
|
242
|
-
const _v = v * mb, value = _v > mbMax ? mbMax : _v;
|
|
243
|
-
filter.nativeElement.setStdDeviation(isVertical ? 0 : v * value, isVertical ? v * value : 0);
|
|
244
|
-
}), debounceTime(50), tap(([, , filter, ,]) => {
|
|
245
|
-
filter.nativeElement.setStdDeviation(0, 0);
|
|
246
|
-
})).subscribe();
|
|
247
|
-
this._service.$langTextDir.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(v => {
|
|
248
|
-
this._$langTextDir.next(v);
|
|
249
|
-
})).subscribe();
|
|
250
|
-
const $prepare = this.$preparedSignal;
|
|
251
|
-
$prepare.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(() => {
|
|
252
|
-
this.updateScrollBarHandler(true, false, true);
|
|
253
|
-
})).subscribe();
|
|
254
|
-
const $scrollbarEnabled = this.$scrollbarEnabled, $scrollbarShow = this.$scrollbarShow;
|
|
255
|
-
combineLatest([$scrollbarEnabled, $scrollbarShow, this.$preparedSignal]).pipe(takeUntil(this._$unsubscribe), tap(([scrollbarEnabled, scrollbarShow, prepared]) => {
|
|
256
|
-
this._$show.next(scrollbarEnabled && scrollbarShow && prepared);
|
|
257
|
-
})).subscribe();
|
|
258
|
-
const $startOffset = this.$startOffset, $endOffset = this.$endOffset, $scrollbarMinSize = this.$scrollbarMinSize, $thumbSize = this.$thumbSize;
|
|
259
|
-
from([$endOffset, $startOffset, $thumbSize, $scrollbarMinSize, $isVertical]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(() => {
|
|
260
|
-
this.updateScrollBar();
|
|
261
|
-
})).subscribe();
|
|
262
|
-
const $updateScrollBar = this.$updateScrollBar;
|
|
263
|
-
$updateScrollBar.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(() => {
|
|
264
|
-
this.updateScrollBarHandler(!this._isScrollbarUserAction);
|
|
265
|
-
})).subscribe();
|
|
266
|
-
combineLatest([this.$classes, this.$direction, this.$grabbing, this.$motionBlurEnabled]).pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), debounceTime(0), tap(([classes, direction, grabbing, filtered]) => {
|
|
267
|
-
this._$actualClasses.next({ ...classes, [direction]: true, grabbing, filtered });
|
|
268
|
-
})).subscribe();
|
|
269
|
-
combineLatest([this.$contentBounds, this.$viewportBounds, this.$isVertical, this.$direction, this.$grabbing, this.$scrollbarEnabled, this.$overlappingScrollbar]).pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), debounceTime(0), tap(([contentBounds, viewportBounds, isVertical, direction, grabbing, scrollbarEnabled, overlappingScrollbar]) => {
|
|
270
|
-
const { width: contentWidth, height: contentHeight } = contentBounds, { width, height } = viewportBounds, viewportSize = isVertical ? height : width, contentSize = isVertical ? contentHeight : contentWidth;
|
|
271
|
-
this._$containerClasses.next({ [direction]: true, grabbing, enabled: scrollbarEnabled, scrollable: contentSize > viewportSize, overlapping: overlappingScrollbar });
|
|
272
|
-
})).subscribe();
|
|
273
|
-
this.$viewInitialized.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(() => {
|
|
274
|
-
this.updateScrollBarHandler();
|
|
275
|
-
})).subscribe();
|
|
276
|
-
this.$thumbGradientPositions.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(v => {
|
|
277
|
-
this._$thumbColorPositions.next(v);
|
|
278
|
-
})).subscribe();
|
|
279
|
-
this.$thumbSize.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(v => {
|
|
280
|
-
this._$actualThumbSize.next(v);
|
|
281
|
-
})).subscribe();
|
|
282
|
-
this._$viewInitialized.next(true);
|
|
283
|
-
}
|
|
284
|
-
recalculatePerspective() {
|
|
285
|
-
const isVertical = this._$isVertical.getValue(), scrollSize = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, { width, height } = this._$viewportBounds.getValue();
|
|
286
|
-
this._$listStyles.next({
|
|
287
|
-
perspectiveOrigin: `${isVertical ? width * .5 : (scrollSize + width * .5)}${PX} ${isVertical ? (scrollSize + height * .5) : height * .5}${PX}`
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
onResizeViewport() {
|
|
291
|
-
const viewport = this.scrollViewport?.nativeElement;
|
|
292
|
-
if (!!viewport) {
|
|
293
|
-
const bounds = { width: viewport.offsetWidth, height: viewport.offsetHeight }, b = this._$viewportBounds.getValue();
|
|
294
|
-
if (bounds.width === b.width && bounds.height === b.height) {
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
this._$viewportBounds.next(bounds);
|
|
298
|
-
this.updateScrollBar();
|
|
299
|
-
this._$resizeViewport.next(bounds);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
onResizeContent(value = null) {
|
|
303
|
-
const content = this.scrollContent?.nativeElement;
|
|
304
|
-
if (!!content) {
|
|
305
|
-
const isVertical = this._$isVertical.getValue(), bounds = {
|
|
306
|
-
width: isVertical ? content.offsetWidth : (value ?? content.offsetWidth),
|
|
307
|
-
height: isVertical ? (value ?? content.offsetHeight) : content.offsetHeight
|
|
308
|
-
}, b = this._$contentBounds.getValue();
|
|
309
|
-
if (value === null && bounds.width === b.width && bounds.height === b.height) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
this._$contentBounds.next(bounds);
|
|
313
|
-
this.updateScrollBar();
|
|
314
|
-
this._$resizeContent.next(bounds);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
updateScrollBarHandler(update = false, blending = true, fireUpdate = false) {
|
|
318
|
-
const direction = this.direction, isVertical = this._$isVertical.getValue(), viewportBounds = this._$viewportBounds.getValue(), contentBounds = this._$contentBounds.getValue(), startOffset = this.startOffset, endOffset = this.endOffset, { thumbSize, thumbPosition, thumbGradientPositions, } = this._scrollBox.calculateScroll({
|
|
319
|
-
direction,
|
|
320
|
-
viewportWidth: viewportBounds.width,
|
|
321
|
-
viewportHeight: viewportBounds.height,
|
|
322
|
-
contentWidth: contentBounds.width,
|
|
323
|
-
contentHeight: contentBounds.height,
|
|
324
|
-
startOffset,
|
|
325
|
-
endOffset,
|
|
326
|
-
positionX: this._x,
|
|
327
|
-
positionY: this._y,
|
|
328
|
-
minSize: this.scrollbarMinSize,
|
|
329
|
-
});
|
|
330
|
-
this._$thumbGradientPositions.next(thumbGradientPositions);
|
|
331
|
-
this._$thumbSize.next(thumbSize);
|
|
332
|
-
const actualThumbPosition = thumbPosition < startOffset ? startOffset : thumbPosition;
|
|
333
|
-
if (update) {
|
|
334
|
-
this.scrollBar?.scroll({
|
|
335
|
-
[isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualThumbPosition, fireUpdate, behavior: BEHAVIOR_INSTANT,
|
|
336
|
-
userAction: false, blending,
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
this._$scrollbarShow.next(this.scrollable && this.scrollbarEnabled);
|
|
340
|
-
}
|
|
341
|
-
;
|
|
342
|
-
tick() {
|
|
343
|
-
super.tick();
|
|
344
|
-
this.scrollBar?.tick();
|
|
345
|
-
}
|
|
346
|
-
updateScrollBar() {
|
|
347
|
-
this._$updateScrollBar.next();
|
|
348
|
-
}
|
|
349
|
-
refreshScrollbar() {
|
|
350
|
-
this.updateScrollBarHandler(true, false, false);
|
|
351
|
-
}
|
|
352
|
-
onDragStart() {
|
|
353
|
-
super.onDragStart();
|
|
354
|
-
this.stopScrollbar();
|
|
355
|
-
this._isScrollbarUserAction = false;
|
|
356
|
-
this.updateScrollBar();
|
|
357
|
-
}
|
|
358
|
-
reset() {
|
|
359
|
-
super.reset();
|
|
360
|
-
this.totalSize = 0;
|
|
361
|
-
this.onResizeContent(0);
|
|
362
|
-
this.stopScrollbar();
|
|
363
|
-
this.refresh(true, true);
|
|
364
|
-
this.prepared = false;
|
|
365
|
-
}
|
|
366
|
-
refresh(fireUpdate = false, updateScrollbar = true) {
|
|
367
|
-
if (updateScrollbar) {
|
|
368
|
-
this.stopScrolling();
|
|
369
|
-
}
|
|
370
|
-
this.scrollLimits();
|
|
371
|
-
this.refreshCoordinate(this._x, this._y);
|
|
372
|
-
if (updateScrollbar) {
|
|
373
|
-
this.updateScrollBarHandler(false);
|
|
374
|
-
this.emitScrollableEvent();
|
|
375
|
-
}
|
|
376
|
-
if (fireUpdate) {
|
|
377
|
-
this.fireScrollEvent(false);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
snapIfNeed(animated = true) {
|
|
381
|
-
this.snapWithInitialForceIfNecessary(null, animated, true);
|
|
382
|
-
}
|
|
383
|
-
startScrollTo() {
|
|
384
|
-
this.stopScrollbar();
|
|
385
|
-
this.stopScrolling(true);
|
|
386
|
-
this._scrollDirection.clear();
|
|
387
|
-
this.dropVelocity();
|
|
388
|
-
this._isScrollsTo = true;
|
|
389
|
-
}
|
|
390
|
-
finishedScrollTo() {
|
|
391
|
-
this._isScrollsTo = false;
|
|
392
|
-
this._scrollDirection.clear();
|
|
393
|
-
this.dropVelocity();
|
|
394
|
-
this.checkIntersectionComponent();
|
|
395
|
-
this.fireScrollEvent(true);
|
|
396
|
-
}
|
|
397
|
-
scrollTo(params) {
|
|
398
|
-
const userAction = params?.userAction ?? true;
|
|
399
|
-
if (userAction) {
|
|
400
|
-
this._isScrollbarUserAction = false;
|
|
401
|
-
this.scrollBar?.stopScrolling();
|
|
402
|
-
}
|
|
403
|
-
this.scroll({ ...params, userAction: userAction });
|
|
404
|
-
}
|
|
405
|
-
stopScrollbar() {
|
|
406
|
-
if (!!this.scrollBar) {
|
|
407
|
-
this.scrollBar.stopScrolling();
|
|
408
|
-
this.alignPosition();
|
|
409
|
-
this.dropVelocity();
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
dropVelocity() {
|
|
413
|
-
this._velocities = [0];
|
|
414
|
-
this._$velocity.next(0);
|
|
415
|
-
this._$averageVelocity.next(0);
|
|
416
|
-
}
|
|
417
|
-
stopMoving() {
|
|
418
|
-
super.stopMoving();
|
|
419
|
-
this.dropVelocity();
|
|
420
|
-
}
|
|
421
|
-
onAnimationComplete(position) {
|
|
422
|
-
this.dropVelocity();
|
|
423
|
-
this._$scrollEnd.next(false);
|
|
424
|
-
}
|
|
425
|
-
onScrollBarDragHandler(event) {
|
|
426
|
-
const { position, min, max, userAction } = event;
|
|
427
|
-
this._isScrollbarUserAction = userAction;
|
|
428
|
-
if (!userAction) {
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
this._$scrollbarScroll.next(true);
|
|
432
|
-
this.stopScrolling(true);
|
|
433
|
-
const isVertical = this._$isVertical.getValue(), { position: absolutePosition, } = this._scrollBox.getScrollPositionByScrollBar({
|
|
434
|
-
scrollSize: isVertical ? this.scrollHeight : this.scrollWidth,
|
|
435
|
-
position,
|
|
436
|
-
});
|
|
437
|
-
this.scrollTo({
|
|
438
|
-
[isVertical ? TOP : LEFT]: absolutePosition, behavior: INSTANT,
|
|
439
|
-
blending: false, userAction: true, fireUpdate: true,
|
|
440
|
-
});
|
|
441
|
-
this.emitScrollableEvent();
|
|
442
|
-
this._service.update(false);
|
|
443
|
-
}
|
|
444
|
-
onScrollBarDragEndHandler(event) {
|
|
445
|
-
const { position, min, max, userAction } = event;
|
|
446
|
-
this._isScrollbarUserAction = userAction;
|
|
447
|
-
if (!userAction) {
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
this._isScrollbarUserAction = false;
|
|
451
|
-
this.dropVelocity();
|
|
452
|
-
this._service.update(false);
|
|
453
|
-
const isEdge = this.fireUpdateIfEdgesDetected(position, min, max, true, true);
|
|
454
|
-
if (!isEdge) {
|
|
455
|
-
this.alignPosition();
|
|
456
|
-
}
|
|
457
|
-
this._scrollDirection.clear();
|
|
458
|
-
this._$scrollbarScroll.next(true);
|
|
459
|
-
this.fireScrollEvent(true);
|
|
460
|
-
}
|
|
461
|
-
fireUpdateIfEdgesDetected(position, min = 0, max = 1, animation = false, userAction = false) {
|
|
462
|
-
if (userAction && animation) {
|
|
463
|
-
if (position <= min) {
|
|
464
|
-
this._service.scrollToStart();
|
|
465
|
-
return true;
|
|
466
|
-
}
|
|
467
|
-
else if (position >= max) {
|
|
468
|
-
this._service.scrollToEnd();
|
|
469
|
-
return true;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
return false;
|
|
473
|
-
}
|
|
474
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgScrollerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
475
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: NgScrollerComponent, selector: "ng-scroller", inputs: { scrollbarEnabled: "scrollbarEnabled", scrollbarInteractive: "scrollbarInteractive", focusedElement: "focusedElement", overlappingScrollbar: "overlappingScrollbar", content: "content", loading: "loading", classes: "classes", scrollbarMinSize: "scrollbarMinSize", scrollbarThickness: "scrollbarThickness", scrollbarThumbRenderer: "scrollbarThumbRenderer", scrollbarThumbParams: "scrollbarThumbParams", motionBlur: "motionBlur", maxMotionBlur: "maxMotionBlur", motionBlurEnabled: "motionBlurEnabled" }, outputs: { onScrollbarVisible: "onScrollbarVisible" }, providers: [
|
|
476
|
-
{ provide: SCROLL_VIEW_INVERSION, useValue: false },
|
|
477
|
-
{ provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: true },
|
|
478
|
-
{ provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: true },
|
|
479
|
-
], viewQueries: [{ propertyName: "scrollBar", first: true, predicate: ["scrollBar"], descendants: true, read: NgScrollBarComponent }, { propertyName: "filter", first: true, predicate: ["filter"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div localeSensitive [langTextDir]=\"($langTextDir | async)!\" [listDir]=\"($direction | async)!\" class=\"ngvl__container\"\r\n [ngClass]=\"($containerClasses | async)!\">\r\n <svg part=\"viewport\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <filter [id]=\"_filterId\">\r\n <feGaussianBlur #filter></feGaussianBlur>\r\n </filter>\r\n <foreignObject xmlns=\"http://www.w3.org/1999/xhtml\" width=\"100%\" height=\"100%\" class=\"ngvl__viewport\">\r\n <div class=\"ngvl__scroller-wrapper\" [class.filtered]=\"($motionBlurEnabled | async)!\" [style.filter]=\"($motionBlurEnabled | async)! ? _filter : 'unset'\">\r\n <div cdkScrollable #scrollViewport part=\"scroller\" class=\"ngvl__scroller\">\r\n <div #scrollContent [attr.aria-orientation]=\"($direction | async)!\"\r\n [attr.aria-activedescendant]=\"$focusedElement | async\" tabindex=\"0\" part=\"list\" class=\"ngvl__list\"\r\n [ngClass]=\"($actualClasses | async)!\" [ngStyle]=\"($listStyles | async)!\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n <ng-container *ngIf=\"($scrollbarEnabled | async)!\">\r\n <ng-scroll-bar #scrollBar [direction]=\"($direction | async)!\" [size]=\"($actualThumbSize | async)!\" [renderer]=\"($scrollbarThumbRenderer | async)!\"\r\n [thickness]=\"($scrollbarThickness | async)!\" [params]=\"($scrollbarThumbParams | async)!\" [loading]=\"($loading | async)!\" [overlapping]=\"($overlappingScrollbar | async)!\"\r\n [thumbGradientPositions]=\"($thumbColorPositions | async)!\" [prepared]=\"($preparedSignal | async)!\" [interactive]=\"($scrollbarInteractive | async)!\"\r\n [show]=\"($show | async)!\" [startOffset]=\"($startOffset | async)!\" [langTextDir]=\"($langTextDir | async)!\"\r\n [endOffset]=\"($endOffset | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" (onDrag)=\"onScrollBarDragHandler($event)\"\r\n (onDragEnd)=\"onScrollBarDragEndHandler($event)\"></ng-scroll-bar>\r\n </ng-container>\r\n</div>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none}.ngvl__container{position:relative;overflow:hidden;display:grid;width:100%;height:100%;cursor:grab}.ngvl__container.overlapping{position:relative;display:block}.ngvl__container.grabbing{cursor:grabbing}.ngvl__container.horizontal{transition:grid-template-rows .1s ease-out}.ngvl__container.horizontal:not(.overlapping){grid-template-rows:1fr 0}.ngvl__container.horizontal.scrollable.enabled:not(.overlapping){grid-template-rows:1fr auto}.ngvl__container.horizontal .ngvl__list{display:inline-flex}.ngvl__container.horizontal .ngvl__scroller-wrapper.filtered,.ngvl__container.horizontal .ngvl__scroller{overflow:unset}.ngvl__container.vertical{transition:grid-template-columns .1s ease-out}.ngvl__container.vertical:not(.overlapping){grid-template-columns:1fr 0}.ngvl__container.vertical.scrollable.enabled:not(.overlapping){grid-template-columns:1fr auto}.ngvl__container.vertical .ngvl__scroller-wrapper.filtered,.ngvl__container.vertical .ngvl__scroller{overflow:unset}.ngvl__container .ngvl__scroller-wrapper,.ngvl__container .ngvl__scroller{display:block;position:relative;overflow:hidden;width:100%;height:100%}.ngvl__container .ngvl__list{position:absolute;list-style:none;padding:0;margin:0;width:100%;height:100%;opacity:0}.ngvl__container .ngvl__list.prepared{opacity:1}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.NgScrollBarComponent, selector: "ng-scroll-bar", inputs: ["loading", "thumbGradientPositions", "size", "thickness", "scrollbarMinSize", "prepared", "langTextDir", "interactive", "overlapping", "show", "params", "renderer"], outputs: ["onDrag", "onDragEnd"] }, { kind: "directive", type: i3.LocaleSensitiveDirective, selector: "[localeSensitive]", inputs: ["langTextDir", "listDir"] }, { kind: "directive", type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
480
|
-
}
|
|
481
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgScrollerComponent, decorators: [{
|
|
482
|
-
type: Component,
|
|
483
|
-
args: [{ selector: 'ng-scroller', providers: [
|
|
484
|
-
{ provide: SCROLL_VIEW_INVERSION, useValue: false },
|
|
485
|
-
{ provide: SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, useValue: true },
|
|
486
|
-
{ provide: SCROLL_VIEW_OVERSCROLL_ENABLED, useValue: true },
|
|
487
|
-
], standalone: false, template: "<div localeSensitive [langTextDir]=\"($langTextDir | async)!\" [listDir]=\"($direction | async)!\" class=\"ngvl__container\"\r\n [ngClass]=\"($containerClasses | async)!\">\r\n <svg part=\"viewport\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <filter [id]=\"_filterId\">\r\n <feGaussianBlur #filter></feGaussianBlur>\r\n </filter>\r\n <foreignObject xmlns=\"http://www.w3.org/1999/xhtml\" width=\"100%\" height=\"100%\" class=\"ngvl__viewport\">\r\n <div class=\"ngvl__scroller-wrapper\" [class.filtered]=\"($motionBlurEnabled | async)!\" [style.filter]=\"($motionBlurEnabled | async)! ? _filter : 'unset'\">\r\n <div cdkScrollable #scrollViewport part=\"scroller\" class=\"ngvl__scroller\">\r\n <div #scrollContent [attr.aria-orientation]=\"($direction | async)!\"\r\n [attr.aria-activedescendant]=\"$focusedElement | async\" tabindex=\"0\" part=\"list\" class=\"ngvl__list\"\r\n [ngClass]=\"($actualClasses | async)!\" [ngStyle]=\"($listStyles | async)!\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n <ng-container *ngIf=\"($scrollbarEnabled | async)!\">\r\n <ng-scroll-bar #scrollBar [direction]=\"($direction | async)!\" [size]=\"($actualThumbSize | async)!\" [renderer]=\"($scrollbarThumbRenderer | async)!\"\r\n [thickness]=\"($scrollbarThickness | async)!\" [params]=\"($scrollbarThumbParams | async)!\" [loading]=\"($loading | async)!\" [overlapping]=\"($overlappingScrollbar | async)!\"\r\n [thumbGradientPositions]=\"($thumbColorPositions | async)!\" [prepared]=\"($preparedSignal | async)!\" [interactive]=\"($scrollbarInteractive | async)!\"\r\n [show]=\"($show | async)!\" [startOffset]=\"($startOffset | async)!\" [langTextDir]=\"($langTextDir | async)!\"\r\n [endOffset]=\"($endOffset | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" (onDrag)=\"onScrollBarDragHandler($event)\"\r\n (onDragEnd)=\"onScrollBarDragEndHandler($event)\"></ng-scroll-bar>\r\n </ng-container>\r\n</div>", styles: [":host{position:relative;overflow:hidden;-webkit-user-select:none;user-select:none}.ngvl__container{position:relative;overflow:hidden;display:grid;width:100%;height:100%;cursor:grab}.ngvl__container.overlapping{position:relative;display:block}.ngvl__container.grabbing{cursor:grabbing}.ngvl__container.horizontal{transition:grid-template-rows .1s ease-out}.ngvl__container.horizontal:not(.overlapping){grid-template-rows:1fr 0}.ngvl__container.horizontal.scrollable.enabled:not(.overlapping){grid-template-rows:1fr auto}.ngvl__container.horizontal .ngvl__list{display:inline-flex}.ngvl__container.horizontal .ngvl__scroller-wrapper.filtered,.ngvl__container.horizontal .ngvl__scroller{overflow:unset}.ngvl__container.vertical{transition:grid-template-columns .1s ease-out}.ngvl__container.vertical:not(.overlapping){grid-template-columns:1fr 0}.ngvl__container.vertical.scrollable.enabled:not(.overlapping){grid-template-columns:1fr auto}.ngvl__container.vertical .ngvl__scroller-wrapper.filtered,.ngvl__container.vertical .ngvl__scroller{overflow:unset}.ngvl__container .ngvl__scroller-wrapper,.ngvl__container .ngvl__scroller{display:block;position:relative;overflow:hidden;width:100%;height:100%}.ngvl__container .ngvl__list{position:absolute;list-style:none;padding:0;margin:0;width:100%;height:100%;opacity:0}.ngvl__container .ngvl__list.prepared{opacity:1}\n"] }]
|
|
488
|
-
}], ctorParameters: () => [], propDecorators: { scrollBar: [{
|
|
489
|
-
type: ViewChild,
|
|
490
|
-
args: ['scrollBar', { read: NgScrollBarComponent }]
|
|
491
|
-
}], filter: [{
|
|
492
|
-
type: ViewChild,
|
|
493
|
-
args: ['filter']
|
|
494
|
-
}], onScrollbarVisible: [{
|
|
495
|
-
type: Output
|
|
496
|
-
}], scrollbarEnabled: [{
|
|
497
|
-
type: Input
|
|
498
|
-
}], scrollbarInteractive: [{
|
|
499
|
-
type: Input
|
|
500
|
-
}], focusedElement: [{
|
|
501
|
-
type: Input
|
|
502
|
-
}], overlappingScrollbar: [{
|
|
503
|
-
type: Input
|
|
504
|
-
}], content: [{
|
|
505
|
-
type: Input
|
|
506
|
-
}], loading: [{
|
|
507
|
-
type: Input
|
|
508
|
-
}], classes: [{
|
|
509
|
-
type: Input
|
|
510
|
-
}], scrollbarMinSize: [{
|
|
511
|
-
type: Input
|
|
512
|
-
}], scrollbarThickness: [{
|
|
513
|
-
type: Input
|
|
514
|
-
}], scrollbarThumbRenderer: [{
|
|
515
|
-
type: Input
|
|
516
|
-
}], scrollbarThumbParams: [{
|
|
517
|
-
type: Input
|
|
518
|
-
}], motionBlur: [{
|
|
519
|
-
type: Input
|
|
520
|
-
}], maxMotionBlur: [{
|
|
521
|
-
type: Input
|
|
522
|
-
}], motionBlurEnabled: [{
|
|
523
|
-
type: Input
|
|
524
|
-
}] } });
|
|
525
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGxlci9uZy1zY3JvbGxlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb21wb25lbnRzL25nLXNjcm9sbGVyL25nLXNjcm9sbGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNySSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRWhGLE9BQU8sRUFDTCxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSw2QkFBNkIsRUFBRSx5QkFBeUIsRUFDckosNkJBQTZCLEVBQUUsMEJBQTBCLEVBQUUsMkJBQTJCLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsYUFBYSxHQUMzSSxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBbUIsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekYsT0FBTyxFQUFFLHFDQUFx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RixVQUFVO3NCQURiLEtBQUs7Z0JBWUYsYUFBYTtzQkFEaEIsS0FBSztnQkFZRixpQkFBaUI7c0JBRHBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZnJvbSwgb2YsIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNjcm9sbEJveCB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBJZCwgVGV4dERpcmVjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcclxuaW1wb3J0IHsgTmdTY3JvbGxCYXJDb21wb25lbnQgfSBmcm9tIFwiLi4vbmctc2Nyb2xsLWJhci9uZy1zY3JvbGwtYmFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBHcmFkaWVudENvbG9yUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvZ3JhZGllbnQtY29sb3ItcG9zaXRpb25zJztcclxuaW1wb3J0IHtcclxuICBCRUhBVklPUl9JTlNUQU5ULCBERUZBVUxUX01BWF9NT1RJT05fQkxVUiwgREVGQVVMVF9NT1RJT05fQkxVUiwgREVGQVVMVF9NT1RJT05fQkxVUl9FTkFCTEVELCBERUZBVUxUX09WRVJMQVBQSU5HX1NDUk9MTEJBUiwgREVGQVVMVF9TQ1JPTExCQVJfRU5BQkxFRCxcclxuICBERUZBVUxUX1NDUk9MTEJBUl9JTlRFUkFDVElWRSwgREVGQVVMVF9TQ1JPTExCQVJfTUlOX1NJWkUsIERFRkFVTFRfU0NST0xMQkFSX1RISUNLTkVTUywgTEVGVF9QUk9QX05BTUUsIFBYLCBTQ1JPTExFUl9TQ1JPTEwsIFRPUF9QUk9QX05BTUUsXHJcbn0gZnJvbSAnLi4vLi4vY29uc3QnO1xyXG5pbXBvcnQgeyBUZXh0RGlyZWN0aW9ucyB9IGZyb20gJy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgSVNjcm9sbFRvUGFyYW1zLCBOZ1Njcm9sbFZpZXcsIFNDUk9MTF9WSUVXX0lOVkVSU0lPTiB9IGZyb20gJy4uL25nLXNjcm9sbC12aWV3JztcclxuaW1wb3J0IHsgSVNjcm9sbEJhckRyYWdFdmVudCB9IGZyb20gJy4uL25nLXNjcm9sbC1iYXIvaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFNDUk9MTF9WSUVXX05PUk1BTElaRV9WQUxVRV9GUk9NX1pFUk8sIFNDUk9MTF9WSUVXX09WRVJTQ1JPTExfRU5BQkxFRCB9IGZyb20gJy4uL25nLXNjcm9sbC12aWV3L2NvbnN0JztcclxuaW1wb3J0IHsgSVNpemUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuXHJcbmNvbnN0IFRPUCA9ICd0b3AnLFxyXG4gIExFRlQgPSAnbGVmdCcsXHJcbiAgSU5TVEFOVCA9ICdpbnN0YW50JyBhcyBTY3JvbGxCZWhhdmlvcixcclxuICBNT1RJT05fQkxVUiA9ICdtb3Rpb24tYmx1cic7XHJcblxyXG5leHBvcnQgY29uc3QgU0NST0xMX0VWRU5UID0gbmV3IEV2ZW50KFNDUk9MTEVSX1NDUk9MTCk7XHJcblxyXG4vKipcclxuICogVGhlIHNjcm9sbGVyIGZvciB0aGUgTmdWaXJ0dWFsTGlzdCBpdGVtIGNvbXBvbmVudFxyXG4gKiBNYXhpbXVtIHBlcmZvcm1hbmNlIGZvciBleHRyZW1lbHkgbGFyZ2UgbGlzdHMuXHJcbiAqIEl0IGlzIGJhc2VkIG9uIGFsZ29yaXRobXMgZm9yIHZpcnR1YWxpemF0aW9uIG9mIHNjcmVlbiBvYmplY3RzLlxyXG4gKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vRGpvbm55WC9uZy12aXJ0dWFsLWxpc3QvYmxvYi8xNC54L3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL2NvbXBvbmVudHMvbmctc2Nyb2xsZXIvbmctc2Nyb2xsZXIuY29tcG9uZW50LnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBBbGV4YW5kcm92aWNoIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZy1zY3JvbGxlcicsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7IHByb3ZpZGU6IFNDUk9MTF9WSUVXX0lOVkVSU0lPTiwgdXNlVmFsdWU6IGZhbHNlIH0sXHJcbiAgICB7IHByb3ZpZGU6IFNDUk9MTF9WSUVXX05PUk1BTElaRV9WQUxVRV9GUk9NX1pFUk8sIHVzZVZhbHVlOiB0cnVlIH0sXHJcbiAgICB7IHByb3ZpZGU6IFNDUk9MTF9WSUVXX09WRVJTQ1JPTExfRU5BQkxFRCwgdXNlVmFsdWU6IHRydWUgfSxcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1zY3JvbGxlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmctc2Nyb2xsZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nU2Nyb2xsZXJDb21wb25lbnQgZXh0ZW5kcyBOZ1Njcm9sbFZpZXcge1xyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbEJhcicsIHsgcmVhZDogTmdTY3JvbGxCYXJDb21wb25lbnQgfSlcclxuICByZWFkb25seSBzY3JvbGxCYXI6IE5nU2Nyb2xsQmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWx0ZXInKVxyXG4gIHJlYWRvbmx5IGZpbHRlcjogRWxlbWVudFJlZjxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBAT3V0cHV0KClcclxuICByZWFkb25seSBvblNjcm9sbGJhclZpc2libGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxiYXJFbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NDUk9MTEJBUl9FTkFCTEVEKTtcclxuICByZWFkb25seSAkc2Nyb2xsYmFyRW5hYmxlZCA9IHRoaXMuXyRzY3JvbGxiYXJFbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzY3JvbGxiYXJFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsYmFyRW5hYmxlZC5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzY3JvbGxiYXJFbmFibGVkLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzY3JvbGxiYXJFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGJhckVuYWJsZWQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFySW50ZXJhY3RpdmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU0NST0xMQkFSX0lOVEVSQUNUSVZFKTtcclxuICByZWFkb25seSAkc2Nyb2xsYmFySW50ZXJhY3RpdmUgPSB0aGlzLl8kc2Nyb2xsYmFySW50ZXJhY3RpdmUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNjcm9sbGJhckludGVyYWN0aXZlKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsYmFySW50ZXJhY3RpdmUuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kc2Nyb2xsYmFySW50ZXJhY3RpdmUubmV4dCh2KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IHNjcm9sbGJhckludGVyYWN0aXZlKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGJhckludGVyYWN0aXZlLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGZvY3VzZWRFbGVtZW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJZCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICByZWFkb25seSAkZm9jdXNlZEVsZW1lbnQgPSB0aGlzLl8kZm9jdXNlZEVsZW1lbnQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGZvY3VzZWRFbGVtZW50KHY6IElkIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fJGZvY3VzZWRFbGVtZW50LmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgdGhpcy5fJGZvY3VzZWRFbGVtZW50Lm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBmb2N1c2VkRWxlbWVudCgpIHsgcmV0dXJuIHRoaXMuXyRmb2N1c2VkRWxlbWVudC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRvdmVybGFwcGluZ1Njcm9sbGJhciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9PVkVSTEFQUElOR19TQ1JPTExCQVIpO1xyXG4gIHJlYWRvbmx5ICRvdmVybGFwcGluZ1Njcm9sbGJhciA9IHRoaXMuXyRvdmVybGFwcGluZ1Njcm9sbGJhci5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgb3ZlcmxhcHBpbmdTY3JvbGxiYXIodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRvdmVybGFwcGluZ1Njcm9sbGJhci5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRvdmVybGFwcGluZ1Njcm9sbGJhci5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgb3ZlcmxhcHBpbmdTY3JvbGxiYXIoKSB7IHJldHVybiB0aGlzLl8kb3ZlcmxhcHBpbmdTY3JvbGxiYXIuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kY29udGVudCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcbiAgcmVhZG9ubHkgJGNvbnRlbnQgPSB0aGlzLl8kZm9jdXNlZEVsZW1lbnQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbnRlbnQodjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl8kY29udGVudC5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRjb250ZW50Lm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBjb250ZW50KCkgeyByZXR1cm4gdGhpcy5fJGNvbnRlbnQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kbG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRsb2FkaW5nID0gdGhpcy5fJGxvYWRpbmcuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGxvYWRpbmcodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRsb2FkaW5nLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgdGhpcy5fJGxvYWRpbmcubmV4dCh2KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxvYWRpbmcoKSB7IHJldHVybiB0aGlzLl8kbG9hZGluZy5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRjbGFzc2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtjTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9Pih7fSk7XHJcbiAgcmVhZG9ubHkgJGNsYXNzZXMgPSB0aGlzLl8kY2xhc3Nlcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY2xhc3Nlcyh2OiB7IFtjTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9KSB7XHJcbiAgICBpZiAodGhpcy5fJGNsYXNzZXMuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kY2xhc3Nlcy5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgY2xhc3NlcygpIHsgcmV0dXJuIHRoaXMuXyRjbGFzc2VzLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhck1pblNpemUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oREVGQVVMVF9TQ1JPTExCQVJfTUlOX1NJWkUpO1xyXG4gIHJlYWRvbmx5ICRzY3JvbGxiYXJNaW5TaXplID0gdGhpcy5fJHNjcm9sbGJhck1pblNpemUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNjcm9sbGJhck1pblNpemUodjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fJHNjcm9sbGJhck1pblNpemUuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kc2Nyb2xsYmFyTWluU2l6ZS5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2Nyb2xsYmFyTWluU2l6ZSgpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxiYXJNaW5TaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhclRoaWNrbmVzcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX1NDUk9MTEJBUl9USElDS05FU1MpO1xyXG4gIHJlYWRvbmx5ICRzY3JvbGxiYXJUaGlja25lc3MgPSB0aGlzLl8kc2Nyb2xsYmFyVGhpY2tuZXNzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzY3JvbGxiYXJUaGlja25lc3ModjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fJHNjcm9sbGJhclRoaWNrbmVzcy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzY3JvbGxiYXJUaGlja25lc3MubmV4dCh2KTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IHNjcm9sbGJhclRoaWNrbmVzcygpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxiYXJUaGlja25lc3MuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFyVGh1bWJSZW5kZXJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5ICRzY3JvbGxiYXJUaHVtYlJlbmRlcmVyID0gdGhpcy5fJHNjcm9sbGJhclRodW1iUmVuZGVyZXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNjcm9sbGJhclRodW1iUmVuZGVyZXIodjogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsYmFyVGh1bWJSZW5kZXJlci5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzY3JvbGxiYXJUaHVtYlJlbmRlcmVyLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzY3JvbGxiYXJUaHVtYlJlbmRlcmVyKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGJhclRodW1iUmVuZGVyZXIuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFyVGh1bWJQYXJhbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgW3Byb3BOYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGw+KG51bGwpO1xyXG4gIHJlYWRvbmx5ICRzY3JvbGxiYXJUaHVtYlBhcmFtcyA9IHRoaXMuXyRzY3JvbGxiYXJUaHVtYlBhcmFtcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsYmFyVGh1bWJQYXJhbXModjogeyBbcHJvcE5hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuXyRzY3JvbGxiYXJUaHVtYlBhcmFtcy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRzY3JvbGxiYXJUaHVtYlBhcmFtcy5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2Nyb2xsYmFyVGh1bWJQYXJhbXMoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsYmFyVGh1bWJQYXJhbXMuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kbW90aW9uQmx1ciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgJ2Rpc2FibGVkJz4oREVGQVVMVF9NT1RJT05fQkxVUik7XHJcbiAgcmVhZG9ubHkgJG1vdGlvbkJsdXIgPSB0aGlzLl8kbW90aW9uQmx1ci5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgbW90aW9uQmx1cih2OiBudW1iZXIgfCAnZGlzYWJsZWQnKSB7XHJcbiAgICBpZiAodGhpcy5fJG1vdGlvbkJsdXIuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kbW90aW9uQmx1ci5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbW90aW9uQmx1cigpIHsgcmV0dXJuIHRoaXMuXyRtb3Rpb25CbHVyLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJG1heE1vdGlvbkJsdXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oREVGQVVMVF9NQVhfTU9USU9OX0JMVVIpO1xyXG4gIHJlYWRvbmx5ICRtYXhNb3Rpb25CbHVyID0gdGhpcy5fJG1heE1vdGlvbkJsdXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG1heE1vdGlvbkJsdXIodjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fJG1heE1vdGlvbkJsdXIuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICB0aGlzLl8kbWF4TW90aW9uQmx1ci5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbWF4TW90aW9uQmx1cigpIHsgcmV0dXJuIHRoaXMuXyRtYXhNb3Rpb25CbHVyLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJG1vdGlvbkJsdXJFbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX01PVElPTl9CTFVSX0VOQUJMRUQpO1xyXG4gIHJlYWRvbmx5ICRtb3Rpb25CbHVyRW5hYmxlZCA9IHRoaXMuXyRtb3Rpb25CbHVyRW5hYmxlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgbW90aW9uQmx1ckVuYWJsZWQodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRtb3Rpb25CbHVyRW5hYmxlZC5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuXyRtb3Rpb25CbHVyRW5hYmxlZC5uZXh0KHYpO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbW90aW9uQmx1ckVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl8kbW90aW9uQmx1ckVuYWJsZWQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kYWN0dWFsQ2xhc3NlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBbY05hbWU6IHN0cmluZ106IGJvb2xlYW4gfT4oe30pO1xyXG4gIHJlYWRvbmx5ICRhY3R1YWxDbGFzc2VzID0gdGhpcy5fJGFjdHVhbENsYXNzZXMuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRjb250YWluZXJDbGFzc2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtjTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9Pih7fSk7XHJcbiAgcmVhZG9ubHkgJGNvbnRhaW5lckNsYXNzZXMgPSB0aGlzLl8kY29udGFpbmVyQ2xhc3Nlcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHRodW1iR3JhZGllbnRQb3NpdGlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEdyYWRpZW50Q29sb3JQb3NpdGlvbnM+KFswLCAwXSk7XHJcbiAgcmVhZG9ubHkgJHRodW1iR3JhZGllbnRQb3NpdGlvbnMgPSB0aGlzLl8kdGh1bWJHcmFkaWVudFBvc2l0aW9ucy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHRodW1iU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICByZWFkb25seSAkdGh1bWJTaXplID0gdGhpcy5fJHRodW1iU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHRodW1iQ29sb3JQb3NpdGlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEdyYWRpZW50Q29sb3JQb3NpdGlvbnM+KFswLCAwXSk7XHJcbiAgcmVhZG9ubHkgJHRodW1iQ29sb3JQb3NpdGlvbnMgPSB0aGlzLl8kdGh1bWJDb2xvclBvc2l0aW9ucy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGFjdHVhbFRodW1iU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICByZWFkb25seSAkYWN0dWFsVGh1bWJTaXplID0gdGhpcy5fJGFjdHVhbFRodW1iU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhclNob3cgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICByZWFkb25seSAkc2Nyb2xsYmFyU2hvdyA9IHRoaXMuXyRzY3JvbGxiYXJTaG93LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kc2hvdyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRzaG93ID0gdGhpcy5fJHNob3cuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRwcmVwYXJlZFNpZ25hbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRwcmVwYXJlZFNpZ25hbCA9IHRoaXMuXyRwcmVwYXJlZFNpZ25hbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGxhbmdUZXh0RGlyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZXh0RGlyZWN0aW9uPihUZXh0RGlyZWN0aW9ucy5MVFIpO1xyXG4gIHJlYWRvbmx5ICRsYW5nVGV4dERpciA9IHRoaXMuXyRsYW5nVGV4dERpci5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGxpc3RTdHlsZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgcGVyc3BlY3RpdmVPcmlnaW46IHN0cmluZyB9Pih7IHBlcnNwZWN0aXZlT3JpZ2luOiAnY2VudGVyJyB9KTtcclxuICByZWFkb25seSAkbGlzdFN0eWxlcyA9IHRoaXMuXyRsaXN0U3R5bGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zY3JvbGxCb3ggPSBuZXcgU2Nyb2xsQm94KCk7XHJcblxyXG4gIGdldCBob3N0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsVmlld3BvcnQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFyU2Nyb2xsID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICByZWFkb25seSAkc2Nyb2xsYmFyU2Nyb2xsID0gdGhpcy5fJHNjcm9sbGJhclNjcm9sbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZWQgPSBmYWxzZTtcclxuICBzZXQgcHJlcGFyZWQodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX3ByZXBhcmVkICE9PSB2KSB7XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVkID0gdjtcclxuICAgICAgdGhpcy5fJHByZXBhcmVkU2lnbmFsLm5leHQodik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0WCh4OiBudW1iZXIsIHNuYXA6IGJvb2xlYW4gPSB0cnVlLCBub3JtYWxpemU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICBpZiAoeCAhPT0gdW5kZWZpbmVkICYmICFOdW1iZXIuaXNOYU4oeCkpIHtcclxuICAgICAgdGhpcy51cGRhdGVEaXJlY3Rpb24oeCwgdGhpcy5feCk7XHJcblxyXG4gICAgICB0aGlzLl94ID0gdGhpcy5fYWN0dWFsWCA9IHg7XHJcblxyXG4gICAgICBjb25zdCBvdmVycmlkZGVuID0gbm9ybWFsaXplID8gdGhpcy5ub3JtYWxpemVTY3JvbGxTaXplKCkgOiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcblxyXG4gICAgICBpZiAoIW92ZXJyaWRkZW4pIHtcclxuICAgICAgICB0aGlzLm1lYXN1cmVWZWxvY2l0eSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZVNjcm9sbEJhcigpO1xyXG5cclxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZVBlcnNwZWN0aXZlKCk7XHJcblxyXG4gICAgICBpZiAoc25hcCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJbnRlcnNlY3Rpb25Db21wb25lbnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldFkoeTogbnVtYmVyLCBzbmFwOiBib29sZWFuID0gdHJ1ZSwgbm9ybWFsaXplOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgaWYgKHkgIT09IHVuZGVmaW5lZCAmJiAhTnVtYmVyLmlzTmFOKHkpKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRGlyZWN0aW9uKHksIHRoaXMuX3kpO1xyXG5cclxuICAgICAgdGhpcy5feSA9IHRoaXMuX2FjdHVhbFkgPSB5O1xyXG5cclxuICAgICAgY29uc3Qgb3ZlcnJpZGRlbiA9IG5vcm1hbGl6ZSA/IHRoaXMubm9ybWFsaXplU2Nyb2xsU2l6ZSgpIDogZmFsc2U7XHJcblxyXG4gICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG5cclxuICAgICAgaWYgKCFvdmVycmlkZGVuKSB7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlVmVsb2NpdHkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy51cGRhdGVTY3JvbGxCYXIoKTtcclxuXHJcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVQZXJzcGVjdGl2ZSgpO1xyXG5cclxuICAgICAgaWYgKHNuYXApIHtcclxuICAgICAgICB0aGlzLmNoZWNrSW50ZXJzZWN0aW9uQ29tcG9uZW50KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHNldCBzdGFydExheW91dE9mZnNldCh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9zdGFydExheW91dE9mZnNldCAhPT0gdikge1xyXG4gICAgICB0aGlzLl9zdGFydExheW91dE9mZnNldCA9IHY7XHJcblxyXG4gICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG5cclxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZVBlcnNwZWN0aXZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG92ZXJyaWRlIGdldCBzdGFydExheW91dE9mZnNldCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0OyB9XHJcblxyXG4gIHByaXZhdGUgXyR2aWV3SW5pdGlhbGl6ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICByZWFkb25seSAkdmlld0luaXRpYWxpemVkID0gdGhpcy5fJHZpZXdJbml0aWFsaXplZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNTY3JvbGxiYXJVc2VyQWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ2V0IGlzU2Nyb2xsYmFyVXNlckFjdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1Njcm9sbGJhclVzZXJBY3Rpb247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgXyRyZXNpemVWaWV3cG9ydCA9IG5ldyBTdWJqZWN0PElTaXplPigpO1xyXG4gIHJlYWRvbmx5ICRyZXNpemVWaWV3cG9ydCA9IHRoaXMuXyRyZXNpemVWaWV3cG9ydC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJvdGVjdGVkIF8kcmVzaXplQ29udGVudCA9IG5ldyBTdWJqZWN0PElTaXplPigpO1xyXG4gIHJlYWRvbmx5ICRyZXNpemVDb250ZW50ID0gdGhpcy5fJHJlc2l6ZUNvbnRlbnQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByb3RlY3RlZCBfZmlsdGVySWQ6IHN0cmluZztcclxuXHJcbiAgcHJvdGVjdGVkIF9maWx0ZXI6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuX2ZpbHRlcklkID0gYCR7dGhpcy5fc2VydmljZS5pZH0tJHtNT1RJT05fQkxVUn1gO1xyXG4gICAgdGhpcy5fZmlsdGVyID0gYHVybCgjJHt0aGlzLl9maWx0ZXJJZH0pYDtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG5cclxuICAgIGNvbnN0ICRmaWx0ZXIgPSBvZih0aGlzLmZpbHRlciksXHJcbiAgICAgICRtb3Rpb25CbHVyID0gdGhpcy4kbW90aW9uQmx1cixcclxuICAgICAgJG1heE1vdGlvbkJsdXIgPSB0aGlzLiRtYXhNb3Rpb25CbHVyLFxyXG4gICAgICAkbW90aW9uQmx1ckVuYWJsZWQgPSB0aGlzLiRtb3Rpb25CbHVyRW5hYmxlZCxcclxuICAgICAgJGlzVmVydGljYWwgPSB0aGlzLiRpc1ZlcnRpY2FsO1xyXG5cclxuICAgIGNvbnN0ICRzY3JvbGxiYXJTY3JvbGwgPSB0aGlzLiRzY3JvbGxiYXJTY3JvbGw7XHJcbiAgICAkc2Nyb2xsYmFyU2Nyb2xsLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoNTApLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZHJvcFZlbG9jaXR5KCk7XHJcbiAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQoZmFsc2UpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJGF2ZXJhZ2VWZWxvY2l0eSA9IHRoaXMuJGF2ZXJhZ2VWZWxvY2l0eTtcclxuICAgIGNvbWJpbmVMYXRlc3QoWyRpc1ZlcnRpY2FsLCAkYXZlcmFnZVZlbG9jaXR5LCAkZmlsdGVyLCAkbW90aW9uQmx1ckVuYWJsZWQsICRtb3Rpb25CbHVyLCAkbWF4TW90aW9uQmx1cl0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIoKFssICwgZiwgZSwgbWJdKSA9PiAhIWYgJiYgKCEhZSAmJiBtYiAhPT0gMCkpLFxyXG4gICAgICB0YXAoKFtpc1ZlcnRpY2FsLCB2LCBmaWx0ZXIsICwgbWIsIG1iTWF4XSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IF92ID0gdiAqIChtYiBhcyBudW1iZXIpLCB2YWx1ZSA9IF92ID4gbWJNYXggPyBtYk1heCA6IF92O1xyXG4gICAgICAgIGZpbHRlciEubmF0aXZlRWxlbWVudC5zZXRTdGREZXZpYXRpb24oaXNWZXJ0aWNhbCA/IDAgOiB2ICogdmFsdWUsIGlzVmVydGljYWwgPyB2ICogdmFsdWUgOiAwKTtcclxuICAgICAgfSksXHJcbiAgICAgIGRlYm91bmNlVGltZSg1MCksXHJcbiAgICAgIHRhcCgoWywgLCBmaWx0ZXIsICxdKSA9PiB7XHJcbiAgICAgICAgZmlsdGVyIS5uYXRpdmVFbGVtZW50LnNldFN0ZERldmlhdGlvbigwLCAwKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZpY2UuJGxhbmdUZXh0RGlyLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl8kbGFuZ1RleHREaXIubmV4dCh2KTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHByZXBhcmUgPSB0aGlzLiRwcmVwYXJlZFNpZ25hbDtcclxuICAgICRwcmVwYXJlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsQmFySGFuZGxlcih0cnVlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkc2Nyb2xsYmFyRW5hYmxlZCA9IHRoaXMuJHNjcm9sbGJhckVuYWJsZWQsXHJcbiAgICAgICRzY3JvbGxiYXJTaG93ID0gdGhpcy4kc2Nyb2xsYmFyU2hvdztcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskc2Nyb2xsYmFyRW5hYmxlZCwgJHNjcm9sbGJhclNob3csIHRoaXMuJHByZXBhcmVkU2lnbmFsXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCgoW3Njcm9sbGJhckVuYWJsZWQsIHNjcm9sbGJhclNob3csIHByZXBhcmVkXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRzaG93Lm5leHQoc2Nyb2xsYmFyRW5hYmxlZCAmJiBzY3JvbGxiYXJTaG93ICYmIHByZXBhcmVkKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRzdGFydE9mZnNldCA9IHRoaXMuJHN0YXJ0T2Zmc2V0LFxyXG4gICAgICAkZW5kT2Zmc2V0ID0gdGhpcy4kZW5kT2Zmc2V0LFxyXG4gICAgICAkc2Nyb2xsYmFyTWluU2l6ZSA9IHRoaXMuJHNjcm9sbGJhck1pblNpemUsXHJcbiAgICAgICR0aHVtYlNpemUgPSB0aGlzLiR0aHVtYlNpemU7XHJcblxyXG4gICAgZnJvbShbJGVuZE9mZnNldCwgJHN0YXJ0T2Zmc2V0LCAkdGh1bWJTaXplLCAkc2Nyb2xsYmFyTWluU2l6ZSwgJGlzVmVydGljYWxdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsQmFyKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkdXBkYXRlU2Nyb2xsQmFyID0gdGhpcy4kdXBkYXRlU2Nyb2xsQmFyO1xyXG5cclxuICAgICR1cGRhdGVTY3JvbGxCYXIucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEJhckhhbmRsZXIoIXRoaXMuX2lzU2Nyb2xsYmFyVXNlckFjdGlvbik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRjbGFzc2VzLCB0aGlzLiRkaXJlY3Rpb24sIHRoaXMuJGdyYWJiaW5nLCB0aGlzLiRtb3Rpb25CbHVyRW5hYmxlZF0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgIHRhcCgoW2NsYXNzZXMsIGRpcmVjdGlvbiwgZ3JhYmJpbmcsIGZpbHRlcmVkXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRhY3R1YWxDbGFzc2VzLm5leHQoeyAuLi5jbGFzc2VzLCBbZGlyZWN0aW9uXTogdHJ1ZSwgZ3JhYmJpbmcsIGZpbHRlcmVkIH0pO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy4kY29udGVudEJvdW5kcywgdGhpcy4kdmlld3BvcnRCb3VuZHMsIHRoaXMuJGlzVmVydGljYWwsIHRoaXMuJGRpcmVjdGlvbiwgdGhpcy4kZ3JhYmJpbmcsIHRoaXMuJHNjcm9sbGJhckVuYWJsZWQsIHRoaXMuJG92ZXJsYXBwaW5nU2Nyb2xsYmFyXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKChbY29udGVudEJvdW5kcywgdmlld3BvcnRCb3VuZHMsIGlzVmVydGljYWwsIGRpcmVjdGlvbiwgZ3JhYmJpbmcsIHNjcm9sbGJhckVuYWJsZWQsIG92ZXJsYXBwaW5nU2Nyb2xsYmFyXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGg6IGNvbnRlbnRXaWR0aCwgaGVpZ2h0OiBjb250ZW50SGVpZ2h0IH0gPSBjb250ZW50Qm91bmRzLFxyXG4gICAgICAgICAgeyB3aWR0aCwgaGVpZ2h0IH0gPSB2aWV3cG9ydEJvdW5kcyxcclxuICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCxcclxuICAgICAgICAgIGNvbnRlbnRTaXplID0gaXNWZXJ0aWNhbCA/IGNvbnRlbnRIZWlnaHQgOiBjb250ZW50V2lkdGg7XHJcbiAgICAgICAgdGhpcy5fJGNvbnRhaW5lckNsYXNzZXMubmV4dCh7IFtkaXJlY3Rpb25dOiB0cnVlLCBncmFiYmluZywgZW5hYmxlZDogc2Nyb2xsYmFyRW5hYmxlZCwgc2Nyb2xsYWJsZTogY29udGVudFNpemUgPiB2aWV3cG9ydFNpemUsIG92ZXJsYXBwaW5nOiBvdmVybGFwcGluZ1Njcm9sbGJhciB9KTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuJHZpZXdJbml0aWFsaXplZC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEJhckhhbmRsZXIoKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuJHRodW1iR3JhZGllbnRQb3NpdGlvbnMucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyR0aHVtYkNvbG9yUG9zaXRpb25zLm5leHQodik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiR0aHVtYlNpemUucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRhY3R1YWxUaHVtYlNpemUubmV4dCh2KTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuXyR2aWV3SW5pdGlhbGl6ZWQubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjYWxjdWxhdGVQZXJzcGVjdGl2ZSgpIHtcclxuICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLCBzY3JvbGxTaXplID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCkgLSB0aGlzLl9zdGFydExheW91dE9mZnNldCxcclxuICAgICAgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKTtcclxuICAgIHRoaXMuXyRsaXN0U3R5bGVzLm5leHQoe1xyXG4gICAgICBwZXJzcGVjdGl2ZU9yaWdpbjogYCR7aXNWZXJ0aWNhbCA/IHdpZHRoICogLjUgOiAoc2Nyb2xsU2l6ZSArIHdpZHRoICogLjUpfSR7UFh9ICR7aXNWZXJ0aWNhbCA/IChzY3JvbGxTaXplICsgaGVpZ2h0ICogLjUpIDogaGVpZ2h0ICogLjV9JHtQWH1gXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblJlc2l6ZVZpZXdwb3J0KCkge1xyXG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnNjcm9sbFZpZXdwb3J0Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCEhdmlld3BvcnQpIHtcclxuICAgICAgY29uc3QgYm91bmRzOiBJU2l6ZSA9IHsgd2lkdGg6IHZpZXdwb3J0Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IHZpZXdwb3J0Lm9mZnNldEhlaWdodCB9LCBiID0gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCk7XHJcbiAgICAgIGlmIChib3VuZHMud2lkdGggPT09IGIud2lkdGggJiYgYm91bmRzLmhlaWdodCA9PT0gYi5oZWlnaHQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fJHZpZXdwb3J0Qm91bmRzLm5leHQoYm91bmRzKTtcclxuICAgICAgdGhpcy51cGRhdGVTY3JvbGxCYXIoKTtcclxuICAgICAgdGhpcy5fJHJlc2l6ZVZpZXdwb3J0Lm5leHQoYm91bmRzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblJlc2l6ZUNvbnRlbnQodmFsdWU6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XHJcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5zY3JvbGxDb250ZW50Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCEhY29udGVudCkge1xyXG4gICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSwgYm91bmRzOiBJU2l6ZSA9IHtcclxuICAgICAgICB3aWR0aDogaXNWZXJ0aWNhbCA/IGNvbnRlbnQub2Zmc2V0V2lkdGggOiAodmFsdWUgPz8gY29udGVudC5vZmZzZXRXaWR0aCksXHJcbiAgICAgICAgaGVpZ2h0OiBpc1ZlcnRpY2FsID8gKHZhbHVlID8/IGNvbnRlbnQub2Zmc2V0SGVpZ2h0KSA6IGNvbnRlbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICAgIH0sIGIgPSB0aGlzLl8kY29udGVudEJvdW5kcy5nZXRWYWx1ZSgpO1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgYm91bmRzLndpZHRoID09PSBiLndpZHRoICYmIGJvdW5kcy5oZWlnaHQgPT09IGIuaGVpZ2h0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuXyRjb250ZW50Qm91bmRzLm5leHQoYm91bmRzKTtcclxuICAgICAgdGhpcy51cGRhdGVTY3JvbGxCYXIoKTtcclxuICAgICAgdGhpcy5fJHJlc2l6ZUNvbnRlbnQubmV4dChib3VuZHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxCYXJIYW5kbGVyKHVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLCBibGVuZGluZzogYm9vbGVhbiA9IHRydWUsIGZpcmVVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb24sXHJcbiAgICAgIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLFxyXG4gICAgICB2aWV3cG9ydEJvdW5kcyA9IHRoaXMuXyR2aWV3cG9ydEJvdW5kcy5nZXRWYWx1ZSgpLFxyXG4gICAgICBjb250ZW50Qm91bmRzID0gdGhpcy5fJGNvbnRlbnRCb3VuZHMuZ2V0VmFsdWUoKSxcclxuICAgICAgc3RhcnRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0LFxyXG4gICAgICBlbmRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldCxcclxuICAgICAge1xyXG4gICAgICAgIHRodW1iU2l6ZSxcclxuICAgICAgICB0aHVtYlBvc2l0aW9uLFxyXG4gICAgICAgIHRodW1iR3JhZGllbnRQb3NpdGlvbnMsXHJcbiAgICAgIH0gPSB0aGlzLl9zY3JvbGxCb3guY2FsY3VsYXRlU2Nyb2xsKHtcclxuICAgICAgICBkaXJlY3Rpb24sXHJcbiAgICAgICAgdmlld3BvcnRXaWR0aDogdmlld3BvcnRCb3VuZHMud2lkdGgsXHJcbiAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHZpZXdwb3J0Qm91bmRzLmhlaWdodCxcclxuICAgICAgICBjb250ZW50V2lkdGg6IGNvbnRlbnRCb3VuZHMud2lkdGgsXHJcbiAgICAgICAgY29udGVudEhlaWdodDogY29udGVudEJvdW5kcy5oZWlnaHQsXHJcbiAgICAgICAgc3RhcnRPZmZzZXQsXHJcbiAgICAgICAgZW5kT2Zmc2V0LFxyXG4gICAgICAgIHBvc2l0aW9uWDogdGhpcy5feCxcclxuICAgICAgICBwb3NpdGlvblk6IHRoaXMuX3ksXHJcbiAgICAgICAgbWluU2l6ZTogdGhpcy5zY3JvbGxiYXJNaW5TaXplLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLl8kdGh1bWJHcmFkaWVudFBvc2l0aW9ucy5uZXh0KHRodW1iR3JhZGllbnRQb3NpdGlvbnMpO1xyXG4gICAgdGhpcy5fJHRodW1iU2l6ZS5uZXh0KHRodW1iU2l6ZSk7XHJcbiAgICBjb25zdCBhY3R1YWxUaHVtYlBvc2l0aW9uID0gdGh1bWJQb3NpdGlvbiA8IHN0YXJ0T2Zmc2V0ID8gc3RhcnRPZmZzZXQgOiB0aHVtYlBvc2l0aW9uO1xyXG4gICAgaWYgKHVwZGF0ZSkge1xyXG4gICAgICB0aGlzLnNjcm9sbEJhcj8uc2Nyb2xsKHtcclxuICAgICAgICBbaXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFRodW1iUG9zaXRpb24sIGZpcmVVcGRhdGUsIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5ULFxyXG4gICAgICAgIHVzZXJBY3Rpb246IGZhbHNlLCBibGVuZGluZyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl8kc2Nyb2xsYmFyU2hvdy5uZXh0KHRoaXMuc2Nyb2xsYWJsZSAmJiB0aGlzLnNjcm9sbGJhckVuYWJsZWQpO1xyXG4gIH07XHJcblxyXG4gIG92ZXJyaWRlIHRpY2soKSB7XHJcbiAgICBzdXBlci50aWNrKCk7XHJcblxyXG4gICAgdGhpcy5zY3JvbGxCYXI/LnRpY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2Nyb2xsQmFyKCkge1xyXG4gICAgdGhpcy5fJHVwZGF0ZVNjcm9sbEJhci5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoU2Nyb2xsYmFyKCkge1xyXG4gICAgdGhpcy51cGRhdGVTY3JvbGxCYXJIYW5kbGVyKHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25EcmFnU3RhcnQoKSB7XHJcbiAgICBzdXBlci5vbkRyYWdTdGFydCgpO1xyXG5cclxuICAgIHRoaXMuc3RvcFNjcm9sbGJhcigpO1xyXG5cclxuICAgIHRoaXMuX2lzU2Nyb2xsYmFyVXNlckFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMudXBkYXRlU2Nyb2xsQmFyKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSByZXNldCgpIHtcclxuICAgIHN1cGVyLnJlc2V0KCk7XHJcbiAgICB0aGlzLnRvdGFsU2l6ZSA9IDA7XHJcbiAgICB0aGlzLm9uUmVzaXplQ29udGVudCgwKTtcclxuICAgIHRoaXMuc3RvcFNjcm9sbGJhcigpO1xyXG4gICAgdGhpcy5yZWZyZXNoKHRydWUsIHRydWUpO1xyXG4gICAgdGhpcy5wcmVwYXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaChmaXJlVXBkYXRlOiBib29sZWFuID0gZmFsc2UsIHVwZGF0ZVNjcm9sbGJhcjogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIGlmICh1cGRhdGVTY3JvbGxiYXIpIHtcclxuICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zY3JvbGxMaW1pdHMoKTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG5cclxuICAgIGlmICh1cGRhdGVTY3JvbGxiYXIpIHtcclxuICAgICAgdGhpcy51cGRhdGVTY3JvbGxCYXJIYW5kbGVyKGZhbHNlKTtcclxuICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpcmVVcGRhdGUpIHtcclxuICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc25hcElmTmVlZChhbmltYXRlZCA9IHRydWUpIHtcclxuICAgIHRoaXMuc25hcFdpdGhJbml0aWFsRm9yY2VJZk5lY2Vzc2FyeShudWxsLCBhbmltYXRlZCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNjcm9sbFRvKCkge1xyXG4gICAgdGhpcy5zdG9wU2Nyb2xsYmFyKCk7XHJcbiAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uY2xlYXIoKTtcclxuICAgIHRoaXMuZHJvcFZlbG9jaXR5KCk7XHJcbiAgICB0aGlzLl9pc1Njcm9sbHNUbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBmaW5pc2hlZFNjcm9sbFRvKCkge1xyXG4gICAgdGhpcy5faXNTY3JvbGxzVG8gPSBmYWxzZTtcclxuICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5jbGVhcigpO1xyXG4gICAgdGhpcy5kcm9wVmVsb2NpdHkoKTtcclxuICAgIHRoaXMuY2hlY2tJbnRlcnNlY3Rpb25Db21wb25lbnQoKTtcclxuICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgc2Nyb2xsVG8ocGFyYW1zOiBJU2Nyb2xsVG9QYXJhbXMpIHtcclxuICAgIGNvbnN0IHVzZXJBY3Rpb24gPSBwYXJhbXM/LnVzZXJBY3Rpb24gPz8gdHJ1ZTtcclxuICAgIGlmICh1c2VyQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuX2lzU2Nyb2xsYmFyVXNlckFjdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNjcm9sbEJhcj8uc3RvcFNjcm9sbGluZygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zY3JvbGwoeyAuLi5wYXJhbXMsIHVzZXJBY3Rpb246IHVzZXJBY3Rpb24gfSk7XHJcbiAgfVxyXG5cclxuICBzdG9wU2Nyb2xsYmFyKCkge1xyXG4gICAgaWYgKCEhdGhpcy5zY3JvbGxCYXIpIHtcclxuICAgICAgdGhpcy5zY3JvbGxCYXIuc3RvcFNjcm9sbGluZygpO1xyXG4gICAgICB0aGlzLmFsaWduUG9zaXRpb24oKTtcclxuICAgICAgdGhpcy5kcm9wVmVsb2NpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJvcFZlbG9jaXR5KCkge1xyXG4gICAgdGhpcy5fdmVsb2NpdGllcyA9IFswXTtcclxuICAgIHRoaXMuXyR2ZWxvY2l0eS5uZXh0KDApO1xyXG4gICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KDApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0b3BNb3ZpbmcoKSB7XHJcbiAgICBzdXBlci5zdG9wTW92aW5nKCk7XHJcbiAgICB0aGlzLmRyb3BWZWxvY2l0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uQW5pbWF0aW9uQ29tcGxldGUocG9zaXRpb246IG51bWJlcikge1xyXG4gICAgdGhpcy5kcm9wVmVsb2NpdHkoKTtcclxuICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBvblNjcm9sbEJhckRyYWdIYW5kbGVyKGV2ZW50OiBJU2Nyb2xsQmFyRHJhZ0V2ZW50KSB7XHJcbiAgICBjb25zdCB7IHBvc2l0aW9uLCBtaW4sIG1heCwgdXNlckFjdGlvbiB9ID0gZXZlbnQ7XHJcbiAgICB0aGlzLl9pc1Njcm9sbGJhclVzZXJBY3Rpb24gPSB1c2VyQWN0aW9uO1xyXG4gICAgaWYgKCF1c2VyQWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuXyRzY3JvbGxiYXJTY3JvbGwubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLFxyXG4gICAgICB7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlUG9zaXRpb24sXHJcbiAgICAgIH0gPSB0aGlzLl9zY3JvbGxCb3guZ2V0U2Nyb2xsUG9zaXRpb25CeVNjcm9sbEJhcih7XHJcbiAgICAgICAgc2Nyb2xsU2l6ZTogaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICBwb3NpdGlvbixcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5zY3JvbGxUbyh7XHJcbiAgICAgIFtpc1ZlcnRpY2FsID8gVE9QIDogTEVGVF06IGFic29sdXRlUG9zaXRpb24sIGJlaGF2aW9yOiBJTlNUQU5ULFxyXG4gICAgICBibGVuZGluZzogZmFsc2UsIHVzZXJBY3Rpb246IHRydWUsIGZpcmVVcGRhdGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgdGhpcy5fc2VydmljZS51cGRhdGUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgb25TY3JvbGxCYXJEcmFnRW5kSGFuZGxlcihldmVudDogSVNjcm9sbEJhckRyYWdFdmVudCkge1xyXG4gICAgY29uc3QgeyBwb3NpdGlvbiwgbWluLCBtYXgsIHVzZXJBY3Rpb24gfSA9IGV2ZW50O1xyXG4gICAgdGhpcy5faXNTY3JvbGxiYXJVc2VyQWN0aW9uID0gdXNlckFjdGlvbjtcclxuICAgIGlmICghdXNlckFjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1Njcm9sbGJhclVzZXJBY3Rpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuZHJvcFZlbG9jaXR5KCk7XHJcbiAgICB0aGlzLl9zZXJ2aWNlLnVwZGF0ZShmYWxzZSk7XHJcbiAgICBjb25zdCBpc0VkZ2UgPSB0aGlzLmZpcmVVcGRhdGVJZkVkZ2VzRGV0ZWN0ZWQocG9zaXRpb24sIG1pbiwgbWF4LCB0cnVlLCB0cnVlKTtcclxuICAgIGlmICghaXNFZGdlKSB7XHJcbiAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmNsZWFyKCk7XHJcbiAgICB0aGlzLl8kc2Nyb2xsYmFyU2Nyb2xsLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmZpcmVTY3JvbGxFdmVudCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlyZVVwZGF0ZUlmRWRnZXNEZXRlY3RlZChwb3NpdGlvbjogbnVtYmVyLCBtaW46IG51bWJlciA9IDAsIG1heDogbnVtYmVyID0gMSwgYW5pbWF0aW9uOiBib29sZWFuID0gZmFsc2UsIHVzZXJBY3Rpb246IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHVzZXJBY3Rpb24gJiYgYW5pbWF0aW9uKSB7XHJcbiAgICAgIGlmIChwb3NpdGlvbiA8PSBtaW4pIHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLnNjcm9sbFRvU3RhcnQoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+PSBtYXgpIHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLnNjcm9sbFRvRW5kKCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn0iLCI8ZGl2IGxvY2FsZVNlbnNpdGl2ZSBbbGFuZ1RleHREaXJdPVwiKCRsYW5nVGV4dERpciB8IGFzeW5jKSFcIiBbbGlzdERpcl09XCIoJGRpcmVjdGlvbiB8IGFzeW5jKSFcIiBjbGFzcz1cIm5ndmxfX2NvbnRhaW5lclwiXHJcbiAgICBbbmdDbGFzc109XCIoJGNvbnRhaW5lckNsYXNzZXMgfCBhc3luYykhXCI+XHJcbiAgICA8c3ZnIHBhcnQ9XCJ2aWV3cG9ydFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XHJcbiAgICAgICAgPGZpbHRlciBbaWRdPVwiX2ZpbHRlcklkXCI+XHJcbiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciAjZmlsdGVyPjwvZmVHYXVzc2lhbkJsdXI+XHJcbiAgICAgICAgPC9maWx0ZXI+XHJcbiAgICAgICAgPGZvcmVpZ25PYmplY3QgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGNsYXNzPVwibmd2bF9fdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ndmxfX3Njcm9sbGVyLXdyYXBwZXJcIiBbY2xhc3MuZmlsdGVyZWRdPVwiKCRtb3Rpb25CbHVyRW5hYmxlZCB8IGFzeW5jKSFcIiBbc3R5bGUuZmlsdGVyXT1cIigkbW90aW9uQmx1ckVuYWJsZWQgfCBhc3luYykhID8gX2ZpbHRlciA6ICd1bnNldCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2RrU2Nyb2xsYWJsZSAjc2Nyb2xsVmlld3BvcnQgcGFydD1cInNjcm9sbGVyXCIgY2xhc3M9XCJuZ3ZsX19zY3JvbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgI3Njcm9sbENvbnRlbnQgW2F0dHIuYXJpYS1vcmllbnRhdGlvbl09XCIoJGRpcmVjdGlvbiB8IGFzeW5jKSFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiJGZvY3VzZWRFbGVtZW50IHwgYXN5bmNcIiB0YWJpbmRleD1cIjBcIiBwYXJ0PVwibGlzdFwiIGNsYXNzPVwibmd2bF9fbGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIigkYWN0dWFsQ2xhc3NlcyB8IGFzeW5jKSFcIiBbbmdTdHlsZV09XCIoJGxpc3RTdHlsZXMgfCBhc3luYykhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICA8L3N2Zz5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoJHNjcm9sbGJhckVuYWJsZWQgfCBhc3luYykhXCI+XHJcbiAgICAgICAgPG5nLXNjcm9sbC1iYXIgI3Njcm9sbEJhciBbZGlyZWN0aW9uXT1cIigkZGlyZWN0aW9uIHwgYXN5bmMpIVwiIFtzaXplXT1cIigkYWN0dWFsVGh1bWJTaXplIHwgYXN5bmMpIVwiIFtyZW5kZXJlcl09XCIoJHNjcm9sbGJhclRodW1iUmVuZGVyZXIgfCBhc3luYykhXCJcclxuICAgICAgICAgICAgW3RoaWNrbmVzc109XCIoJHNjcm9sbGJhclRoaWNrbmVzcyB8IGFzeW5jKSFcIiBbcGFyYW1zXT1cIigkc2Nyb2xsYmFyVGh1bWJQYXJhbXMgfCBhc3luYykhXCIgW2xvYWRpbmddPVwiKCRsb2FkaW5nIHwgYXN5bmMpIVwiIFtvdmVybGFwcGluZ109XCIoJG92ZXJsYXBwaW5nU2Nyb2xsYmFyIHwgYXN5bmMpIVwiXHJcbiAgICAgICAgICAgIFt0aHVtYkdyYWRpZW50UG9zaXRpb25zXT1cIigkdGh1bWJDb2xvclBvc2l0aW9ucyB8IGFzeW5jKSFcIiBbcHJlcGFyZWRdPVwiKCRwcmVwYXJlZFNpZ25hbCB8IGFzeW5jKSFcIiBbaW50ZXJhY3RpdmVdPVwiKCRzY3JvbGxiYXJJbnRlcmFjdGl2ZSB8IGFzeW5jKSFcIlxyXG4gICAgICAgICAgICBbc2hvd109XCIoJHNob3cgfCBhc3luYykhXCIgW3N0YXJ0T2Zmc2V0XT1cIigkc3RhcnRPZmZzZXQgfCBhc3luYykhXCIgW2xhbmdUZXh0RGlyXT1cIigkbGFuZ1RleHREaXIgfCBhc3luYykhXCJcclxuICAgICAgICAgICAgW2VuZE9mZnNldF09XCIoJGVuZE9mZnNldCB8IGFzeW5jKSFcIiBbb3ZlcnNjcm9sbEVuYWJsZWRdPVwiKCRvdmVyc2Nyb2xsRW5hYmxlZCB8IGFzeW5jKSFcIiBbc2Nyb2xsQmVoYXZpb3JdPVwiKCRzY3JvbGxCZWhhdmlvciB8IGFzeW5jKSFcIlxyXG4gICAgICAgICAgICBbc2Nyb2xsYmFyTWluU2l6ZV09XCIoJHNjcm9sbGJhck1pblNpemUgfCBhc3luYykhXCIgKG9uRHJhZyk9XCJvblNjcm9sbEJhckRyYWdIYW5kbGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25EcmFnRW5kKT1cIm9uU2Nyb2xsQmFyRHJhZ0VuZEhhbmRsZXIoJGV2ZW50KVwiPjwvbmctc2Nyb2xsLWJhcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj4iXX0=
|