From 26c756c31e206340c6ab1084fd483ca2951663a8 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Mon, 26 Sep 2022 11:52:42 -0400 Subject: [PATCH 01/85] add mobile animation button --- .../timeline-controls/animation-button.js | 65 +++++++++++-------- web/js/containers/timeline/timeline.js | 34 +++++++++- web/scss/features/timeline.scss | 19 ++++++ 3 files changed, 91 insertions(+), 27 deletions(-) diff --git a/web/js/components/timeline/timeline-controls/animation-button.js b/web/js/components/timeline/timeline-controls/animation-button.js index 64cc2e98e8..be45c15b0b 100644 --- a/web/js/components/timeline/timeline-controls/animation-button.js +++ b/web/js/components/timeline/timeline-controls/animation-button.js @@ -1,38 +1,51 @@ -import React, { PureComponent } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { UncontrolledTooltip } from 'reactstrap'; -class AnimationButton extends PureComponent { - render() { - const className = 'button-action-group animate-button'; - const { disabled, label, clickAnimationButton } = this.props; - const buttonId = 'animate-button'; - const labelText = label || 'Set up animation'; - return ( -
-
- - {labelText} - - -
+const AnimationButton = (props) => { + const { + disabled, + label, + clickAnimationButton, + isMobile, + breakpoints, + screenWidth, + } = props; + + const buttonId = 'animate-button'; + const labelText = label || 'Set up animation'; + const className = isMobile && screenWidth < breakpoints.small ? 'button-action-group mobile-animate-button animate-button-phone' + : isMobile && screenWidth > breakpoints.small ? 'button-action-group mobile-animate-button animate-button-tablet' + : 'button-action-group animate-button'; + + return ( +
+
+ + {labelText} + +
- ); - } -} +
+ ); +}; AnimationButton.propTypes = { + breakpoints: PropTypes.object, clickAnimationButton: PropTypes.func, disabled: PropTypes.bool, + isMobile: PropTypes.bool, label: PropTypes.string, + screenWidth: PropTypes.number, + }; -export default AnimationButton; +export default React.memo(AnimationButton); diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index ee784f1456..81695c8a1b 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -920,7 +920,16 @@ class Timeline extends React.Component { renderMobile() { const { - isMobile, timelineStartDateLimit, timelineEndDateLimit, hasSubdailyLayers, selectedDate, + animationDisabled, + breakpoints, + hasSubdailyLayers, + isCompareModeActive, + isDataDownload, + isMobile, + screenWidth, + selectedDate, + timelineEndDateLimit, + timelineStartDateLimit, } = this.props; return (
@@ -941,6 +950,22 @@ class Timeline extends React.Component { {this.renderDateChangeArrows()}
+
+ +
); } @@ -953,6 +978,7 @@ class Timeline extends React.Component { animStartLocationDate, appNow, axisWidth, + breakpoints, dateA, dateB, draggerSelected, @@ -969,6 +995,7 @@ class Timeline extends React.Component { isMobile, isTourActive, parentOffset, + screenWidth, selectedDate, timelineCustomModalOpen, timelineEndDateLimit, @@ -1070,6 +1097,8 @@ class Timeline extends React.Component { Date: Mon, 26 Sep 2022 13:28:37 -0400 Subject: [PATCH 02/85] full screen modal for mobile view --- web/js/app.js | 3 +- web/js/containers/animation-widget.js | 103 +++++++++++++++++++++++++- web/scss/features/anim-widget.scss | 39 ++++++++++ 3 files changed, 143 insertions(+), 2 deletions(-) diff --git a/web/js/app.js b/web/js/app.js index 94b5861a6c..06e939eb00 100644 --- a/web/js/app.js +++ b/web/js/app.js @@ -136,6 +136,7 @@ class App extends React.Component { parameters, } = this.props; const appClass = `wv-content ${isEmbedModeActive ? 'embed-mode' : ''}`; + const animationID = isMobile ? 'wv-animation-widget-case-mobile' : 'wv-animation-widget-case'; return (
{!isMobile && !isEmbedModeActive && } @@ -153,7 +154,7 @@ class App extends React.Component {
-
+
{isAnimationWidgetActive ? : null}
diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index a9dfe7e8b8..d90b75cd07 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -324,6 +324,107 @@ class AnimationWidget extends React.Component { ); } + renderMobileWidget() { + const { + onClose, + looping, + isPlaying, + maxDate, + minDate, + onSlide, + sliderLabel, + startDate, + endDate, + onPushPause, + subDailyMode, + interval, + animationCustomModalOpen, + hasSubdailyLayers, + playDisabled, + numberOfFrames, + } = this.props; + const { speed } = this.state; + const cancelSelector = '.no-drag, .date-arrows'; + + return ( +
+
+
+
+ {'Animate Map in '} + + {' Increments'} +
+ + {/* Custom time interval selection */} + + + + + + {/* FPS slider */} +
+ this.setState({ speed: num })} + handle={RangeHandle} + onAfterChange={() => { onSlide(speed); }} + disabled={isPlaying} + /> + {sliderLabel} +
+ + {/* Create Gif */} + + + {/* From/To Date/Time Selection */} + + + + + +
+
+
+ ); + } + renderExpandedWidget() { const { onClose, @@ -474,7 +575,7 @@ class AnimationWidget extends React.Component { )} {!isDistractionFreeModeActive && ( <> - {collapsed || isMobile ? this.renderCollapsedWidget() : this.renderExpandedWidget()} + {collapsed ? this.renderCollapsedWidget() : isMobile ? this.renderMobileWidget() : this.renderExpandedWidget()} )} diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index c0f20785b6..9dc5fde330 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -357,3 +357,42 @@ a .wv-animation-widget-icon { display: inline; position: relative; } + +#wv-animation-widget-case-mobile{ + + width: 100%; + height: 100%; +} + +.wv-animation-widget-wrapper-mobile { + position: absolute; + z-index: 100; + width: 100%; + height: 100%; + + & .wv-animation-widget { + margin: 0; + width: 100%; + height: 100%; + + & .wv-minimize { + width: 2em; + height: 3em; + margin-right: 3em; + } + + & .wv-close { + width: 2em; + height: 3em; + margin-left: 3em; + } + } + + & .wv-animation-widget-header { + margin-top: 50px; + width: 100%; + font-size: 22px; + } + +} + From aa4836ae4b6b63374b749d96bf56390c9deb76ba Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Mon, 26 Sep 2022 16:31:45 -0400 Subject: [PATCH 03/85] customize date range selector --- web/js/app.js | 3 +- .../date-selector/date-range-selector.js | 85 +++++++++++++------ web/js/containers/animation-widget.js | 3 +- web/scss/features/anim-widget.scss | 41 +++++++-- 4 files changed, 99 insertions(+), 33 deletions(-) diff --git a/web/js/app.js b/web/js/app.js index 06e939eb00..a772f778d2 100644 --- a/web/js/app.js +++ b/web/js/app.js @@ -136,7 +136,6 @@ class App extends React.Component { parameters, } = this.props; const appClass = `wv-content ${isEmbedModeActive ? 'embed-mode' : ''}`; - const animationID = isMobile ? 'wv-animation-widget-case-mobile' : 'wv-animation-widget-case'; return (
{!isMobile && !isEmbedModeActive && } @@ -154,7 +153,7 @@ class App extends React.Component {
-
+
{isAnimationWidgetActive ? : null}
diff --git a/web/js/components/date-selector/date-range-selector.js b/web/js/components/date-selector/date-range-selector.js index 91b3164dd5..764025860b 100644 --- a/web/js/components/date-selector/date-range-selector.js +++ b/web/js/components/date-selector/date-range-selector.js @@ -4,7 +4,7 @@ import DateSelector from './date-selector'; export default function DateRangeSelector (props) { const { - startDate, endDate, setDateRange, minDate, maxDate, subDailyMode, idSuffix, isDisabled, + startDate, endDate, setDateRange, minDate, maxDate, subDailyMode, idSuffix, isDisabled, mobileStyle, } = props; const setStartDate = (newStart) => { @@ -18,29 +18,65 @@ export default function DateRangeSelector (props) { : 'wv-date-range-selector'; return ( -
- -
to
- -
+ mobileStyle ? ( +
+
+
+ Start Date: +
+ +
+
+
+ End Date: +
+ +
+
+ ) + : ( +
+ +
to
+ +
+ ) ); } @@ -52,5 +88,6 @@ DateRangeSelector.propTypes = { setDateRange: PropTypes.func, minDate: PropTypes.object, maxDate: PropTypes.object, + mobileStyle: PropTypes.bool, subDailyMode: PropTypes.bool, }; diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index d90b75cd07..05c87fc22c 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -345,6 +345,7 @@ class AnimationWidget extends React.Component { } = this.props; const { speed } = this.state; const cancelSelector = '.no-drag, .date-arrows'; + const mobileDateSelectorStyle = true; return (
- diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index 9dc5fde330..ed730c8af0 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -358,12 +358,6 @@ a .wv-animation-widget-icon { position: relative; } -#wv-animation-widget-case-mobile{ - - width: 100%; - height: 100%; -} - .wv-animation-widget-wrapper-mobile { position: absolute; z-index: 100; @@ -386,6 +380,41 @@ a .wv-animation-widget-icon { height: 3em; margin-left: 3em; } + + & #animation-mobile-datepicker-case { + display: flex; + justify-content: space-between; + } + & .wv-date-range-selector { + margin-top: 40px; + } + & .date-selector-row { + display: flex; + justify-content: space-evenly; + align-items: center; + margin-top: 40px; + + & .date-selector-col { + font-size: 18px; + } + + & .wv-date-selector-widget { + position: relative; + top: 0px; + } + + & .input-wrapper { + margin-right: 20px; + margin-left: 20px; + } + + & .button-input-group { + font-size: 18px !important; + } + + } + + } & .wv-animation-widget-header { From e1c3e9035ba6ebe29bb659bf8a27c9734a851ce5 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Mon, 26 Sep 2022 20:31:17 -0400 Subject: [PATCH 04/85] mobile animation menu options --- web/js/containers/animation-widget.js | 133 +++++++++++++++----------- web/scss/features/anim-widget.scss | 49 ++++++++-- 2 files changed, 122 insertions(+), 60 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 05c87fc22c..9fd5480fd8 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -359,64 +359,89 @@ class AnimationWidget extends React.Component { className={`wv-animation-widget${subDailyMode ? ' subdaily' : ''}`} >
- {'Animate Map in '} - - {' Increments'} + Map Animation
- {/* Custom time interval selection */} - - - - - - {/* FPS slider */} -
- this.setState({ speed: num })} - handle={RangeHandle} - onAfterChange={() => { onSlide(speed); }} - disabled={isPlaying} +
+
+
+ + Play Animation: + + +
+
+ + Loop Animation: + + +
+
+ + Create GIF: + + +
+
+ + Increments: + + + + {/* Custom time interval selection */} + + +
+
+ + + +
+
+ this.setState({ speed: num })} + handle={RangeHandle} + onAfterChange={() => { onSlide(speed); }} + disabled={isPlaying} + /> + {sliderLabel} +
+
+ + {/* From/To Date/Time Selection */} + - {sliderLabel}
- - {/* Create Gif */} - - - {/* From/To Date/Time Selection */} - diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index ed730c8af0..003c81155c 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -363,12 +363,47 @@ a .wv-animation-widget-icon { z-index: 100; width: 100%; height: 100%; + border: 8px solid $wv-orange; & .wv-animation-widget { margin: 0; width: 100%; height: 100%; + & .mobile-animation-widget-container { + margin: 0; + width: 100%; + height: 90%; + } + + & .mobile-animation-widget-button-items { + width: 75%; + margin: auto; + + & .mobile-animation-widget-row { + justify-content: space-between; + } + } + + & .mobile-animation-widget-row { + display: flex; + justify-content: center; + align-items: center; + margin-top: 40px; + width: 100%; + + span{ + font-size: 22px; + margin-right: 40px; + } + + .wv-icon-case { + height: 45px; + width: 52px; + } + + } + & .wv-minimize { width: 2em; height: 3em; @@ -381,6 +416,10 @@ a .wv-animation-widget-icon { margin-left: 3em; } + & .rc-slider { + margin: auto; + } + & #animation-mobile-datepicker-case { display: flex; justify-content: space-between; @@ -395,7 +434,7 @@ a .wv-animation-widget-icon { margin-top: 40px; & .date-selector-col { - font-size: 18px; + font-size: 22px; } & .wv-date-selector-widget { @@ -411,16 +450,14 @@ a .wv-animation-widget-icon { & .button-input-group { font-size: 18px !important; } - } - - } & .wv-animation-widget-header { - margin-top: 50px; + margin-top: 70px; width: 100%; - font-size: 22px; + font-size: 30px; + color: $wv-orange; } } From 50d4cf4abfc4858d5100fea436483e4ae2cf1778 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Tue, 27 Sep 2022 11:34:37 -0400 Subject: [PATCH 05/85] initial mobile-timescale-interval-change component --- .../mobile-timescale-interval-change.js | 124 ++++++++++++++++++ web/js/containers/animation-widget.js | 37 ++---- web/scss/features/anim-widget.scss | 32 +++-- 3 files changed, 159 insertions(+), 34 deletions(-) create mode 100644 web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js diff --git a/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js b/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js new file mode 100644 index 0000000000..b3d3740b23 --- /dev/null +++ b/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js @@ -0,0 +1,124 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { + Dropdown, DropdownToggle, DropdownMenu, DropdownItem, +} from 'reactstrap'; +import { + TIME_SCALE_TO_NUMBER, + TIME_SCALE_FROM_NUMBER, +} from '../../../modules/date/constants'; +import { + toggleCustomModal as toggleCustomModalAction, + selectInterval as selectIntervalAction, +} from '../../../modules/date/actions'; + +const MobileTimeScaleIntervalChange = (props) => { + const { + customDelta, + customInterval, + timeScaleChangeUnit, + customSelected, + selectInterval, + hasSubdailyLayers, + } = props; + + const [dropdownOpen, setDropdownOpen] = useState(false); + + const toggle = () => setDropdownOpen((prevState) => !prevState); + + const handleClickInterval = (timescale) => { + // send props function to change timescale interval throughout app + setTimeScaleIntervalChangeUnit(timescale); + }; + + const setTimeScaleIntervalChangeUnit = (timeScale) => { + const customSelected = timeScale === 'custom'; + let delta; + let newTimeScale = timeScale; + + if (customSelected && customInterval && customDelta) { + newTimeScale = customInterval; + delta = customDelta; + } else { + newTimeScale = Number(TIME_SCALE_TO_NUMBER[newTimeScale]); + delta = 1; + } + selectInterval(delta, newTimeScale, customSelected); + }; + + const setCustomIntervalText = () => { + const { customDelta, customInterval } = this.props; + this.setState({ + customIntervalText: `${customDelta} ${TIME_SCALE_FROM_NUMBER[customInterval]}`, + }); + }; + + const resetCustomIntervalText = () => { + this.setState({ + customIntervalText: 'Custom', + }); + }; + + return ( +
+ + + Increments + + + + handleClickInterval('year')}> + Year + + + + handleClickInterval('month')}> + Month + + + + handleClickInterval('day')}> + Day + + + + +
+ ); +}; + +const mapDispatchToProps = (dispatch) => ({ + selectInterval: (delta, timeScale, customSelected) => { + dispatch(selectIntervalAction(delta, timeScale, customSelected)); + }, +}); + +const mapStateToProps = (state) => { + const { date } = state; + const { + interval, customInterval, customDelta, customSelected, + } = date; + return { + interval, + customInterval, + customDelta, + customSelected, + }; +}; + +MobileTimeScaleIntervalChange.propTypes = { + customDelta: PropTypes.number, + customInterval: PropTypes.number, + customSelected: PropTypes.bool, + hasSubdailyLayers: PropTypes.bool, + interval: PropTypes.number, + isDisabled: PropTypes.bool, + selectInterval: PropTypes.func, + timeScaleChangeUnit: PropTypes.string, +}; + +export default connect( + mapStateToProps, + mapDispatchToProps, +)(MobileTimeScaleIntervalChange); diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 9fd5480fd8..263da4044f 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -14,6 +14,7 @@ import DateRangeSelector from '../components/date-selector/date-range-selector'; import LoopButton from '../components/animation-widget/loop-button'; import PlayButton from '../components/animation-widget/play-button'; import TimeScaleIntervalChange from '../components/timeline/timeline-controls/timescale-interval-change'; +import MobileTimeScaleIntervalChange from '../components/timeline/timeline-controls/mobile-timescale-interval-change'; import CustomIntervalSelector from '../components/timeline/custom-interval-selector/custom-interval-selector'; import PlayQueue from '../components/animation-widget/play-queue'; import { promiseImageryForTime } from '../modules/map/util'; @@ -326,7 +327,6 @@ class AnimationWidget extends React.Component { renderMobileWidget() { const { - onClose, looping, isPlaying, maxDate, @@ -364,32 +364,12 @@ class AnimationWidget extends React.Component {
-
- - Play Animation: - - -
Loop Animation:
-
- - Create GIF: - - -
Increments: @@ -406,12 +386,19 @@ class AnimationWidget extends React.Component { modalOpen={animationCustomModalOpen} hasSubdailyLayers={hasSubdailyLayers} /> - +
+
+ + Increments2: + +
- -
- -
diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index 003c81155c..749b09e1ab 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -407,13 +407,6 @@ a .wv-animation-widget-icon { & .wv-minimize { width: 2em; height: 3em; - margin-right: 3em; - } - - & .wv-close { - width: 2em; - height: 3em; - margin-left: 3em; } & .rc-slider { @@ -458,7 +451,30 @@ a .wv-animation-widget-icon { width: 100%; font-size: 30px; color: $wv-orange; + border-radius: 4px; } - } + +.mobile-timescale-dropdown { + & .dropdown-toggle { + font-size: 18px; + background-color: #295f92; + } + & .dropdown-menu { + // left: -20px !important; + background-color: $wv-solid-black; + border: solid 1px $wv-orange; + + } + & .dropdown-item { + text-align: center; + margin-top: 10px; + } + & span { + text-align: center; + color: white; + width: 100%; + margin: 0 !important; + } +} From fe9a52d88221317fbad9f51a80aba8dfe7152d82 Mon Sep 17 00:00:00 2001 From: Jason Kent Date: Tue, 27 Sep 2022 10:08:21 -0600 Subject: [PATCH 06/85] WV-2450 * Constants for CRS codes * Safety check for non-existant proj in measurement * Better request reducer error handling --- .../components/context-menu/context-menu.js | 7 ++--- web/js/components/dateline/datelines.js | 5 ++-- .../image-download/lat-long-inputs.js | 4 +-- .../location-search/ol-coordinates-marker.js | 3 ++- web/js/components/map/ol-coordinates.js | 5 ++-- web/js/components/map/ol-measure-tool.js | 9 ++++--- .../measure-tool/measure-tooltip.js | 11 ++++---- web/js/components/measure-tool/util.js | 12 ++++----- web/js/components/sidebar/events-filter.js | 3 ++- web/js/containers/gif.js | 5 ++-- web/js/containers/image-download.js | 11 ++++---- .../ol-vector-interactions.js | 6 ++--- web/js/containers/sidebar/smart-handoff.js | 5 ++-- web/js/map/granule/granule-layer-builder.js | 4 +-- web/js/map/granule/util.js | 7 ++--- web/js/map/natural-events/event-markers.js | 7 ++--- web/js/map/natural-events/event-track.js | 6 ++--- web/js/map/natural-events/natural-events.js | 5 ++-- web/js/map/natural-events/util.js | 5 ++-- web/js/modules/core/actions.js | 26 +++++++++---------- web/js/modules/image-download/util.js | 5 ++-- web/js/modules/location-search/util.js | 10 +++---- web/js/modules/map/constants.js | 7 +++++ web/js/modules/measure/reducers.js | 20 +++++++++----- web/js/modules/natural-events/actions.js | 16 +++++++----- web/js/modules/natural-events/util.js | 11 ++++---- 26 files changed, 123 insertions(+), 92 deletions(-) diff --git a/web/js/components/context-menu/context-menu.js b/web/js/components/context-menu/context-menu.js index 9b1caba1d3..e55b45b23c 100644 --- a/web/js/components/context-menu/context-menu.js +++ b/web/js/components/context-menu/context-menu.js @@ -13,6 +13,7 @@ import { changeUnits } from '../../modules/measure/actions'; import { getFormattedCoordinates, getNormalizedCoordinate } from '../location-search/util'; import { areCoordinatesWithinExtent } from '../../modules/location-search/util'; import { CONTEXT_MENU_LOCATION, MAP_SINGLE_CLICK, MAP_CONTEXT_MENU } from '../../util/constants'; +import { CRS } from '../../modules/map/constants'; const { events } = util; @@ -25,14 +26,14 @@ function RightClickMenu(props) { map, proj, unitOfMeasure, onToggleUnits, isCoordinateSearchActive, allMeasurements, measurementIsActive, isMobile, } = props; const { crs } = proj.selected; - const measurementsInProj = !!Object.keys(allMeasurements[crs]).length; + const measurementsInProj = !!(Object.keys(allMeasurements[crs]) || []).length; const handleClick = () => (show ? setShow(false) : null); function handleContextEvent(event) { if (measurementIsActive) return; event.originalEvent.preventDefault(); const coord = map.getCoordinateFromPixel(event.pixel); - const tCoord = transform(coord, crs, 'EPSG:4326'); + const tCoord = transform(coord, crs, CRS.GEOGRAPHIC); const [lon, lat] = getNormalizedCoordinate(tCoord); if (areCoordinatesWithinExtent(proj, [lon, lat])) { @@ -86,7 +87,7 @@ function RightClickMenu(props) { }; }); - const mobileStyle = isMobile && 'react-contextmenu-mobile'; + const mobileStyle = isMobile ? 'react-contextmenu-mobile' : ''; return show && (
diff --git a/web/js/components/dateline/datelines.js b/web/js/components/dateline/datelines.js index bde62a2e1d..28f8b26a2a 100644 --- a/web/js/components/dateline/datelines.js +++ b/web/js/components/dateline/datelines.js @@ -5,6 +5,7 @@ import PropTypes from 'prop-types'; import Line from './line'; import util from '../../util/util'; import { getSelectedDate } from '../../modules/date/selectors'; +import { CRS } from '../../modules/map/constants'; function DateLines(props) { const { @@ -53,7 +54,7 @@ function DateLines(props) { }; useEffect(() => { - if (!proj.selected.crs === 'EPSG:4326') { + if (!proj.selected.crs === CRS.GEOGRAPHIC) { setHideLines(true); } }, [proj]); @@ -111,7 +112,7 @@ const mapStateToProps = (state) => { proj, map, compare, settings, modal, } = state; const isImageDownload = modal.id === 'TOOLBAR_SNAPSHOT' && modal.isOpen; - const isGeographic = proj.selected.crs === 'EPSG:4326'; + const isGeographic = proj.selected.crs === CRS.GEOGRAPHIC; return { proj, map: map.ui.selected, diff --git a/web/js/components/image-download/lat-long-inputs.js b/web/js/components/image-download/lat-long-inputs.js index c8694b7532..daf7861621 100644 --- a/web/js/components/image-download/lat-long-inputs.js +++ b/web/js/components/image-download/lat-long-inputs.js @@ -6,7 +6,7 @@ import { import { containsExtent, isEmpty } from 'ol/extent'; import PropTypes from 'prop-types'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; - +import { CRS } from '../../modules/map/constants'; const isValidExtent = (extent) => { if (extent.length !== 4) return false; @@ -29,7 +29,7 @@ const Input = ({ const newInputValue = Number(inputValue); const newArray = lodashClone(boundingBoxArray); newArray[index] = newInputValue; - const crsCorrectedExtent = olProj.transformExtent(newArray, 'EPSG:4326', crs); + const crsCorrectedExtent = olProj.transformExtent(newArray, CRS.GEOGRAPHIC, crs); if (containsExtent(viewExtent, crsCorrectedExtent) && isValidExtent(newArray) diff --git a/web/js/components/location-search/ol-coordinates-marker.js b/web/js/components/location-search/ol-coordinates-marker.js index 2faec37b56..964b119bc2 100644 --- a/web/js/components/location-search/ol-coordinates-marker.js +++ b/web/js/components/location-search/ol-coordinates-marker.js @@ -11,6 +11,7 @@ import { areCoordinatesWithinExtent } from '../../modules/location-search/util'; import { reverseGeocode } from '../../modules/location-search/util-api'; import util from '../../util/util'; import { MAP_SINGLE_CLICK, MAP_CONTEXT_MENU, CONTEXT_MENU_LOCATION } from '../../util/constants'; +import { CRS } from '../../modules/map/constants'; const { events } = util; @@ -62,7 +63,7 @@ export class CoordinatesMarker extends Component { // handle reverse geocoding mouse click const pixels = e.pixel; const coord = map.getCoordinateFromPixel(pixels); - const tCoord = transform(coord, crs, 'EPSG:4326'); + const tCoord = transform(coord, crs, CRS.GEOGRAPHIC); const [lon, lat] = getNormalizedCoordinate(tCoord); if (!areCoordinatesWithinExtent(proj, [lon, lat])) { diff --git a/web/js/components/map/ol-coordinates.js b/web/js/components/map/ol-coordinates.js index 5123b131c8..e148214b26 100644 --- a/web/js/components/map/ol-coordinates.js +++ b/web/js/components/map/ol-coordinates.js @@ -11,6 +11,7 @@ import util from '../../util/util'; import { getNormalizedCoordinate } from '../location-search/util'; import { changeCoordinateFormat } from '../../modules/settings/actions'; import { MAP_MOUSE_MOVE, MAP_MOUSE_OUT } from '../../util/constants'; +import { CRS } from '../../modules/map/constants'; const { events } = util; const getContainerWidth = (format) => { @@ -65,7 +66,7 @@ class OlCoordinates extends React.Component { this.clearCoord(); return; } - let pcoord = transform(coord, crs, 'EPSG:4326'); + let pcoord = transform(coord, crs, CRS.GEOGRAPHIC); // eslint-disable-next-line prefer-const let [lon, lat] = pcoord; if (Math.abs(lat) > 90) { @@ -73,7 +74,7 @@ class OlCoordinates extends React.Component { return; } if (Math.abs(lon) > 180) { - if (crs === 'EPSG:4326' && Math.abs(lon) < 250) { + if (crs === CRS.GEOGRAPHIC && Math.abs(lon) < 250) { pcoord = getNormalizedCoordinate([lon, lat]); } else { this.clearCoord(); diff --git a/web/js/components/map/ol-measure-tool.js b/web/js/components/map/ol-measure-tool.js index c787be4571..935692bd43 100644 --- a/web/js/components/map/ol-measure-tool.js +++ b/web/js/components/map/ol-measure-tool.js @@ -39,6 +39,7 @@ import { MAP_ENABLE_CLICK_ZOOM, } from '../../util/constants'; import { areCoordinatesWithinExtent } from '../../modules/location-search/util'; +import { CRS } from '../../modules/map/constants'; const { events } = util; @@ -75,9 +76,9 @@ function OlMeasureTool (props) { useEffect(() => { if (olMap != null) { const regionFromCrs = { - 'EPSG:4326': 'geographic', - 'EPSG:3413': 'arctic', - 'EPSG:3031': 'antarctic', + [CRS.GEOGRAPHIC]: 'geographic', + [CRS.ARCTIC]: 'arctic', + [CRS.ANTARCTIC]: 'antarctic', }; const geographyToTerminate = regionFromCrs[previousCrs]; @@ -266,7 +267,7 @@ function OlMeasureTool (props) { condition(e) { const pixel = [e.originalEvent.x, e.originalEvent.y]; const coord = olMap.getCoordinateFromPixel(pixel); - const tCoord = transform(coord, crs, 'EPSG:4326'); + const tCoord = transform(coord, crs, CRS.GEOGRAPHIC); return areCoordinatesWithinExtent(proj, tCoord); }, }); diff --git a/web/js/components/measure-tool/measure-tooltip.js b/web/js/components/measure-tool/measure-tooltip.js index a09763697d..d16dadc3f0 100644 --- a/web/js/components/measure-tool/measure-tooltip.js +++ b/web/js/components/measure-tool/measure-tooltip.js @@ -13,8 +13,9 @@ import { getGeographicLibDistance, getGeographicLibArea, } from './util'; +import { CRS } from '../../modules/map/constants'; + -const geographicProj = 'EPSG:4326'; const metersPerKilometer = 1000; const ftPerMile = 5280; const sqFtPerSqMile = 27878400; @@ -58,7 +59,7 @@ export default function MeasureTooltip(props) { * @return {String} - The formatted distance measurement */ const getFormattedLength = () => { - const transformedLine = geometry.clone().transform(crs, geographicProj); + const transformedLine = geometry.clone().transform(crs, CRS.GEOGRAPHIC); const metricLength = getGeographicLibDistance(transformedLine); if (unitOfMeasure === 'km') { return metricLength > 100 @@ -77,7 +78,7 @@ export default function MeasureTooltip(props) { * @return {String} - The formatted area measurement */ const getFormattedArea = () => { - const transformedPoly = geometry.clone().transform(crs, geographicProj); + const transformedPoly = geometry.clone().transform(crs, CRS.GEOGRAPHIC); const metricArea = getGeographicLibArea(transformedPoly); if (unitOfMeasure === 'km') { return metricArea > 10000 @@ -112,12 +113,12 @@ export default function MeasureTooltip(props) { // Distance & Area measurement coordinates are stored differently, so identify based on geometry type const yCoord = geometry instanceof OlGeomPolygon ? coordinates[coordinates.length - 4] : coordinates[coordinates.length - 2]; const xCoord = geometry instanceof OlGeomPolygon ? coordinates[coordinates.length - 3] : coordinates[coordinates.length - 1]; - const tCoord = transform([xCoord, yCoord], crs, 'EPSG:4326'); + const tCoord = transform([xCoord, yCoord], crs, CRS.GEOGRAPHIC); return areCoordinatesWithinExtent(proj, tCoord); }; const tooltipValue = getMeasurementValue(); - const coordinatesAreValid = crs === 'EPSG:4326' ? checkGeographicCoordValidity(tooltipValue) : checkPolarCoordValidity(); + const coordinatesAreValid = crs === CRS.GEOGRAPHIC ? checkGeographicCoordValidity(tooltipValue) : checkPolarCoordValidity(); if (coordinatesAreValid) { return ( diff --git a/web/js/components/measure-tool/util.js b/web/js/components/measure-tool/util.js index cd7942e1d0..d8a4ce90d4 100644 --- a/web/js/components/measure-tool/util.js +++ b/web/js/components/measure-tool/util.js @@ -5,9 +5,9 @@ import { import geographiclib from 'geographiclib'; import shpWrite from 'shp-write'; import FileSaver from 'file-saver'; +import { CRS } from '../../modules/map/constants'; const geod = geographiclib.Geodesic.WGS84; -const geographicProj = 'EPSG:4326'; /** * Shift x value of every coord except the last, @@ -35,7 +35,7 @@ function checkForXFlip(geom, projection) { const coords = geom.getCoordinates(); const [x1] = coords[coords.length - 2]; const [x2] = coords[coords.length - 1]; - if (Math.abs(x1 - x2) > 180 && projection === geographicProj) { + if (Math.abs(x1 - x2) > 180 && projection === CRS.GEOGRAPHIC) { if (x1 < x2) { geom.setCoordinates(shiftXCoords(coords, 360)); } else if (x1 > x2) { @@ -53,7 +53,7 @@ function checkForXFlip(geom, projection) { export function transformLineStringArc(geom, projection) { const coords = []; const distance = 50000; // meters between segments - const transformedGeom = checkForXFlip(geom, projection).clone().transform(projection, geographicProj); + const transformedGeom = checkForXFlip(geom, projection).clone().transform(projection, CRS.GEOGRAPHIC); transformedGeom.forEachSegment((segStart, segEnd) => { const line = geod.InverseLine(segStart[1], segStart[0], segEnd[1], segEnd[0]); const n = Math.ceil(line.s13 / distance); @@ -63,7 +63,7 @@ export function transformLineStringArc(geom, projection) { coords.push([r.lon2, r.lat2]); } }); - return new OlGeomMultiLineString([coords]).transform(geographicProj, projection); + return new OlGeomMultiLineString([coords]).transform(CRS.GEOGRAPHIC, projection); } /** @@ -73,7 +73,7 @@ export function transformLineStringArc(geom, projection) { */ export function transformPolygonArc(geom, projection) { const coords = []; - const transformedGeom = geom.clone().transform(projection, geographicProj); + const transformedGeom = geom.clone().transform(projection, CRS.GEOGRAPHIC); const distance = 50000; // meters between segments const polyCoords = transformedGeom.getCoordinates()[0]; for (let i = 0; i < polyCoords.length - 1; i += 1) { @@ -90,7 +90,7 @@ export function transformPolygonArc(geom, projection) { coords.push([r.lon2, r.lat2]); } } - return new OlGeomPolygon([coords]).transform(geographicProj, projection); + return new OlGeomPolygon([coords]).transform(CRS.GEOGRAPHIC, projection); } /** diff --git a/web/js/components/sidebar/events-filter.js b/web/js/components/sidebar/events-filter.js index 8e10cff0b3..c0921be8a9 100644 --- a/web/js/components/sidebar/events-filter.js +++ b/web/js/components/sidebar/events-filter.js @@ -13,6 +13,7 @@ import { } from '../../modules/natural-events/actions'; import util from '../../util/util'; import DateRangeSelector from '../date-selector/date-range-selector'; +import { CRS } from '../../modules/map/constants'; function EventFilterModalBody (props) { const { @@ -190,7 +191,7 @@ const mapStateToProps = (state) => { selectedCategories, selectedDates, showAll, } = events; - const isPolarProj = proj.selected.crs === 'EPSG:3031' || proj.selected.crs === 'EPSG:3413'; + const isPolarProj = proj.selected.crs === CRS.ANTARCTIC || proj.selected.crs === CRS.ARCTIC; return { isPolarProj, diff --git a/web/js/containers/gif.js b/web/js/containers/gif.js index 462ac0aaab..9545e9e946 100644 --- a/web/js/containers/gif.js +++ b/web/js/containers/gif.js @@ -26,6 +26,7 @@ import { getStampProps, svgToPng, getNumberOfSteps } from '../modules/animation/ import { changeCropBounds } from '../modules/animation/actions'; import { subdailyLayersActive } from '../modules/layers/selectors'; import { formatDisplayDate } from '../modules/date/util'; +import { CRS } from '../modules/map/constants'; const DEFAULT_URL = 'http://localhost:3002/api/v1/snapshot'; const gifStream = new GifStream(); @@ -106,8 +107,8 @@ class GIF extends Component { map.ui.selected, ); const { crs } = proj; - const geolonlat1 = olProj.transform(lonlats[0], crs, 'EPSG:4326'); - const geolonlat2 = olProj.transform(lonlats[1], crs, 'EPSG:4326'); + const geolonlat1 = olProj.transform(lonlats[0], crs, CRS.GEOGRAPHIC); + const geolonlat2 = olProj.transform(lonlats[1], crs, CRS.GEOGRAPHIC); const resolution = imageUtilCalculateResolution( Math.round(map.ui.selected.getView().getZoom()), isGeoProjection, diff --git a/web/js/containers/image-download.js b/web/js/containers/image-download.js index b1dc8e2574..164c2679b9 100644 --- a/web/js/containers/image-download.js +++ b/web/js/containers/image-download.js @@ -29,6 +29,7 @@ import { updateBoundaries, } from '../modules/image-download/actions'; import { getNormalizedCoordinate } from '../components/location-search/util'; +import { CRS } from '../modules/map/constants'; const DEFAULT_URL = 'http://localhost:3002/api/v1/snapshot'; @@ -73,7 +74,7 @@ class ImageDownloadContainer extends Component { const { proj, map } = this.props; const coordinate = map.ui.selected.getCoordinateFromPixel([Math.floor(pixelX), Math.floor(pixelY)]); const { crs } = proj.selected; - const [x, y] = olProj.transform(coordinate, crs, 'EPSG:4326'); + const [x, y] = olProj.transform(coordinate, crs, CRS.GEOGRAPHIC); return [Number(x.toFixed(4)), Number(y.toFixed(4))]; } @@ -88,8 +89,8 @@ class ImageDownloadContainer extends Component { getBoundaries(lonLat1, lonLat2) { const { map, proj } = this.props; const { crs } = proj.selected; - const lonLatBottomLeft = olProj.transform(lonLat1, 'EPSG:4326', crs); - const lonLatTopRight = olProj.transform(lonLat2, 'EPSG:4326', crs); + const lonLatBottomLeft = olProj.transform(lonLat1, CRS.GEOGRAPHIC, crs); + const lonLatTopRight = olProj.transform(lonLat2, CRS.GEOGRAPHIC, crs); const { x, y, x2, y2, } = imageUtilGetPixelValuesFromCoords(lonLatBottomLeft, lonLatTopRight, map.ui.selected); @@ -158,8 +159,8 @@ class ImageDownloadContainer extends Component { const { x, y, x2, y2, } = boundaries; - const lonLat1 = olProj.transform(bottomLeftLatLong, 'EPSG:4326', crs); - const lonLat2 = olProj.transform(topRightLatLong, 'EPSG:4326', crs); + const lonLat1 = olProj.transform(bottomLeftLatLong, CRS.GEOGRAPHIC, crs); + const lonLat2 = olProj.transform(topRightLatLong, CRS.GEOGRAPHIC, crs); const isGeoProjection = proj.id === 'geographic'; const fileTypes = isGeoProjection ? fileTypesGeo : fileTypesPolar; const resolutions = isGeoProjection ? resolutionsGeo : resolutionsPolar; diff --git a/web/js/containers/map-interactions/ol-vector-interactions.js b/web/js/containers/map-interactions/ol-vector-interactions.js index 7e7823d4b1..c1e242fa9b 100644 --- a/web/js/containers/map-interactions/ol-vector-interactions.js +++ b/web/js/containers/map-interactions/ol-vector-interactions.js @@ -24,7 +24,7 @@ import { selectVectorFeatures as selectVectorFeaturesActionCreator } from '../.. import { changeCursor as changeCursorActionCreator } from '../../modules/map/actions'; import { ACTIVATE_VECTOR_ZOOM_ALERT, ACTIVATE_VECTOR_EXCEEDED_ALERT, DISABLE_VECTOR_EXCEEDED_ALERT } from '../../modules/alerts/constants'; import util from '../../util/util'; -import { FULL_MAP_EXTENT } from '../../modules/map/constants'; +import { CRS, FULL_MAP_EXTENT } from '../../modules/map/constants'; import { GRANULE_HOVERED, GRANULE_HOVER_UPDATE, @@ -156,7 +156,7 @@ export class VectorInteractions extends React.Component { isCoordinateSearchActive, measureIsActive, granuleFootprints, } = this.props; const coord = map.getCoordinateFromPixel(pixel); - const [lon, lat] = transform(coord, crs, 'EPSG:4326'); + const [lon, lat] = transform(coord, crs, CRS.GEOGRAPHIC); if (measureIsActive || isCoordinateSearchActive) { return; @@ -259,7 +259,7 @@ function mapStateToProps(state) { const granulePlatform = getGranulePlatform(state); const { maxExtent } = config.projections[proj.id]; - const visibleExtent = proj.selected.crs === 'EPSG:4326' ? FULL_MAP_EXTENT : maxExtent; + const visibleExtent = proj.selected.crs === CRS.GEOGRAPHIC ? FULL_MAP_EXTENT : maxExtent; return { activeLayers, diff --git a/web/js/containers/sidebar/smart-handoff.js b/web/js/containers/sidebar/smart-handoff.js index c3f9e0d22c..c3edba2272 100644 --- a/web/js/containers/sidebar/smart-handoff.js +++ b/web/js/containers/sidebar/smart-handoff.js @@ -33,6 +33,7 @@ import { fetchAvailableTools as fetchAvailableToolsAction, validateLayersConceptIds as validateLayersConceptIdsAction, } from '../../modules/smart-handoff/actions'; +import { CRS } from '../../modules/map/constants'; import { formatDisplayDate } from '../../modules/date/util'; @@ -179,8 +180,8 @@ class SmartHandoff extends Component { const { crs } = proj; // Retrieve the lat/lon coordinates based on the defining boundary and map projection - const bottomLeft = olProj.transform(lonlats[0], crs, 'EPSG:4326'); - const topRight = olProj.transform(lonlats[1], crs, 'EPSG:4326'); + const bottomLeft = olProj.transform(lonlats[0], crs, CRS.GEOGRAPHIC); + const topRight = olProj.transform(lonlats[1], crs, CRS.GEOGRAPHIC); let [x1, y1] = bottomLeft; let [x2, y2] = topRight; diff --git a/web/js/map/granule/granule-layer-builder.js b/web/js/map/granule/granule-layer-builder.js index f976453920..e4ef1eca5b 100644 --- a/web/js/map/granule/granule-layer-builder.js +++ b/web/js/map/granule/granule-layer-builder.js @@ -9,7 +9,7 @@ import { stopLoading, LOADING_GRANULES, } from '../../modules/loading/actions'; -import { FULL_MAP_EXTENT } from '../../modules/map/constants'; +import { FULL_MAP_EXTENT, CRS } from '../../modules/map/constants'; import { openBasicContent } from '../../modules/modal/actions'; import { getCacheOptions } from '../../modules/layers/util'; import { getGranulesUrl as getGranulesUrlSelector } from '../../modules/smart-handoff/selectors'; @@ -208,7 +208,7 @@ export default function granuleLayerBuilder(cache, store, createLayerWMTS) { const granules = datelineShiftGranules(visibleGranules, date, crs); const tileLayers = new OlCollection(createGranuleTileLayers(granules, def, attributes)); granuleLayer.setLayers(tileLayers); - granuleLayer.setExtent(crs === 'EPSG:4326' ? FULL_MAP_EXTENT : maxExtent); + granuleLayer.setExtent(crs === CRS.GEOGRAPHIC ? FULL_MAP_EXTENT : maxExtent); granuleLayer.set('granuleGroup', true); granuleLayer.set('layerId', `${id}-${group}`); granuleLayer.wv = { diff --git a/web/js/map/granule/util.js b/web/js/map/granule/util.js index 3142927dae..e41b65a5b7 100644 --- a/web/js/map/granule/util.js +++ b/web/js/map/granule/util.js @@ -12,6 +12,7 @@ import { transform } from 'ol/proj'; import { Polygon as OlGeomPolygon } from 'ol/geom'; import * as OlExtent from 'ol/extent'; import util from '../../util/util'; +import { CRS } from '../../modules/map/constants'; /** * Shift granules to hande dateline cross. Granules are shifted if: @@ -25,7 +26,7 @@ import util from '../../util/util'; export const datelineShiftGranules = (granules, currentDate, crs) => { const currentDayDate = new Date(currentDate).getUTCDate(); const datelineShiftNeeded = (() => { - if (crs !== 'EPSG:4326') return false; + if (crs !== CRS.GEOGRAPHIC) return false; const sameDays = granules.every(({ date }) => new Date(date).getUTCDate() === currentDayDate); return !sameDays; })(); @@ -231,7 +232,7 @@ export const getCMRQueryDateUpdateOptions = (CMRDateStoreForLayer, date, startQu */ export const transformGranuleData = (entry, date, crs) => { const line = new OlGeomLineString([]); - const maxDistance = crs === 'EPSG:4326' ? 270 : Number.POSITIVE_INFINITY; + const maxDistance = crs === CRS.GEOGRAPHIC ? 270 : Number.POSITIVE_INFINITY; const points = entry.polygons[0][0].split(' '); const dayNight = entry.day_night_flag; const polygonCoords = []; @@ -261,7 +262,7 @@ export const transformGranuleData = (entry, date, crs) => { }; export const transformGranulesForProj = (granules, crs) => granules.map((granule) => { - const transformedPolygon = granule.polygon.map((coords) => transform(coords, 'EPSG:4326', crs)); + const transformedPolygon = granule.polygon.map((coords) => transform(coords, CRS.GEOGRAPHIC, crs)); return { ...granule, polygon: transformedPolygon, diff --git a/web/js/map/natural-events/event-markers.js b/web/js/map/natural-events/event-markers.js index 398302ba45..6aa378a857 100644 --- a/web/js/map/natural-events/event-markers.js +++ b/web/js/map/natural-events/event-markers.js @@ -17,6 +17,7 @@ import EventIcon from '../../components/sidebar/event-icon'; import { selectEvent as selectEventAction } from '../../modules/natural-events/actions'; import { getDefaultEventDate } from '../../modules/natural-events/util'; import { getFilteredEvents } from '../../modules/natural-events/selectors'; +import { CRS } from '../../modules/map/constants'; const icons = [ 'Dust and Haze', @@ -86,7 +87,7 @@ class EventMarkers extends React.Component { let { coordinates } = geometry; - const transformCoords = (coords) => olProj.transform(coords, 'EPSG:4326', crs); + const transformCoords = (coords) => olProj.transform(coords, CRS.GEOGRAPHIC, crs); // polar projections require transform of coordinates to crs if (proj.selected.id !== 'geographic') { @@ -224,7 +225,7 @@ const createPin = function(id, category, isSelected, title, hideTooltip) { }); }; -const createBoundingBox = function(coordinates, title, proj = 'EPSG:4326') { +const createBoundingBox = function(coordinates, title, proj = CRS.GEOGRAPHIC) { const lightStroke = new OlStyleStyle({ stroke: new OlStyleStroke({ color: [255, 255, 255, 0.6], @@ -240,7 +241,7 @@ const createBoundingBox = function(coordinates, title, proj = 'EPSG:4326') { lineDash: [8, 12], }), }); - const boxPolygon = new OlGeomPolygon(coordinates).transform('EPSG:4326', proj); + const boxPolygon = new OlGeomPolygon(coordinates).transform(CRS.GEOGRAPHIC, proj); const boxFeature = new OlFeature({ geometry: boxPolygon, name: title, diff --git a/web/js/map/natural-events/event-track.js b/web/js/map/natural-events/event-track.js index a9351282f2..6b3c470d2e 100644 --- a/web/js/map/natural-events/event-track.js +++ b/web/js/map/natural-events/event-track.js @@ -13,7 +13,7 @@ import { } from './cluster'; import { selectEvent as selectEventAction } from '../../modules/natural-events/actions'; import { getFilteredEvents } from '../../modules/natural-events/selectors'; - +import { CRS } from '../../modules/map/constants'; import { getTrackLines, getTrackPoint, getArrows, getClusterPointEl, @@ -237,8 +237,8 @@ const getTracksAndPoints = function(eventObj, proj, map, selectedDate, callback) // polar projections require transform of coordinates to crs if (proj.selected.id !== 'geographic') { const { crs } = proj.selected; - prevCoordinates = olProj.transform(prevCoordinates, 'EPSG:4326', crs); - nextCoordinates = olProj.transform(nextCoordinates, 'EPSG:4326', crs); + prevCoordinates = olProj.transform(prevCoordinates, CRS.GEOGRAPHIC, crs); + nextCoordinates = olProj.transform(nextCoordinates, CRS.GEOGRAPHIC, crs); } const lineSegmentArray = [prevCoordinates, nextCoordinates]; const arrowOverlay = getArrows(lineSegmentArray, map); diff --git a/web/js/map/natural-events/natural-events.js b/web/js/map/natural-events/natural-events.js index 9a0d85082a..f4c3402ea3 100644 --- a/web/js/map/natural-events/natural-events.js +++ b/web/js/map/natural-events/natural-events.js @@ -15,6 +15,7 @@ import { activateLayersForEventCategory as activateLayersForEventCategoryAction, } from '../../modules/layers/actions'; import { getFilteredEvents } from '../../modules/natural-events/selectors'; +import { CRS } from '../../modules/map/constants'; import EventTrack from './event-track'; import EventMarkers from './event-markers'; @@ -140,13 +141,13 @@ class NaturalEvents extends React.Component { // check for polygon geometries and/or perform projection coordinate transform let coordinates; - const transformCoords = (coords) => olProj.transform(coords, 'EPSG:4326', crs); + const transformCoords = (coords) => olProj.transform(coords, CRS.GEOGRAPHIC, crs); if (geometry.type === 'Polygon') { const transformedCoords = geometry.coordinates[0].map(transformCoords); coordinates = olExtent.boundingExtent(transformedCoords); } else { - coordinates = olProj.transform(geometry.coordinates, 'EPSG:4326', crs); + coordinates = olProj.transform(geometry.coordinates, CRS.GEOGRAPHIC, crs); } return fly(map, proj, coordinates, zoom, null); }; diff --git a/web/js/map/natural-events/util.js b/web/js/map/natural-events/util.js index bb7fb41a0c..d523347f93 100644 --- a/web/js/map/natural-events/util.js +++ b/web/js/map/natural-events/util.js @@ -2,6 +2,7 @@ import OlOverlay from 'ol/Overlay'; import * as olProj from 'ol/proj'; import { mapUtilZoomAction } from '../util'; import { formatDisplayDate } from '../../modules/date/util'; +import { CRS } from '../../modules/map/constants'; /** * Create event point @@ -34,7 +35,7 @@ export const getTrackPoint = function(proj, clusterPoint, isSelected, callback) const eventID = properties.event_id; let { coordinates } = clusterPoint.geometry; if (proj.selected.id !== 'geographic') { - coordinates = olProj.transform(coordinates, 'EPSG:4326', proj.selected.crs); + coordinates = olProj.transform(coordinates, CRS.GEOGRAPHIC, proj.selected.crs); } overlayEl.className = isSelected ? 'track-marker-case track-marker-case-selected' @@ -197,7 +198,7 @@ export const getClusterPointEl = function (proj, cluster, map, pointClusterObj) let { coordinates } = cluster.geometry; const mapView = map.getView(); if (proj.selected.id !== 'geographic') { - coordinates = olProj.transform(coordinates, 'EPSG:4326', proj.selected.crs); + coordinates = olProj.transform(coordinates, CRS.GEOGRAPHIC, proj.selected.crs); } const sizeClass = number < 10 ? 'small' : number < 20 ? 'medium' : 'large'; diff --git a/web/js/modules/core/actions.js b/web/js/modules/core/actions.js index fbcdef09ab..7bea30f953 100644 --- a/web/js/modules/core/actions.js +++ b/web/js/modules/core/actions.js @@ -1,4 +1,4 @@ -export function requestAction( +export async function requestAction( dispatch, actionName, url, @@ -7,19 +7,17 @@ export function requestAction( options, ) { dispatch(startRequest(actionName, id)); - return new Promise((resolve, reject) => fetch(url, options) - .then((response) => (mimeType === 'application/json' - ? response.json() - : response.text() - )) - .then((data) => { - dispatch(fetchSuccess(actionName, data, id)); - resolve(data); - }) - .catch((error) => { - dispatch(fetchFailure(actionName, error, id)); - reject(error); - })); + try { + const response = await fetch(url, options); + const data = mimeType === 'application/json' + ? await response.json() + : await response.text(); + dispatch(fetchSuccess(actionName, data, id)); + return data; + } catch (error) { + dispatch(fetchFailure(actionName, error, id)); + console.error(error); + } } export function startRequest(actionName, id) { diff --git a/web/js/modules/image-download/util.js b/web/js/modules/image-download/util.js index 204aa1e880..0a3ce31bd2 100644 --- a/web/js/modules/image-download/util.js +++ b/web/js/modules/image-download/util.js @@ -6,6 +6,7 @@ import { transform } from 'ol/proj'; import util from '../../util/util'; import { formatDisplayDate } from '../date/util'; import { nearestInterval } from '../layers/util'; +import { CRS } from '../map/constants'; const GEO_ESTIMATION_CONSTANT = 256.0; const POLAR_ESTIMATION_CONSTANT = 0.002197265625; @@ -141,7 +142,7 @@ export function getDownloadUrl(url, proj, layerDefs, bbox, dimensions, dateTime, // handle adding coordinates marker if (markerCoordinates.length > 0) { const coords = markerCoordinates.reduce((validCoords, { longitude: lon, latitude: lat }) => { - const mCoord = transform([lon, lat], 'EPSG:4326', crs); + const mCoord = transform([lon, lat], CRS.GEOGRAPHIC, crs); // const inExtent = containsCoordinate(boundingExtent(bbox), mCoord); return validCoords.concat([mCoord[0], mCoord[1]]); }, []); @@ -330,7 +331,7 @@ export function imageUtilGetPixelValuesFromCoords(bottomLeft, topRight, map) { * Y,X order, otherwise in X,Y order. */ export function bboxWMS13(lonlats, crs) { - if (crs === 'EPSG:4326') { + if (crs === CRS.GEOGRAPHIC) { return `${lonlats[0][1]},${lonlats[0][0]},${lonlats[1][1]},${ lonlats[1][0] }`; diff --git a/web/js/modules/location-search/util.js b/web/js/modules/location-search/util.js index 27ce6e3456..0aa831972c 100644 --- a/web/js/modules/location-search/util.js +++ b/web/js/modules/location-search/util.js @@ -8,7 +8,7 @@ import { transform } from 'ol/proj'; import LocationMarker from '../../components/location-search/location-marker'; import safeLocalStorage from '../../util/local-storage'; import { fly } from '../../map/util'; -import { FULL_MAP_EXTENT } from '../map/constants'; +import { FULL_MAP_EXTENT, CRS } from '../map/constants'; const { LOCATION_SEARCH_COLLAPSED } = safeLocalStorage.keys; @@ -24,7 +24,7 @@ export function animateCoordinates(map, proj, coordinates, zoom) { let [x, y] = coordinates; if (proj !== 'geographic') { - [x, y] = transform(coordinates, 'EPSG:4326', crs); + [x, y] = transform(coordinates, CRS.GEOGRAPHIC, crs); } fly(map, proj, [x, y], zoom); } @@ -37,8 +37,8 @@ export function animateCoordinates(map, proj, coordinates, zoom) { */ export function areCoordinatesWithinExtent(proj, coordinates) { const { maxExtent, crs } = proj.selected; - const extent = crs === 'EPSG:4326' ? FULL_MAP_EXTENT : maxExtent; - const coord = crs === 'EPSG:4326' ? coordinates : transform(coordinates, 'EPSG:4326', crs); + const extent = crs === CRS.GEOGRAPHIC ? FULL_MAP_EXTENT : maxExtent; + const coord = crs === CRS.GEOGRAPHIC ? coordinates : transform(coordinates, CRS.GEOGRAPHIC, crs); return containsCoordinate(extent, coord); // expects X then Y! } @@ -57,7 +57,7 @@ export function getCoordinatesMarker(proj, coordinatesObject, results, removeMar // transform coordinates if not CRS EPSG:4326 let transformedCoords = coordinates; if (proj !== 'geographic') { - transformedCoords = transform(coordinates, 'EPSG:4326', crs); + transformedCoords = transform(coordinates, CRS.GEOGRAPHIC, crs); } const pinProps = { diff --git a/web/js/modules/map/constants.js b/web/js/modules/map/constants.js index c687f10438..7dd36a357b 100644 --- a/web/js/modules/map/constants.js +++ b/web/js/modules/map/constants.js @@ -16,6 +16,13 @@ export const LEFT_WING_ORIGIN = [-540, 90]; export const RIGHT_WING_ORIGIN = [180, 90]; export const CENTER_MAP_ORIGIN = [-180, 90]; +export const CRS = { + ARCTIC: 'EPSG:3413', + ANTARCTIC: 'EPSG:3031', + GEOGRAPHIC: 'EPSG:4326', + WEB_MERCATOR: 'EPSG:3857', +}; + export const RESOLUTION_FOR_LARGE_WMS_TILES = [ 0.3515625, 0.17578125, diff --git a/web/js/modules/measure/reducers.js b/web/js/modules/measure/reducers.js index fede724795..892ad70edb 100644 --- a/web/js/modules/measure/reducers.js +++ b/web/js/modules/measure/reducers.js @@ -3,14 +3,17 @@ import { UPDATE_MEASUREMENTS, TOGGLE_MEASURE_ACTIVE, } from './constants'; +import { CRS } from '../map/constants'; const defaultState = { isActive: false, unitOfMeasure: 'km', allMeasurements: { - 'EPSG:3413': {}, - 'EPSG:4326': {}, - 'EPSG:3031': {}, + ...Object.values(CRS) + .reduce((prev, key) => ({ + ...prev, + [key]: {}, + }), {}), }, }; @@ -26,15 +29,18 @@ export default function measureReducer(state = defaultState, action) { ...state, isActive: action.value, }; - case UPDATE_MEASUREMENTS: + case UPDATE_MEASUREMENTS: { + const newMeasurementObj = {}; + Object.entries(action.value).forEach(([key, value]) => { + newMeasurementObj[key] = value; + }); return { ...state, allMeasurements: { - 'EPSG:3413': action.value['EPSG:3413'], - 'EPSG:4326': action.value['EPSG:4326'], - 'EPSG:3031': action.value['EPSG:3031'], + ...newMeasurementObj, }, }; + } default: return state; } diff --git a/web/js/modules/natural-events/actions.js b/web/js/modules/natural-events/actions.js index dc84e024b0..ce744e2624 100644 --- a/web/js/modules/natural-events/actions.js +++ b/web/js/modules/natural-events/actions.js @@ -41,12 +41,16 @@ export function requestSources() { console.warn(`Using mock sources data: ${mockSources}`); sourcesURL = `mock/sources_data.json-${mockSources}`; } - requestAction( - dispatch, - REQUEST_SOURCES, - sourcesURL, - 'application/json', - ); + try { + requestAction( + dispatch, + REQUEST_SOURCES, + sourcesURL, + 'application/json', + ); + } catch (e) { + console.error(e); + } }; } diff --git a/web/js/modules/natural-events/util.js b/web/js/modules/natural-events/util.js index b7cbc783fa..347e83351e 100644 --- a/web/js/modules/natural-events/util.js +++ b/web/js/modules/natural-events/util.js @@ -7,6 +7,7 @@ import util from '../../util/util'; import { LIMIT_EVENT_REQUEST_COUNT, } from './constants'; +import { CRS } from '../map/constants'; export function parseEvent(eventString) { const values = eventString.split(','); @@ -127,9 +128,9 @@ export function getEventsRequestURL (state) { // represent exact bounds seen in app since they are expressed in EPSG:4326 // format which is the only format the API supports const extentBounds = { - 'EPSG:4326': [-180, 90, 180, -90], - 'EPSG:3413': [-180, 40, 180, 90], - 'EPSG:3031': [-180, -90, 180, -40], + [CRS.GEOGRAPHIC]: [-180, 90, 180, -90], + [CRS.ARCTIC]: [-180, 40, 180, 90], + [CRS.ANTARCTIC]: [-180, -90, 180, -40], }; const { crs } = proj.selected; const selectedMap = map && map.ui.selected; @@ -139,7 +140,7 @@ export function getEventsRequestURL (state) { status: 'all', limit: LIMIT_EVENT_REQUEST_COUNT, }; - const useBbox = bbox && bbox.length && crs === 'EPSG:4326'; + const useBbox = bbox && bbox.length && crs === CRS.GEOGRAPHIC; params.bbox = useBbox ? bbox : extentBounds[crs]; if (start && end) { @@ -185,7 +186,7 @@ export const validateGeometryCoords = (geometry, proj) => { const { coordinates, type } = geometry; const { crs, maxExtent } = proj; const passesFilter = (coords) => { - const tCoords = transform(coords, 'EPSG:4326', crs); + const tCoords = transform(coords, CRS.GEOGRAPHIC, crs); return containsCoordinate(maxExtent, tCoords); }; if (type === 'Point') { From 313b15b32f8a8332ff4896428da147f42f09f762 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Tue, 27 Sep 2022 12:39:06 -0400 Subject: [PATCH 07/85] create mobile custom interval selector --- .../mobile-custom-interval-selector.js | 91 +++++++++++++++++++ .../mobile-timescale-interval-change.js | 14 +++ web/js/containers/animation-widget.js | 13 ++- web/scss/features/anim-widget.scss | 1 + 4 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js diff --git a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js new file mode 100644 index 0000000000..aaf903e33a --- /dev/null +++ b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js @@ -0,0 +1,91 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import DeltaInput from './delta-input'; +import IntervalSelect from './interval-select'; +import { + TIME_SCALE_FROM_NUMBER, + TIME_SCALE_TO_NUMBER, +} from '../../../modules/date/constants'; +import { + selectInterval as selectIntervalAction, + changeCustomInterval as changeCustomIntervalAction, +} from '../../../modules/date/actions'; + +const MobileCustomIntervalSelector = (props) => { + const { + changeCustomInterval, + customInterval, + customSelected, + hasSubdailyLayers, + interval, + selectInterval, + customDelta, + } = props; + + const changeDelta = (value) => { + if (value >= 0 && value <= 1000) { + changeCustomInterval(value, customInterval); + } + } + + const changeZoomLevel = (zoomLevel) => { + changeCustomInterval(customDelta, TIME_SCALE_TO_NUMBER[zoomLevel]); + } + + return ( +
+

Custom Interval Selector

+
+ + +
+
+ ) +} + +const mapDispatchToProps = (dispatch) => ({ + changeCustomInterval: (delta, timeScale) => { + dispatch(changeCustomIntervalAction(delta, timeScale)); + }, + selectInterval: (delta, timeScale, customSelected) => { + dispatch(selectIntervalAction(delta, timeScale, customSelected)); + }, +}); + +const mapStateToProps = (state) => { + const { date } = state; + const { + interval, customInterval, customDelta, customSelected, + } = date; + return { + customDelta: customDelta || 1, + customInterval: customInterval || interval, + customSelected, + interval, + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps, +)(MobileCustomIntervalSelector); + +MobileCustomIntervalSelector.propTypes = { + changeCustomInterval: PropTypes.func, + closeModal: PropTypes.func, + customDelta: PropTypes.number, + customInterval: PropTypes.number, + customSelected: PropTypes.bool, + hasSubdailyLayers: PropTypes.bool, + interval: PropTypes.number, + selectInterval: PropTypes.func, + modalOpen: PropTypes.bool, +}; \ No newline at end of file diff --git a/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js b/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js index b3d3740b23..6f7d8a4347 100644 --- a/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js +++ b/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js @@ -82,6 +82,20 @@ const MobileTimeScaleIntervalChange = (props) => { Day + {hasSubdailyLayers ? ( + <> + + handleClickInterval('hour')}> + Hour + + + + handleClickInterval('minute')}> + Minute + + + + ) : null}
diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 263da4044f..7cea5f5a8f 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -16,6 +16,7 @@ import PlayButton from '../components/animation-widget/play-button'; import TimeScaleIntervalChange from '../components/timeline/timeline-controls/timescale-interval-change'; import MobileTimeScaleIntervalChange from '../components/timeline/timeline-controls/mobile-timescale-interval-change'; import CustomIntervalSelector from '../components/timeline/custom-interval-selector/custom-interval-selector'; +import MobileCustomIntervalSelector from '../components/timeline/custom-interval-selector/mobile-custom-interval-selector'; import PlayQueue from '../components/animation-widget/play-queue'; import { promiseImageryForTime } from '../modules/map/util'; import { @@ -380,16 +381,18 @@ class AnimationWidget extends React.Component { modalType={customModalType.ANIMATION} isDisabled={isPlaying} /> - - {/* Custom time interval selection */} - +
+ + Custom Interval: + +
- Increments2: + Increments: Date: Tue, 27 Sep 2022 14:32:32 -0400 Subject: [PATCH 08/85] add mobile layout version to interval-select.js --- .../interval-select.js | 136 ++++++++++++----- .../mobile-custom-interval-selector.js | 10 +- .../mobile-timescale-interval-change.js | 138 ------------------ web/js/containers/animation-widget.js | 15 -- web/scss/features/anim-widget.scss | 13 +- 5 files changed, 117 insertions(+), 195 deletions(-) delete mode 100644 web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js diff --git a/web/js/components/timeline/custom-interval-selector/interval-select.js b/web/js/components/timeline/custom-interval-selector/interval-select.js index 17f8c64778..83b51375db 100644 --- a/web/js/components/timeline/custom-interval-selector/interval-select.js +++ b/web/js/components/timeline/custom-interval-selector/interval-select.js @@ -1,5 +1,11 @@ -import React, { PureComponent } from 'react'; +import React, { useState } from 'react'; import PropTypes from 'prop-types'; +import { + Dropdown, DropdownToggle, DropdownMenu, DropdownItem, +} from 'reactstrap'; +import { + TIME_SCALE_FROM_NUMBER, +} from '../../../modules/date/constants'; /* * TimeScaleSelect for Custom Interval Selector @@ -7,53 +13,107 @@ import PropTypes from 'prop-types'; * * @class TimeScaleSelect */ -class IntervalSelect extends PureComponent { - handleChangeZoomLevel = (e) => { - const { changeZoomLevel } = this.props; +const IntervalSelect = (props) => { + const { + zoomLevel, + hasSubdailyLayers, + isMobile, + changeZoomLevel, + interval, + } = props; + + const [dropdownOpen, setDropdownOpen] = useState(false); + + const toggle = () => setDropdownOpen((prevState) => !prevState); + + const handleChangeZoomLevel = (e) => { const zoomLevel = e.target.value; changeZoomLevel(zoomLevel); - } + }; - handleSubmit = (e) => { + const handleChangeZoomLevelMobile = (increment) => { + changeZoomLevel(increment); + }; + + const handleSubmit = (e) => { e.preventDefault(); - } - - render() { - const { - zoomLevel, - hasSubdailyLayers, - } = this.props; - return ( -
- -
- ); - } -} + + + )} + + ); +}; IntervalSelect.propTypes = { changeZoomLevel: PropTypes.func, hasSubdailyLayers: PropTypes.bool, zoomLevel: PropTypes.string, + isMobile: PropTypes.bool, + interval: PropTypes.number, }; export default IntervalSelect; diff --git a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js index aaf903e33a..1118781ebe 100644 --- a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js +++ b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js @@ -21,6 +21,7 @@ const MobileCustomIntervalSelector = (props) => { interval, selectInterval, customDelta, + isMobile, } = props; const changeDelta = (value) => { @@ -34,8 +35,8 @@ const MobileCustomIntervalSelector = (props) => { } return ( -
-

Custom Interval Selector

+
+

Interval Selector

{ hasSubdailyLayers={hasSubdailyLayers} zoomLevel={TIME_SCALE_FROM_NUMBER[customInterval]} changeZoomLevel={changeZoomLevel} + interval={customInterval} + isMobile={isMobile} />
@@ -61,7 +64,7 @@ const mapDispatchToProps = (dispatch) => ({ }); const mapStateToProps = (state) => { - const { date } = state; + const { date, screenSize } = state; const { interval, customInterval, customDelta, customSelected, } = date; @@ -70,6 +73,7 @@ const mapStateToProps = (state) => { customInterval: customInterval || interval, customSelected, interval, + isMobile: screenSize.isMobileDevice, }; }; diff --git a/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js b/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js deleted file mode 100644 index 6f7d8a4347..0000000000 --- a/web/js/components/timeline/timeline-controls/mobile-timescale-interval-change.js +++ /dev/null @@ -1,138 +0,0 @@ -import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { - Dropdown, DropdownToggle, DropdownMenu, DropdownItem, -} from 'reactstrap'; -import { - TIME_SCALE_TO_NUMBER, - TIME_SCALE_FROM_NUMBER, -} from '../../../modules/date/constants'; -import { - toggleCustomModal as toggleCustomModalAction, - selectInterval as selectIntervalAction, -} from '../../../modules/date/actions'; - -const MobileTimeScaleIntervalChange = (props) => { - const { - customDelta, - customInterval, - timeScaleChangeUnit, - customSelected, - selectInterval, - hasSubdailyLayers, - } = props; - - const [dropdownOpen, setDropdownOpen] = useState(false); - - const toggle = () => setDropdownOpen((prevState) => !prevState); - - const handleClickInterval = (timescale) => { - // send props function to change timescale interval throughout app - setTimeScaleIntervalChangeUnit(timescale); - }; - - const setTimeScaleIntervalChangeUnit = (timeScale) => { - const customSelected = timeScale === 'custom'; - let delta; - let newTimeScale = timeScale; - - if (customSelected && customInterval && customDelta) { - newTimeScale = customInterval; - delta = customDelta; - } else { - newTimeScale = Number(TIME_SCALE_TO_NUMBER[newTimeScale]); - delta = 1; - } - selectInterval(delta, newTimeScale, customSelected); - }; - - const setCustomIntervalText = () => { - const { customDelta, customInterval } = this.props; - this.setState({ - customIntervalText: `${customDelta} ${TIME_SCALE_FROM_NUMBER[customInterval]}`, - }); - }; - - const resetCustomIntervalText = () => { - this.setState({ - customIntervalText: 'Custom', - }); - }; - - return ( -
- - - Increments - - - - handleClickInterval('year')}> - Year - - - - handleClickInterval('month')}> - Month - - - - handleClickInterval('day')}> - Day - - - {hasSubdailyLayers ? ( - <> - - handleClickInterval('hour')}> - Hour - - - - handleClickInterval('minute')}> - Minute - - - - ) : null} - - -
- ); -}; - -const mapDispatchToProps = (dispatch) => ({ - selectInterval: (delta, timeScale, customSelected) => { - dispatch(selectIntervalAction(delta, timeScale, customSelected)); - }, -}); - -const mapStateToProps = (state) => { - const { date } = state; - const { - interval, customInterval, customDelta, customSelected, - } = date; - return { - interval, - customInterval, - customDelta, - customSelected, - }; -}; - -MobileTimeScaleIntervalChange.propTypes = { - customDelta: PropTypes.number, - customInterval: PropTypes.number, - customSelected: PropTypes.bool, - hasSubdailyLayers: PropTypes.bool, - interval: PropTypes.number, - isDisabled: PropTypes.bool, - selectInterval: PropTypes.func, - timeScaleChangeUnit: PropTypes.string, -}; - -export default connect( - mapStateToProps, - mapDispatchToProps, -)(MobileTimeScaleIntervalChange); diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 7cea5f5a8f..f10dd71c2a 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -14,7 +14,6 @@ import DateRangeSelector from '../components/date-selector/date-range-selector'; import LoopButton from '../components/animation-widget/loop-button'; import PlayButton from '../components/animation-widget/play-button'; import TimeScaleIntervalChange from '../components/timeline/timeline-controls/timescale-interval-change'; -import MobileTimeScaleIntervalChange from '../components/timeline/timeline-controls/mobile-timescale-interval-change'; import CustomIntervalSelector from '../components/timeline/custom-interval-selector/custom-interval-selector'; import MobileCustomIntervalSelector from '../components/timeline/custom-interval-selector/mobile-custom-interval-selector'; import PlayQueue from '../components/animation-widget/play-queue'; @@ -383,25 +382,11 @@ class AnimationWidget extends React.Component { />
- - Custom Interval: -
-
- - Increments: - - -
-
Date: Tue, 27 Sep 2022 14:52:28 -0400 Subject: [PATCH 09/85] formated interval select --- .../mobile-custom-interval-selector.js | 1 + web/js/containers/animation-widget.js | 12 ------------ web/scss/features/anim-widget.scss | 11 +++++++++-- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js index 1118781ebe..363729a548 100644 --- a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js +++ b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js @@ -41,6 +41,7 @@ const MobileCustomIntervalSelector = (props) => {
-
- - Increments: - - -
Date: Tue, 27 Sep 2022 15:02:16 -0400 Subject: [PATCH 10/85] clean up css and animation-widget --- .../date-selector/date-range-selector.js | 38 +---------- web/js/containers/animation-widget.js | 5 -- web/scss/features/anim-widget.scss | 67 +++++-------------- 3 files changed, 19 insertions(+), 91 deletions(-) diff --git a/web/js/components/date-selector/date-range-selector.js b/web/js/components/date-selector/date-range-selector.js index 764025860b..f1edd00488 100644 --- a/web/js/components/date-selector/date-range-selector.js +++ b/web/js/components/date-selector/date-range-selector.js @@ -4,7 +4,7 @@ import DateSelector from './date-selector'; export default function DateRangeSelector (props) { const { - startDate, endDate, setDateRange, minDate, maxDate, subDailyMode, idSuffix, isDisabled, mobileStyle, + startDate, endDate, setDateRange, minDate, maxDate, subDailyMode, idSuffix, isDisabled, } = props; const setStartDate = (newStart) => { @@ -18,41 +18,6 @@ export default function DateRangeSelector (props) { : 'wv-date-range-selector'; return ( - mobileStyle ? ( -
-
-
- Start Date: -
- -
-
-
- End Date: -
- -
-
- ) - : (
) - ); } DateRangeSelector.propTypes = { diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 2f28f7ecb0..8918933b11 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -343,13 +343,9 @@ class AnimationWidget extends React.Component { numberOfFrames, } = this.props; const { speed } = this.state; - const cancelSelector = '.no-drag, .date-arrows'; - const mobileDateSelectorStyle = true; return (
@@ -402,7 +398,6 @@ class AnimationWidget extends React.Component { maxDate={maxDate} subDailyMode={subDailyMode} isDisabled={isPlaying} - mobileStyle={mobileDateSelectorStyle} />
diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index f73b1f7dfa..72a948546d 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -358,6 +358,7 @@ a .wv-animation-widget-icon { position: relative; } +/* mobile animation styles */ .wv-animation-widget-wrapper-mobile { position: absolute; z-index: 100; @@ -370,6 +371,23 @@ a .wv-animation-widget-icon { width: 100%; height: 100%; + & .wv-animation-widget-header { + margin-top: 70px; + width: 100%; + font-size: 30px; + color: $wv-orange; + border-radius: 4px; + } + + & .wv-minimize { + width: 2em; + height: 3em; + } + + & .rc-slider { + margin: auto; + } + & .mobile-animation-widget-container { margin: 0; width: 100%; @@ -404,55 +422,6 @@ a .wv-animation-widget-icon { } } - - & .wv-minimize { - width: 2em; - height: 3em; - } - - & .rc-slider { - margin: auto; - } - - & #animation-mobile-datepicker-case { - display: flex; - justify-content: space-between; - } - & .wv-date-range-selector { - margin-top: 40px; - } - & .date-selector-row { - display: flex; - justify-content: space-evenly; - align-items: center; - margin-top: 40px; - - & .date-selector-col { - font-size: 22px; - } - - & .wv-date-selector-widget { - position: relative; - top: 0px; - } - - & .input-wrapper { - margin-right: 20px; - margin-left: 20px; - } - - & .button-input-group { - font-size: 18px !important; - } - } - } - - & .wv-animation-widget-header { - margin-top: 70px; - width: 100%; - font-size: 30px; - color: $wv-orange; - border-radius: 4px; } } From 43f5acfb9a92c52acb8412bd25d7a7c00221b183 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Wed, 28 Sep 2022 12:13:05 -0400 Subject: [PATCH 11/85] fix minimum and maximum date format for mobile date picker --- web/js/containers/animation-widget.js | 34 +++++++++++++++++++++++++- web/js/containers/timeline/timeline.js | 1 + web/scss/features/anim-widget.scss | 12 +++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 8918933b11..3ac02b8de3 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -7,7 +7,7 @@ import PropTypes from 'prop-types'; import Slider, { Handle } from 'rc-slider'; import Draggable from 'react-draggable'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; - +import { getISODateFormatted } from '../components/timeline/date-util' import util from '../util/util'; import ErrorBoundary from './error-boundary'; import DateRangeSelector from '../components/date-selector/date-range-selector'; @@ -16,6 +16,7 @@ import PlayButton from '../components/animation-widget/play-button'; import TimeScaleIntervalChange from '../components/timeline/timeline-controls/timescale-interval-change'; import CustomIntervalSelector from '../components/timeline/custom-interval-selector/custom-interval-selector'; import MobileCustomIntervalSelector from '../components/timeline/custom-interval-selector/mobile-custom-interval-selector'; +import MobileDatePicker from '../components/timeline/mobile-date-picker' import PlayQueue from '../components/animation-widget/play-queue'; import { promiseImageryForTime } from '../modules/map/util'; import { @@ -190,6 +191,7 @@ class AnimationWidget extends React.Component { } onDateChange([newStartDate, newEndDate]) { + console.log([newStartDate, newEndDate]) const { onUpdateStartDate, onUpdateEndDate, startDate, endDate, } = this.props; @@ -341,9 +343,13 @@ class AnimationWidget extends React.Component { hasSubdailyLayers, playDisabled, numberOfFrames, + isMobile, } = this.props; const { speed } = this.state; + let minimumDate = getISODateFormatted(minDate); + let maximumDate = getISODateFormatted(maxDate); + return (
+
+
+ +
+
+ +
+
+ +
+
+ {/* From/To Date/Time Selection */} Date: Wed, 28 Sep 2022 10:15:54 -0600 Subject: [PATCH 12/85] Source maps for scss files --- webpack.config.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 2d6fba6870..5051cc2f2e 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,10 +10,10 @@ const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin' const devMode = process.env.NODE_ENV !== 'production'; const pluginSystem = [ + new MomentLocalesPlugin(), new MiniCssExtractPlugin({ filename: 'wv.css', }), - new MomentLocalesPlugin(), ]; /* Conditional Plugin Management */ @@ -22,9 +22,11 @@ if (devMode) { new ReactRefreshWebpackPlugin(), ); } + if (process.env.ANALYZE_MODE === 'true') { pluginSystem.push(new BundleAnalyzerPlugin()); } + if (process.env.DEBUG !== undefined) { pluginSystem.push( new webpack.DefinePlugin({ DEBUG: JSON.stringify(process.env.DEBUG) }), @@ -62,7 +64,7 @@ module.exports = { pathinfo: false, clean: true, }, - devtool: devMode ? 'cheap-module-source-map' : 'source-map', + devtool: 'source-map', devServer: { devMiddleware: { writeToDisk: true, @@ -105,17 +107,16 @@ module.exports = { { loader: MiniCssExtractPlugin.loader, }, - 'css-hot-loader', { loader: 'css-loader', options: { + sourceMap: true, importLoaders: 1, }, }, { loader: 'postcss-loader', options: { - sourceMap: true, postcssOptions: { plugins: [ 'cssnano', From 402fa3abe3842ed4fffb137db7745857d897420a Mon Sep 17 00:00:00 2001 From: Jason Kent Date: Wed, 28 Sep 2022 10:47:21 -0600 Subject: [PATCH 13/85] No source map for prod build --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 5051cc2f2e..59e4a0a2f5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -64,7 +64,7 @@ module.exports = { pathinfo: false, clean: true, }, - devtool: 'source-map', + devtool: devMode && 'source-map', devServer: { devMiddleware: { writeToDisk: true, From b14d572d459895b1ff5111f837f5f0ef692f7f6f Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Wed, 28 Sep 2022 12:53:34 -0400 Subject: [PATCH 14/85] working mobile date wheel selectors in animation widget --- web/js/containers/animation-widget.js | 46 +++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 3ac02b8de3..1da6df7d26 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -1,6 +1,8 @@ import React from 'react'; import { connect } from 'react-redux'; import { + debounce as lodashDebounce, + throttle as lodashThrottle, get as lodashGet, } from 'lodash'; import PropTypes from 'prop-types'; @@ -94,6 +96,8 @@ class AnimationWidget extends React.Component { collapsedWidgetPosition: { x: 0, y: 0 }, userHasMovedWidget: false, }; + this.debounceDateUpdate = lodashDebounce(selectDate, 8); + this.onDateChange = this.onDateChange.bind(this); this.onIntervalSelect = this.onIntervalSelect.bind(this); this.onLoop = this.onLoop.bind(this); @@ -203,6 +207,42 @@ class AnimationWidget extends React.Component { } } + // eslint-disable-next-line react/destructuring-assignment + onMobileDateChangeStart = (date, draggerSelected = this.props.draggerSelected) => { + const { onUpdateStartDate } = this.props; + const dateObj = new Date(date); + const dateISOFormatted = getISODateFormatted(date); + if (draggerSelected === 'selected') { // dragger A + this.setState({ + draggerTimeState: dateISOFormatted, + }); + } else { // dragger B + this.setState({ + draggerTimeStateB: dateISOFormatted, + }); + } + this.debounceDateUpdate(dateObj, draggerSelected); + onUpdateStartDate(dateObj) + } + + // eslint-disable-next-line react/destructuring-assignment + onMobileDateChangeEnd = (date, draggerSelected = this.props.draggerSelected) => { + const { onUpdateEndDate } = this.props; + const dateObj = new Date(date); + const dateISOFormatted = getISODateFormatted(date); + if (draggerSelected === 'selected') { // dragger A + this.setState({ + draggerTimeState: dateISOFormatted, + }); + } else { // dragger B + this.setState({ + draggerTimeStateB: dateISOFormatted, + }); + } + this.debounceDateUpdate(dateObj, draggerSelected); + onUpdateEndDate(dateObj) + } + onIntervalSelect(timeScale, openModal) { let delta; const { onIntervalSelect, customInterval, customDelta } = this.props; @@ -400,7 +440,7 @@ class AnimationWidget extends React.Component { date={startDate} startDateLimit={minimumDate} endDateLimit={maximumDate} - onDateChange={this.onDateChange} + onDateChange={this.onMobileDateChangeStart} hasSubdailyLayers={hasSubdailyLayers} isMobile={isMobile} /> @@ -413,7 +453,7 @@ class AnimationWidget extends React.Component { date={endDate} startDateLimit={minimumDate} endDateLimit={maximumDate} - onDateChange={this.onDateChange} + onDateChange={this.onMobileDateChangeEnd} hasSubdailyLayers={hasSubdailyLayers} isMobile={isMobile} /> @@ -625,6 +665,7 @@ function mapStateToProps(state) { interval, customInterval, } = date; + const { isCompareA } = compare; const hasSubdailyLayers = subdailyLayersActive(state); const activeLayersForProj = getAllActiveLayers(state); @@ -683,6 +724,7 @@ function mapStateToProps(state) { customSelected, startDate, endDate, + draggerSelected: isCompareA ? 'selected' : 'selectedB', snappedCurrentDate, currentDate, minDate, From 8d4da58d2dee6a4f9e4ab7cbe8ba9726ea422fcc Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Wed, 28 Sep 2022 13:04:52 -0400 Subject: [PATCH 15/85] update play button position in mobile portrait subdaily mode --- web/scss/features/anim-widget.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index abadf8587f..a9bf0b2517 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -57,6 +57,13 @@ } } +@media (max-width: 483px) { + .wv-animation-widget-wrapper.mobile.minimized.subdaily { + left: 210px; + bottom: 75px; + } +} + .wv-animation-widget .input-range.rc-slider-disabled { cursor: default; } From e0d7f394ff2b2f82e807ce9a135dd45a7a0a9cb3 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Wed, 28 Sep 2022 14:29:50 -0400 Subject: [PATCH 16/85] update screenSize actions to include mobile/tablet identification and provide mobile animation widget with custom mobile ids --- web/js/containers/animation-widget.js | 167 +++++++++++++------------- web/js/modules/screen-size/actions.js | 4 + web/js/modules/screen-size/reducer.js | 4 + web/scss/features/anim-widget.scss | 8 +- 4 files changed, 95 insertions(+), 88 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 1da6df7d26..340b257c6d 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -2,14 +2,13 @@ import React from 'react'; import { connect } from 'react-redux'; import { debounce as lodashDebounce, - throttle as lodashThrottle, get as lodashGet, } from 'lodash'; import PropTypes from 'prop-types'; import Slider, { Handle } from 'rc-slider'; import Draggable from 'react-draggable'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { getISODateFormatted } from '../components/timeline/date-util' +import { getISODateFormatted } from '../components/timeline/date-util'; import util from '../util/util'; import ErrorBoundary from './error-boundary'; import DateRangeSelector from '../components/date-selector/date-range-selector'; @@ -18,7 +17,7 @@ import PlayButton from '../components/animation-widget/play-button'; import TimeScaleIntervalChange from '../components/timeline/timeline-controls/timescale-interval-change'; import CustomIntervalSelector from '../components/timeline/custom-interval-selector/custom-interval-selector'; import MobileCustomIntervalSelector from '../components/timeline/custom-interval-selector/mobile-custom-interval-selector'; -import MobileDatePicker from '../components/timeline/mobile-date-picker' +import MobileDatePicker from '../components/timeline/mobile-date-picker'; import PlayQueue from '../components/animation-widget/play-queue'; import { promiseImageryForTime } from '../modules/map/util'; import { @@ -195,7 +194,7 @@ class AnimationWidget extends React.Component { } onDateChange([newStartDate, newEndDate]) { - console.log([newStartDate, newEndDate]) + console.log([newStartDate, newEndDate]); const { onUpdateStartDate, onUpdateEndDate, startDate, endDate, } = this.props; @@ -222,7 +221,7 @@ class AnimationWidget extends React.Component { }); } this.debounceDateUpdate(dateObj, draggerSelected); - onUpdateStartDate(dateObj) + onUpdateStartDate(dateObj); } // eslint-disable-next-line react/destructuring-assignment @@ -240,28 +239,28 @@ class AnimationWidget extends React.Component { }); } this.debounceDateUpdate(dateObj, draggerSelected); - onUpdateEndDate(dateObj) + onUpdateEndDate(dateObj); } - onIntervalSelect(timeScale, openModal) { - let delta; - const { onIntervalSelect, customInterval, customDelta } = this.props; - const customSelected = timeScale === 'custom'; + onIntervalSelect(timeScale, openModal) { + let delta; + const { onIntervalSelect, customInterval, customDelta } = this.props; + const customSelected = timeScale === 'custom'; - if (openModal) { - this.toggleCustomIntervalModal(openModal); - return; - } + if (openModal) { + this.toggleCustomIntervalModal(openModal); + return; + } - if (customSelected && customInterval && customDelta) { - timeScale = customInterval; - delta = customDelta; - } else { - timeScale = Number(TIME_SCALE_TO_NUMBER[timeScale]); - delta = 1; + if (customSelected && customInterval && customDelta) { + timeScale = customInterval; + delta = customDelta; + } else { + timeScale = Number(TIME_SCALE_TO_NUMBER[timeScale]); + delta = 1; + } + onIntervalSelect(delta, timeScale, customSelected); } - onIntervalSelect(delta, timeScale, customSelected); - } onPushPlay = () => { const { @@ -384,96 +383,89 @@ class AnimationWidget extends React.Component { playDisabled, numberOfFrames, isMobile, + isMobilePhone, + isTablet, + screenWidth, + breakpoints, + orientation, } = this.props; const { speed } = this.state; - let minimumDate = getISODateFormatted(minDate); - let maximumDate = getISODateFormatted(maxDate); + const mobileID = isMobilePhone && orientation === 'landscape' ? 'mobile-phone-landscape' + : isMobilePhone && orientation === 'portrait' ? 'mobile-phone-portrait' + : isTablet || screenWidth <= breakpoints.small ? 'tablet' : 'mobile'; + + const minimumDate = getISODateFormatted(minDate); + const maximumDate = getISODateFormatted(maxDate); return ( -
-
-
-
- Map Animation -
+
+
+
+ Map Animation +
-
-
-
- - Loop Animation: - - -
-
- -
+
+
+
+ + Loop Animation: + +
-
- this.setState({ speed: num })} - handle={RangeHandle} - onAfterChange={() => { onSlide(speed); }} - disabled={isPlaying} - /> - {sliderLabel} -
+
+
+
+
+ this.setState({ speed: num })} + handle={RangeHandle} + onAfterChange={() => { onSlide(speed); }} + disabled={isPlaying} + /> + {sliderLabel} +
+
-
-
- +
+ -
+ />
+
-
-
- +
+ -
+ />
- - {/* From/To Date/Time Selection */} -
-
+
); @@ -732,6 +724,11 @@ function mapStateToProps(state) { isActive: animationIsActive, isDistractionFreeModeActive, isMobile: screenSize.isMobileDevice, + isMobilePhone: screenSize.isMobilePhone, + screenWidth: screenSize.screenWidth, + isTablet: screenSize.isMobileTablet, + orientation: screenSize.orientation, + breakpoints: screenSize.breakpoints, isLandscape: screenSize.orientation === 'landscape', hasFutureLayers, hasSubdailyLayers, diff --git a/web/js/modules/screen-size/actions.js b/web/js/modules/screen-size/actions.js index 4521674ed9..a2421b3d50 100644 --- a/web/js/modules/screen-size/actions.js +++ b/web/js/modules/screen-size/actions.js @@ -8,6 +8,8 @@ export default function setScreenInfo() { const screenWidth = window.innerWidth; const isMobileDevice = screenWidth < 768 || isMobileOnly || isTablet; const orientation = screenHeight > screenWidth ? 'portrait' : 'landscape'; + const isMobilePhone = isMobileOnly; + const isMobileTablet = isTablet; return { type: SET_SCREEN_INFO, @@ -15,5 +17,7 @@ export default function setScreenInfo() { screenWidth, isMobileDevice, orientation, + isMobilePhone, + isMobileTablet, }; } diff --git a/web/js/modules/screen-size/reducer.js b/web/js/modules/screen-size/reducer.js index 2005943b0e..925febf8ea 100644 --- a/web/js/modules/screen-size/reducer.js +++ b/web/js/modules/screen-size/reducer.js @@ -6,6 +6,8 @@ export const initialState = { isMobileDevice: false, orientation: '', breakpoints: {}, + isMobilePhone: false, + isMobileTablet: false, }; export const getInitialState = () => ({ @@ -26,6 +28,8 @@ export const screenSizeReducer = (state = initialState, action) => { screenWidth: action.screenWidth, isMobileDevice: action.isMobileDevice, orientation: action.orientation, + isMobilePhone: action.isMobilePhone, + isMobileTablet: action.isMobileTablet, }; default: return state; diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index a9bf0b2517..9f91421b61 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -365,12 +365,13 @@ a .wv-animation-widget-icon { position: relative; } -/* mobile animation styles */ +/* mobile animation widget styles */ .wv-animation-widget-wrapper-mobile { position: absolute; z-index: 100; width: 100%; height: 100%; + box-sizing: border-box; border: 8px solid $wv-orange; & .wv-animation-widget { @@ -379,7 +380,7 @@ a .wv-animation-widget-icon { height: 100%; & .wv-animation-widget-header { - margin-top: 70px; + margin-top: 2rem; width: 100%; font-size: 30px; color: $wv-orange; @@ -414,7 +415,8 @@ a .wv-animation-widget-icon { display: flex; justify-content: center; align-items: center; - margin-top: 40px; + // margin-top: 40px; + margin-top: 5%; width: 100%; span{ From 051f76aa0528b69ffc9165eec0749b11de313c68 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Wed, 28 Sep 2022 18:20:37 -0400 Subject: [PATCH 17/85] mobile phone landscape layout --- web/js/containers/animation-widget.js | 24 +++++------ web/scss/features/anim-widget.scss | 60 ++++++++++++++++++++------- 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 340b257c6d..42e34d047f 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -409,20 +409,21 @@ class AnimationWidget extends React.Component {
-
-
+ +
- Loop Animation: + Loop Animation
-
+ +
-
-
+ +
-
-
+
+ Start Date -
-
-
+
+ End Date -
+
diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index 9f91421b61..b1d65d132a 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -372,19 +372,18 @@ a .wv-animation-widget-icon { width: 100%; height: 100%; box-sizing: border-box; - border: 8px solid $wv-orange; + border: 4px solid #555; & .wv-animation-widget { margin: 0; width: 100%; height: 100%; + background: $wv-transparent-black; & .wv-animation-widget-header { margin-top: 2rem; width: 100%; font-size: 30px; - color: $wv-orange; - border-radius: 4px; } & .wv-minimize { @@ -392,36 +391,55 @@ a .wv-animation-widget-icon { height: 3em; } - & .rc-slider { - margin: auto; - } - & .mobile-animation-widget-container { margin: 0; width: 100%; height: 90%; + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px; } & .mobile-animation-widget-button-items { width: 75%; margin: auto; + } + + #slider-case-row { + grid-column: 1 / -1; + width: 100%; + + & .wv-slider-label { + text-align: center; + margin: auto; + } + + & .rc-slider { + margin: auto; + } + } - & .mobile-animation-widget-row { - justify-content: space-between; + & .mobile-animation-block-row { + text-align: center; + font-size: 22px; + + & .mobile-date-picker-select-btn{ + position: relative; + background-color: #295f92; + bottom: -10%; + width: 95%; } } - & .mobile-animation-widget-row { + & .mobile-animation-flex-row { display: flex; justify-content: center; align-items: center; - // margin-top: 40px; - margin-top: 5%; width: 100%; span{ font-size: 22px; - margin-right: 40px; + margin-right: 20px; line-height: normal; } @@ -430,7 +448,7 @@ a .wv-animation-widget-icon { width: 52px; } - .mobile-animation-datepicker-container { + & .mobile-date-picker-select-btn{ position: relative; background-color: #295f92; @@ -440,12 +458,24 @@ a .wv-animation-widget-icon { } } - } + } } } +#mobile-animation-widget-mobile-phone-landscape { + & .wv-animation-widget { + & .wv-animation-widget-header { + margin-top: 1rem; + font-size: 24px; + } + & .rc-slider { + width: 400px; + } +} +} + .mobile-timescale-dropdown { & .dropdown-toggle { From 99422b2402659d4a69e871e303a833a836a60cc4 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Thu, 29 Sep 2022 09:18:27 -0400 Subject: [PATCH 18/85] move play button in mobile portrait --- web/scss/features/anim-widget.scss | 8 ++++++-- web/scss/features/timeline.scss | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index b1d65d132a..e5d8ce8630 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -23,7 +23,7 @@ left: 320px; &.landscape { - left: 323px; + left: 390px; } } @@ -53,7 +53,11 @@ @media (max-width: 483px) { .wv-animation-widget-wrapper.mobile.minimized { - left: 200px; + left: 190px; + + & #play-button { + width: 100px; + } } } diff --git a/web/scss/features/timeline.scss b/web/scss/features/timeline.scss index c1a1e12b72..96fd34096d 100644 --- a/web/scss/features/timeline.scss +++ b/web/scss/features/timeline.scss @@ -835,6 +835,6 @@ button:focus { } .animate-button-tablet { - left: 440px; + left: 323px; bottom: 20px; } From 53c9a4998678ca86aa2d031dc5cb78229986ba3c Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Thu, 29 Sep 2022 09:47:12 -0400 Subject: [PATCH 19/85] mobile-portrait design --- web/scss/features/anim-widget.scss | 33 ++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index e5d8ce8630..7c6f42375f 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -397,7 +397,7 @@ a .wv-animation-widget-icon { & .mobile-animation-widget-container { margin: 0; - width: 100%; + width: 98%; height: 90%; display: grid; grid-template-columns: repeat(2, 1fr); @@ -445,6 +445,7 @@ a .wv-animation-widget-icon { font-size: 22px; margin-right: 20px; line-height: normal; + text-align: center; } .wv-icon-case { @@ -477,9 +478,36 @@ a .wv-animation-widget-icon { & .rc-slider { width: 400px; } + } } -} +#mobile-animation-widget-mobile-phone-portrait { + height: 60%; + bottom: 0px; + + & .wv-animation-widget-header { + margin-top: 0.75rem; + } + + & .mobile-animation-block-row { + grid-column: 1 / -1; + } + + & .mobile-animation-flex-row { + flex-direction: column; + width: 100%; + + + & #loop-button { + margin-top: 15px; + } + + & span{ + text-align: center; + margin: 0; + } +} +} .mobile-timescale-dropdown { & .dropdown-toggle { @@ -511,6 +539,7 @@ a .wv-animation-widget-icon { & .custom-animation-interval-header { font-size: 22px; text-align: center; + line-height: 1.50rem; margin-bottom: 10px; } From b2990cb3887b7b60c648bedf03c0c5408703d43c Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Thu, 29 Sep 2022 13:06:42 -0400 Subject: [PATCH 20/85] add unique ids/classes for different views --- .../timeline-controls/animation-button.js | 17 +++- web/js/containers/animation-widget.js | 45 +++++++---- web/js/containers/timeline/timeline.js | 19 ++++- web/scss/features/anim-widget.scss | 79 +++++++++++++------ web/scss/features/timeline.scss | 19 ++++- 5 files changed, 130 insertions(+), 49 deletions(-) diff --git a/web/js/components/timeline/timeline-controls/animation-button.js b/web/js/components/timeline/timeline-controls/animation-button.js index be45c15b0b..5d2e95b215 100644 --- a/web/js/components/timeline/timeline-controls/animation-button.js +++ b/web/js/components/timeline/timeline-controls/animation-button.js @@ -11,18 +11,27 @@ const AnimationButton = (props) => { isMobile, breakpoints, screenWidth, + isLandscape, + isPortrait, + isMobilePhone, + isMobileTablet, + hasSubdailyLayers, } = props; + const subdailyID = hasSubdailyLayers ? '-subdaily' : '' const buttonId = 'animate-button'; const labelText = label || 'Set up animation'; - const className = isMobile && screenWidth < breakpoints.small ? 'button-action-group mobile-animate-button animate-button-phone' - : isMobile && screenWidth > breakpoints.small ? 'button-action-group mobile-animate-button animate-button-tablet' - : 'button-action-group animate-button'; + const className = isMobilePhone && isPortrait ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` + : isMobilePhone && isLandscape ? 'mobile-animate-button animate-button-phone-landscape' + : isMobileTablet && isPortrait ? 'mobile-animate-button animate-button-tablet-portrait' + : isMobileTablet && isLandscape ? 'mobile-animate-button animate-button-tablet-landscape' + : ' animate-button' + return (
diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 42e34d047f..a7bb8d3835 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -320,12 +320,15 @@ class AnimationWidget extends React.Component { renderCollapsedWidget() { const { hasSubdailyLayers, - isLandscape, isMobile, isPlaying, onClose, onPushPause, playDisabled, + isPortrait, + isLandscape, + isMobilePhone, + isMobileTablet, } = this.props; const { collapsedWidgetPosition } = this.state; const cancelSelector = '.no-drag, svg'; @@ -335,6 +338,14 @@ class AnimationWidget extends React.Component { + `${isMobile ? 'mobile ' : ''}` + `${isLandscape ? 'landscape ' : ''}`; + const subdailyID = hasSubdailyLayers ? '-subdaily' : ''; + + const widgetIDs = isMobilePhone && isPortrait ? `collapsed-animate-widget-phone-portrait${subdailyID}` + : isMobilePhone && isLandscape ? 'collapsed-animate-widget-phone-landscape' + : isMobileTablet && isPortrait ? 'collapsed-animate-widget-tablet-portrait' + : isMobileTablet && isLandscape ? 'collapsed-animate-widget-tablet-landscape' + : 'collapsed-animate-widget' + return !dontShow && (
-
- Map Animation -
-
- Loop Animation + Loop
@@ -709,9 +718,11 @@ function mapStateToProps(state) { snappedCurrentDate = currentDate; } + const {isMobilePhone, screenWidth, isMobileTablet, breakpoints } = screenSize; + return { appNow, - screenWidth: screenSize.screenWidth, + screenWidth, animationCustomModalOpen, customSelected, startDate, @@ -724,12 +735,12 @@ function mapStateToProps(state) { isActive: animationIsActive, isDistractionFreeModeActive, isMobile: screenSize.isMobileDevice, - isMobilePhone: screenSize.isMobilePhone, - screenWidth: screenSize.screenWidth, - isTablet: screenSize.isMobileTablet, - orientation: screenSize.orientation, - breakpoints: screenSize.breakpoints, + isMobilePhone, + screenWidth, + isMobileTablet, + breakpoints, isLandscape: screenSize.orientation === 'landscape', + isPortrait: screenSize.orientation === 'portrait', hasFutureLayers, hasSubdailyLayers, subDailyMode, diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index ed2ae645a8..9b9e52d82d 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -921,11 +921,15 @@ class Timeline extends React.Component { renderMobile() { const { animationDisabled, - breakpoints, hasSubdailyLayers, isCompareModeActive, isDataDownload, isMobile, + isMobilePhone, + isMobileTablet, + isLandscape, + isPortrait, + breakpoints, screenWidth, selectedDate, timelineEndDateLimit, @@ -956,7 +960,12 @@ class Timeline extends React.Component { isMobile={isMobile} breakpoints={breakpoints} screenWidth={screenWidth} + isMobilePhone={isMobilePhone} + isMobileTablet={isMobileTablet} + isLandscape={isLandscape} + isPortrait={isPortrait} clickAnimationButton={this.clickAnimationButton} + hasSubdailyLayers={hasSubdailyLayers} disabled={animationDisabled} label={ isCompareModeActive @@ -1322,13 +1331,12 @@ function mapStateToProps(state) { selectedZoom, timelineCustomModalOpen, } = date; - const { screenWidth } = screenSize; const { isCompareA } = compare; const isCompareModeActive = compare.active; const { isDistractionFreeModeActive } = ui; const { isEmbedModeActive } = embed; const isMobile = screenSize.isMobileDevice; - const { breakpoints } = screenSize; + const { breakpoints, screenWidth, isMobilePhone, isMobileTablet, orientation, } = screenSize; const { isAnimatingToEvent } = events; // handle active layer filtering and check for subdaily @@ -1396,6 +1404,11 @@ function mapStateToProps(state) { activeLayers: activeLayersFiltered, isTourActive: tour.active, isMobile, + isMobilePhone, + isMobileTablet, + orientation, + isLandscape: screenSize.orientation === 'landscape', + isPortrait: screenSize.orientation === 'portrait', screenWidth, breakpoints, draggerSelected: isCompareA ? 'selected' : 'selectedB', diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index 7c6f42375f..dc8c21cbfb 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -3,6 +3,21 @@ z-index: 100; } +#collapsed-animate-widget-phone-portrait { + bottom: 20px; + left: 190px; +} + +#collapsed-animate-widget-phone-portrait-subdaily { + bottom: 75px; + left: 210px; +} + +#collapsed-animate-widget-phone-landscape{ + bottom: 20px; + left: 390px; +} + @media (min-width: $tablet-min-width) { .wv-animation-widget-wrapper { bottom: 88px; @@ -20,7 +35,7 @@ &.minimized { bottom: 20px; - left: 320px; + left: 390px; &.landscape { left: 390px; @@ -384,17 +399,17 @@ a .wv-animation-widget-icon { height: 100%; background: $wv-transparent-black; - & .wv-animation-widget-header { - margin-top: 2rem; - width: 100%; - font-size: 30px; - } - & .wv-minimize { width: 2em; height: 3em; } + & #loop-button { + height: 4em; + width: 5em; + margin-top: 10px; + } + & .mobile-animation-widget-container { margin: 0; width: 98%; @@ -402,11 +417,7 @@ a .wv-animation-widget-icon { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; - } - - & .mobile-animation-widget-button-items { - width: 75%; - margin: auto; + margin-top: 20px; } #slider-case-row { @@ -425,7 +436,7 @@ a .wv-animation-widget-icon { & .mobile-animation-block-row { text-align: center; - font-size: 22px; + font-size: 18px; & .mobile-date-picker-select-btn{ position: relative; @@ -440,10 +451,10 @@ a .wv-animation-widget-icon { justify-content: center; align-items: center; width: 100%; + flex-direction: column; - span{ - font-size: 22px; - margin-right: 20px; + span { + font-size: 18px; line-height: normal; text-align: center; } @@ -471,10 +482,6 @@ a .wv-animation-widget-icon { #mobile-animation-widget-mobile-phone-landscape { & .wv-animation-widget { - & .wv-animation-widget-header { - margin-top: 1rem; - font-size: 24px; - } & .rc-slider { width: 400px; } @@ -485,8 +492,8 @@ a .wv-animation-widget-icon { height: 60%; bottom: 0px; - & .wv-animation-widget-header { - margin-top: 0.75rem; + & .wv-minimize { + top: 1px; } & .mobile-animation-block-row { @@ -502,6 +509,14 @@ a .wv-animation-widget-icon { margin-top: 15px; } + & .wv-slider-case{ + margin-top: 1.5rem; + + & .rc-slider { + width: 300px; + } + } + & span{ text-align: center; margin: 0; @@ -509,6 +524,24 @@ a .wv-animation-widget-icon { } } +#mobile-animation-widget-tablet { + height: 30%; + bottom: 0px; + + & .mobile-animation-widget-container { + margin: 0; + } + + & .wv-minimize { + top: 1px; + } + + & .rc-slider { + width: 400px; + } +} + + .mobile-timescale-dropdown { & .dropdown-toggle { font-size: 18px; @@ -537,7 +570,7 @@ a .wv-animation-widget-icon { margin: auto; & .custom-animation-interval-header { - font-size: 22px; + font-size: 18px; text-align: center; line-height: 1.50rem; margin-bottom: 10px; diff --git a/web/scss/features/timeline.scss b/web/scss/features/timeline.scss index 96fd34096d..e382b070a4 100644 --- a/web/scss/features/timeline.scss +++ b/web/scss/features/timeline.scss @@ -829,12 +829,27 @@ button:focus { border-radius: 5px; } -.animate-button-phone { +.animate-button-phone-portrait { left: 140px; bottom: 75px; } -.animate-button-tablet { +.animate-button-phone-portrait-subdaily { + left: 140px; + bottom: 75px; +} + +.animate-button-phone-landscape { + left: 140px; + bottom: 20px; +} + +.animate-button-tablet-portrait { + left: 430px; + bottom: 20px; +} + +.animate-button-tablet-landscape { left: 323px; bottom: 20px; } From 94a7bb841a773eee8b89d0a63bd4b3c4868c7672 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Thu, 29 Sep 2022 13:34:38 -0400 Subject: [PATCH 21/85] reconfigure mobile device layouts for animation button and collapsed widget --- .../timeline-controls/animation-button.js | 6 +- web/js/containers/animation-widget.js | 6 +- web/scss/features/anim-widget.scss | 64 +++++++------------ web/scss/features/timeline.scss | 19 +++++- 4 files changed, 47 insertions(+), 48 deletions(-) diff --git a/web/js/components/timeline/timeline-controls/animation-button.js b/web/js/components/timeline/timeline-controls/animation-button.js index 5d2e95b215..878b2ef44d 100644 --- a/web/js/components/timeline/timeline-controls/animation-button.js +++ b/web/js/components/timeline/timeline-controls/animation-button.js @@ -22,9 +22,9 @@ const AnimationButton = (props) => { const buttonId = 'animate-button'; const labelText = label || 'Set up animation'; const className = isMobilePhone && isPortrait ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` - : isMobilePhone && isLandscape ? 'mobile-animate-button animate-button-phone-landscape' - : isMobileTablet && isPortrait ? 'mobile-animate-button animate-button-tablet-portrait' - : isMobileTablet && isLandscape ? 'mobile-animate-button animate-button-tablet-landscape' + : isMobilePhone && isLandscape ? `mobile-animate-button animate-button-phone-landscape${subdailyID}` + : isMobileTablet && isPortrait ? `mobile-animate-button animate-button-tablet-portrait${subdailyID}` + : isMobileTablet && isLandscape ? `mobile-animate-button animate-button-tablet-landscape${subdailyID}` : ' animate-button' diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index a7bb8d3835..d46df685bf 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -341,9 +341,9 @@ class AnimationWidget extends React.Component { const subdailyID = hasSubdailyLayers ? '-subdaily' : ''; const widgetIDs = isMobilePhone && isPortrait ? `collapsed-animate-widget-phone-portrait${subdailyID}` - : isMobilePhone && isLandscape ? 'collapsed-animate-widget-phone-landscape' - : isMobileTablet && isPortrait ? 'collapsed-animate-widget-tablet-portrait' - : isMobileTablet && isLandscape ? 'collapsed-animate-widget-tablet-landscape' + : isMobilePhone && isLandscape ? `collapsed-animate-widget-phone-landscape${subdailyID}` + : isMobileTablet && isPortrait ? `collapsed-animate-widget-tablet-portrait${subdailyID}` + : isMobileTablet && isLandscape ? `collapsed-animate-widget-tablet-landscape${subdailyID}` : 'collapsed-animate-widget' return !dontShow && ( diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index dc8c21cbfb..3539b95d59 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -13,44 +13,39 @@ left: 210px; } -#collapsed-animate-widget-phone-landscape{ +#collapsed-animate-widget-phone-landscape { bottom: 20px; left: 390px; } -@media (min-width: $tablet-min-width) { - .wv-animation-widget-wrapper { - bottom: 88px; - - &.minimized { - bottom: 83px; - left: 10px; - } - } +#collapsed-animate-widget-phone-landscape-subdaily { + bottom: 20px; + left: 485px; } -/* Mobile Style */ -.wv-animation-widget-wrapper.mobile { - bottom: 0; +#collapsed-animate-widget-tablet-portrait { + bottom: 20px; + left: 400px; +} - &.minimized { - bottom: 20px; - left: 390px; +#collapsed-animate-widget-tablet-portrait-subdaily { + bottom: 20px; + left: 495px; +} - &.landscape { - left: 390px; - } - } +#collapsed-animate-widget-tablet-landscape { + bottom: 20px; + left: 400px; +} - &.subdaily { - bottom: 65px; - left: 165px; +#collapsed-animate-widget-tablet-landscape-subdaily { + bottom: 20px; + left: 495px; +} - &.landscape { - bottom: 20px; - left: 420px; - } - } +/* Mobile Style */ +.wv-animation-widget-wrapper.mobile { + bottom: 0; .wv-animation-widget.minimized { background: transparent; @@ -68,21 +63,12 @@ @media (max-width: 483px) { .wv-animation-widget-wrapper.mobile.minimized { - left: 190px; - & #play-button { width: 100px; } } } -@media (max-width: 483px) { - .wv-animation-widget-wrapper.mobile.minimized.subdaily { - left: 210px; - bottom: 75px; - } -} - .wv-animation-widget .input-range.rc-slider-disabled { cursor: default; } @@ -474,8 +460,6 @@ a .wv-animation-widget-icon { } } - - } } } @@ -521,7 +505,7 @@ a .wv-animation-widget-icon { text-align: center; margin: 0; } -} + } } #mobile-animation-widget-tablet { diff --git a/web/scss/features/timeline.scss b/web/scss/features/timeline.scss index e382b070a4..343aef1fa1 100644 --- a/web/scss/features/timeline.scss +++ b/web/scss/features/timeline.scss @@ -840,12 +840,22 @@ button:focus { } .animate-button-phone-landscape { - left: 140px; + left: 320px; + bottom: 20px; +} + +.animate-button-phone-landscape-subdaily { + left: 420px; bottom: 20px; } .animate-button-tablet-portrait { - left: 430px; + left: 325px; + bottom: 20px; +} + +.animate-button-tablet-portrait-subdaily { + left: 420px; bottom: 20px; } @@ -853,3 +863,8 @@ button:focus { left: 323px; bottom: 20px; } + +.animate-button-tablet-landscape-subdaily { + left: 420px; + bottom: 20px; +} From 27ff2cb4a0e8fad8030ecbe55ec9fb7c8bb75621 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Thu, 29 Sep 2022 14:09:30 -0400 Subject: [PATCH 22/85] conditional desktop styling for animation button and collapsed widget --- .../timeline-controls/animation-button.js | 7 ++- web/js/containers/animation-widget.js | 7 +-- web/scss/features/anim-widget.scss | 43 ++++++++++++++++++- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/web/js/components/timeline/timeline-controls/animation-button.js b/web/js/components/timeline/timeline-controls/animation-button.js index 878b2ef44d..4c180a0857 100644 --- a/web/js/components/timeline/timeline-controls/animation-button.js +++ b/web/js/components/timeline/timeline-controls/animation-button.js @@ -21,12 +21,11 @@ const AnimationButton = (props) => { const subdailyID = hasSubdailyLayers ? '-subdaily' : '' const buttonId = 'animate-button'; const labelText = label || 'Set up animation'; - const className = isMobilePhone && isPortrait ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` + const className = isMobilePhone && isPortrait || !isMobileTablet && screenWidth < breakpoints.extraSmall ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` : isMobilePhone && isLandscape ? `mobile-animate-button animate-button-phone-landscape${subdailyID}` - : isMobileTablet && isPortrait ? `mobile-animate-button animate-button-tablet-portrait${subdailyID}` + : isMobileTablet && isPortrait || !isMobilePhone && screenWidth < breakpoints.small ? `mobile-animate-button animate-button-tablet-portrait${subdailyID}` : isMobileTablet && isLandscape ? `mobile-animate-button animate-button-tablet-landscape${subdailyID}` - : ' animate-button' - + : ' animate-button' return (
Date: Thu, 29 Sep 2022 15:55:01 -0400 Subject: [PATCH 23/85] cleaning up components & css --- .../date-selector/date-range-selector.js | 49 ++++---- .../mobile-custom-interval-selector.js | 51 ++++----- .../timeline-controls/animation-button.js | 16 +-- web/js/containers/animation-widget.js | 105 +++++++----------- web/js/containers/timeline/timeline.js | 12 +- web/scss/features/anim-widget.scss | 46 ++++---- 6 files changed, 129 insertions(+), 150 deletions(-) diff --git a/web/js/components/date-selector/date-range-selector.js b/web/js/components/date-selector/date-range-selector.js index f1edd00488..91b3164dd5 100644 --- a/web/js/components/date-selector/date-range-selector.js +++ b/web/js/components/date-selector/date-range-selector.js @@ -18,30 +18,30 @@ export default function DateRangeSelector (props) { : 'wv-date-range-selector'; return ( -
- -
to
- -
- ) +
+ +
to
+ +
+ ); } DateRangeSelector.propTypes = { @@ -52,6 +52,5 @@ DateRangeSelector.propTypes = { setDateRange: PropTypes.func, minDate: PropTypes.object, maxDate: PropTypes.object, - mobileStyle: PropTypes.bool, subDailyMode: PropTypes.bool, }; diff --git a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js index 363729a548..042f4d3a9f 100644 --- a/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js +++ b/web/js/components/timeline/custom-interval-selector/mobile-custom-interval-selector.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import DeltaInput from './delta-input'; @@ -16,10 +16,7 @@ const MobileCustomIntervalSelector = (props) => { const { changeCustomInterval, customInterval, - customSelected, hasSubdailyLayers, - interval, - selectInterval, customDelta, isMobile, } = props; @@ -28,32 +25,32 @@ const MobileCustomIntervalSelector = (props) => { if (value >= 0 && value <= 1000) { changeCustomInterval(value, customInterval); } - } + }; const changeZoomLevel = (zoomLevel) => { changeCustomInterval(customDelta, TIME_SCALE_TO_NUMBER[zoomLevel]); - } + }; return (
-

Interval Selector

-
- - -
+

Interval Selector

+
+ + +
- ) -} + ); +}; const mapDispatchToProps = (dispatch) => ({ changeCustomInterval: (delta, timeScale) => { @@ -85,12 +82,8 @@ export default connect( MobileCustomIntervalSelector.propTypes = { changeCustomInterval: PropTypes.func, - closeModal: PropTypes.func, customDelta: PropTypes.number, customInterval: PropTypes.number, - customSelected: PropTypes.bool, hasSubdailyLayers: PropTypes.bool, - interval: PropTypes.number, - selectInterval: PropTypes.func, - modalOpen: PropTypes.bool, -}; \ No newline at end of file + isMobile: PropTypes.bool, +}; diff --git a/web/js/components/timeline/timeline-controls/animation-button.js b/web/js/components/timeline/timeline-controls/animation-button.js index 4c180a0857..c09c2ba0db 100644 --- a/web/js/components/timeline/timeline-controls/animation-button.js +++ b/web/js/components/timeline/timeline-controls/animation-button.js @@ -8,7 +8,6 @@ const AnimationButton = (props) => { disabled, label, clickAnimationButton, - isMobile, breakpoints, screenWidth, isLandscape, @@ -18,14 +17,14 @@ const AnimationButton = (props) => { hasSubdailyLayers, } = props; - const subdailyID = hasSubdailyLayers ? '-subdaily' : '' + const subdailyID = hasSubdailyLayers ? '-subdaily' : ''; const buttonId = 'animate-button'; const labelText = label || 'Set up animation'; - const className = isMobilePhone && isPortrait || !isMobileTablet && screenWidth < breakpoints.extraSmall ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` + const className = (isMobilePhone && isPortrait) || (!isMobileTablet && screenWidth < breakpoints.extraSmall) ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` : isMobilePhone && isLandscape ? `mobile-animate-button animate-button-phone-landscape${subdailyID}` - : isMobileTablet && isPortrait || !isMobilePhone && screenWidth < breakpoints.small ? `mobile-animate-button animate-button-tablet-portrait${subdailyID}` + : (isMobileTablet && isPortrait) || (!isMobilePhone && screenWidth < breakpoints.small) ? `mobile-animate-button animate-button-tablet-portrait${subdailyID}` : isMobileTablet && isLandscape ? `mobile-animate-button animate-button-tablet-landscape${subdailyID}` - : ' animate-button' + : ' animate-button'; return (
{ + onMobileDateChangeStart = (date) => { const { onUpdateStartDate } = this.props; const dateObj = new Date(date); - const dateISOFormatted = getISODateFormatted(date); - if (draggerSelected === 'selected') { // dragger A - this.setState({ - draggerTimeState: dateISOFormatted, - }); - } else { // dragger B - this.setState({ - draggerTimeStateB: dateISOFormatted, - }); - } - this.debounceDateUpdate(dateObj, draggerSelected); + this.debounceDateUpdate(dateObj); onUpdateStartDate(dateObj); } - // eslint-disable-next-line react/destructuring-assignment - onMobileDateChangeEnd = (date, draggerSelected = this.props.draggerSelected) => { + onMobileDateChangeEnd = (date) => { const { onUpdateEndDate } = this.props; const dateObj = new Date(date); - const dateISOFormatted = getISODateFormatted(date); - if (draggerSelected === 'selected') { // dragger A - this.setState({ - draggerTimeState: dateISOFormatted, - }); - } else { // dragger B - this.setState({ - draggerTimeStateB: dateISOFormatted, - }); - } - this.debounceDateUpdate(dateObj, draggerSelected); + this.debounceDateUpdate(dateObj); onUpdateEndDate(dateObj); } @@ -341,11 +318,11 @@ class AnimationWidget extends React.Component { + `${isLandscape ? 'landscape ' : ''}`; const subdailyID = hasSubdailyLayers ? '-subdaily' : ''; - const widgetIDs = isMobilePhone && isPortrait || screenWidth < breakpoints.extraSmall ? `collapsed-animate-widget-phone-portrait${subdailyID}` - : isMobilePhone && isLandscape ? `collapsed-animate-widget-phone-landscape${subdailyID}` - : isMobileTablet && isPortrait || screenWidth < breakpoints.small ? `collapsed-animate-widget-tablet-portrait${subdailyID}` - : isMobileTablet && isLandscape ? `collapsed-animate-widget-tablet-landscape${subdailyID}` - : 'collapsed-animate-widget' + const widgetIDs = (isMobilePhone && isPortrait) || (screenWidth < breakpoints.extraSmall) ? `collapsed-animate-widget-phone-portrait${subdailyID}` + : isMobilePhone && isLandscape ? `collapsed-animate-widget-phone-landscape${subdailyID}` + : (isMobileTablet && isPortrait) || (screenWidth < breakpoints.small) ? `collapsed-animate-widget-tablet-portrait${subdailyID}` + : isMobileTablet && isLandscape ? `collapsed-animate-widget-tablet-landscape${subdailyID}` + : 'collapsed-animate-widget'; return !dontShow && (
-
- - Loop - - -
+
+ + Loop + + +
-
- -
+
+ +
@@ -452,26 +428,26 @@ class AnimationWidget extends React.Component {
Start Date - +
End Date - +
@@ -719,7 +695,9 @@ function mapStateToProps(state) { snappedCurrentDate = currentDate; } - const {isMobilePhone, screenWidth, isMobileTablet, breakpoints } = screenSize; + const { + isMobilePhone, screenWidth, isMobileTablet, breakpoints, + } = screenSize; return { appNow, @@ -737,7 +715,6 @@ function mapStateToProps(state) { isDistractionFreeModeActive, isMobile: screenSize.isMobileDevice, isMobilePhone, - screenWidth, isMobileTablet, breakpoints, isLandscape: screenSize.orientation === 'landscape', @@ -811,6 +788,7 @@ RangeHandle.propTypes = { AnimationWidget.propTypes = { appNow: PropTypes.object, animationCustomModalOpen: PropTypes.bool, + breakpoints: PropTypes.object, snappedCurrentDate: PropTypes.object, currentDate: PropTypes.object, customDelta: PropTypes.number, @@ -824,7 +802,10 @@ AnimationWidget.propTypes = { isDistractionFreeModeActive: PropTypes.bool, isEmbedModeActive: PropTypes.bool, isMobile: PropTypes.bool, + isMobilePhone: PropTypes.bool, + isMobileTablet: PropTypes.bool, isPlaying: PropTypes.bool, + isPortrait: PropTypes.bool, isLandscape: PropTypes.bool, looping: PropTypes.bool, maxDate: PropTypes.object, diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index 9b9e52d82d..552f41b189 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -1336,7 +1336,13 @@ function mapStateToProps(state) { const { isDistractionFreeModeActive } = ui; const { isEmbedModeActive } = embed; const isMobile = screenSize.isMobileDevice; - const { breakpoints, screenWidth, isMobilePhone, isMobileTablet, orientation, } = screenSize; + const { + breakpoints, + screenWidth, + isMobilePhone, + isMobileTablet, + orientation, + } = screenSize; const { isAnimatingToEvent } = events; // handle active layer filtering and check for subdaily @@ -1534,6 +1540,10 @@ Timeline.propTypes = { isEmbedModeActive: PropTypes.bool, isGifActive: PropTypes.bool, isMobile: PropTypes.bool, + isMobilePhone: PropTypes.bool, + isMobileTablet: PropTypes.bool, + isLandscape: PropTypes.bool, + isPortrait: PropTypes.bool, isTourActive: PropTypes.bool, leftArrowDisabled: PropTypes.bool, nowButtonDisabled: PropTypes.bool, diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index 9ef3553571..99588a56c8 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -463,7 +463,7 @@ a .wv-animation-widget-icon { text-align: center; font-size: 18px; - & .mobile-date-picker-select-btn{ + & .mobile-date-picker-select-btn { position: relative; background-color: #295f92; bottom: -10%; @@ -489,18 +489,14 @@ a .wv-animation-widget-icon { width: 52px; } + & .mobile-date-picker-select-btn { + position: relative; + background-color: #295f92; - & .mobile-date-picker-select-btn{ - position: relative; - background-color: #295f92; - - & span { - margin: 20px; - - } + & span { + margin: 20px; } - - + } } } } @@ -515,7 +511,7 @@ a .wv-animation-widget-icon { #mobile-animation-widget-mobile-phone-portrait { height: 60%; - bottom: 0px; + bottom: 0; & .wv-minimize { top: 1px; @@ -529,12 +525,11 @@ a .wv-animation-widget-icon { flex-direction: column; width: 100%; - & #loop-button { margin-top: 15px; } - & .wv-slider-case{ + & .wv-slider-case { margin-top: 1.5rem; & .rc-slider { @@ -542,16 +537,16 @@ a .wv-animation-widget-icon { } } - & span{ - text-align: center; - margin: 0; - } -} + & span { + text-align: center; + margin: 0; + } + } } #mobile-animation-widget-tablet { height: 30%; - bottom: 0px; + bottom: 0; & .mobile-animation-widget-container { margin: 0; @@ -566,22 +561,23 @@ a .wv-animation-widget-icon { } } - .mobile-timescale-dropdown { & .dropdown-toggle { font-size: 18px; background-color: #295f92; height: 3em; } + & .dropdown-menu { background-color: $wv-solid-black; border: solid 1px $wv-orange; - } + & .dropdown-item { text-align: center; margin-top: 2px; } + & span { text-align: center; color: white; @@ -590,14 +586,13 @@ a .wv-animation-widget-icon { } } - .custom-animation-interval-container { margin: auto; & .custom-animation-interval-header { font-size: 18px; text-align: center; - line-height: 1.50rem; + line-height: 1.5rem; margin-bottom: 10px; } @@ -606,5 +601,4 @@ a .wv-animation-widget-icon { height: 3em; background-color: #295f92; } - -} \ No newline at end of file +} From 7e958deaff37b9e2ff7af642e1c781839c7c708f Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Thu, 29 Sep 2022 16:07:57 -0400 Subject: [PATCH 24/85] limit max mobile frames to 50 --- web/js/containers/animation-widget.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 570d167427..ac4ebcd3e6 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -80,6 +80,7 @@ const RangeHandle = (props) => { const widgetWidth = 334; const subdailyWidgetWidth = 460; const maxFrames = 300; +const mobileMaxFrames = 50; class AnimationWidget extends React.Component { constructor(props) { @@ -367,10 +368,7 @@ class AnimationWidget extends React.Component { startDate, endDate, subDailyMode, - interval, hasSubdailyLayers, - playDisabled, - numberOfFrames, isMobile, isMobilePhone, isMobileTablet, @@ -674,16 +672,17 @@ function mapStateToProps(state) { const useDelta = customSelected && customDelta ? customDelta : delta; const subDailyInterval = useInterval > 3; const subDailyMode = subDailyInterval && hasSubdailyLayers; + const frameLimit = screenSize.isMobileDevice ? mobileMaxFrames : maxFrames; const numberOfFrames = getNumberOfSteps( startDate, endDate, TIME_SCALE_FROM_NUMBER[useInterval], useDelta, - maxFrames, + frameLimit, ); const currentDate = getSelectedDate(state); let snappedCurrentDate; - if (numberOfFrames < maxFrames) { + if (numberOfFrames < frameLimit) { snappedCurrentDate = snapToIntervalDelta( currentDate, startDate, From 59c4c563ee8d30ddfd8ef10bb0df1a341dba41b0 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Fri, 30 Sep 2022 10:16:17 -0400 Subject: [PATCH 25/85] create and utilize animation collapse redux action --- web/js/containers/animation-widget.js | 21 ++++++++++++-------- web/js/containers/timeline/timeline.js | 27 ++++++++++++++++++++++++-- web/js/modules/animation/actions.js | 6 ++++++ web/js/modules/animation/constants.js | 1 + web/js/modules/animation/reducers.js | 7 +++++++ 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index ac4ebcd3e6..4a53904367 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -49,6 +49,7 @@ import { changeStartDate, changeEndDate, changeStartAndEndDate, + toggleAnimationCollapse, } from '../modules/animation/actions'; import GifButton from '../components/animation-widget/gif-button'; @@ -92,7 +93,6 @@ class AnimationWidget extends React.Component { x: (props.screenWidth / 2) - halfWidgetWidth, y: -25, }, - collapsed: false, collapsedWidgetPosition: { x: 0, y: 0 }, userHasMovedWidget: false, }; @@ -111,7 +111,6 @@ class AnimationWidget extends React.Component { const { isEmbedModeActive } = this.props; if (isEmbedModeActive) { this.setState({ - collapsed: true, widgetPosition: { x: 10, y: 0, @@ -148,9 +147,8 @@ class AnimationWidget extends React.Component { } toggleCollapse() { - this.setState((prevState) => ({ - collapsed: !prevState.collapsed, - })); + const { onToggleAnimationCollapse } = this.props; + onToggleAnimationCollapse(); } /** @@ -576,8 +574,9 @@ class AnimationWidget extends React.Component { delta, interval, numberOfFrames, + isCollapsed, } = this.props; - const { speed, collapsed } = this.state; + const { speed } = this.state; if (!isActive) { return null; @@ -605,7 +604,7 @@ class AnimationWidget extends React.Component { )} {!isDistractionFreeModeActive && ( <> - {collapsed ? this.renderCollapsedWidget() : isMobile ? this.renderMobileWidget() : this.renderExpandedWidget()} + {isCollapsed ? this.renderCollapsedWidget() : isMobile ? this.renderMobileWidget() : this.renderExpandedWidget()} )} @@ -628,7 +627,7 @@ function mapStateToProps(state) { proj, } = state; const { - startDate, endDate, speed, loop, isPlaying, isActive, + startDate, endDate, speed, loop, isPlaying, isActive, isCollapsed, } = animation; const { customSelected, @@ -705,6 +704,7 @@ function mapStateToProps(state) { customSelected, startDate, endDate, + isCollapsed, draggerSelected: isCompareA ? 'selected' : 'selectedB', snappedCurrentDate, currentDate, @@ -772,6 +772,9 @@ const mapDispatchToProps = (dispatch) => ({ onUpdateStartAndEndDate: (startDate, endDate) => { dispatch(changeStartAndEndDate(startDate, endDate)); }, + onToggleAnimationCollapse: () => { + dispatch(toggleAnimationCollapse()); + }, }); export default connect( @@ -798,6 +801,7 @@ AnimationWidget.propTypes = { hasSubdailyLayers: PropTypes.bool, interval: PropTypes.string, isActive: PropTypes.bool, + isCollapsed: PropTypes.bool, isDistractionFreeModeActive: PropTypes.bool, isEmbedModeActive: PropTypes.bool, isMobile: PropTypes.bool, @@ -810,6 +814,7 @@ AnimationWidget.propTypes = { maxDate: PropTypes.object, minDate: PropTypes.object, numberOfFrames: PropTypes.number, + onToggleAnimationCollapse: PropTypes.func, onClose: PropTypes.func, onIntervalSelect: PropTypes.func, onPushLoop: PropTypes.func, diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index 552f41b189..31ff5df6f3 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -60,6 +60,8 @@ import { changeStartAndEndDate, changeStartDate, changeEndDate, + toggleAnimationCollapse, + stop as pauseAnimation, } from '../../modules/animation/actions'; import { TIME_SCALE_FROM_NUMBER, @@ -565,8 +567,19 @@ class Timeline extends React.Component { * @returns {void} */ clickAnimationButton = () => { - const { closeAnimation, isAnimationWidgetOpen, openAnimation } = this.props; - if (isAnimationWidgetOpen) { + const { + closeAnimation, + isAnimationWidgetOpen, + openAnimation, + isMobile, + onPauseAnimation, + onToggleAnimationCollapse, + } = this.props; + + if (isAnimationWidgetOpen && isMobile) { + onToggleAnimationCollapse(); + onPauseAnimation(); + } else if (isAnimationWidgetOpen) { closeAnimation(); } else { googleTagManager.pushEvent({ @@ -1450,6 +1463,7 @@ function mapStateToProps(state) { || compare.active, isDataDownload: sidebar.activeTab === 'download', isAnimationPlaying: animation.isPlaying, + isAnimationCollapsed: animation.isCollapsed, isGifActive: animation.gifActive, timelineCustomModalOpen, isDistractionFreeModeActive, @@ -1506,6 +1520,13 @@ const mapDispatchToProps = (dispatch) => ({ onUpdateStartAndEndDate: (startDate, endDate) => { dispatch(changeStartAndEndDate(startDate, endDate)); }, + // unminimize animation widget in mobile + onToggleAnimationCollapse: () => { + dispatch(toggleAnimationCollapse()); + }, + onPauseAnimation: () => { + dispatch(pauseAnimation()); + }, }); export default connect( @@ -1548,6 +1569,8 @@ Timeline.propTypes = { leftArrowDisabled: PropTypes.bool, nowButtonDisabled: PropTypes.bool, nowOverride: PropTypes.bool, + onPauseAnimation: PropTypes.func, + onToggleAnimationCollapse: PropTypes.func, onUpdateEndDate: PropTypes.func, onUpdateStartAndEndDate: PropTypes.func, onUpdateStartDate: PropTypes.func, diff --git a/web/js/modules/animation/actions.js b/web/js/modules/animation/actions.js index dc693d611a..7aa8d83a1b 100644 --- a/web/js/modules/animation/actions.js +++ b/web/js/modules/animation/actions.js @@ -10,6 +10,7 @@ import { UPDATE_END_DATE, UPDATE_CROP_BOUNDS, TOGGLE_GIF, + COLLAPSE_ANIMATION, } from './constants'; import util from '../../util/util'; import { TIME_SCALE_FROM_NUMBER } from '../date/constants'; @@ -101,3 +102,8 @@ export function toggleComponentGifActive() { type: TOGGLE_GIF, }; } +export function toggleAnimationCollapse() { + return { + type: COLLAPSE_ANIMATION, + }; +} diff --git a/web/js/modules/animation/constants.js b/web/js/modules/animation/constants.js index 90a30b17a4..1a27ba6cf2 100644 --- a/web/js/modules/animation/constants.js +++ b/web/js/modules/animation/constants.js @@ -10,3 +10,4 @@ export const UPDATE_END_DATE = 'ANIMATION/UPDATE_END_DATE'; export const UPDATE_CROP_BOUNDS = 'ANIMATION/UPDATE_CROP_BOUNDS'; export const TOGGLE_GIF = 'ANIMATION/TOGGLE_GIF'; export const KEY_PRESS_ACTION = 'ANIMATION/KEY_PRESS_ACTION'; +export const COLLAPSE_ANIMATION = 'ANIMATION/COLLAPSE_ANIMATION'; diff --git a/web/js/modules/animation/reducers.js b/web/js/modules/animation/reducers.js index 72b2dbfd70..f679e3d1bf 100644 --- a/web/js/modules/animation/reducers.js +++ b/web/js/modules/animation/reducers.js @@ -12,6 +12,7 @@ import { UPDATE_CROP_BOUNDS, TOGGLE_GIF, KEY_PRESS_ACTION, + COLLAPSE_ANIMATION, } from './constants'; export const defaultState = { @@ -23,6 +24,7 @@ export const defaultState = { startDate: undefined, endDate: undefined, boundaries: undefined, + isCollapsed: true, }; export function getInitialState(config) { return { @@ -98,6 +100,11 @@ export function animationReducer(state = defaultState, action) { gifActive: !state.gifActive, isPlaying: false, }; + case COLLAPSE_ANIMATION: + return { + ...state, + isCollapsed: !state.isCollapsed, + }; case KEY_PRESS_ACTION: if (action.keyCode === 32 && state.isActive) { return { From cae764b0b1145138aefd83d75e7f4c73fd4b9603 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Fri, 30 Sep 2022 10:23:46 -0400 Subject: [PATCH 26/85] update start and end date limit in mobile date pickers --- web/js/containers/animation-widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 4a53904367..4177184b3f 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -427,7 +427,7 @@ class AnimationWidget extends React.Component { End Date Date: Fri, 30 Sep 2022 11:58:06 -0400 Subject: [PATCH 27/85] update initial state logic for isCollapsed --- web/js/containers/animation-widget.js | 10 +++++++++- web/js/containers/timeline/timeline.js | 3 +++ web/js/modules/animation/reducers.js | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 4177184b3f..f544150a66 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -108,7 +108,12 @@ class AnimationWidget extends React.Component { } componentDidMount() { - const { isEmbedModeActive } = this.props; + const { + isEmbedModeActive, + isMobile, + onToggleAnimationCollapse, + isCollapsed, + } = this.props; if (isEmbedModeActive) { this.setState({ widgetPosition: { @@ -117,6 +122,9 @@ class AnimationWidget extends React.Component { }, }); } + if (isMobile && !isCollapsed) { + onToggleAnimationCollapse(); + } } componentDidUpdate(prevProps, prevState) { diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index 31ff5df6f3..c024cb550c 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -579,6 +579,9 @@ class Timeline extends React.Component { if (isAnimationWidgetOpen && isMobile) { onToggleAnimationCollapse(); onPauseAnimation(); + } else if (isMobile && !isAnimationWidgetOpen) { + onToggleAnimationCollapse(); + openAnimation(); } else if (isAnimationWidgetOpen) { closeAnimation(); } else { diff --git a/web/js/modules/animation/reducers.js b/web/js/modules/animation/reducers.js index f679e3d1bf..5a67fa9d59 100644 --- a/web/js/modules/animation/reducers.js +++ b/web/js/modules/animation/reducers.js @@ -24,7 +24,7 @@ export const defaultState = { startDate: undefined, endDate: undefined, boundaries: undefined, - isCollapsed: true, + isCollapsed: false, }; export function getInitialState(config) { return { From 0add4a9bbdcc307dd3f33699adb05f9068719f38 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Fri, 30 Sep 2022 13:55:03 -0400 Subject: [PATCH 28/85] mobile-animation-test start --- .../animation/mobile-animation-test.js | 31 +++++++++++++++++++ e2e/reuseables/selectors.js | 4 +++ web/js/containers/animation-widget.js | 6 ---- web/js/containers/timeline/timeline.js | 9 ++++-- 4 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 e2e/features/animation/mobile-animation-test.js diff --git a/e2e/features/animation/mobile-animation-test.js b/e2e/features/animation/mobile-animation-test.js new file mode 100644 index 0000000000..5c974b2224 --- /dev/null +++ b/e2e/features/animation/mobile-animation-test.js @@ -0,0 +1,31 @@ +const skipTour = require('../../reuseables/skip-tour.js'); +const localQueryStrings = require('../../reuseables/querystrings.js'); +const localSelectors = require('../../reuseables/selectors.js'); + +const { + mobileAnimateButton, + mobileAnimationWidget, + +} = localSelectors; + +const TIME_LIMIT = 1000; + + +module.exports = { + before(c) { + skipTour.loadAndSkipTour(c, TIME_LIMIT); + c.url(`${c.globals.url}'?v=-82.73697802714918,27.137724977419197,-71.17181984959728,52.16591344371096&lg=false&t=2022-01-07-T15%3A27%3A49Z`); + c.setWindowSize(500, 800); + }, + //verify that mobile animation button opens mobile animation widget + 'Mobile animate button opens widget': (c) => { + c.useCss().click(mobileAnimateButton); + c.pause(100000); + + + }, + + after(c) { + c.end(); + }, +}; diff --git a/e2e/reuseables/selectors.js b/e2e/reuseables/selectors.js index ad502318de..53557520bb 100644 --- a/e2e/reuseables/selectors.js +++ b/e2e/reuseables/selectors.js @@ -30,6 +30,10 @@ module.exports = { animationIntervalSelector: '#wv-animation-widget #current-interval', animationFrameSlider: '#wv-animation-widget .rc-slider', + // mobile animations + mobileAnimateButton: '#animate-button', + mobileAnimationWidget: '.wv-animation-widget-wrapper-mobile', + // sidebar, layers sidebarContainer: '#products-holder', infoButton: '.wv-layers-info', diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index f544150a66..bd84908ced 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -110,9 +110,6 @@ class AnimationWidget extends React.Component { componentDidMount() { const { isEmbedModeActive, - isMobile, - onToggleAnimationCollapse, - isCollapsed, } = this.props; if (isEmbedModeActive) { this.setState({ @@ -122,9 +119,6 @@ class AnimationWidget extends React.Component { }, }); } - if (isMobile && !isCollapsed) { - onToggleAnimationCollapse(); - } } componentDidUpdate(prevProps, prevState) { diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index c024cb550c..3fdccb4d00 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -165,7 +165,7 @@ class Timeline extends React.Component { } componentDidMount() { - const { nowOverride } = this.props; + const { nowOverride, isMobile, isCollapsed, onToggleAnimationCollapse } = this.props; document.addEventListener('keydown', this.handleKeyDown); document.addEventListener('keyup', this.handleKeyUp); // prevent default react synthetic event passive event listener @@ -177,6 +177,12 @@ class Timeline extends React.Component { this.checkAndUpdateAppNow = this.checkAndUpdateAppNow.bind(this); this.appNowUpdateInterval = setInterval(this.checkAndUpdateAppNow, 60000 * 10); } + + // if (!isMobile && isCollapsed) { + // console.log("testing") + // onToggleAnimationCollapse(); + // } + this.setInitialState(); } @@ -580,7 +586,6 @@ class Timeline extends React.Component { onToggleAnimationCollapse(); onPauseAnimation(); } else if (isMobile && !isAnimationWidgetOpen) { - onToggleAnimationCollapse(); openAnimation(); } else if (isAnimationWidgetOpen) { closeAnimation(); From ce8efe1ec7d6758bf84ed8ecae197df7436c9eec Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Fri, 30 Sep 2022 16:45:45 -0400 Subject: [PATCH 29/85] css updates and e2e test --- .../animation/mobile-animation-test.js | 29 ++++++++++++++---- package-lock.json | 30 +++++++++++++------ web/js/containers/animation-widget.js | 4 +-- web/scss/features/anim-widget.scss | 2 +- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/e2e/features/animation/mobile-animation-test.js b/e2e/features/animation/mobile-animation-test.js index 5c974b2224..b4494fbeee 100644 --- a/e2e/features/animation/mobile-animation-test.js +++ b/e2e/features/animation/mobile-animation-test.js @@ -1,28 +1,45 @@ const skipTour = require('../../reuseables/skip-tour.js'); -const localQueryStrings = require('../../reuseables/querystrings.js'); const localSelectors = require('../../reuseables/selectors.js'); const { mobileAnimateButton, mobileAnimationWidget, - } = localSelectors; const TIME_LIMIT = 1000; - module.exports = { before(c) { skipTour.loadAndSkipTour(c, TIME_LIMIT); c.url(`${c.globals.url}'?v=-82.73697802714918,27.137724977419197,-71.17181984959728,52.16591344371096&lg=false&t=2022-01-07-T15%3A27%3A49Z`); - c.setWindowSize(500, 800); + c.setWindowSize(748, 1024); // iPad Mini dimensions }, - //verify that mobile animation button opens mobile animation widget + 'Mobile animate button opens widget': (c) => { c.useCss().click(mobileAnimateButton); - c.pause(100000); + c.waitForElementVisible(mobileAnimationWidget, (el) => { + c.expect.element('.custom-interval-delta-input').to.have.value.that.equals('1'); + c.expect.element('.dropdown-toggle').text.to.equal('DAY'); + }); + }, + 'Minimizing mobile animation widget opens collapsed animation widget': (c) => { + c.useCss().click('.wv-minimize'); + c.waitForElementVisible('#collapsed-animate-widget-tablet-portrait', TIME_LIMIT); + }, + + 'Playing the animation changes the date of the mobile date picker': (c) => { + c.useCss().click('#collapsed-animate-widget-tablet-portrait'); + c.pause(1000); + c.expect.element('.mobile-date-picker-select-btn-text span').text.to.equal('2022 JAN 17'); + }, + 'Pressing the animation button brings up the mobile animation widget with the same information': (c) => { + c.useCss().click(mobileAnimateButton); + c.waitForElementVisible(mobileAnimationWidget, TIME_LIMIT, (el) => { + c.expect.element('#mobile-animation-start-date .mobile-date-picker-select-btn span').text.to.equal('2022 JAN 07'); + c.expect.element('#mobile-animation-end-date .mobile-date-picker-select-btn span').text.to.equal('2022 JAN 17'); + }); }, after(c) { diff --git a/package-lock.json b/package-lock.json index 6a3c9e6c60..a5949e7955 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2986,9 +2986,10 @@ } }, "node_modules/@testim/chrome-version": { - "version": "1.1.2", - "dev": true, - "license": "MIT" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", + "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", + "dev": true }, "node_modules/@tootallnate/once": { "version": "1.1.2", @@ -5659,9 +5660,10 @@ }, "node_modules/chromedriver": { "version": "104.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-104.0.0.tgz", + "integrity": "sha512-zbHZutN2ATo19xA6nXwwLn+KueD/5w8ap5m4b6bCb8MIaRFnyDwMbFoy7oFAjlSMpCFL3KSaZRiWUwjj//N3yQ==", "dev": true, "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { "@testim/chrome-version": "^1.1.2", "axios": "^0.27.2", @@ -7340,9 +7342,10 @@ } }, "node_modules/del": { - "version": "6.0.0", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, - "license": "MIT", "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -11281,8 +11284,9 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -25323,7 +25327,9 @@ } }, "@testim/chrome-version": { - "version": "1.1.2", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", + "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", "dev": true }, "@tootallnate/once": { @@ -27309,6 +27315,8 @@ }, "chromedriver": { "version": "104.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-104.0.0.tgz", + "integrity": "sha512-zbHZutN2ATo19xA6nXwwLn+KueD/5w8ap5m4b6bCb8MIaRFnyDwMbFoy7oFAjlSMpCFL3KSaZRiWUwjj//N3yQ==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.2", @@ -28469,7 +28477,9 @@ } }, "del": { - "version": "6.0.0", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "requires": { "globby": "^11.0.1", @@ -31105,6 +31115,8 @@ }, "is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-obj": { diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index bd84908ced..57722edca0 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -424,7 +424,7 @@ class AnimationWidget extends React.Component {
-
+
Start Date
-
+
End Date Date: Mon, 3 Oct 2022 12:07:02 -0400 Subject: [PATCH 30/85] fix timeline button positions & fix mobile date picker prop types --- .../animation/mobile-animation-test.js | 6 ++-- .../components/timeline/mobile-date-picker.js | 1 + .../timeline-controls/animation-button.js | 2 +- web/js/containers/animation-widget.js | 21 +++++++++----- web/js/containers/timeline/timeline.js | 29 +++++++++---------- web/scss/features/anim-widget.scss | 4 ++- 6 files changed, 35 insertions(+), 28 deletions(-) diff --git a/e2e/features/animation/mobile-animation-test.js b/e2e/features/animation/mobile-animation-test.js index b4494fbeee..13ff113b38 100644 --- a/e2e/features/animation/mobile-animation-test.js +++ b/e2e/features/animation/mobile-animation-test.js @@ -18,8 +18,8 @@ module.exports = { 'Mobile animate button opens widget': (c) => { c.useCss().click(mobileAnimateButton); c.waitForElementVisible(mobileAnimationWidget, (el) => { - c.expect.element('.custom-interval-delta-input').to.have.value.that.equals('1'); - c.expect.element('.dropdown-toggle').text.to.equal('DAY'); + c.expect.element('.custom-interval-delta-input').to.have.value.that.equals('1'); + c.expect.element('.dropdown-toggle').text.to.equal('DAY'); }); }, @@ -39,7 +39,7 @@ module.exports = { c.waitForElementVisible(mobileAnimationWidget, TIME_LIMIT, (el) => { c.expect.element('#mobile-animation-start-date .mobile-date-picker-select-btn span').text.to.equal('2022 JAN 07'); c.expect.element('#mobile-animation-end-date .mobile-date-picker-select-btn span').text.to.equal('2022 JAN 17'); - }); + }); }, after(c) { diff --git a/web/js/components/timeline/mobile-date-picker.js b/web/js/components/timeline/mobile-date-picker.js index 119a2a3635..fa27e9d864 100644 --- a/web/js/components/timeline/mobile-date-picker.js +++ b/web/js/components/timeline/mobile-date-picker.js @@ -69,6 +69,7 @@ class MobileDatePicker extends Component { componentDidUpdate(prevProps) { const { date, endDateLimit } = this.props; + console.log('endDateLimit from MDP', endDateLimit); // update on new endDateLimit or changed date if (prevProps.endDateLimit !== endDateLimit || prevProps.date !== date) { this.setInitDates(); diff --git a/web/js/components/timeline/timeline-controls/animation-button.js b/web/js/components/timeline/timeline-controls/animation-button.js index c09c2ba0db..2e99979538 100644 --- a/web/js/components/timeline/timeline-controls/animation-button.js +++ b/web/js/components/timeline/timeline-controls/animation-button.js @@ -20,7 +20,7 @@ const AnimationButton = (props) => { const subdailyID = hasSubdailyLayers ? '-subdaily' : ''; const buttonId = 'animate-button'; const labelText = label || 'Set up animation'; - const className = (isMobilePhone && isPortrait) || (!isMobileTablet && screenWidth < breakpoints.extraSmall) ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` + const className = (isMobilePhone && isPortrait) || (!isMobileTablet && screenWidth < 670 && hasSubdailyLayers) || (!isMobileTablet && screenWidth < 575 && !hasSubdailyLayers) ? `mobile-animate-button animate-button-phone-portrait${subdailyID}` : isMobilePhone && isLandscape ? `mobile-animate-button animate-button-phone-landscape${subdailyID}` : (isMobileTablet && isPortrait) || (!isMobilePhone && screenWidth < breakpoints.small) ? `mobile-animate-button animate-button-tablet-portrait${subdailyID}` : isMobileTablet && isLandscape ? `mobile-animate-button animate-button-tablet-landscape${subdailyID}` diff --git a/web/js/containers/animation-widget.js b/web/js/containers/animation-widget.js index 57722edca0..2090e35c88 100644 --- a/web/js/containers/animation-widget.js +++ b/web/js/containers/animation-widget.js @@ -319,7 +319,7 @@ class AnimationWidget extends React.Component { + `${isLandscape ? 'landscape ' : ''}`; const subdailyID = hasSubdailyLayers ? '-subdaily' : ''; - const widgetIDs = (isMobilePhone && isPortrait) || (screenWidth < breakpoints.extraSmall) ? `collapsed-animate-widget-phone-portrait${subdailyID}` + const widgetIDs = (isMobilePhone && isPortrait) || (screenWidth < 670 && hasSubdailyLayers) || (screenWidth < 575 && !hasSubdailyLayers) ? `collapsed-animate-widget-phone-portrait${subdailyID}` : isMobilePhone && isLandscape ? `collapsed-animate-widget-phone-landscape${subdailyID}` : (isMobileTablet && isPortrait) || (screenWidth < breakpoints.small) ? `collapsed-animate-widget-tablet-portrait${subdailyID}` : isMobileTablet && isLandscape ? `collapsed-animate-widget-tablet-landscape${subdailyID}` @@ -373,18 +373,21 @@ class AnimationWidget extends React.Component { isMobilePhone, isMobileTablet, screenWidth, + screenHeight, breakpoints, isLandscape, isPortrait, } = this.props; const { speed } = this.state; - const mobileID = isMobilePhone && isLandscape ? 'mobile-phone-landscape' - : isMobilePhone && isPortrait ? 'mobile-phone-portrait' + const mobileID = (isMobilePhone && isLandscape) || (!isMobilePhone && !isMobileTablet && screenHeight < 800) ? 'mobile-phone-landscape' + : (isMobilePhone && isPortrait) || (!isMobilePhone && !isMobileTablet && screenWidth < 550) ? 'mobile-phone-portrait' : isMobileTablet || screenWidth <= breakpoints.small ? 'tablet' : 'mobile'; const minimumDate = getISODateFormatted(minDate); const maximumDate = getISODateFormatted(maxDate); + const endingDate = getISODateFormatted(endDate); + const startingDate = getISODateFormatted(startDate); return (
@@ -429,7 +432,7 @@ class AnimationWidget extends React.Component { End Date promiseImageryForTime(state, date), isEmbedModeActive, - playDisabled: numberOfFrames >= maxFrames || numberOfFrames === 1, + playDisabled: !screenSize.isMobileDevice ? numberOfFrames >= maxFrames || numberOfFrames === 1 : numberOfFrames >= mobileMaxFrames || numberOfFrames === 1, }; } @@ -828,6 +832,7 @@ AnimationWidget.propTypes = { onUpdateStartDate: PropTypes.func, playDisabled: PropTypes.bool, promiseImageryForTime: PropTypes.func, + screenHeight: PropTypes.number, screenWidth: PropTypes.number, selectDate: PropTypes.func, sliderLabel: PropTypes.string, diff --git a/web/js/containers/timeline/timeline.js b/web/js/containers/timeline/timeline.js index 3fdccb4d00..6d61aaf773 100644 --- a/web/js/containers/timeline/timeline.js +++ b/web/js/containers/timeline/timeline.js @@ -165,7 +165,9 @@ class Timeline extends React.Component { } componentDidMount() { - const { nowOverride, isMobile, isCollapsed, onToggleAnimationCollapse } = this.props; + const { + nowOverride, + } = this.props; document.addEventListener('keydown', this.handleKeyDown); document.addEventListener('keyup', this.handleKeyUp); // prevent default react synthetic event passive event listener @@ -178,11 +180,6 @@ class Timeline extends React.Component { this.appNowUpdateInterval = setInterval(this.checkAndUpdateAppNow, 60000 * 10); } - // if (!isMobile && isCollapsed) { - // console.log("testing") - // onToggleAnimationCollapse(); - // } - this.setInitialState(); } @@ -889,8 +886,6 @@ class Timeline extends React.Component { screenWidth, } = this.props; - const isScreenWidthLessThan484 = screenWidth < 484; - // default positioning let mobileLeft = 190; let mobileBottom = 20; @@ -907,7 +902,7 @@ class Timeline extends React.Component { if (isEmbedModeActive) { mobileLeft = 220; } - } else if (isScreenWidthLessThan484) { + } else if (screenWidth < 575) { mobileLeft = isCompareModeActive ? 112 : 10; mobileBottom = 75; if (isEmbedModeActive) { @@ -977,6 +972,7 @@ class Timeline extends React.Component {
+ {!isCompareModeActive && ( + + )} +
); diff --git a/web/scss/features/anim-widget.scss b/web/scss/features/anim-widget.scss index d9dc0e51ea..61da236601 100644 --- a/web/scss/features/anim-widget.scss +++ b/web/scss/features/anim-widget.scss @@ -417,6 +417,7 @@ a .wv-animation-widget-icon { height: 100%; box-sizing: border-box; border: 4px solid #555; + bottom: 0; & .wv-animation-widget { margin: 0; @@ -448,6 +449,7 @@ a .wv-animation-widget-icon { #slider-case-row { grid-column: 1 / -1; width: 100%; + margin-top: 1rem; & .wv-slider-label { text-align: center; @@ -545,7 +547,7 @@ a .wv-animation-widget-icon { } #mobile-animation-widget-tablet { - height: 30%; + height: 32%; bottom: 0; & .mobile-animation-widget-container { From 4af9236b0888b064929509295dd46c9d935912b8 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Mon, 3 Oct 2022 14:19:18 -0400 Subject: [PATCH 31/85] recalc measurements on crs change --- web/js/components/map/ol-measure-tool.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/js/components/map/ol-measure-tool.js b/web/js/components/map/ol-measure-tool.js index 935692bd43..7e793e6241 100644 --- a/web/js/components/map/ol-measure-tool.js +++ b/web/js/components/map/ol-measure-tool.js @@ -123,6 +123,8 @@ function OlMeasureTool (props) { useEffect(recalculateAllMeasurements, [unitOfMeasure]); + useEffect(recalculateAllMeasurements, [crs]); + const areaBgFill = new OlStyleFill({ color: 'rgba(213, 78, 33, 0.1)', }); From 2c7ff53c82c286b8cb124b01ff28ab173fefa680 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Mon, 3 Oct 2022 14:52:59 -0400 Subject: [PATCH 32/85] update e2e test --- e2e/features/animation/mobile-animation-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/features/animation/mobile-animation-test.js b/e2e/features/animation/mobile-animation-test.js index 13ff113b38..bfa5f069ae 100644 --- a/e2e/features/animation/mobile-animation-test.js +++ b/e2e/features/animation/mobile-animation-test.js @@ -17,7 +17,7 @@ module.exports = { 'Mobile animate button opens widget': (c) => { c.useCss().click(mobileAnimateButton); - c.waitForElementVisible(mobileAnimationWidget, (el) => { + c.waitForElementVisible(mobileAnimationWidget, TIME_LIMIT, (el) => { c.expect.element('.custom-interval-delta-input').to.have.value.that.equals('1'); c.expect.element('.dropdown-toggle').text.to.equal('DAY'); }); From 41e7d536bb2c0d17c8680fda67713cf2381ddf13 Mon Sep 17 00:00:00 2001 From: ryanweiler92 Date: Mon, 3 Oct 2022 15:29:21 -0400 Subject: [PATCH 33/85] update dateline text logic --- web/js/components/dateline/line.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/js/components/dateline/line.js b/web/js/components/dateline/line.js index f85f49d3e7..fbd3e649eb 100644 --- a/web/js/components/dateline/line.js +++ b/web/js/components/dateline/line.js @@ -53,7 +53,7 @@ export default function Line (props) { useEffect(() => { if (overlay !== '') return overlay.setPosition([lineX, lineY]); if (!alwaysShow && alwaysShow !== prevAlwaysShow) { - toggleTextActive(true); + toggleTextActive(false); } }); From 10ad5dfb029ac067d2a005c3d900497148d5926f Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Fri, 14 Oct 2022 16:34:36 -0400 Subject: [PATCH 34/85] Beginning to add a layer (Vector Flow Test 1) to the layers list. --- .../metadata/layers/vectorflowtest1/vft1.md | 3 +++ .../common/config/wv.json/layerOrder.json | 1 + .../layers/vector_flow_test_1/vft1.json | 17 +++++++++++++++++ .../measurements/Vector Flow Test 1.json | 19 +++++++++++++++++++ schemas/layer-config.json | 1 + 5 files changed, 41 insertions(+) create mode 100644 config/default/common/config/metadata/layers/vectorflowtest1/vft1.md create mode 100644 config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json create mode 100644 config/default/common/config/wv.json/measurements/Vector Flow Test 1.json diff --git a/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md b/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md new file mode 100644 index 0000000000..c675e1ea10 --- /dev/null +++ b/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md @@ -0,0 +1,3 @@ +Vector Flow Test 1 layer is used for development purposes only. + +References: TBD diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index ce31c20aa7..6dd40827eb 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,5 +1,6 @@ { "layerOrder": [ + "Vector_Flow_Test_1", "VIIRS_SNPP_CorrectedReflectance_TrueColor", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1", diff --git a/config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json b/config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json new file mode 100644 index 0000000000..bac382e5f6 --- /dev/null +++ b/config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json @@ -0,0 +1,17 @@ +{ + "layers": { + "Vector_Flow_Test_1": { + "id": "Vector_Flow_Test_1", + "description": "Vector Flow Test 1 description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Wind Speed", + "projections": { + "geographic": { + "source": "GIBS:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/measurements/Vector Flow Test 1.json b/config/default/common/config/wv.json/measurements/Vector Flow Test 1.json new file mode 100644 index 0000000000..7f8f0dfb00 --- /dev/null +++ b/config/default/common/config/wv.json/measurements/Vector Flow Test 1.json @@ -0,0 +1,19 @@ +{ + "measurements": { + "Vector Flow Test 1": { + "id": "Vector_Flow_Test_1", + "title": "Vector Flow Test 1", + "subtitle": "Vector_Flow_Test_1 Testing", + "sources": { + "tbd": { + "id": "Vector_Flow_Test_1", + "title": "Vector_Flow_Test_1 Title", + "description": "", + "image": "", + "settings": [ + ] + } + } + } + } +} diff --git a/schemas/layer-config.json b/schemas/layer-config.json index d101e2583e..216b665020 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -175,6 +175,7 @@ "Urban Expansion", "Urban Extents", "Vectors", + "Vector Flow Test 1", "Vegetation Indices", "Vegetation Light Use Efficiency", "Volcano Hazard", From 70718d32abd45c7970351c3aab0979ec9e816caa Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Fri, 14 Oct 2022 16:47:32 -0400 Subject: [PATCH 35/85] Added temporary imagery associated with the test layer --- .../previews/geographic/Vector_Flow_Test_1.jpg | Bin 0 -> 76778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 web/images/layers/previews/geographic/Vector_Flow_Test_1.jpg diff --git a/web/images/layers/previews/geographic/Vector_Flow_Test_1.jpg b/web/images/layers/previews/geographic/Vector_Flow_Test_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27fd7cc8d6910ba40a545e5237d7bdc6fbaa4e28 GIT binary patch literal 76778 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

s?9*%BTni#!sW}%#GP;w~oduwx|!Jf2Ecu5(qI4 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 aW@ct)W`C^A%*@Qp%*@Y0+Fd#S0RP#3f$1** literal 0 HcmV?d00001 From a0156f5c6058900a91c1959b05d6472554b2a5e6 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 19 Oct 2022 10:07:55 -0400 Subject: [PATCH 36/85] Fixed some typos, comments & method definitions. --- web/js/map/layerbuilder.js | 11 +++++++---- web/js/map/ui.js | 6 ++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 65dc8e0c8e..16f37f55f0 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -87,12 +87,12 @@ export default function mapLayerBuilder(config, cache, store) { }; /** - * Create a new OpenLayers Layer + * Create a new OpenLayers Layer Wrapper * @param {object} def * @param {object} key * @param {object} options * @param {object} dateOptions - * @param {object} granuleAttributes + * @param {object} granuleAttributes // THIS PARAMETER IS NOT USED! * @returns {object} Openlayers TileLayer or LayerGroup */ const createLayerWrapper = async (def, key, options, dateOptions) => { @@ -274,7 +274,7 @@ export default function mapLayerBuilder(config, cache, store) { * @static * @param {Object} def - Layer properties * @param {number} options - Layer options - * @param {boolean} precache + * @param {boolean} precache // This does not align with the parameters of the layerKey function * @returns {object} layer key Object */ const layerKey = (def, options, state) => { @@ -434,13 +434,14 @@ export default function mapLayerBuilder(config, cache, store) { }); } - /** + /** Create a new Vector Layer * * @param {object} def - Layer Specs * @param {object} options - Layer options * @param {number} day * @param {object} state * @param {object} attributes + * @returns {object} OpenLayers Vector layer */ const createLayerVector = function(def, options, day, state, attributes) { const { proj, animation } = state; @@ -555,6 +556,8 @@ export default function mapLayerBuilder(config, cache, store) { * @static * @param {object} def - Layer Specs * @param {object} options - Layer options + * @param {number} day + * @param {object} state * @returns {object} OpenLayers WMS layer */ const createLayerWMS = function(def, options, day, state) { diff --git a/web/js/map/ui.js b/web/js/map/ui.js index 3febaae29c..a0315faf6a 100644 --- a/web/js/map/ui.js +++ b/web/js/map/ui.js @@ -281,7 +281,7 @@ export default function mapui(models, config, store) { * the WMS tiles with Vector tiles. * * We also disable granule layer state updates due to performance reasons and so - * need to trigger a layer state update once animation fisnishes. + * need to trigger a layer state update once animation finishes. */ const onStopAnimation = function() { const state = store.getState(); @@ -319,8 +319,6 @@ export default function mapui(models, config, store) { updateProjection(true); }; - - /* * Remove coordinates marker from all projections * @@ -1054,7 +1052,7 @@ export default function mapui(models, config, store) { } /* - * Return an Index value for a layer in the OPenLayers layer array + * Return an Index value for a layer in the OpenLayers layer array * @method findLayerIndex * @param {object} def - Layer Specs From 67f1d33fbb3e6e4cd025562a0dbfac8598b08dd3 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 19 Oct 2022 10:29:07 -0400 Subject: [PATCH 37/85] Replaced all 'Vector Flow Test...' strings with 'ascat'. --- .../metadata/layers/vectorflowtest1/vft1.md | 2 +- .../common/config/wv.json/layerOrder.json | 2 +- .../vft1.json => ascat/ascat.json} | 6 +++--- .../measurements/Vector Flow Test 1.json | 19 ------------------ .../config/wv.json/measurements/ascat.json | 19 ++++++++++++++++++ schemas/layer-config.json | 2 +- .../{Vector_Flow_Test_1.jpg => ascat.jpg} | Bin 7 files changed, 25 insertions(+), 25 deletions(-) rename config/default/common/config/wv.json/layers/{vector_flow_test_1/vft1.json => ascat/ascat.json} (66%) delete mode 100644 config/default/common/config/wv.json/measurements/Vector Flow Test 1.json create mode 100644 config/default/common/config/wv.json/measurements/ascat.json rename web/images/layers/previews/geographic/{Vector_Flow_Test_1.jpg => ascat.jpg} (100%) diff --git a/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md b/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md index c675e1ea10..8db4345647 100644 --- a/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md +++ b/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md @@ -1,3 +1,3 @@ -Vector Flow Test 1 layer is used for development purposes only. +ascat layer is used for development purposes only. References: TBD diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 6dd40827eb..cba0a31b0b 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,6 +1,6 @@ { "layerOrder": [ - "Vector_Flow_Test_1", + "ASCAT", "VIIRS_SNPP_CorrectedReflectance_TrueColor", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1", diff --git a/config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json b/config/default/common/config/wv.json/layers/ascat/ascat.json similarity index 66% rename from config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json rename to config/default/common/config/wv.json/layers/ascat/ascat.json index bac382e5f6..794faa50aa 100644 --- a/config/default/common/config/wv.json/layers/vector_flow_test_1/vft1.json +++ b/config/default/common/config/wv.json/layers/ascat/ascat.json @@ -1,8 +1,8 @@ { "layers": { - "Vector_Flow_Test_1": { - "id": "Vector_Flow_Test_1", - "description": "Vector Flow Test 1 description", + "ascat": { + "id": "ascat", + "description": "ascat description", "tags": "", "group": "overlays", "type": "vector", diff --git a/config/default/common/config/wv.json/measurements/Vector Flow Test 1.json b/config/default/common/config/wv.json/measurements/Vector Flow Test 1.json deleted file mode 100644 index 7f8f0dfb00..0000000000 --- a/config/default/common/config/wv.json/measurements/Vector Flow Test 1.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "measurements": { - "Vector Flow Test 1": { - "id": "Vector_Flow_Test_1", - "title": "Vector Flow Test 1", - "subtitle": "Vector_Flow_Test_1 Testing", - "sources": { - "tbd": { - "id": "Vector_Flow_Test_1", - "title": "Vector_Flow_Test_1 Title", - "description": "", - "image": "", - "settings": [ - ] - } - } - } - } -} diff --git a/config/default/common/config/wv.json/measurements/ascat.json b/config/default/common/config/wv.json/measurements/ascat.json new file mode 100644 index 0000000000..cf163244b2 --- /dev/null +++ b/config/default/common/config/wv.json/measurements/ascat.json @@ -0,0 +1,19 @@ +{ + "measurements": { + "ascat": { + "id": "ascat", + "title": "ascat title", + "subtitle": "ascat Testing", + "sources": { + "tbd": { + "id": "ascat", + "title": "ascat Title", + "description": "", + "image": "", + "settings": [ + ] + } + } + } + } +} diff --git a/schemas/layer-config.json b/schemas/layer-config.json index 216b665020..8f5e80e10e 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -175,7 +175,7 @@ "Urban Expansion", "Urban Extents", "Vectors", - "Vector Flow Test 1", + "ascat", "Vegetation Indices", "Vegetation Light Use Efficiency", "Volcano Hazard", diff --git a/web/images/layers/previews/geographic/Vector_Flow_Test_1.jpg b/web/images/layers/previews/geographic/ascat.jpg similarity index 100% rename from web/images/layers/previews/geographic/Vector_Flow_Test_1.jpg rename to web/images/layers/previews/geographic/ascat.jpg From 03add5c58d7cf30d9987cbafc5c0cdc49e06916b Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 19 Oct 2022 11:50:32 -0400 Subject: [PATCH 38/85] Added & adjusted more ascat config files. --- .../config/metadata/layers/ascat/ascat.md | 19 +++++++++++++++++++ .../common/config/wv.json/layerOrder.json | 2 +- .../config/wv.json/layers/ascat/ascat.json | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 config/default/common/config/metadata/layers/ascat/ascat.md diff --git a/config/default/common/config/metadata/layers/ascat/ascat.md b/config/default/common/config/metadata/layers/ascat/ascat.md new file mode 100644 index 0000000000..071d2b8c24 --- /dev/null +++ b/config/default/common/config/metadata/layers/ascat/ascat.md @@ -0,0 +1,19 @@ +The ascat layer displays... + +#### Image Resolution +?? km/pixel + +#### Data Product +Image initially produced with ??? data.
+Near Real-Time Product: Sed ac arcu et nisl varius aliquet. Nunc ornare tortor elit, vel porta velit volutpat id. Aenean id metus vel massa ultrices hendrerit.
+Science Quality Product: Donec suscipit orci ac viverra pharetra. Morbi hendrerit ligula urna, sed faucibus enim condimentum et. Cras convallis aliquam cursus.
+Field name: Aliquam urna dolor, varius id neque et, suscipit egestas purus. Morbi luctus, lacus eget volutpat ornare, nisi odio condimentum lacus, dignissim accumsan magna ex vitae dolor.
+Resolution: ?? km/pixel at nadir + +#### Coverage +Spatial Coverage: ???
+Overpasses: ???
+Orbit: ??? + +#### References +Data Product: ascat \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index cba0a31b0b..346aff5e54 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,6 +1,6 @@ { "layerOrder": [ - "ASCAT", + "ascat", "VIIRS_SNPP_CorrectedReflectance_TrueColor", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1", diff --git a/config/default/common/config/wv.json/layers/ascat/ascat.json b/config/default/common/config/wv.json/layers/ascat/ascat.json index 794faa50aa..25f2c22ead 100644 --- a/config/default/common/config/wv.json/layers/ascat/ascat.json +++ b/config/default/common/config/wv.json/layers/ascat/ascat.json @@ -2,6 +2,8 @@ "layers": { "ascat": { "id": "ascat", + "title": "ascat title", + "subtitle": "ascat subtitle", "description": "ascat description", "tags": "", "group": "overlays", From 4de3a05f8a2e782b685d6e1cee046182afa03d71 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 19 Oct 2022 13:46:36 -0400 Subject: [PATCH 39/85] Updated file configs for ascat layer (thanks Jason K). --- .../config/wv.json/layers/ascat/ascat.json | 8 +++-- config/default/common/vectorstyles/ascat.json | 34 +++++++++++++++++++ config/default/release/config.json | 11 ++++++ .../release/config/wv.json/sources.json | 3 ++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 config/default/common/vectorstyles/ascat.json diff --git a/config/default/common/config/wv.json/layers/ascat/ascat.json b/config/default/common/config/wv.json/layers/ascat/ascat.json index 25f2c22ead..5638a639e3 100644 --- a/config/default/common/config/wv.json/layers/ascat/ascat.json +++ b/config/default/common/config/wv.json/layers/ascat/ascat.json @@ -8,10 +8,14 @@ "tags": "", "group": "overlays", "type": "vector", - "layergroup": "Wind Speed", + "layergroup": "Vectors", + "vectorStyle": { + "id": "ascat" + }, + "transition": true, "projections": { "geographic": { - "source": "GIBS:geographic" + "source": "GITC:geographic" } } } diff --git a/config/default/common/vectorstyles/ascat.json b/config/default/common/vectorstyles/ascat.json new file mode 100644 index 0000000000..435afcccbb --- /dev/null +++ b/config/default/common/vectorstyles/ascat.json @@ -0,0 +1,34 @@ +{ + "version": 8, + "name": "ascat", + "sources": { + "ascat": { + "type": "vector", + "tiles": [ + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt" + ] + } + }, + "layers": [ + { + "id": "ascat", + "source": "ascat", + "source-layer": "ascat", + "type": "circle", + "paint": { + "circle-radius": [ + "step", + [ + "zoom" + ], + 1, + 1, + 2, + 3, + 3 + ], + "circle-color": "rgb(236, 98, 16)" + } + } + ] +} \ No newline at end of file diff --git a/config/default/release/config.json b/config/default/release/config.json index c80b758f7d..6d4177e5c6 100644 --- a/config/default/release/config.json +++ b/config/default/release/config.json @@ -11,6 +11,10 @@ { "from": "https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/wmts.cgi?request=GetCapabilities", "to": "gibs-antarctic.xml" + }, + { + "from": "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?request=GetCapabilities", + "to": "gitc-geographic.xml" } ], "wv-options-wmts": [ @@ -21,6 +25,13 @@ "projection": "geographic", "maxResolution": 0.5625 }, + { + "source": "GITC:geographic", + "from": "gitc-geographic.xml", + "to": "gitc-geographic.json", + "projection": "geographic", + "maxResolution": 0.5625 + }, { "source": "GIBS:arctic", "from": "gibs-arctic.xml", diff --git a/config/default/release/config/wv.json/sources.json b/config/default/release/config/wv.json/sources.json index 49c7af1eb0..b91dc2e12d 100644 --- a/config/default/release/config/wv.json/sources.json +++ b/config/default/release/config/wv.json/sources.json @@ -9,6 +9,9 @@ "GIBS:geographic": { "url": "https://gibs-{a-c}.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi" }, + "GITC:geographic": { + "url": "https://sit.gitc-{a-c}.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi" + }, "GIBS:wms": { "url": "https://gibs-{a-c}.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi" }, From 9a5163e612e45bc1d9e3adbb87bb45183777c0ec Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 20 Oct 2022 09:31:38 -0400 Subject: [PATCH 40/85] Minor tweaks. --- config/default/release/config/wv.json/sources.json | 2 +- tasks/python3/processVectorStyles.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/default/release/config/wv.json/sources.json b/config/default/release/config/wv.json/sources.json index b91dc2e12d..4f2d77b347 100644 --- a/config/default/release/config/wv.json/sources.json +++ b/config/default/release/config/wv.json/sources.json @@ -10,7 +10,7 @@ "url": "https://gibs-{a-c}.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi" }, "GITC:geographic": { - "url": "https://sit.gitc-{a-c}.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi" + "url": "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi" }, "GIBS:wms": { "url": "https://gibs-{a-c}.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi" diff --git a/tasks/python3/processVectorStyles.py b/tasks/python3/processVectorStyles.py index 57c29a70d0..8d3ce92767 100755 --- a/tasks/python3/processVectorStyles.py +++ b/tasks/python3/processVectorStyles.py @@ -25,6 +25,8 @@ vectordata_input_dir = args[1] output_dir = args[2] +print(config_file) + with open(config_file, "r", encoding="utf-8") as fp: config = json.load(fp) From 6401fd9550fbfe1a0be604dda0c253bc507b30d2 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Fri, 21 Oct 2022 10:47:54 -0400 Subject: [PATCH 41/85] Temporarily kludged a glStyle value for ascat layer. --- web/js/modules/vector-styles/selectors.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 43f073adc7..7fe1a32c56 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -104,7 +104,13 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const { resolutions } = proj.selected; const layerId = def.id; const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; - const glStyle = vectorStyles[styleId]; + let glStyle = vectorStyles[styleId]; + + // Forcing a valid glStyle if one cannot be found. + if (glStyle === undefined) { + console.log('Forcing glStyle...'); + glStyle = vectorStyles.FIRMS_VIIRS_Thermal_Anomalies; + } if (!layer || layer.isWMS) { return; // WMS breakpoint tile From f109a3119e26db319924777bcc7df02be3c81d83 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 24 Oct 2022 11:50:21 -0400 Subject: [PATCH 42/85] ASCAT data is loading statically. --- config/default/common/vectorstyles/ascat.json | 2 +- web/js/map/layerbuilder.js | 1 + web/js/modules/vector-styles/selectors.js | 59 ++++++++++++++++++- web/js/modules/vector-styles/util.js | 5 ++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/config/default/common/vectorstyles/ascat.json b/config/default/common/vectorstyles/ascat.json index 435afcccbb..af1915902b 100644 --- a/config/default/common/vectorstyles/ascat.json +++ b/config/default/common/vectorstyles/ascat.json @@ -5,7 +5,7 @@ "ascat": { "type": "vector", "tiles": [ - "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt" + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt" ] } }, diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 16f37f55f0..5e22e5d1d7 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -444,6 +444,7 @@ export default function mapLayerBuilder(config, cache, store) { * @returns {object} OpenLayers Vector layer */ const createLayerVector = function(def, options, day, state, attributes) { + // const { proj, animation } = state; let date; let gridExtent; diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 7fe1a32c56..f48f38f793 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -24,6 +24,7 @@ import { * @returns */ export function getVectorLayers(state) { + console.log('getVectorLayers'); const { map: { ui: { selected } } } = state; const layerGroups = selected.getLayers().getArray(); return layerGroups.reduce((prev, layerGroup) => { @@ -43,6 +44,7 @@ export function getVectorLayers(state) { * @return {object} object including the entries and legend */ export function getVectorStyle(layerId, index, groupStr, state) { + console.log('getVectorStyle'); groupStr = groupStr || state.compare.activeString; index = lodashIsUndefined(index) ? 0 : index; const renderedVectorStyle = lodashGet( @@ -56,8 +58,10 @@ export function getVectorStyle(layerId, index, groupStr, state) { } export function getAllVectorStyles(layerId, index, state) { + console.log('Getting All Vector Styles!'); const { config, vectorStyles } = state; const name = lodashGet(config, `layers.${layerId}.vectorStyle.id`); + console.log(`namne: ${name}`); let vectorStyle = vectorStyles.custom[name]; if (!vectorStyle) { throw new Error(`${name} Is not a rendered vectorStyle`); @@ -71,6 +75,7 @@ export function getAllVectorStyles(layerId, index, state) { } export function findIndex(layerId, type, value, index, groupStr, state) { + console.log('findIndex'); index = index || 0; const { values } = getVectorStyle(layerId, index, groupStr, state).entries; let result; @@ -90,13 +95,16 @@ export function findIndex(layerId, type, value, index, groupStr, state) { } export function setRange(layerId, props, index, palettes, state) { + console.log('setRange'); // Placeholder filter range function return { layerId, props, index, palettes, state, }; } +// Review calls to this function & determine if calls are necessary for ASCAT export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { + console.log('setStyleFunction'); const map = lodashGet(state, 'map.ui.selected'); if (!map) return; const { proj } = state; @@ -104,18 +112,57 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const { resolutions } = proj.selected; const layerId = def.id; const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; - let glStyle = vectorStyles[styleId]; + const glStyle = vectorStyles[styleId]; // Forcing a valid glStyle if one cannot be found. if (glStyle === undefined) { - console.log('Forcing glStyle...'); - glStyle = vectorStyles.FIRMS_VIIRS_Thermal_Anomalies; + return; + // console.log('Forcing glStyle for ascat...'); + // glStyle = vectorStyles.FIRMS_VIIRS_Thermal_Anomalies; + // glStyle = { + // version: 8, + // name: 'ASCAT', + // sources: { + // ASCAT_source: { + // type: 'vector', + // tiles: [ + // // 'https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/VIIRS_SNPP_Thermal_Anomalies_375m_All/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt', + // // 'https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/VIIRS_SNPP_Thermal_Anomalies_375m_All/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt', + // 'https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt', + // ], + // }, + // }, + // layers: [ + // { + // id: 'ASCAT_source_v1_NRT', + // source: 'ASCAT_source', + // 'source-layer': 'ASCAT_source_v1_NRT', + // type: 'circle', + // paint: { + // 'circle-radius': [ + // 'step', + // [ + // 'zoom', + // ], + // 1, + // 1, + // 2, + // 3, + // 3, + // ], + // 'circle-color': 'rgb(240, 40, 40)', + // }, + // }, + // ], } + console.log(glStyle); + if (!layer || layer.isWMS) { return; // WMS breakpoint tile } + console.log('getting layers'); layer = layer.getLayers ? lodashFind(layer.getLayers().getArray(), 'isVector') : layer; @@ -151,6 +198,7 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) } const shouldRenderFeature = (feature, acceptableExtent) => { + console.log('shouldRenderFeature'); if (!acceptableExtent) return true; const midpoint = feature.getFlatCoordinates ? feature.getFlatCoordinates() @@ -160,6 +208,7 @@ const shouldRenderFeature = (feature, acceptableExtent) => { }; export function getKey(layerId, groupStr, state) { + console.log('getKey'); groupStr = groupStr || state.compare.activeString; if (!isActive(layerId, groupStr, state)) { return ''; @@ -179,6 +228,7 @@ export function getKey(layerId, groupStr, state) { } export function isActive(layerId, group, state) { + console.log('isActive'); group = group || state.compare.activeString; if (state.vectorStyles.custom[layerId]) { return state.vectorStyles[group][layerId]; @@ -186,6 +236,7 @@ export function isActive(layerId, group, state) { } export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { + console.log('clearStyleFunction'); const layerId = def.id; const glStyle = vectorStyles[layerId]; const olMap = lodashGet(state, 'legacy.map.ui.selected'); @@ -220,6 +271,7 @@ export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, stat * @param {Object} state */ export const applyStyle = (def, olVectorLayer, state) => { + console.log('applyStyle'); const { config } = state; const { vectorStyles } = config; const activeLayers = getActiveLayers(state) || []; @@ -235,5 +287,6 @@ export const applyStyle = (def, olVectorLayer, state) => { vectorStyleId = layer.custom; } }); + console.log('setStyleFunction'); setStyleFunction(def, vectorStyleId, vectorStyles, olVectorLayer, state); }; diff --git a/web/js/modules/vector-styles/util.js b/web/js/modules/vector-styles/util.js index beb0fc288a..0f47cc30bb 100644 --- a/web/js/modules/vector-styles/util.js +++ b/web/js/modules/vector-styles/util.js @@ -324,6 +324,11 @@ export function updateVectorSelection(selectionObj, lastSelection, layers, type, const def = lodashFind(layers, { id: key }); if (!def) return; const olLayer = vectorLayers.find((layer) => layer.wv.id === key); + console.log('calling setStyleFunction'); + console.log(def); + console.log(vectorStyles); + console.log(olLayer); + console.log(state); setStyleFunction(def, def.vectorStyle.id, vectorStyles, olLayer, state); if (lastSelection[key]) delete lastSelection[key]; } From 635a005a2a89cc65448ab23fa811c46fe45c2e86 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 24 Oct 2022 16:55:54 -0400 Subject: [PATCH 43/85] Brought in the WindTile code from Ben's demo. Not hooked in yet... --- package-lock.json | 17 +- package.json | 1 + .../components/timeline/mobile-date-picker.js | 1 - web/js/map/layerbuilder.js | 4 + web/js/map/ui.js | 6 +- web/js/modules/vector-styles/selectors.js | 54 +---- web/js/vectorflow/index.js | 173 +++++++++++++++ web/js/vectorflow/renderer.js | 122 +++++++++++ web/js/vectorflow/reportWebVitals.js | 13 ++ web/js/vectorflow/util.js | 45 ++++ web/js/vectorflow/wind/img.png | Bin 0 -> 87383 bytes web/js/vectorflow/wind/shaders/draw.frag.glsl | 24 +++ web/js/vectorflow/wind/shaders/draw.vert.glsl | 22 ++ web/js/vectorflow/wind/shaders/quad.vert.glsl | 10 + .../vectorflow/wind/shaders/screen.frag.glsl | 12 ++ .../vectorflow/wind/shaders/update.frag.glsl | 67 ++++++ web/js/vectorflow/wind/util.js | 82 ++++++++ web/js/vectorflow/wind/windindex.js | 197 ++++++++++++++++++ 18 files changed, 787 insertions(+), 63 deletions(-) create mode 100644 web/js/vectorflow/index.js create mode 100644 web/js/vectorflow/renderer.js create mode 100644 web/js/vectorflow/reportWebVitals.js create mode 100644 web/js/vectorflow/util.js create mode 100644 web/js/vectorflow/wind/img.png create mode 100644 web/js/vectorflow/wind/shaders/draw.frag.glsl create mode 100644 web/js/vectorflow/wind/shaders/draw.vert.glsl create mode 100644 web/js/vectorflow/wind/shaders/quad.vert.glsl create mode 100644 web/js/vectorflow/wind/shaders/screen.frag.glsl create mode 100644 web/js/vectorflow/wind/shaders/update.frag.glsl create mode 100644 web/js/vectorflow/wind/util.js create mode 100644 web/js/vectorflow/wind/windindex.js diff --git a/package-lock.json b/package-lock.json index 9747055908..ebc489deda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "compression": "^1.7.4", "coordinate-parser": "^1.0.4", "copy-to-clipboard": "^3.3.1", + "dat.gui": "^0.7.7", "elm-pep": "^1.0.6", "file-saver": "^2.0.2", "geographiclib": "^1.50.0", @@ -7044,6 +7045,11 @@ "node": ">=0.10" } }, + "node_modules/dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" + }, "node_modules/data-urls": { "version": "2.0.0", "dev": true, @@ -27315,15 +27321,9 @@ "version": "1.0.3" }, "chromedriver": { -<<<<<<< HEAD - "version": "104.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-104.0.0.tgz", - "integrity": "sha512-zbHZutN2ATo19xA6nXwwLn+KueD/5w8ap5m4b6bCb8MIaRFnyDwMbFoy7oFAjlSMpCFL3KSaZRiWUwjj//N3yQ==", -======= "version": "106.0.1", "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-106.0.1.tgz", "integrity": "sha512-thaBvbDEPgGocSp4/SBIajQz3G7UQfUqCOHZBp9TVhRJv7c91eZrUGcjeJUaNF4p9CfSjCYNYzs4EVVryqmddA==", ->>>>>>> 6e9eba7a912ffaf872b6f77e63ea2092e24fbbc5 "dev": true, "requires": { "@testim/chrome-version": "^1.1.3", @@ -28288,6 +28288,11 @@ "assert-plus": "^1.0.0" } }, + "dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" + }, "data-urls": { "version": "2.0.0", "dev": true, diff --git a/package.json b/package.json index 635c53d4a8..73f9aace8d 100644 --- a/package.json +++ b/package.json @@ -175,6 +175,7 @@ "compression": "^1.7.4", "coordinate-parser": "^1.0.4", "copy-to-clipboard": "^3.3.1", + "dat.gui": "^0.7.7", "elm-pep": "^1.0.6", "file-saver": "^2.0.2", "geographiclib": "^1.50.0", diff --git a/web/js/components/timeline/mobile-date-picker.js b/web/js/components/timeline/mobile-date-picker.js index fa27e9d864..119a2a3635 100644 --- a/web/js/components/timeline/mobile-date-picker.js +++ b/web/js/components/timeline/mobile-date-picker.js @@ -69,7 +69,6 @@ class MobileDatePicker extends Component { componentDidUpdate(prevProps) { const { date, endDateLimit } = this.props; - console.log('endDateLimit from MDP', endDateLimit); // update on new endDateLimit or changed date if (prevProps.endDateLimit !== endDateLimit || prevProps.date !== date) { this.setInitDates(); diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 5e22e5d1d7..6f0a6ea343 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -499,6 +499,10 @@ export default function mapLayerBuilder(config, cache, store) { const isMaxBreakPoint = breakPointType === 'max'; const isMinBreakPoint = breakPointType === 'min'; + + + + const tileSource = new SourceVectorTile({ url: source.url + urlParameters, layer: layerName, diff --git a/web/js/map/ui.js b/web/js/map/ui.js index a0315faf6a..f636cc0021 100644 --- a/web/js/map/ui.js +++ b/web/js/map/ui.js @@ -138,12 +138,12 @@ export default function mapui(models, config, store) { const def = lodashFind(action.layers, { id: action.id }); if (def.type === 'granule') { self.processingPromise = new Promise((resolve) => { - resolve(addLayer(def)); + resolve(addLayerUI(def)); }); return self.processingPromise; } store.dispatch({ type: dateConstants.CLEAR_PRELOAD }); - return addLayer(def); + return addLayerUI(def); } case REMOVE_MARKER: return removeCoordinatesMarker(action.coordinates); @@ -812,7 +812,7 @@ export default function mapui(models, config, store) { * @param {object} def - layer Specs * @returns {void} */ - const addLayer = async function(def, date, activeLayers) { + const addLayerUI = async function(def, date, activeLayers) { const state = store.getState(); const { compare } = state; date = date || getSelectedDate(state); diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index f48f38f793..6443856a4a 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -24,7 +24,6 @@ import { * @returns */ export function getVectorLayers(state) { - console.log('getVectorLayers'); const { map: { ui: { selected } } } = state; const layerGroups = selected.getLayers().getArray(); return layerGroups.reduce((prev, layerGroup) => { @@ -44,7 +43,6 @@ export function getVectorLayers(state) { * @return {object} object including the entries and legend */ export function getVectorStyle(layerId, index, groupStr, state) { - console.log('getVectorStyle'); groupStr = groupStr || state.compare.activeString; index = lodashIsUndefined(index) ? 0 : index; const renderedVectorStyle = lodashGet( @@ -58,10 +56,8 @@ export function getVectorStyle(layerId, index, groupStr, state) { } export function getAllVectorStyles(layerId, index, state) { - console.log('Getting All Vector Styles!'); const { config, vectorStyles } = state; const name = lodashGet(config, `layers.${layerId}.vectorStyle.id`); - console.log(`namne: ${name}`); let vectorStyle = vectorStyles.custom[name]; if (!vectorStyle) { throw new Error(`${name} Is not a rendered vectorStyle`); @@ -75,7 +71,6 @@ export function getAllVectorStyles(layerId, index, state) { } export function findIndex(layerId, type, value, index, groupStr, state) { - console.log('findIndex'); index = index || 0; const { values } = getVectorStyle(layerId, index, groupStr, state).entries; let result; @@ -95,7 +90,6 @@ export function findIndex(layerId, type, value, index, groupStr, state) { } export function setRange(layerId, props, index, palettes, state) { - console.log('setRange'); // Placeholder filter range function return { layerId, props, index, palettes, state, @@ -104,7 +98,6 @@ export function setRange(layerId, props, index, palettes, state) { // Review calls to this function & determine if calls are necessary for ASCAT export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { - console.log('setStyleFunction'); const map = lodashGet(state, 'map.ui.selected'); if (!map) return; const { proj } = state; @@ -114,55 +107,16 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; const glStyle = vectorStyles[styleId]; - // Forcing a valid glStyle if one cannot be found. + // ASCAT does not include a glStyle, so we early return here in that instance if (glStyle === undefined) { return; - // console.log('Forcing glStyle for ascat...'); - // glStyle = vectorStyles.FIRMS_VIIRS_Thermal_Anomalies; - // glStyle = { - // version: 8, - // name: 'ASCAT', - // sources: { - // ASCAT_source: { - // type: 'vector', - // tiles: [ - // // 'https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/VIIRS_SNPP_Thermal_Anomalies_375m_All/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt', - // // 'https://gibs.earthdata.nasa.gov/wmts/epsg3413/best/VIIRS_SNPP_Thermal_Anomalies_375m_All/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt', - // 'https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt', - // ], - // }, - // }, - // layers: [ - // { - // id: 'ASCAT_source_v1_NRT', - // source: 'ASCAT_source', - // 'source-layer': 'ASCAT_source_v1_NRT', - // type: 'circle', - // paint: { - // 'circle-radius': [ - // 'step', - // [ - // 'zoom', - // ], - // 1, - // 1, - // 2, - // 3, - // 3, - // ], - // 'circle-color': 'rgb(240, 40, 40)', - // }, - // }, - // ], } - console.log(glStyle); if (!layer || layer.isWMS) { return; // WMS breakpoint tile } - console.log('getting layers'); layer = layer.getLayers ? lodashFind(layer.getLayers().getArray(), 'isVector') : layer; @@ -198,7 +152,6 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) } const shouldRenderFeature = (feature, acceptableExtent) => { - console.log('shouldRenderFeature'); if (!acceptableExtent) return true; const midpoint = feature.getFlatCoordinates ? feature.getFlatCoordinates() @@ -208,7 +161,6 @@ const shouldRenderFeature = (feature, acceptableExtent) => { }; export function getKey(layerId, groupStr, state) { - console.log('getKey'); groupStr = groupStr || state.compare.activeString; if (!isActive(layerId, groupStr, state)) { return ''; @@ -228,7 +180,6 @@ export function getKey(layerId, groupStr, state) { } export function isActive(layerId, group, state) { - console.log('isActive'); group = group || state.compare.activeString; if (state.vectorStyles.custom[layerId]) { return state.vectorStyles[group][layerId]; @@ -236,7 +187,6 @@ export function isActive(layerId, group, state) { } export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { - console.log('clearStyleFunction'); const layerId = def.id; const glStyle = vectorStyles[layerId]; const olMap = lodashGet(state, 'legacy.map.ui.selected'); @@ -271,7 +221,6 @@ export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, stat * @param {Object} state */ export const applyStyle = (def, olVectorLayer, state) => { - console.log('applyStyle'); const { config } = state; const { vectorStyles } = config; const activeLayers = getActiveLayers(state) || []; @@ -287,6 +236,5 @@ export const applyStyle = (def, olVectorLayer, state) => { vectorStyleId = layer.custom; } }); - console.log('setStyleFunction'); setStyleFunction(def, vectorStyleId, vectorStyles, olVectorLayer, state); }; diff --git a/web/js/vectorflow/index.js b/web/js/vectorflow/index.js new file mode 100644 index 0000000000..f9e4b41ea8 --- /dev/null +++ b/web/js/vectorflow/index.js @@ -0,0 +1,173 @@ + +import * as dat from 'dat.gui'; +import olTile from 'ol/layer/Tile'; +import WMTS from 'ol/source/WMTS'; +import WMTSTileGrid from 'ol/tilegrid/WMTS'; +import MVT from 'ol/format/MVT'; +import { get } from 'ol/proj'; +import SourceVectorTile from 'ol/source/VectorTile'; +import LayerVectorTile from 'ol/layer/VectorTile'; +import olMap from 'ol/Map'; +import olView from 'ol/View'; +import WindTile from './renderer'; +import { throttle } from './util'; +// import './App.css'; +// import Style from 'ol/style/Style'; +// import Stroke from 'ol/style/Stroke'; + +const gui = new dat.GUI(); + +const tileGridSizes = [ + { + matrixWidth: 2, + matrixHeight: 1, + }, + { + matrixWidth: 3, + matrixHeight: 2, + }, + { + matrixWidth: 5, + matrixHeight: 3, + }, + { + matrixWidth: 10, + matrixHeight: 5, + }, + { + matrixWidth: 20, + matrixHeight: 10, + }, + { + matrixWidth: 40, + matrixHeight: 20, + }, +]; +const base = new olTile({ + extent: [-180, -90, 180, 90], + crossOrigin: 'anonymous', + source: new WMTS({ + url: '//gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?TIME=2020-04-27', + layer: 'BlueMarble_NextGeneration', + format: 'image/jpeg', + matrixSet: '500m', + tileGrid: new WMTSTileGrid({ + origin: [-180, 90], + resolutions: [0.140625, 0.0703125, 0.03515625, 0.017578125, 0.0087890625, 0.00439453125, 0.002197265625], + matrixIds: [2, 3, 4, 5, 6, 7, 8], + tileSize: 512, + }), + }), +}); +const source = new SourceVectorTile({ + visible: true, + projection: get('EPSG:4326'), + // url: 'https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?TIME=2020-03-21&layer=MISR_Cloud_Motion_Vector&tilematrixset=2km&Service=WMTS&Request=GetTile&Version=1.0.0&FORMAT=application%2Fvnd.mapbox-vector-tile&TileMatrix={z}&TileCol={x}&TileRow={y}', + url: 'https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt', + format: new MVT(), + tileGrid: new WMTSTileGrid({ + extent: [-180, -90, 180, 90], + resolutions: [0.5625, 0.28125, 0.140625, 0.0703125, 0.03515625, 0.017578125], + tileSize: [512, 512], + sizes: tileGridSizes, + }), +}); + +// console.log(staticStyle); +const vectorLayer = new LayerVectorTile({ + source, + // Removing the style array renders each point in the default style (blue circles at each point, not animated) + // style: [], +}); +const map = new olMap({ + layers: [base, vectorLayer], + target: 'map', + view: new olView({ + center: [0, 0], + maxZoom: 12, + zoom: 1, + extent: [-180, -90, 180, 90], + projection: get('EPSG:4326'), + }), +}); + +let i = 0; +source.on('tileloadstart', (e) => { + i++; +}); +let windRender; +source.on('tileloadend', (e) => { + if (!windRender) { + const mapSize = map.getSize(); + const options = { + uMin: -76.57695007324219, + uMax: 44.30181884765625, + vMin: -76.57695007324219, + vMax: 44.30181884765625, + width: mapSize[0], + height: mapSize[1], + }; + windRender = new WindTile(options); + } + i--; + if (i === 1 && !windRender.stopped && windRender) { + windRender.stop(); + } + if (i === 0 && !moving && windRender) { + if (!initiatedGUI) { + setTimeout(() => { updateRenderer(); }, 1); + } else { + updateRendererThrottled(); + } + } +}); +let moving = false; +map.getView().on('change:center', () => { + windRender.stop(); + moving = true; +}); +map.getView().on('propertychange', (e) => { + if (e.key === 'resolution' && windRender) { + windRender.stop(); + moving = true; + } +}); +map.on('moveend', (e) => { + moving = false; + if (i === 0 && windRender) updateRendererThrottled(); +}); +let initiatedGUI = false; +let currentFeatures; let zoom; let extent; let + options; +const updateRenderer = () => { + const view = map.getView(); + const mapSize = map.getSize(); + extent = view.calculateExtent(mapSize); + currentFeatures = vectorLayer.getSource().getFeaturesInExtent(extent); + zoom = view.getZoom(); + options = { + uMin: -55.806217193603516, + uMax: 45.42329406738281, + vMin: -5.684286117553711, + vMax: 44.30181884765625, + width: mapSize[0], + height: mapSize[1], + ts: Date.now(), + }; + windRender.updateData(currentFeatures, extent, zoom, options); + if (!initiatedGUI) initGUI(); +}; +const updateRendererThrottled = throttle(updateRenderer, 150); +const initGUI = function() { + const { wind } = windRender; + gui.add(wind, 'numParticles', 144, 248832); + gui.add(wind, 'fadeOpacity', 0.96, 0.999).step(0.001).updateDisplay(); + gui.add(wind, 'speedFactor', 0.05, 1.0); + gui.add(wind, 'dropRate', 0, 0.1); + gui.add(wind, 'dropRateBump', 0, 0.2); + gui.add(windRender, 'dataGridWidth', 18, 360).step(2).onChange(updateTexture); + initiatedGUI = true; +}; +const updateTexture = function() { + windRender.updateData(currentFeatures, extent, zoom, options); +}; diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js new file mode 100644 index 0000000000..d073d64c8f --- /dev/null +++ b/web/js/vectorflow/renderer.js @@ -0,0 +1,122 @@ +import WindGL from './wind/windindex'; + +export default class WindTile { + constructor(options) { + this.options = options; + this.visibleExtent = [-180, -90, 180, 90]; + this.width = options.width || 512; + this.height = options.height || 512; + this.dataGridWidth = 360; + this.glCanvas = options.canvas || document.createElement('canvas'); + this.gl = options.gl || this.glCanvas.getContext('webgl', { antialiasing: false }); + this.offset = options.offset || [0, 0]; + this.pxRatio = Math.max(Math.floor(window.devicePixelRatio) || 1, 2); + this.meta = options.meta || {}; + this.parent = options.parent || document.getElementById('root'); + this.glCanvas.id = 'gl-canvas'; + this.stopped = false; + this.init(); + this.callback = options.callback; + } + + init() { + this.parent.appendChild(this.glCanvas); + this.glCanvas.width = this.width; + this.glCanvas.height = this.height; + this.gl.width = this.width; + this.gl.height = this.height; + + this.wind = window.wind = new WindGL(this.gl); + this.wind.numParticles = 11024; + this.frame(); + if (this.pxRatio !== 1) { + this.meta['retina resolution'] = true; + } + } + + updateData(data, extent, zoom, options) { + const windData = this.windData = this.organizeData(data, extent, zoom, options); + this.wind.setWind(windData); + this.stopped = false; + this.glCanvas.style = 'display:block'; + windData.image = null; + } + + stop() { + delete this.wind.windData; + this.stopped = true; + this.glCanvas.style = 'display:none'; + } + + organizeData(data, extent, zoom, options) { + const vectorData = data; + const longMin = extent[0]; + const latMin = extent[1]; + const deltaLong = extent[2] - extent[0]; + const deltaLat = extent[3] - extent[1]; + // const isZoomedIn = zoom > 6; + // const isLowZoom = zoom < 3; + // const width = isLowZoom ? 360 : isZoomedIn ? 90 : 180 ; + // const height = isLowZoom ? 180 :isZoomedIn ? 45 : 90; + const width = this.dataGridWidth; + const height = this.dataGridWidth / 2; + const NUM_POINTS = data.length; + + const { + uMin, vMin, uMax, vMax, + } = options; + const uZero = Math.floor(255 * Math.abs(0 - uMin) / (uMax - uMin)); + const vZero = Math.floor(255 * Math.abs(0 - vMin) / (vMax - vMin)); + const imageArray = new Uint8Array(width * height * 4); + const j = new Uint8Array(width * height * 4); + + for (let i = 0; i < NUM_POINTS; i++) { + const flatCoordinates = vectorData[i].flatCoordinates_; + const x = Math.floor((Math.abs(flatCoordinates[0] - longMin) / deltaLong) * width); + const y = Math.floor(height - ((Math.abs(flatCoordinates[1] - latMin) / deltaLat) * height)); + const u = vectorData[i].properties_.U; + const v = vectorData[i].properties_.V; + const ii = (y * width + x) * 4; + j[ii] = i; + const r = Math.floor(255 * (u - uMin) / (uMax - uMin)); + const g = Math.floor(255 * (v - vMin) / (vMax - vMin)); + imageArray[ii + 0] = r; + imageArray[ii + 1] = g; + imageArray[ii + 2] = 0; + imageArray[ii + 3] = 255; + } + + // Fill in empty pixels with zero wind color + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const i = (y * width + x) * 4; + const index = j[i]; + if (!index) { + imageArray[i + 0] = uZero; + imageArray[i + 1] = vZero; + imageArray[i + 2] = 0; + imageArray[i + 3] = 255; + } + } + } + const windData = { + image: imageArray, + uMin, + vMin, + uMax, + vMax, + width: deltaLong, + height: deltaLat, + textureHeight: height, + textureWidth: width, + }; + return windData; + } + + frame() { + if (this.wind.windData) { + this.wind.draw(); + } + requestAnimationFrame(this.frame.bind(this)); + } +} diff --git a/web/js/vectorflow/reportWebVitals.js b/web/js/vectorflow/reportWebVitals.js new file mode 100644 index 0000000000..5253d3ad9e --- /dev/null +++ b/web/js/vectorflow/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/web/js/vectorflow/util.js b/web/js/vectorflow/util.js new file mode 100644 index 0000000000..432616299a --- /dev/null +++ b/web/js/vectorflow/util.js @@ -0,0 +1,45 @@ + + +export function convert(lat, long, extent){ + const TILE_HEIGHT_WIDTH = 512; + const long0 = extent[0]; + const lat0 = extent[1]; + + const dxExtent = Math.abs(extent[0] - extent[2]); + const dyExtent = Math.abs(extent[1] - extent[3]); + + const x = TILE_HEIGHT_WIDTH * ((long0 - long) / dxExtent) + const y = TILE_HEIGHT_WIDTH * ((lat0 - lat) / dyExtent) + + return { + x:x, + y:y + }; +} +// const scale = Math.floor(Math.pow(255, 2) / Math.max(512, 512) / 3); +export function encode(value, scale) { + var b = 255; + value = value * scale + b * b / 2; + var pair = [ + Math.floor((value % b) / b * 255), + Math.floor(Math.floor(value / b) / b * 255) + ]; + return pair; +} + +export function decode(pair, scale) { + var b = 255; + return (((pair[0] / 255) * b + + (pair[1] / 255) * b * b) - b * b / 2) / scale; +} + +// https://codepen.io/SitePoint/pen/RRLVAL?editors=1010 +export function throttle(fn, wait) { + var time = Date.now(); + return function() { + if ((time + wait - Date.now()) < 0) { + fn(); + time = Date.now(); + } + } +} \ No newline at end of file diff --git a/web/js/vectorflow/wind/img.png b/web/js/vectorflow/wind/img.png new file mode 100644 index 0000000000000000000000000000000000000000..f2223b6f4bd064d4d13a8fae2d3438968e8127de GIT binary patch literal 87383 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

El2a_7ETKiiIw9wMRdTUXl^l>Cs33E}mW`oI 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 Date: Tue, 25 Oct 2022 09:39:21 -0400 Subject: [PATCH 44/85] Modified demo code to be complianyt with our ESLint requirements. --- package-lock.json | 11 + package.json | 1 + web/js/vectorflow/index.js | 16 +- web/js/vectorflow/renderer.js | 20 +- web/js/vectorflow/reportWebVitals.js | 6 +- web/js/vectorflow/util.js | 60 ++--- web/js/vectorflow/wind/util.js | 110 ++++----- web/js/vectorflow/wind/windindex.js | 354 ++++++++++++++------------- 8 files changed, 299 insertions(+), 279 deletions(-) diff --git a/package-lock.json b/package-lock.json index ebc489deda..bd9306ab5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,6 +72,7 @@ "simplebar-react": "^2.1.0", "supercluster": "7.0.0", "url-template": "^3.0.0", + "web-vitals": "^1.1.2", "what-input": "^5.2.7" }, "devDependencies": { @@ -22490,6 +22491,11 @@ "defaults": "^1.0.3" } }, + "node_modules/web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, "node_modules/web-worker": { "version": "1.2.0", "license": "Apache-2.0" @@ -38791,6 +38797,11 @@ "defaults": "^1.0.3" } }, + "web-vitals": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + }, "web-worker": { "version": "1.2.0" }, diff --git a/package.json b/package.json index 73f9aace8d..e6792e5a94 100644 --- a/package.json +++ b/package.json @@ -221,6 +221,7 @@ "simplebar-react": "^2.1.0", "supercluster": "7.0.0", "url-template": "^3.0.0", + "web-vitals": "^1.1.2", "what-input": "^5.2.7" }, "browserslist": [ diff --git a/web/js/vectorflow/index.js b/web/js/vectorflow/index.js index f9e4b41ea8..49b138d38d 100644 --- a/web/js/vectorflow/index.js +++ b/web/js/vectorflow/index.js @@ -1,14 +1,14 @@ import * as dat from 'dat.gui'; -import olTile from 'ol/layer/Tile'; +import OLTile from 'ol/layer/Tile'; import WMTS from 'ol/source/WMTS'; import WMTSTileGrid from 'ol/tilegrid/WMTS'; import MVT from 'ol/format/MVT'; import { get } from 'ol/proj'; import SourceVectorTile from 'ol/source/VectorTile'; import LayerVectorTile from 'ol/layer/VectorTile'; -import olMap from 'ol/Map'; -import olView from 'ol/View'; +import OLMap from 'ol/Map'; +import OLView from 'ol/View'; import WindTile from './renderer'; import { throttle } from './util'; // import './App.css'; @@ -43,7 +43,7 @@ const tileGridSizes = [ matrixHeight: 20, }, ]; -const base = new olTile({ +const base = new OLTile({ extent: [-180, -90, 180, 90], crossOrigin: 'anonymous', source: new WMTS({ @@ -79,10 +79,10 @@ const vectorLayer = new LayerVectorTile({ // Removing the style array renders each point in the default style (blue circles at each point, not animated) // style: [], }); -const map = new olMap({ +const map = new OLMap({ layers: [base, vectorLayer], target: 'map', - view: new olView({ + view: new OLView({ center: [0, 0], maxZoom: 12, zoom: 1, @@ -93,7 +93,7 @@ const map = new olMap({ let i = 0; source.on('tileloadstart', (e) => { - i++; + i += 1; }); let windRender; source.on('tileloadend', (e) => { @@ -109,7 +109,7 @@ source.on('tileloadend', (e) => { }; windRender = new WindTile(options); } - i--; + i -= 1; if (i === 1 && !windRender.stopped && windRender) { windRender.stop(); } diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index d073d64c8f..1313118239 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -26,7 +26,8 @@ export default class WindTile { this.gl.width = this.width; this.gl.height = this.height; - this.wind = window.wind = new WindGL(this.gl); + this.wind = new WindGL(this.gl); + window.wind = new WindGL(this.gl); this.wind.numParticles = 11024; this.frame(); if (this.pxRatio !== 1) { @@ -35,7 +36,8 @@ export default class WindTile { } updateData(data, extent, zoom, options) { - const windData = this.windData = this.organizeData(data, extent, zoom, options); + const windData = this.organizeData(data, extent, zoom, options); + this.windData = this.organizeData(data, extent, zoom, options); this.wind.setWind(windData); this.stopped = false; this.glCanvas.style = 'display:block'; @@ -65,12 +67,12 @@ export default class WindTile { const { uMin, vMin, uMax, vMax, } = options; - const uZero = Math.floor(255 * Math.abs(0 - uMin) / (uMax - uMin)); - const vZero = Math.floor(255 * Math.abs(0 - vMin) / (vMax - vMin)); + const uZero = Math.floor(255 * Math.abs(0 - uMin)) / (uMax - uMin); + const vZero = Math.floor(255 * Math.abs(0 - vMin)) / (vMax - vMin); const imageArray = new Uint8Array(width * height * 4); const j = new Uint8Array(width * height * 4); - for (let i = 0; i < NUM_POINTS; i++) { + for (let i = 0; i < NUM_POINTS; i += 1) { const flatCoordinates = vectorData[i].flatCoordinates_; const x = Math.floor((Math.abs(flatCoordinates[0] - longMin) / deltaLong) * width); const y = Math.floor(height - ((Math.abs(flatCoordinates[1] - latMin) / deltaLat) * height)); @@ -78,8 +80,8 @@ export default class WindTile { const v = vectorData[i].properties_.V; const ii = (y * width + x) * 4; j[ii] = i; - const r = Math.floor(255 * (u - uMin) / (uMax - uMin)); - const g = Math.floor(255 * (v - vMin) / (vMax - vMin)); + const r = Math.floor((255 * (u - uMin)) / (uMax - uMin)); + const g = Math.floor((255 * (v - vMin)) / (vMax - vMin)); imageArray[ii + 0] = r; imageArray[ii + 1] = g; imageArray[ii + 2] = 0; @@ -87,8 +89,8 @@ export default class WindTile { } // Fill in empty pixels with zero wind color - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { + for (let y = 0; y < height; y += 1) { + for (let x = 0; x < width; x += 1) { const i = (y * width + x) * 4; const index = j[i]; if (!index) { diff --git a/web/js/vectorflow/reportWebVitals.js b/web/js/vectorflow/reportWebVitals.js index 5253d3ad9e..bb47dbbb9f 100644 --- a/web/js/vectorflow/reportWebVitals.js +++ b/web/js/vectorflow/reportWebVitals.js @@ -1,6 +1,8 @@ -const reportWebVitals = onPerfEntry => { +const reportWebVitals = (onPerfEntry) => { if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + import('web-vitals').then(({ + getCLS, getFID, getFCP, getLCP, getTTFB, + }) => { getCLS(onPerfEntry); getFID(onPerfEntry); getFCP(onPerfEntry); diff --git a/web/js/vectorflow/util.js b/web/js/vectorflow/util.js index 432616299a..914155ea28 100644 --- a/web/js/vectorflow/util.js +++ b/web/js/vectorflow/util.js @@ -1,45 +1,45 @@ -export function convert(lat, long, extent){ - const TILE_HEIGHT_WIDTH = 512; - const long0 = extent[0]; - const lat0 = extent[1]; - - const dxExtent = Math.abs(extent[0] - extent[2]); - const dyExtent = Math.abs(extent[1] - extent[3]); +export function convert(lat, long, extent) { + const TILE_HEIGHT_WIDTH = 512; + const long0 = extent[0]; + const lat0 = extent[1]; - const x = TILE_HEIGHT_WIDTH * ((long0 - long) / dxExtent) - const y = TILE_HEIGHT_WIDTH * ((lat0 - lat) / dyExtent) + const dxExtent = Math.abs(extent[0] - extent[2]); + const dyExtent = Math.abs(extent[1] - extent[3]); - return { - x:x, - y:y - }; + const x = TILE_HEIGHT_WIDTH * ((long0 - long) / dxExtent); + const y = TILE_HEIGHT_WIDTH * ((lat0 - lat) / dyExtent); + + return { + x, + y, + }; } // const scale = Math.floor(Math.pow(255, 2) / Math.max(512, 512) / 3); export function encode(value, scale) { - var b = 255; - value = value * scale + b * b / 2; - var pair = [ - Math.floor((value % b) / b * 255), - Math.floor(Math.floor(value / b) / b * 255) - ]; - return pair; + const b = 255; + value = (value * scale + b * b) / 2; + const pair = [ + Math.floor((value % b) / (b * 255)), + Math.floor(Math.floor(value / b) / (b * 255)), + ]; + return pair; } export function decode(pair, scale) { - var b = 255; - return (((pair[0] / 255) * b + - (pair[1] / 255) * b * b) - b * b / 2) / scale; + const b = 255; + const calc = (((pair[0] / 255) * b + (pair[1] / 255) * b * b) - (b * b) / 2) / scale; + return calc; } // https://codepen.io/SitePoint/pen/RRLVAL?editors=1010 export function throttle(fn, wait) { - var time = Date.now(); - return function() { - if ((time + wait - Date.now()) < 0) { - fn(); - time = Date.now(); - } + let time = Date.now(); + return function() { + if ((time + wait - Date.now()) < 0) { + fn(); + time = Date.now(); } -} \ No newline at end of file + }; +} diff --git a/web/js/vectorflow/wind/util.js b/web/js/vectorflow/wind/util.js index 34a9413004..e16d995cb8 100644 --- a/web/js/vectorflow/wind/util.js +++ b/web/js/vectorflow/wind/util.js @@ -1,82 +1,82 @@ function createShader(gl, type, source) { - const shader = gl.createShader(type); - gl.shaderSource(shader, source); + const shader = gl.createShader(type); + gl.shaderSource(shader, source); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - throw new Error(gl.getShaderInfoLog(shader)); - } + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + throw new Error(gl.getShaderInfoLog(shader)); + } - return shader; + return shader; } export function createProgram(gl, vertexSource, fragmentSource) { - const program = gl.createProgram(); - const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource); - const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource); + const program = gl.createProgram(); + const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource); + const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource); - gl.attachShader(program, vertexShader); - gl.attachShader(program, fragmentShader); + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragmentShader); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - throw new Error(gl.getProgramInfoLog(program)); - } + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + throw new Error(gl.getProgramInfoLog(program)); + } - const wrapper = {program: program}; + const wrapper = { program }; - const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); - for (let i = 0; i < numAttributes; i++) { - const attribute = gl.getActiveAttrib(program, i); - wrapper[attribute.name] = gl.getAttribLocation(program, attribute.name); - } - const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); - for (let i = 0; i < numUniforms; i++) { - const uniform = gl.getActiveUniform(program, i); - wrapper[uniform.name] = gl.getUniformLocation(program, uniform.name); - } + const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + for (let i = 0; i < numAttributes; i += 1) { + const attribute = gl.getActiveAttrib(program, i); + wrapper[attribute.name] = gl.getAttribLocation(program, attribute.name); + } + const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + for (let i = 0; i < numUniforms; i += 1) { + const uniform = gl.getActiveUniform(program, i); + wrapper[uniform.name] = gl.getUniformLocation(program, uniform.name); + } - return wrapper; + return wrapper; } export function createTexture(gl, filter, data, width, height) { - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); - if (data instanceof Uint8Array) { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, data); - } - gl.bindTexture(gl.TEXTURE_2D, null); - return texture; + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); + if (data instanceof Uint8Array) { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + } else { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, data); + } + gl.bindTexture(gl.TEXTURE_2D, null); + return texture; } export function bindTexture(gl, texture, unit) { - gl.activeTexture(gl.TEXTURE0 + unit); - gl.bindTexture(gl.TEXTURE_2D, texture); + gl.activeTexture(gl.TEXTURE0 + unit); + gl.bindTexture(gl.TEXTURE_2D, texture); } export function createBuffer(gl, data) { - const buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); - return buffer; + const buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); + return buffer; } export function bindAttribute(gl, buffer, attribute, numComponents) { - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.enableVertexAttribArray(attribute); - gl.vertexAttribPointer(attribute, numComponents, gl.FLOAT, false, 0, 0); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.enableVertexAttribArray(attribute); + gl.vertexAttribPointer(attribute, numComponents, gl.FLOAT, false, 0, 0); } export function bindFramebuffer(gl, framebuffer, texture) { - gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); - if (texture) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - } -} \ No newline at end of file + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + if (texture) { + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + } +} diff --git a/web/js/vectorflow/wind/windindex.js b/web/js/vectorflow/wind/windindex.js index 53d8539ae8..fa613f2b77 100644 --- a/web/js/vectorflow/wind/windindex.js +++ b/web/js/vectorflow/wind/windindex.js @@ -1,3 +1,5 @@ +/* eslint guard-for-in: "off" */ +/* eslint no-restricted-syntax: "off" */ import * as util from './util'; @@ -9,189 +11,191 @@ import screenFrag from './shaders/screen.frag.glsl'; import updateFrag from './shaders/update.frag.glsl'; const defaultRampColors = { - 0.0: '#3288bd', - 0.1: '#66c2a5', - 0.2: '#abdda4', - 0.3: '#e6f598', - 0.4: '#fee08b', - 0.5: '#fdae61', - 0.6: '#f46d43', - 1.0: '#d53e4f' + 0.0: '#3288bd', + 0.1: '#66c2a5', + 0.2: '#abdda4', + 0.3: '#e6f598', + 0.4: '#fee08b', + 0.5: '#fdae61', + 0.6: '#f46d43', + 1.0: '#d53e4f', }; export default class WindGL { - constructor(gl) { - this.gl = gl; - - this.fadeOpacity = 0.996; // how fast the particle trails fade on each frame - this.speedFactor = 0.25; // how fast the particles move - this.dropRate = 0.003; // how often the particles move to a random place - this.dropRateBump = 0.01; // drop rate increase relative to individual particle speed - - this.drawProgram = util.createProgram(gl, drawVert, drawFrag); - this.screenProgram = util.createProgram(gl, quadVert, screenFrag); - this.updateProgram = util.createProgram(gl, quadVert, updateFrag); - - this.quadBuffer = util.createBuffer(gl, new Float32Array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1])); - this.framebuffer = gl.createFramebuffer(); - - this.setColorRamp(defaultRampColors); - this.resize(); - } - - resize() { - const gl = this.gl; - const emptyPixels = new Uint8Array(gl.canvas.width * gl.canvas.height * 4); - // screen textures to hold the drawn screen for the previous and the current frame - this.backgroundTexture = util.createTexture(gl, gl.NEAREST, emptyPixels, gl.canvas.width, gl.canvas.height); - this.screenTexture = util.createTexture(gl, gl.NEAREST, emptyPixels, gl.canvas.width, gl.canvas.height); - } - - setColorRamp(colors) { - // lookup texture for colorizing the particles according to their speed - this.colorRampTexture = util.createTexture(this.gl, this.gl.LINEAR, getColorRamp(colors), 16, 16); - } - - set numParticles(numParticles) { - const gl = this.gl; - - // we create a square texture where each pixel will hold a particle position encoded as RGBA - const particleRes = this.particleStateResolution = Math.ceil(Math.sqrt(numParticles)); - this._numParticles = particleRes * particleRes; - - const particleState = new Uint8Array(this._numParticles * 4); - for (let i = 0; i < particleState.length; i++) { - particleState[i] = Math.floor(Math.random() * 256); // randomize the initial particle positions - } - // textures to hold the particle state for the current and the next frame - this.particleStateTexture0 = util.createTexture(gl, gl.NEAREST, particleState, particleRes, particleRes); - this.particleStateTexture1 = util.createTexture(gl, gl.NEAREST, particleState, particleRes, particleRes); - - const particleIndices = new Float32Array(this._numParticles); - for (let i = 0; i < this._numParticles; i++) particleIndices[i] = i; - this.particleIndexBuffer = util.createBuffer(gl, particleIndices); - } - get numParticles() { - return this._numParticles; - } - - setWind(windData) { - this.windData = windData; - const height= windData.textureHeight; - const width= windData.textureWidth; - this.windTexture = util.createTexture(this.gl, this.gl.LINEAR, windData.image, width, height); - } - - draw() { - const gl = this.gl; - gl.disable(gl.DEPTH_TEST); - gl.disable(gl.STENCIL_TEST); - - util.bindTexture(gl, this.windTexture, 0); - util.bindTexture(gl, this.particleStateTexture0, 1); - - this.drawScreen(); - this.updateParticles(); - } - - drawScreen() { - const gl = this.gl; - // draw the screen into a temporary framebuffer to retain it as the background on the next frame - util.bindFramebuffer(gl, this.framebuffer, this.screenTexture); - gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); - - this.drawTexture(this.backgroundTexture, this.fadeOpacity); - this.drawParticles(); - - util.bindFramebuffer(gl, null); - // enable blending to support drawing on top of an existing background (e.g. a map) - gl.enable(gl.BLEND); - gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); - this.drawTexture(this.screenTexture, 1.0); - gl.disable(gl.BLEND); - - // save the current screen as the background for the next frame - const temp = this.backgroundTexture; - this.backgroundTexture = this.screenTexture; - this.screenTexture = temp; - } - - drawTexture(texture, opacity) { - const gl = this.gl; - const program = this.screenProgram; - gl.useProgram(program.program); - - util.bindAttribute(gl, this.quadBuffer, program.a_pos, 2); - util.bindTexture(gl, texture, 2); - gl.uniform1i(program.u_screen, 2); - gl.uniform1f(program.u_opacity, opacity); - - gl.drawArrays(gl.TRIANGLES, 0, 6); - } - - drawParticles() { - const gl = this.gl; - const program = this.drawProgram; - gl.useProgram(program.program); - - util.bindAttribute(gl, this.particleIndexBuffer, program.a_index, 1); - util.bindTexture(gl, this.colorRampTexture, 2); - - gl.uniform1i(program.u_wind, 0); - gl.uniform1i(program.u_particles, 1); - gl.uniform1i(program.u_color_ramp, 2); - - gl.uniform1f(program.u_particles_res, this.particleStateResolution); - gl.uniform2f(program.u_wind_min, this.windData.uMin, this.windData.vMin); - gl.uniform2f(program.u_wind_max, this.windData.uMax, this.windData.vMax); - - gl.drawArrays(gl.POINTS, 0, this._numParticles); - } - - updateParticles() { - const gl = this.gl; - util.bindFramebuffer(gl, this.framebuffer, this.particleStateTexture1); - gl.viewport(0, 0, this.particleStateResolution, this.particleStateResolution); - - const program = this.updateProgram; - gl.useProgram(program.program); - - util.bindAttribute(gl, this.quadBuffer, program.a_pos, 2); - - gl.uniform1i(program.u_wind, 0); - gl.uniform1i(program.u_particles, 1); - - gl.uniform1f(program.u_rand_seed, Math.random()); - gl.uniform2f(program.u_wind_res, this.windData.width, this.windData.height); - gl.uniform2f(program.u_wind_min, this.windData.uMin, this.windData.vMin); - gl.uniform2f(program.u_wind_max, this.windData.uMax, this.windData.vMax); - gl.uniform1f(program.u_speed_factor, this.speedFactor); - gl.uniform1f(program.u_drop_rate, this.dropRate); - gl.uniform1f(program.u_drop_rate_bump, this.dropRateBump); - - gl.drawArrays(gl.TRIANGLES, 0, 6); - - // swap the particle state textures so the new one becomes the current one - const temp = this.particleStateTexture0; - this.particleStateTexture0 = this.particleStateTexture1; - this.particleStateTexture1 = temp; + constructor(gl) { + this.gl = gl; + + this.fadeOpacity = 0.996; // how fast the particle trails fade on each frame + this.speedFactor = 0.25; // how fast the particles move + this.dropRate = 0.003; // how often the particles move to a random place + this.dropRateBump = 0.01; // drop rate increase relative to individual particle speed + + this.drawProgram = util.createProgram(gl, drawVert, drawFrag); + this.screenProgram = util.createProgram(gl, quadVert, screenFrag); + this.updateProgram = util.createProgram(gl, quadVert, updateFrag); + + this.quadBuffer = util.createBuffer(gl, new Float32Array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1])); + this.framebuffer = gl.createFramebuffer(); + + this.setColorRamp(defaultRampColors); + this.resize(); + } + + resize() { + const { gl } = this; + const emptyPixels = new Uint8Array(gl.canvas.width * gl.canvas.height * 4); + // screen textures to hold the drawn screen for the previous and the current frame + this.backgroundTexture = util.createTexture(gl, gl.NEAREST, emptyPixels, gl.canvas.width, gl.canvas.height); + this.screenTexture = util.createTexture(gl, gl.NEAREST, emptyPixels, gl.canvas.width, gl.canvas.height); + } + + setColorRamp(colors) { + // lookup texture for colorizing the particles according to their speed + this.colorRampTexture = util.createTexture(this.gl, this.gl.LINEAR, getColorRamp(colors), 16, 16); + } + + set numParticles(numParticles) { + const { gl } = this; + + // we create a square texture where each pixel will hold a particle position encoded as RGBA + const particleRes = Math.ceil(Math.sqrt(numParticles)); + this.particleStateResolution = Math.ceil(Math.sqrt(numParticles)); + this._numParticles = particleRes * particleRes; + + const particleState = new Uint8Array(this._numParticles * 4); + for (let i = 0; i < particleState.length; i += 1) { + particleState[i] = Math.floor(Math.random() * 256); // randomize the initial particle positions } + // textures to hold the particle state for the current and the next frame + this.particleStateTexture0 = util.createTexture(gl, gl.NEAREST, particleState, particleRes, particleRes); + this.particleStateTexture1 = util.createTexture(gl, gl.NEAREST, particleState, particleRes, particleRes); + + const particleIndices = new Float32Array(this._numParticles); + for (let i = 0; i < this._numParticles; i += 1) particleIndices[i] = i; + this.particleIndexBuffer = util.createBuffer(gl, particleIndices); + } + + get numParticles() { + return this._numParticles; + } + + setWind(windData) { + this.windData = windData; + const height = windData.textureHeight; + const width = windData.textureWidth; + this.windTexture = util.createTexture(this.gl, this.gl.LINEAR, windData.image, width, height); + } + + draw() { + const { gl } = this; + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.STENCIL_TEST); + + util.bindTexture(gl, this.windTexture, 0); + util.bindTexture(gl, this.particleStateTexture0, 1); + + this.drawScreen(); + this.updateParticles(); + } + + drawScreen() { + const { gl } = this; + // draw the screen into a temporary framebuffer to retain it as the background on the next frame + util.bindFramebuffer(gl, this.framebuffer, this.screenTexture); + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + + this.drawTexture(this.backgroundTexture, this.fadeOpacity); + this.drawParticles(); + + util.bindFramebuffer(gl, null); + // enable blending to support drawing on top of an existing background (e.g. a map) + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + this.drawTexture(this.screenTexture, 1.0); + gl.disable(gl.BLEND); + + // save the current screen as the background for the next frame + const temp = this.backgroundTexture; + this.backgroundTexture = this.screenTexture; + this.screenTexture = temp; + } + + drawTexture(texture, opacity) { + const { gl } = this; + const program = this.screenProgram; + gl.useProgram(program.program); + + util.bindAttribute(gl, this.quadBuffer, program.a_pos, 2); + util.bindTexture(gl, texture, 2); + gl.uniform1i(program.u_screen, 2); + gl.uniform1f(program.u_opacity, opacity); + + gl.drawArrays(gl.TRIANGLES, 0, 6); + } + + drawParticles() { + const { gl } = this; + const program = this.drawProgram; + gl.useProgram(program.program); + + util.bindAttribute(gl, this.particleIndexBuffer, program.a_index, 1); + util.bindTexture(gl, this.colorRampTexture, 2); + + gl.uniform1i(program.u_wind, 0); + gl.uniform1i(program.u_particles, 1); + gl.uniform1i(program.u_color_ramp, 2); + + gl.uniform1f(program.u_particles_res, this.particleStateResolution); + gl.uniform2f(program.u_wind_min, this.windData.uMin, this.windData.vMin); + gl.uniform2f(program.u_wind_max, this.windData.uMax, this.windData.vMax); + + gl.drawArrays(gl.POINTS, 0, this._numParticles); + } + + updateParticles() { + const { gl } = this; + util.bindFramebuffer(gl, this.framebuffer, this.particleStateTexture1); + gl.viewport(0, 0, this.particleStateResolution, this.particleStateResolution); + + const program = this.updateProgram; + gl.useProgram(program.program); + + util.bindAttribute(gl, this.quadBuffer, program.a_pos, 2); + + gl.uniform1i(program.u_wind, 0); + gl.uniform1i(program.u_particles, 1); + + gl.uniform1f(program.u_rand_seed, Math.random()); + gl.uniform2f(program.u_wind_res, this.windData.width, this.windData.height); + gl.uniform2f(program.u_wind_min, this.windData.uMin, this.windData.vMin); + gl.uniform2f(program.u_wind_max, this.windData.uMax, this.windData.vMax); + gl.uniform1f(program.u_speed_factor, this.speedFactor); + gl.uniform1f(program.u_drop_rate, this.dropRate); + gl.uniform1f(program.u_drop_rate_bump, this.dropRateBump); + + gl.drawArrays(gl.TRIANGLES, 0, 6); + + // swap the particle state textures so the new one becomes the current one + const temp = this.particleStateTexture0; + this.particleStateTexture0 = this.particleStateTexture1; + this.particleStateTexture1 = temp; + } } function getColorRamp(colors) { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); - canvas.width = 256; - canvas.height = 1; + canvas.width = 256; + canvas.height = 1; - const gradient = ctx.createLinearGradient(0, 0, 256, 0); - for (const stop in colors) { - gradient.addColorStop(+stop, colors[stop]); - } + const gradient = ctx.createLinearGradient(0, 0, 256, 0); + for (const stop in colors) { + gradient.addColorStop(+stop, colors[stop]); + } - ctx.fillStyle = gradient; - ctx.fillRect(0, 0, 256, 1); + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, 256, 1); - return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data); -} \ No newline at end of file + return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data); +} From 1fe760d76e7ee18c7c30eae3fda509fc1b2725fe Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 11:16:14 -0400 Subject: [PATCH 45/85] ASCAT styled as yellow points. --- .../FIRMS_VIIRS_Thermal_Anomalies.json | 30 +- .../FIRMS_VIIRS_Thermal_Anomalies_polar.json | 30 +- config/default/common/vectorstyles/ascat.json | 2 +- package-lock.json | 535 ++++++++++++++++-- package.json | 2 + web/js/map/layerbuilder.js | 113 +++- web/js/modules/vector-styles/selectors.js | 12 +- webpack.config.js | 7 + 8 files changed, 654 insertions(+), 77 deletions(-) diff --git a/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies.json b/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies.json index 5553979bb4..ca3645afb9 100644 --- a/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies.json +++ b/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies.json @@ -64,7 +64,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -85,7 +85,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -106,7 +106,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -127,7 +127,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -148,7 +148,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -169,7 +169,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -190,7 +190,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -211,7 +211,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -232,7 +232,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -253,7 +253,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -274,7 +274,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -295,7 +295,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -316,7 +316,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -337,7 +337,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -358,7 +358,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } } ] diff --git a/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies_polar.json b/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies_polar.json index 93dd171999..5d31ac85bc 100644 --- a/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies_polar.json +++ b/config/default/common/vectorstyles/FIRMS_VIIRS_Thermal_Anomalies_polar.json @@ -61,7 +61,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -79,7 +79,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -97,7 +97,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -115,7 +115,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -133,7 +133,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -151,7 +151,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -169,7 +169,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -187,7 +187,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -205,7 +205,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -223,7 +223,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -241,7 +241,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -259,7 +259,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -277,7 +277,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -295,7 +295,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } }, { @@ -313,7 +313,7 @@ 3, 3 ], - "circle-color": "rgb(240, 40, 40)" + "circle-color": "rgb(40 40, 240)" } } ] diff --git a/config/default/common/vectorstyles/ascat.json b/config/default/common/vectorstyles/ascat.json index af1915902b..1bc24c866d 100644 --- a/config/default/common/vectorstyles/ascat.json +++ b/config/default/common/vectorstyles/ascat.json @@ -27,7 +27,7 @@ 3, 3 ], - "circle-color": "rgb(236, 98, 16)" + "circle-color": "rgb(160, 229, 26)" } } ] diff --git a/package-lock.json b/package-lock.json index bd9306ab5f..0d8bcf5e2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "elm-pep": "^1.0.6", "file-saver": "^2.0.2", "geographiclib": "^1.50.0", + "glslify-loader": "^2.0.0", "history": "^4.7.2", "immutability-helper": "^3.0.1", "jsdom-worker": "^0.2.1", @@ -43,6 +44,7 @@ "proj4": "2.6.1", "promise-queue": "2.2.5", "prop-types": "^15.7.2", + "raw-loader": "^4.0.2", "rc-slider": "9.2.2", "react": "^16.14.0", "react-autocomplete": "^1.8.1", @@ -1750,6 +1752,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, "node_modules/@cnakazawa/watch": { "version": "1.0.4", "dev": true, @@ -4788,7 +4801,6 @@ }, "node_modules/big.js": { "version": "5.2.2", - "dev": true, "license": "MIT", "engines": { "node": "*" @@ -6148,6 +6160,11 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/common-path-prefix": { "version": "3.0.0", "dev": true, @@ -6378,7 +6395,6 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { @@ -7722,7 +7738,6 @@ }, "node_modules/emojis-list": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -10077,6 +10092,170 @@ "node": "*" } }, + "node_modules/glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "dependencies": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "node_modules/glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "dependencies": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + } + }, + "node_modules/glsl-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + }, + "node_modules/glsl-resolve/node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" + }, + "node_modules/glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "dependencies": { + "glsl-tokenizer": "^2.0.0" + } + }, + "node_modules/glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" + }, + "node_modules/glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "dependencies": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "node_modules/glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" + }, + "node_modules/glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" + }, + "node_modules/glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" + }, + "node_modules/glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "node_modules/glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "dependencies": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "node_modules/glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "dependencies": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "node_modules/glslify-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glslify-loader/-/glslify-loader-2.0.0.tgz", + "integrity": "sha512-oOdmTX1BSPG75o3gNZToemfbbuN5dgi4Pco/aRfjbwGxPIfflYLuok6JCf2kDBPHjP+tV+imNsj6YRJg9gKJ1A==", + "dependencies": { + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.3.0", + "loader-utils": "^1.1.0", + "resolve": "^1.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glslify-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/glslify-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/got": { "version": "11.8.5", "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", @@ -10944,7 +11123,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -13344,7 +13522,6 @@ }, "node_modules/json5": { "version": "2.2.1", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -13541,7 +13718,6 @@ }, "node_modules/loader-utils": { "version": "2.0.2", - "dev": true, "license": "MIT", "dependencies": { "big.js": "^5.2.2", @@ -13943,6 +14119,22 @@ "node": ">=0.10.0" } }, + "node_modules/map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/map-obj": { "version": "4.3.0", "dev": true, @@ -14790,6 +14982,11 @@ "multicast-dns": "cli.js" } }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, "node_modules/nan": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", @@ -17689,6 +17886,25 @@ "node": ">= 0.8" } }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, "node_modules/rbush": { "version": "3.0.1", "license": "MIT", @@ -19831,6 +20047,11 @@ "node": ">=8" } }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, "node_modules/shallowequal": { "version": "1.1.0", "license": "MIT" @@ -21588,11 +21809,6 @@ "node": ">=0.4.0" } }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, "node_modules/terser-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -21691,6 +21907,36 @@ "dev": true, "license": "MIT" }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -23286,7 +23532,6 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -23343,7 +23588,6 @@ }, "node_modules/xtend": { "version": "4.0.2", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -24513,6 +24757,14 @@ "version": "0.2.3", "dev": true }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + } + }, "@cnakazawa/watch": { "version": "1.0.4", "dev": true, @@ -26713,8 +26965,7 @@ } }, "big.js": { - "version": "5.2.2", - "dev": true + "version": "5.2.2" }, "binary-extensions": { "version": "2.2.0", @@ -27671,6 +27922,11 @@ "version": "1.2.9", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "common-path-prefix": { "version": "3.0.0", "dev": true @@ -27825,8 +28081,7 @@ "dev": true }, "core-util-is": { - "version": "1.0.3", - "dev": true + "version": "1.0.3" }, "cosmiconfig": { "version": "7.0.1", @@ -28761,8 +29016,7 @@ "dev": true }, "emojis-list": { - "version": "3.0.0", - "dev": true + "version": "3.0.0" }, "emotion": { "version": "9.2.12", @@ -30357,6 +30611,162 @@ } } }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==" + } + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "glslify-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glslify-loader/-/glslify-loader-2.0.0.tgz", + "integrity": "sha512-oOdmTX1BSPG75o3gNZToemfbbuN5dgi4Pco/aRfjbwGxPIfflYLuok6JCf2kDBPHjP+tV+imNsj6YRJg9gKJ1A==", + "requires": { + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.3.0", + "loader-utils": "^1.1.0", + "resolve": "^1.3.3" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, "got": { "version": "11.8.5", "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", @@ -30926,8 +31336,7 @@ } }, "inherits": { - "version": "2.0.4", - "dev": true + "version": "2.0.4" }, "ini": { "version": "1.3.8", @@ -32484,8 +32893,7 @@ "peer": true }, "json5": { - "version": "2.2.1", - "dev": true + "version": "2.2.1" }, "jsonfile": { "version": "4.0.0", @@ -32627,7 +33035,6 @@ }, "loader-utils": { "version": "2.0.2", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -32936,6 +33343,24 @@ "version": "0.2.2", "dev": true }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "requires": { + "wrappy": "1" + } + } + } + }, "map-obj": { "version": "4.3.0", "dev": true @@ -33529,6 +33954,11 @@ "thunky": "^1.0.2" } }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, "nan": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", @@ -35455,6 +35885,15 @@ } } }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, "rbush": { "version": "3.0.1", "requires": { @@ -36952,6 +37391,11 @@ "kind-of": "^6.0.2" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, "shallowequal": { "version": "1.1.0" }, @@ -38165,11 +38609,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -38245,6 +38684,38 @@ "version": "2.3.8", "dev": true }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -39344,8 +39815,7 @@ } }, "wrappy": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "write-file-atomic": { "version": "3.0.3", @@ -39377,8 +39847,7 @@ "version": "0.1.31" }, "xtend": { - "version": "4.0.2", - "dev": true + "version": "4.0.2" }, "y18n": { "version": "4.0.3", diff --git a/package.json b/package.json index e6792e5a94..4133c4af49 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,7 @@ "elm-pep": "^1.0.6", "file-saver": "^2.0.2", "geographiclib": "^1.50.0", + "glslify-loader": "^2.0.0", "history": "^4.7.2", "immutability-helper": "^3.0.1", "jsdom-worker": "^0.2.1", @@ -192,6 +193,7 @@ "proj4": "2.6.1", "promise-queue": "2.2.5", "prop-types": "^15.7.2", + "raw-loader": "^4.0.2", "rc-slider": "9.2.2", "react": "^16.14.0", "react-autocomplete": "^1.8.1", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 6f0a6ea343..b032ea4467 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -6,14 +6,21 @@ import OlSourceTileWMS from 'ol/source/TileWMS'; import OlLayerGroup from 'ol/layer/Group'; import OlLayerTile from 'ol/layer/Tile'; import OlTileGridTileGrid from 'ol/tilegrid/TileGrid'; - import MVT from 'ol/format/MVT'; + import LayerVectorTile from 'ol/layer/VectorTile'; import SourceVectorTile from 'ol/source/VectorTile'; + import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; import lodashGet from 'lodash/get'; +import Style from 'ol/style/Style'; +import Stroke from 'ol/style/Stroke'; +import Fill from 'ol/style/Fill'; +import CircleStyle from 'ol/style/Circle'; +// import WindTile from '../vectorflow/renderer.js'; +// import { throttle } from '../vectorflow/util'; import util from '../util/util'; import lookupFactory from '../ol/lookupimagetile'; import granuleLayerBuilder from './granule/granule-layer-builder'; @@ -434,6 +441,11 @@ export default function mapLayerBuilder(config, cache, store) { }); } + + + + + /** Create a new Vector Layer * * @param {object} def - Layer Specs @@ -443,8 +455,8 @@ export default function mapLayerBuilder(config, cache, store) { * @param {object} attributes * @returns {object} OpenLayers Vector layer */ - const createLayerVector = function(def, options, day, state, attributes) { - // + const createLayerVector = function(def, layeroptions, day, state, attributes) { + console.log('layerbuilder: createLayerVector running'); const { proj, animation } = state; let date; let gridExtent; @@ -488,7 +500,7 @@ export default function mapLayerBuilder(config, cache, store) { const layerName = def.layer || def.id; const tileMatrixSet = def.matrixSet; - date = options.date || getSelectedDate(state); + date = layeroptions.date || getSelectedDate(state); if (day && def.wrapadjacentdays) date = util.dateAdd(date, 'day', day); const urlParameters = createVectorUrl(date, layerName, tileMatrixSet); @@ -499,9 +511,7 @@ export default function mapLayerBuilder(config, cache, store) { const isMaxBreakPoint = breakPointType === 'max'; const isMinBreakPoint = breakPointType === 'min'; - - - + console.log('Creating Layer Vector'); const tileSource = new SourceVectorTile({ url: source.url + urlParameters, @@ -527,15 +537,98 @@ export default function mapLayerBuilder(config, cache, store) { preload: 0, ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, + // force a style onto the LayerVectorTile. This causes the ASCAT data to render as YELLOW circles + style: new Style({ + fill: new Fill({ + color: 'red', + }), + stroke: new Stroke({ + color: 'white', + width: 1.25, + }), + image: new CircleStyle({ + radius: 5, + fill: new Fill({ + color: 'yellow', + }), + stroke: new Stroke({ + color: 'white', + width: 1.25, + }), + }), + }), }); - applyStyle(def, layer, state, options); + + console.log('Can I force a WindTile here (somehow)?'); + + // let i = 0; + // const moving = false; + // const initiatedGUI = false; + // let currentFeatures; + // let zoom; + // let extent; + // let options; + + // tileSource.on('tileloadstart', (e) => { + // i += 1; + // }); + // let windRender; + // tileSource.on('tileloadend', (e) => { + // if (!windRender) { + // // const mapSize = map.getSize(); + // const tileOptions = { + // uMin: -76.57695007324219, + // uMax: 44.30181884765625, + // vMin: -76.57695007324219, + // vMax: 44.30181884765625, + // // width: mapSize[0], + // // height: mapSize[1], + // }; + // windRender = new WindTile(tileOptions); + // } + // i -= 1; + // if (i === 1 && !windRender.stopped && windRender) { + // windRender.stop(); + // } + // if (i === 0 && !moving && windRender) { + // if (!initiatedGUI) { + // setTimeout(() => { updateRenderer(); }, 1); + // } else { + // updateRendererThrottled(); + // } + // } + // }); + + // const updateRenderer = () => { + // const view = map.getView(); + // const mapSize = map.getSize(); + // extent = view.calculateExtent(mapSize); + // currentFeatures = vectorLayer.getSource().getFeaturesInExtent(extent); + // zoom = view.getZoom(); + // options = { + // uMin: -55.806217193603516, + // uMax: 45.42329406738281, + // vMin: -5.684286117553711, + // vMax: 44.30181884765625, + // width: mapSize[0], + // height: mapSize[1], + // ts: Date.now(), + // }; + // windRender.updateData(currentFeatures, extent, zoom, options); + // if (!initiatedGUI) initGUI(); + // }; + // const updateRendererThrottled = throttle(updateRenderer, 150); + + // Below is OG worldview code + + applyStyle(def, layer, state, layeroptions); layer.wrap = day; layer.wv = attributes; layer.isVector = true; if (breakPointLayerDef && !animationIsPlaying) { const newDef = { ...def, ...breakPointLayerDef }; - const wmsLayer = createLayerWMS(newDef, options, day, state); + const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); const layerGroup = new OlLayerGroup({ layers: [layer, wmsLayer], }); @@ -546,7 +639,7 @@ export default function mapLayerBuilder(config, cache, store) { if (breakPointResolution && animationIsPlaying) { delete breakPointLayerDef.projections[proj.id].resolutionBreakPoint; const newDef = { ...def, ...breakPointLayerDef }; - const wmsLayer = createLayerWMS(newDef, options, day, state); + const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); wmsLayer.wv = attributes; return wmsLayer; } diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 6443856a4a..6194707535 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -107,6 +107,11 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; const glStyle = vectorStyles[styleId]; + console.log('glStyle'); + console.log(glStyle); + // console.log('styleId'); + // console.log(styleId); + // ASCAT does not include a glStyle, so we early return here in that instance if (glStyle === undefined) { return; @@ -216,9 +221,9 @@ export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, stat /** Apply style to new layer * - * @param {Object} def - * @param {Object} olVectorLayer - * @param {Object} state + * @param {Object} def {object} The layer information + * @param {Object} olVectorLayer {object} The VectorTileLayer object + * @param {Object} state {object} application state */ export const applyStyle = (def, olVectorLayer, state) => { const { config } = state; @@ -231,6 +236,7 @@ export const applyStyle = (def, olVectorLayer, state) => { return; } + // iterate to find the matching layer data & apply the associated style activeLayers.forEach((layer) => { if (layer.id === layerName && layer.custom) { vectorStyleId = layer.custom; diff --git a/webpack.config.js b/webpack.config.js index 59e4a0a2f5..17b5c2dbda 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -101,6 +101,13 @@ module.exports = { }, exclude: babelLoaderExcludes, }, + // { + // test: /\.(glsl|frag|vert)$/, + // use: [ + // require.resolve('raw-loader'), + // require.resolve('glslify-loader'), + // ], + // }, { test: /\.(sa|sc|c)ss$/, use: [ From 2c36e395ca78c17830fe5e9fa03b71ac4615171e Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 12:11:18 -0400 Subject: [PATCH 46/85] Animation is visible (but loading underneath the map). --- web/index.html | 1 + web/js/map/layerbuilder.js | 122 +++++++++++++++++----------------- web/js/vectorflow/renderer.js | 4 +- webpack.config.js | 14 ++-- 4 files changed, 72 insertions(+), 69 deletions(-) diff --git a/web/index.html b/web/index.html index dbca11e07f..db7f9b4e53 100644 --- a/web/index.html +++ b/web/index.html @@ -74,6 +74,7 @@

+
diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index b032ea4467..5af1d5273d 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -19,8 +19,8 @@ import Style from 'ol/style/Style'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; import CircleStyle from 'ol/style/Circle'; -// import WindTile from '../vectorflow/renderer.js'; -// import { throttle } from '../vectorflow/util'; +import WindTile from '../vectorflow/renderer.js'; +import { throttle } from '../vectorflow/util'; import util from '../util/util'; import lookupFactory from '../ol/lookupimagetile'; import granuleLayerBuilder from './granule/granule-layer-builder'; @@ -457,7 +457,7 @@ export default function mapLayerBuilder(config, cache, store) { */ const createLayerVector = function(def, layeroptions, day, state, attributes) { console.log('layerbuilder: createLayerVector running'); - const { proj, animation } = state; + const { proj, animation, map: { ui: { selected } } } = state; let date; let gridExtent; let matrixIds; @@ -549,7 +549,7 @@ export default function mapLayerBuilder(config, cache, store) { image: new CircleStyle({ radius: 5, fill: new Fill({ - color: 'yellow', + color: 'green', }), stroke: new Stroke({ color: 'white', @@ -561,63 +561,63 @@ export default function mapLayerBuilder(config, cache, store) { console.log('Can I force a WindTile here (somehow)?'); - // let i = 0; - // const moving = false; - // const initiatedGUI = false; - // let currentFeatures; - // let zoom; - // let extent; - // let options; - - // tileSource.on('tileloadstart', (e) => { - // i += 1; - // }); - // let windRender; - // tileSource.on('tileloadend', (e) => { - // if (!windRender) { - // // const mapSize = map.getSize(); - // const tileOptions = { - // uMin: -76.57695007324219, - // uMax: 44.30181884765625, - // vMin: -76.57695007324219, - // vMax: 44.30181884765625, - // // width: mapSize[0], - // // height: mapSize[1], - // }; - // windRender = new WindTile(tileOptions); - // } - // i -= 1; - // if (i === 1 && !windRender.stopped && windRender) { - // windRender.stop(); - // } - // if (i === 0 && !moving && windRender) { - // if (!initiatedGUI) { - // setTimeout(() => { updateRenderer(); }, 1); - // } else { - // updateRendererThrottled(); - // } - // } - // }); - - // const updateRenderer = () => { - // const view = map.getView(); - // const mapSize = map.getSize(); - // extent = view.calculateExtent(mapSize); - // currentFeatures = vectorLayer.getSource().getFeaturesInExtent(extent); - // zoom = view.getZoom(); - // options = { - // uMin: -55.806217193603516, - // uMax: 45.42329406738281, - // vMin: -5.684286117553711, - // vMax: 44.30181884765625, - // width: mapSize[0], - // height: mapSize[1], - // ts: Date.now(), - // }; - // windRender.updateData(currentFeatures, extent, zoom, options); - // if (!initiatedGUI) initGUI(); - // }; - // const updateRendererThrottled = throttle(updateRenderer, 150); + let i = 0; + const moving = false; + const initiatedGUI = false; + let currentFeatures; + let zoom; + let extent; + let options; + + tileSource.on('tileloadstart', (e) => { + i += 1; + }); + let windRender; + tileSource.on('tileloadend', (e) => { + if (!windRender) { + const mapSize = selected.getSize(); + const tileOptions = { + uMin: -76.57695007324219, + uMax: 44.30181884765625, + vMin: -76.57695007324219, + vMax: 44.30181884765625, + width: mapSize[0], + height: mapSize[1], + }; + windRender = new WindTile(tileOptions); + } + i -= 1; + if (i === 1 && !windRender.stopped && windRender) { + windRender.stop(); + } + if (i === 0 && !moving && windRender) { + if (!initiatedGUI) { + setTimeout(() => { updateRenderer(); }, 1); + } else { + updateRendererThrottled(); + } + } + }); + + const updateRenderer = () => { + const view = selected.getView(); + const mapSize = selected.getSize(); + extent = view.calculateExtent(mapSize); + currentFeatures = layer.getSource().getFeaturesInExtent(extent); + zoom = view.getZoom(); + options = { + uMin: -55.806217193603516, + uMax: 45.42329406738281, + vMin: -5.684286117553711, + vMax: 44.30181884765625, + width: mapSize[0], + height: mapSize[1], + ts: Date.now(), + }; + windRender.updateData(currentFeatures, extent, zoom, options); + // if (!initiatedGUI) initGUI(); + }; + const updateRendererThrottled = throttle(updateRenderer, 150); // Below is OG worldview code diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index 1313118239..c7bb045d57 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -12,7 +12,9 @@ export default class WindTile { this.offset = options.offset || [0, 0]; this.pxRatio = Math.max(Math.floor(window.devicePixelRatio) || 1, 2); this.meta = options.meta || {}; - this.parent = options.parent || document.getElementById('root'); + + // Check Ben's demo & confirm what "parent" is + this.parent = options.parent || document.getElementById('app'); this.glCanvas.id = 'gl-canvas'; this.stopped = false; this.init(); diff --git a/webpack.config.js b/webpack.config.js index 17b5c2dbda..8c70b9310f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -101,13 +101,13 @@ module.exports = { }, exclude: babelLoaderExcludes, }, - // { - // test: /\.(glsl|frag|vert)$/, - // use: [ - // require.resolve('raw-loader'), - // require.resolve('glslify-loader'), - // ], - // }, + { + test: /\.(glsl|frag|vert)$/, + use: [ + require.resolve('raw-loader'), + require.resolve('glslify-loader'), + ], + }, { test: /\.(sa|sc|c)ss$/, use: [ From bc435ea313af90196c39d3d444cb0397c321e7fa Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 12:17:19 -0400 Subject: [PATCH 47/85] Added Jest configuration to ignore the GLSL shaders. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4133c4af49..540f833e36 100644 --- a/package.json +++ b/package.json @@ -247,7 +247,8 @@ "node_modules/(?!(ol|ol-mapbox-style|quick-lru|geotiff|@mapbox)/)" ], "modulePathIgnorePatterns": [ - "/build/" + "/build/", + "/web/js/vectorflow/wind/shaders/" ] }, "prettier": { From 2787f555625925bdebe4d769443c29c9b2cb47de Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 12:52:43 -0400 Subject: [PATCH 48/85] Notes & adjustments. --- package-lock.json | 7 ++-- package.json | 1 + web/js/map/layerbuilder.js | 60 ++++++++++++++++++++++------------- web/js/vectorflow/renderer.js | 3 +- 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d8bcf5e2e..4b636447ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,6 +97,7 @@ "css-loader": "^3.5.2", "css-minimizer-webpack-plugin": "^4.1.0", "cssnano": "^5.1.13", + "dat.gui": "^0.7.7", "eslint": "^7.5.0", "eslint-config-airbnb": "^18.0.1", "eslint-config-standard": "^14.1.0", @@ -7065,7 +7066,8 @@ "node_modules/dat.gui": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", - "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==", + "dev": true }, "node_modules/data-urls": { "version": "2.0.0", @@ -28552,7 +28554,8 @@ "dat.gui": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", - "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==", + "dev": true }, "data-urls": { "version": "2.0.0", diff --git a/package.json b/package.json index 540f833e36..6924963945 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "css-loader": "^3.5.2", "css-minimizer-webpack-plugin": "^4.1.0", "cssnano": "^5.1.13", + "dat.gui": "^0.7.7", "eslint": "^7.5.0", "eslint-config-airbnb": "^18.0.1", "eslint-config-standard": "^14.1.0", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 5af1d5273d..7ab7a2807a 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -19,6 +19,7 @@ import Style from 'ol/style/Style'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; import CircleStyle from 'ol/style/Circle'; +import * as dat from 'dat.gui'; import WindTile from '../vectorflow/renderer.js'; import { throttle } from '../vectorflow/util'; import util from '../util/util'; @@ -538,36 +539,37 @@ export default function mapLayerBuilder(config, cache, store) { ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, // force a style onto the LayerVectorTile. This causes the ASCAT data to render as YELLOW circles - style: new Style({ - fill: new Fill({ - color: 'red', - }), - stroke: new Stroke({ - color: 'white', - width: 1.25, - }), - image: new CircleStyle({ - radius: 5, - fill: new Fill({ - color: 'green', - }), - stroke: new Stroke({ - color: 'white', - width: 1.25, - }), - }), - }), + // style: new Style({ + // fill: new Fill({ + // color: 'red', + // }), + // stroke: new Stroke({ + // color: 'white', + // width: 1.25, + // }), + // image: new CircleStyle({ + // radius: 5, + // fill: new Fill({ + // color: 'green', + // }), + // stroke: new Stroke({ + // color: 'white', + // width: 1.25, + // }), + // }), + // }), }); console.log('Can I force a WindTile here (somehow)?'); let i = 0; const moving = false; - const initiatedGUI = false; + let initiatedGUI = false; let currentFeatures; let zoom; let extent; let options; + const gui = new dat.GUI(); tileSource.on('tileloadstart', (e) => { i += 1; @@ -615,10 +617,24 @@ export default function mapLayerBuilder(config, cache, store) { ts: Date.now(), }; windRender.updateData(currentFeatures, extent, zoom, options); - // if (!initiatedGUI) initGUI(); + if (!initiatedGUI) initGUI(); }; const updateRendererThrottled = throttle(updateRenderer, 150); - + const initGUI = function() { + const { wind } = windRender; + + // How can I modify these defaults? I'd like to make the animated elements more prominent by default + gui.add(wind, 'numParticles', 144, 248832); + gui.add(wind, 'fadeOpacity', 0.96, 0.999).step(0.001).updateDisplay(); + gui.add(wind, 'speedFactor', 0.05, 1.0); + gui.add(wind, 'dropRate', 0, 0.1); + gui.add(wind, 'dropRateBump', 0, 0.2); + gui.add(windRender, 'dataGridWidth', 18, 360).step(2).onChange(updateTexture); + initiatedGUI = true; + }; + const updateTexture = function() { + windRender.updateData(currentFeatures, extent, zoom, options); + }; // Below is OG worldview code applyStyle(def, layer, state, layeroptions); diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index c7bb045d57..b457e9c498 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -13,7 +13,8 @@ export default class WindTile { this.pxRatio = Math.max(Math.floor(window.devicePixelRatio) || 1, 2); this.meta = options.meta || {}; - // Check Ben's demo & confirm what "parent" is + // Ben's demo sets parent to "root", creating a 2nd canvas element overlayed on top of the map + // We are assigning this to "app" which is the map element in WorldView this.parent = options.parent || document.getElementById('app'); this.glCanvas.id = 'gl-canvas'; this.stopped = false; From fdba0747cd67f791eacc1c3f16fee74eed53a58e Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 14:34:51 -0400 Subject: [PATCH 49/85] Modified Wind rendering defaults so the effect is more prominent. --- package.json | 3 +-- web/js/map/layerbuilder.js | 15 ++++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 6924963945..88f2cf85bb 100644 --- a/package.json +++ b/package.json @@ -248,8 +248,7 @@ "node_modules/(?!(ol|ol-mapbox-style|quick-lru|geotiff|@mapbox)/)" ], "modulePathIgnorePatterns": [ - "/build/", - "/web/js/vectorflow/wind/shaders/" + "/build/" ] }, "prettier": { diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 7ab7a2807a..62458469ba 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -623,14 +623,15 @@ export default function mapLayerBuilder(config, cache, store) { const initGUI = function() { const { wind } = windRender; - // How can I modify these defaults? I'd like to make the animated elements more prominent by default - gui.add(wind, 'numParticles', 144, 248832); - gui.add(wind, 'fadeOpacity', 0.96, 0.999).step(0.001).updateDisplay(); - gui.add(wind, 'speedFactor', 0.05, 1.0); - gui.add(wind, 'dropRate', 0, 0.1); - gui.add(wind, 'dropRateBump', 0, 0.2); - gui.add(windRender, 'dataGridWidth', 18, 360).step(2).onChange(updateTexture); + gui.add(wind, 'numParticles', 144, 248832).setValue(148225); + gui.add(wind, 'fadeOpacity', 0.96, 0.999).setValue(0.97).step(0.001).updateDisplay(); + gui.add(wind, 'speedFactor', 0.05, 1.0).setValue(0.5); + gui.add(wind, 'dropRate', 0, 0.1).setValue(0.025); + gui.add(wind, 'dropRateBump', 0, 0.2).setValue(0.04); + gui.add(windRender, 'dataGridWidth', 18, 360).setValue(44).step(2).onChange(updateTexture); + initiatedGUI = true; + updateRenderer(); }; const updateTexture = function() { windRender.updateData(currentFeatures, extent, zoom, options); From 64fd20211a0fc313a723623f385aad82f06290c7 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 15:22:18 -0400 Subject: [PATCH 50/85] Improved animation tracking when zooming & panning. --- web/js/map/layerbuilder.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 62458469ba..912efde4b4 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -538,6 +538,7 @@ export default function mapLayerBuilder(config, cache, store) { preload: 0, ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, + // style: [], // force a style onto the LayerVectorTile. This causes the ASCAT data to render as YELLOW circles // style: new Style({ // fill: new Fill({ @@ -563,7 +564,7 @@ export default function mapLayerBuilder(config, cache, store) { console.log('Can I force a WindTile here (somehow)?'); let i = 0; - const moving = false; + let moving = false; let initiatedGUI = false; let currentFeatures; let zoom; @@ -601,6 +602,24 @@ export default function mapLayerBuilder(config, cache, store) { } }); + selected.getView().on('change:center', () => { + if (windRender !== undefined) { + windRender.stop(); + moving = true; + } + }); + selected.getView().on('propertychange', (e) => { + if (e.key === 'resolution' && windRender) { + windRender.stop(); + moving = true; + } + }); + selected.on('moveend', (e) => { + moving = false; + if (i === 0 && windRender) updateRendererThrottled(); + }); + + const updateRenderer = () => { const view = selected.getView(); const mapSize = selected.getSize(); From e59f76cb04e3c566be60b862967d8a557d559081 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Wed, 26 Oct 2022 16:57:09 -0400 Subject: [PATCH 51/85] Moved animation layer into same div as the map, but can't get it ON the map (yet). --- web/index.html | 1 - web/js/map/layerbuilder.js | 48 +++++++++++++++++++---------------- web/js/vectorflow/renderer.js | 6 +++-- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/web/index.html b/web/index.html index db7f9b4e53..dbca11e07f 100644 --- a/web/index.html +++ b/web/index.html @@ -74,7 +74,6 @@
-
diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 912efde4b4..3c7a6047af 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -539,30 +539,32 @@ export default function mapLayerBuilder(config, cache, store) { ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, // style: [], - // force a style onto the LayerVectorTile. This causes the ASCAT data to render as YELLOW circles - // style: new Style({ - // fill: new Fill({ - // color: 'red', - // }), - // stroke: new Stroke({ - // color: 'white', - // width: 1.25, - // }), - // image: new CircleStyle({ - // radius: 5, - // fill: new Fill({ - // color: 'green', - // }), - // stroke: new Stroke({ - // color: 'white', - // width: 1.25, - // }), - // }), - // }), + // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles + // Setting the radius to 0 includes each point but hides the visual + style: new Style({ + // fill: new Fill({ + // color: 'red', + // }), + // stroke: new Stroke({ + // color: 'white', + // width: 1.25, + // }), + image: new CircleStyle({ + radius: 0, + fill: new Fill({ + color: 'green', + }), + // stroke: new Stroke({ + // color: 'white', + // width: 1.25, + // }), + }), + }), }); console.log('Can I force a WindTile here (somehow)?'); + // Vars to generate the animation & support the mini-GUI to play with the animation settings let i = 0; let moving = false; let initiatedGUI = false; @@ -570,12 +572,12 @@ export default function mapLayerBuilder(config, cache, store) { let zoom; let extent; let options; + let windRender; const gui = new dat.GUI(); tileSource.on('tileloadstart', (e) => { i += 1; }); - let windRender; tileSource.on('tileloadend', (e) => { if (!windRender) { const mapSize = selected.getSize(); @@ -644,7 +646,7 @@ export default function mapLayerBuilder(config, cache, store) { gui.add(wind, 'numParticles', 144, 248832).setValue(148225); gui.add(wind, 'fadeOpacity', 0.96, 0.999).setValue(0.97).step(0.001).updateDisplay(); - gui.add(wind, 'speedFactor', 0.05, 1.0).setValue(0.5); + gui.add(wind, 'speedFactor', 0.05, 1.0).setValue(0.07); gui.add(wind, 'dropRate', 0, 0.1).setValue(0.025); gui.add(wind, 'dropRateBump', 0, 0.2).setValue(0.04); gui.add(windRender, 'dataGridWidth', 18, 360).setValue(44).step(2).onChange(updateTexture); @@ -655,6 +657,8 @@ export default function mapLayerBuilder(config, cache, store) { const updateTexture = function() { windRender.updateData(currentFeatures, extent, zoom, options); }; + + // Below is OG worldview code applyStyle(def, layer, state, layeroptions); diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index b457e9c498..6f021e2fa2 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -13,9 +13,11 @@ export default class WindTile { this.pxRatio = Math.max(Math.floor(window.devicePixelRatio) || 1, 2); this.meta = options.meta || {}; - // Ben's demo sets parent to "root", creating a 2nd canvas element overlayed on top of the map + // Ben's demo set parent to "root", creating a 2nd canvas element overlayed on top of the map // We are assigning this to "app" which is the map element in WorldView - this.parent = options.parent || document.getElementById('app'); + // BUT, we still get a second canvas :-( + // this.parent = options.parent || document.getElementById('app'); + this.parent = document.querySelector('#wv-map-geographic > div > div.ol-unselectable.ol-layers > div'); this.glCanvas.id = 'gl-canvas'; this.stopped = false; this.init(); From 34169ad891a3e33076bd5cdfdaef03fe2230a847 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 1 Nov 2022 13:00:03 -0400 Subject: [PATCH 52/85] Moved windtile code into it's own function. --- web/js/map/layerbuilder.js | 116 +++++++++++++++++++++------------- web/js/vectorflow/renderer.js | 8 ++- 2 files changed, 77 insertions(+), 47 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 3c7a6047af..4965a65e62 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -15,11 +15,13 @@ import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; import lodashGet from 'lodash/get'; -import Style from 'ol/style/Style'; +import { Style, Icon } from 'ol/style'; +import Point from 'ol/geom/Point'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; import CircleStyle from 'ol/style/Circle'; import * as dat from 'dat.gui'; +// import { Point } from 'proj4'; import WindTile from '../vectorflow/renderer.js'; import { throttle } from '../vectorflow/util'; import util from '../util/util'; @@ -458,6 +460,12 @@ export default function mapLayerBuilder(config, cache, store) { */ const createLayerVector = function(def, layeroptions, day, state, attributes) { console.log('layerbuilder: createLayerVector running'); + console.log(def.id); + console.log(layeroptions); + console.log(def); + console.log(state); + console.log(attributes); + const { proj, animation, map: { ui: { selected } } } = state; let date; let gridExtent; @@ -539,30 +547,72 @@ export default function mapLayerBuilder(config, cache, store) { ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, // style: [], - // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles - // Setting the radius to 0 includes each point but hides the visual style: new Style({ - // fill: new Fill({ - // color: 'red', - // }), - // stroke: new Stroke({ - // color: 'white', - // width: 1.25, - // }), + // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) + // Setting the radius to 0 includes each point but hides the visual image: new CircleStyle({ - radius: 0, + radius: 2, fill: new Fill({ color: 'green', }), - // stroke: new Stroke({ - // color: 'white', - // width: 1.25, - // }), }), + + // Set as point to draw a line + // geometry: new Point(100), + // image: new Icon({ + // src: 'data/arow.png', + // anchor: [0.75, 0.5], + // rotateWithView: true, + // // rotation: -rotation, + // }), }), }); - console.log('Can I force a WindTile here (somehow)?'); + + let windTileLayer; + if (def.id === 'ascat') { + windTileLayer = createWindtile(tileSource, selected, layer); + } + + + applyStyle(def, layer, state, layeroptions); + layer.wrap = day; + layer.wv = attributes; + layer.isVector = true; + + if (breakPointLayerDef && !animationIsPlaying) { + const newDef = { ...def, ...breakPointLayerDef }; + const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); + const layerGroup = new OlLayerGroup({ + layers: [layer, wmsLayer], + }); + wmsLayer.wv = attributes; + return layerGroup; + } + + if (breakPointResolution && animationIsPlaying) { + delete breakPointLayerDef.projections[proj.id].resolutionBreakPoint; + const newDef = { ...def, ...breakPointLayerDef }; + const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); + wmsLayer.wv = attributes; + return wmsLayer; + } + + return layer; + }; + + /** + * Create a new WMS Layer + * + * @method createWindtile + * @static + * @param {object} tilesource + * @param {object} selected - OL map + * @param {object} layer + * @returns {object} OpenLayers WMS layer -- INCORRECT~! + */ + const createWindtile = function(tileSource, selected, layer) { + console.log('Generating WindTile'); // Vars to generate the animation & support the mini-GUI to play with the animation settings let i = 0; @@ -582,6 +632,7 @@ export default function mapLayerBuilder(config, cache, store) { if (!windRender) { const mapSize = selected.getSize(); const tileOptions = { + olmap: selected, uMin: -76.57695007324219, uMax: 44.30181884765625, vMin: -76.57695007324219, @@ -591,6 +642,10 @@ export default function mapLayerBuilder(config, cache, store) { }; windRender = new WindTile(tileOptions); } + + console.log('windRender'); + console.log(windRender); + i -= 1; if (i === 1 && !windRender.stopped && windRender) { windRender.stop(); @@ -621,7 +676,6 @@ export default function mapLayerBuilder(config, cache, store) { if (i === 0 && windRender) updateRendererThrottled(); }); - const updateRenderer = () => { const view = selected.getView(); const mapSize = selected.getSize(); @@ -657,34 +711,6 @@ export default function mapLayerBuilder(config, cache, store) { const updateTexture = function() { windRender.updateData(currentFeatures, extent, zoom, options); }; - - - // Below is OG worldview code - - applyStyle(def, layer, state, layeroptions); - layer.wrap = day; - layer.wv = attributes; - layer.isVector = true; - - if (breakPointLayerDef && !animationIsPlaying) { - const newDef = { ...def, ...breakPointLayerDef }; - const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); - const layerGroup = new OlLayerGroup({ - layers: [layer, wmsLayer], - }); - wmsLayer.wv = attributes; - return layerGroup; - } - - if (breakPointResolution && animationIsPlaying) { - delete breakPointLayerDef.projections[proj.id].resolutionBreakPoint; - const newDef = { ...def, ...breakPointLayerDef }; - const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); - wmsLayer.wv = attributes; - return wmsLayer; - } - - return layer; }; /** diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index 6f021e2fa2..e81836112c 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -2,12 +2,15 @@ import WindGL from './wind/windindex'; export default class WindTile { constructor(options) { + console.log(options); this.options = options; this.visibleExtent = [-180, -90, 180, 90]; this.width = options.width || 512; this.height = options.height || 512; this.dataGridWidth = 360; this.glCanvas = options.canvas || document.createElement('canvas'); + this.olmap = options.olmap; + this.gl = options.gl || this.glCanvas.getContext('webgl', { antialiasing: false }); this.offset = options.offset || [0, 0]; this.pxRatio = Math.max(Math.floor(window.devicePixelRatio) || 1, 2); @@ -18,16 +21,17 @@ export default class WindTile { // BUT, we still get a second canvas :-( // this.parent = options.parent || document.getElementById('app'); this.parent = document.querySelector('#wv-map-geographic > div > div.ol-unselectable.ol-layers > div'); - this.glCanvas.id = 'gl-canvas'; + // this.glCanvas.id = 'ben-canvas'; this.stopped = false; this.init(); this.callback = options.callback; } init() { - this.parent.appendChild(this.glCanvas); + this.parent.prepend(this.glCanvas); this.glCanvas.width = this.width; this.glCanvas.height = this.height; + this.glCanvas.height = this.height; this.gl.width = this.width; this.gl.height = this.height; From 8d049750cd500dc4530790900cd04db801cb3fd7 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 1 Nov 2022 15:38:17 -0400 Subject: [PATCH 53/85] Kludged z-index onto map canvas which allows vector animation to display properly. Also tweaked default animation values. --- web/js/map/layerbuilder.js | 40 +++++++++++------------ web/js/modules/vector-styles/selectors.js | 6 ---- web/js/vectorflow/renderer.js | 18 +++++++--- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 4965a65e62..5c019d3ec9 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -459,13 +459,6 @@ export default function mapLayerBuilder(config, cache, store) { * @returns {object} OpenLayers Vector layer */ const createLayerVector = function(def, layeroptions, day, state, attributes) { - console.log('layerbuilder: createLayerVector running'); - console.log(def.id); - console.log(layeroptions); - console.log(def); - console.log(state); - console.log(attributes); - const { proj, animation, map: { ui: { selected } } } = state; let date; let gridExtent; @@ -520,8 +513,6 @@ export default function mapLayerBuilder(config, cache, store) { const isMaxBreakPoint = breakPointType === 'max'; const isMinBreakPoint = breakPointType === 'min'; - console.log('Creating Layer Vector'); - const tileSource = new SourceVectorTile({ url: source.url + urlParameters, layer: layerName, @@ -551,7 +542,7 @@ export default function mapLayerBuilder(config, cache, store) { // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) // Setting the radius to 0 includes each point but hides the visual image: new CircleStyle({ - radius: 2, + radius: 0, fill: new Fill({ color: 'green', }), @@ -571,7 +562,12 @@ export default function mapLayerBuilder(config, cache, store) { let windTileLayer; if (def.id === 'ascat') { + // Add z-index property to existing canvas + // FIND THE PROPER WAY TO DO THIS! + document.querySelectorAll('canvas')[0].style.zIndex = -1; + windTileLayer = createWindtile(tileSource, selected, layer); + // console.log(windTileLayer); } @@ -602,7 +598,7 @@ export default function mapLayerBuilder(config, cache, store) { }; /** - * Create a new WMS Layer + * Create a WindTile * * @method createWindtile * @static @@ -643,9 +639,6 @@ export default function mapLayerBuilder(config, cache, store) { windRender = new WindTile(tileOptions); } - console.log('windRender'); - console.log(windRender); - i -= 1; if (i === 1 && !windRender.stopped && windRender) { windRender.stop(); @@ -659,6 +652,7 @@ export default function mapLayerBuilder(config, cache, store) { } }); + // These listen for changes to position/zoom/other properties & re-render the animation canvas to compensate selected.getView().on('change:center', () => { if (windRender !== undefined) { windRender.stop(); @@ -671,6 +665,8 @@ export default function mapLayerBuilder(config, cache, store) { moving = true; } }); + + // when the user stops moving the map, we need to re-render the windtiles in the new position selected.on('moveend', (e) => { moving = false; if (i === 0 && windRender) updateRendererThrottled(); @@ -698,12 +694,12 @@ export default function mapLayerBuilder(config, cache, store) { const initGUI = function() { const { wind } = windRender; - gui.add(wind, 'numParticles', 144, 248832).setValue(148225); - gui.add(wind, 'fadeOpacity', 0.96, 0.999).setValue(0.97).step(0.001).updateDisplay(); - gui.add(wind, 'speedFactor', 0.05, 1.0).setValue(0.07); - gui.add(wind, 'dropRate', 0, 0.1).setValue(0.025); - gui.add(wind, 'dropRateBump', 0, 0.2).setValue(0.04); - gui.add(windRender, 'dataGridWidth', 18, 360).setValue(44).step(2).onChange(updateTexture); + gui.add(wind, 'numParticles', 144, 248832).setValue(11025); + gui.add(wind, 'fadeOpacity', 0.96, 0.999).setValue(0.996).step(0.001).updateDisplay(); + gui.add(wind, 'speedFactor', 0.05, 1.0).setValue(0.25); + gui.add(wind, 'dropRate', 0, 0.1).setValue(0.003); + gui.add(wind, 'dropRateBump', 0, 0.2).setValue(0.01); + gui.add(windRender, 'dataGridWidth', 18, 360).setValue(200).step(2).onChange(updateTexture); initiatedGUI = true; updateRenderer(); @@ -711,6 +707,10 @@ export default function mapLayerBuilder(config, cache, store) { const updateTexture = function() { windRender.updateData(currentFeatures, extent, zoom, options); }; + + // console.log('returning windRender'); + // console.log(windRender); + return windRender; }; /** diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 6194707535..5079258441 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -107,17 +107,11 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; const glStyle = vectorStyles[styleId]; - console.log('glStyle'); - console.log(glStyle); - // console.log('styleId'); - // console.log(styleId); - // ASCAT does not include a glStyle, so we early return here in that instance if (glStyle === undefined) { return; } - if (!layer || layer.isWMS) { return; // WMS breakpoint tile } diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index e81836112c..a5fa11f910 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -2,12 +2,15 @@ import WindGL from './wind/windindex'; export default class WindTile { constructor(options) { - console.log(options); this.options = options; this.visibleExtent = [-180, -90, 180, 90]; this.width = options.width || 512; this.height = options.height || 512; this.dataGridWidth = 360; + + console.log('options'); + console.log(options); + this.glCanvas = options.canvas || document.createElement('canvas'); this.olmap = options.olmap; @@ -20,7 +23,10 @@ export default class WindTile { // We are assigning this to "app" which is the map element in WorldView // BUT, we still get a second canvas :-( // this.parent = options.parent || document.getElementById('app'); - this.parent = document.querySelector('#wv-map-geographic > div > div.ol-unselectable.ol-layers > div'); + const targetDiv = document.querySelector('#wv-map-geographic > div > div.ol-unselectable.ol-layers > div'); + console.log('targetDiv'); + console.log(targetDiv); + this.parent = targetDiv; // this.glCanvas.id = 'ben-canvas'; this.stopped = false; this.init(); @@ -31,7 +37,7 @@ export default class WindTile { this.parent.prepend(this.glCanvas); this.glCanvas.width = this.width; this.glCanvas.height = this.height; - this.glCanvas.height = this.height; + // this.glCanvas.height = this.height; this.gl.width = this.width; this.gl.height = this.height; @@ -49,14 +55,15 @@ export default class WindTile { this.windData = this.organizeData(data, extent, zoom, options); this.wind.setWind(windData); this.stopped = false; - this.glCanvas.style = 'display:block'; + // this.glCanvas.style = 'display:block'; + this.glCanvas.style = '"display:block position:absolute top:0 pointer-events:none"'; windData.image = null; } stop() { delete this.wind.windData; this.stopped = true; - this.glCanvas.style = 'display:none'; + // this.glCanvas.style = 'display:none'; } organizeData(data, extent, zoom, options) { @@ -120,6 +127,7 @@ export default class WindTile { height: deltaLat, textureHeight: height, textureWidth: width, + globalAlpha: 0.5, }; return windData; } From cc2c8bdee6b1d70015e5b24346e35d856e96eb5d Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 3 Nov 2022 10:18:01 -0400 Subject: [PATCH 54/85] Added boolean var to quickly switch between animated & static views for ASCAT. --- .../metadata/layers/vectorflowtest1/vft1.md | 3 --- .../config/wv.json/layers/ascat/ascat.json | 2 +- .../previews/geographic/ascat-animated.png | Bin 0 -> 87383 bytes .../layers/previews/geographic/ascat.jpg | Bin 76778 -> 26420 bytes web/js/map/layerbuilder.js | 16 +++++++--------- 5 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 config/default/common/config/metadata/layers/vectorflowtest1/vft1.md create mode 100644 web/images/layers/previews/geographic/ascat-animated.png diff --git a/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md b/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md deleted file mode 100644 index 8db4345647..0000000000 --- a/config/default/common/config/metadata/layers/vectorflowtest1/vft1.md +++ /dev/null @@ -1,3 +0,0 @@ -ascat layer is used for development purposes only. - -References: TBD diff --git a/config/default/common/config/wv.json/layers/ascat/ascat.json b/config/default/common/config/wv.json/layers/ascat/ascat.json index 5638a639e3..61e6e1b7cd 100644 --- a/config/default/common/config/wv.json/layers/ascat/ascat.json +++ b/config/default/common/config/wv.json/layers/ascat/ascat.json @@ -2,7 +2,7 @@ "layers": { "ascat": { "id": "ascat", - "title": "ascat title", + "title": "ascat", "subtitle": "ascat subtitle", "description": "ascat description", "tags": "", diff --git a/web/images/layers/previews/geographic/ascat-animated.png b/web/images/layers/previews/geographic/ascat-animated.png new file mode 100644 index 0000000000000000000000000000000000000000..f2223b6f4bd064d4d13a8fae2d3438968e8127de GIT binary patch literal 87383 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

s?9*%BTni#!sW}%#GP;w~oduwx|!Jf2Ecu5(qI4 z{CUyahxDh-=ks)id`P!ncobeDS!=6K#g@#9kep+aVwVL4`%IMIV19IjDyYbsI5e!0 zjnvWmHNC;e)Yz-jPC`_|lJS=yB~{sdi36rkg@Po|@b?*}l=AqhV$GdQM2T?El;X#}0$`0zp3t+V7IJme}x22_6Wp62S!^p9HBvs0T=pMAru z^6-FW1t|^7B(BISPD83Si*q$~LUPZ28BZzl`=@^uO!HIDHIr7vLa61Wbm#rJvxfc1 z4C}32Po?-Xc=&7*Rb)7$vj(hL!wq>6Ouf!!`w)Q;zgZQ>Zps^tA$z~lu}IClD@>hI zSIom5#cqKtE;sT+sFH(eh8~q0Wz{U?Qj%SOR_c?ebcLh9X_!T^;c7siwkihmxTnBS z1Ue;N^{e<$-#MSDQGL=ncVT?AR>Fue-37K>$w8q&U6$-8w3R4FcY5@2{|F)9H6>ug z&Zb=8uhOESt?n0Rf)@e!d=;M8ON?e$2G^0-*-1;Q#wiOz_T-@BxHa;vUmInM>$=Yy zddky_D-J^?3vyB^8qHGy0z z_{$Wo=GOZ2NUn^E2}$IoujpV6YE+Kng4+hT6>P5p4h-dp1upr2eHa#cZQoeoI5(ds9^ud9}TJ zZ37XuWIbkMgS^;mJ#&yZCup4`>|AS$twkF&tMlz#3EYU|ox;JO2poqRd|#=lOTBEx z_bhTHPC|=J5Qt@M#Zn2~XKhj4ZcdN(RA~}UijJ?2hx#)PK45b0C)P;0dYV^MJ~FA{ z?L#kAb@>sj@|qZ{)g;Zc^Vk^C`NEf51fBbN6F@ot^0)xTCGK(pH*YX{(0ZDAqXW8X z^{0gE=lFD=Fe$iNKMzDe^k~fpRr2dr#%$%Zc0}3J1hj#zo5u=zzQeCZ$#k96Pwyym zlA0|Of65EphAr+#quxoy>Dw79(4$K730 zg@!RMUy9NM`x8fKz>H|M@d`FRBNP#_h;%K$)daPQ#EPXUVJF@i?F?}#11`Jg>=%p? zviqar*%7&wi(FIO%3dGZ_za>nJ3W9$50-;VGrR04e(gP7If8M`%MmId^D#%&h8&&B z9FnY4tTNz;1&TIxBF*6C0m=@JRFfy*9E^$>nMSlQ$1*Oj%*@ah zh9#Sme=(`4$Kqw>c_u&9#&`^3FBB51Z^AG1S?)ToruZ&##2 zGyi#Dqwti4^T0n>3btY>I}t1=nkDK!!aCzrO3N>y2(p`bmhG9;c?q`w>wPSf+pveM zJVleo6en7_5WirK*$&g!OL`bDc_%LxkvCrBVl4SQX8>y=ILTMGE6PC2og3RLL*z4j zIC1xwO(YDGHm;&f{r10_)o>S9vb>s2_db4a?YZ7sv8s!Dg++8q@)J*Cb0ix$M50qMcXqIWF`vhdT{o2A_)X zy`ffc_In0dI~`dr))qCldCR16PGnK;3XhirA{t zTl}*&^%G0z%@jYxqn%}Z>K-9oxDFQ;Ws+j?&C_WYw#h`$;_|A9O@K%47!g*}Sra>a z|7o`2%e<0@lxeEVXppXIpPZ6^O8`bfqwC*b@Ds#}UxhVZ(~~sl1Lfjn($Kii8K)bd zN~PysIU}#i&1@=EVD9ZTkW2)X562r!0E^s4(DjvXftqQ0XFd8%5AKr2m%R{X<}Uv3 zBF4x0Knv>?$7+17O3=%8f+zD<0#(IqV<+1@tlU(g)ql4ZTatWU`k&&@QC z-coCNx}A4t>}+E^;)s8*x$ZCq;j?~BE?BI}gZ1&cHGbYMS)?-aGhHnq<{M1Yc5{L* zF0B@j`C*5mKu&3YKo?3K6_HQ%1|zpo&-qfa=^W(&b?NI>JlBIuPa%IyLUY)e5Icbm zC4|`cecU*k;bT%bFfF7YX~Vq*rmdF)njL=)D0dE7Nw_QB^Rh#9qw5o(H9+$uC=A3U4oq@EaXU*8XsuyXgUn42{jfRvEil^5>+*SMr)05m$jy#U&xO z_P+EqjdN-VZ2KE#8`=+!W))s&n-RTvgD63#SI4&36~)KE`N8miy9&6JpAsN;96YAUfmT?JcMPIUYlQAwXN4 zQKBuBK^g&Isz0hTQUti%4vumO0$$ z*Lb{;n}hNijT@3>_UHG8%2P_5h5{Qm`qg>8@vk0;dF0R1b#a>pd(}!Zd6G1AVrMN4 zROBA5YZcgI-e3wsZ6myl<#b+H3-qeoDtsY}kd)nj;jh*_h|T}jHf@A%d>5$J+RCrL z_;pI#T}{5h_)ez0!EpXpN5lNTVEEHV_>Ui8-+dJRKVTSx`3DmwDe&hnc{l}qEP#Q7 zprT>i|DfQH|DoWgQJgmz;uYIB81#u^H!*guj^=~9MJmMD$&G<3Ck_^hZFoL+<~us; z6dD?r0w2>m)?LzfG_qb9-^Lu^O%*Pf zgpx7aQ_wO|L{Z*8N#h>;hkUth%_xvigiY-@Vnls>dYas1H=9=M?d>=+37os$K{P^S zdEBlYM^;Y@Eu8)_PpJJ`^x%fM0%QyMqOb-E#(F2h_aRz17Kf(yl>u5} zHdk=kac(x=r`UEFn$VS%-CW@bbv`AWY0wWRiG>K>>=n&?BSq@jsPO1;aWs0O-e4}t~%;w|%*f38^D@m&x>h7WiA4Je4qwLC& zo2PuVR@C9phpt3D{xv$02fcsvzj90;dgQMkW7W|9Ip8rFJIb81PxC7=AJn65M5l6? z6(Qu~V1|-nFrTuMDxD-wG>t8iHO4q|baAnEC`Le!p~)l~CZGYNvNdl+*xe~wE{=0M zo<)8DFV+ZbMU?n5F5%Mq7O-<~{C?p?W|1c#b#buDM2xg#$%Z|nA-+gt)U%k3eVWcK-@L_c-LLuD z{JCXd522ZHZC|7jxo$w|lB~{}Od7#o5nI|BW^==d>uWyBTcsie`k5kcOhXat4G6Yg zzM?U!fTsWx14rv%QPgK;l+ljpI6rwCvndsSA;-cOs8PPz5xn7+}N%> z*)BNkv&chFNC%+Vlf1OG;X*y|jd4aAMq8SC6~vub=S@t-`dZ2BlTGc0IKB)ZNs;}q zVSlO`GX5LMwoH7h0Y0tT2UqTRS_4;sAZ;GueWy#=Cgo=o^Z}$v)k4NJjKvgkS=FRhz1;JU-g{$v6)sB`fTo01hU|J^< zNwXf1I)&ItrW>@b{km8@V9M&AzAMQZ2 zwOL;Di1gQp?JK7t9i2K6XcQhf=Abgj1?Y>W4KVh`7z1ubEDKza?yiq=4N6L9yCn^v z(wQp?{hI-34dJj&(S`YD6_q~<_R#__Ev`x*pT7y=^7X|J461$VqSjwcz)!jvM8Up%<#2GAI`p)BL92Jv394d@hf0l-Z(aeOJfq@KKF4cUpX21^TrR?OXit__0HK@Ed0<*4Q25}t({E%f|y+rBOn#TrHTkzxhM zQgnHiy{aqREH)00eq;<0SNAUr^Mktpy(bhjJ&9GGBK18oS`o9xjY|yz{J&~tj_#Cn zSDOUi#F@|ruZ`SbWzhcx%@`F?Brk1bUas@631^nri zk%!NCHX>33dp80Kb|VLhn4^13{SxzHvQly&KVramdf`0KBCbh&tcXRb z*4JU4Auo53TH->3LIOE&PE0-Xv?Lk}{LYm|PXC>fMb<|!!n;#tDgivjV@%&~E0%~@ zEo`jWi9$W@D56}%<5>@Epz<33?FXGMI*VBY1t}EC`|BvX(}zj%t97HB^aZph15PyA zw?1SU7{-+(774`pO_8_k8JfT;m1f>28w?%osBl)!n(9uU_BOmMyk@Lb-GrCSSS4xq zp)k#N_1V69tf^&UQge5@s*f8{gCo~|fwttw6GH-Nn6r~jw^L?1#eqB%1%XeLSj_v| zq?p!ZOTf|UuuROD{x3ZNwBN4nhMeu&fyO2a=PD!2u@2at?9fN#<%q@b!KjWNbf&39 z6I|f}JK7PtVVZ1dr$;sQ`=cFv51bH?_V<>dDp7lWk&kQ}=Ncm<+sA(;g>%%UV2gf* zn_V{#*{N*E#V-V40~JhAeXkdkWg_f$K$c_@8V-xk@Es{mLpYQ?xz(MAI ztq3mWm{io){#!Fh<)z4Lj2&#Ylxe0D>32!To^!#`7%rOfPfz$Vi(H10=--!Csx?He zf>Y54|F{mRQg1w%a!`4YTN5MY0bU5tV7b_mc1$oUp8-+?S+$fo)qc#2>;(?DC${Rw z&XaPKcJNFT%rk8brD_{sSFIc3Z*b5kCV{DC=rdtG)kgWRD`>f3DRkllZ)iz8LO0Vn zhuq<5Iqn&&$jIV73$VVVpQ!%lg+T~}lOwk_{4O#4r~n}DG*>`D+#JgSo+Y z2eUH&`Lca@7s>eY84ex}_T7{1Kl?Hm*mqkt4ANf;a6khG5Gp1>P|-j4{0Gxd!|JXn z7J0{jO)N5@_`C~NCHzT(>iB!i#?aL;GaIwq(LN>^^>=KR~ z5pbzelR*2Cji-CbnI)+S56q7|t)ZV@@Xi%0dmb$DjWM~<83Q>H-v8DI5q zR&81(QAF(vc@s&8682C-6Xd{Yn{QQj7Clm;012#r>t^;{v8Jbb#Ki&+TLr5;v`eTr?czMC74Z5IE8iQx11FA z{+^uO)Km<`a)(sy-b@YEfHKAbJiG%{(HQ)XJBwCE_}A|3!?9{tx{-&DYtb_d7j~S@ zx}#Zm8mFxvSW3gtS`QoWY!5Wum)~F%B8#|Hal(~8t!7Q0eM&II30C&3C$<@UV6 zHD7!fo4~hq91j#3Pg>xf3}k&FoX&N?OS5gV-%Iv%C~g_GO-TbUXp7{>Fp7YiN}MK! zl8~FUf=hhMk{a|Bj+a>!Y<1?hye4Kl(^q%f^^dHL808RkOtVfG^f9c z5ShIqPd)>RVDPD_!Sf&W!Zp{net}-|bG22a9p#@osheM05}@jTlvpeCM46du{_HQW zQE)m1C%R{_#%tq$nKHVLTHmS68-PWdWi@A1PE(6XRsW{7J;4<#ab0*+;F^yRt=@x8 zys31hWz?i6MDJ(jf%)f^WQpqvUpZ0ZdpA0&NBv~l~xiSrb|h{K&;IqHN~&+I!X3Z06iYHv9MaW z_OquJAV!}0%gZ>AWTlHW!>VA>&2;D;*3D=?vWrCnVZtweAfzN z?pZ4EBKzdjq^fqwz!?5c$X(=O|%ulkq3(uisJh;H-GtL6ZP400hg?AUWe&xmWAxAYFnph zmyg75K6bKe_ZRZ&o7(qt^qtn&Q4wRdle@e`>nOfs=$GDKRT_1B5G`C!*%w|8L1-U= zbSV(Xh3O{-IiHCy+_gn`5 zsXTNURa&=JShLeIm<8&)RGIgr z9@lYjN|c6>R>7^5l1LSIWE9`8tIoen;PF=lBN0^9HkRQ6S{q)?&9cfKGvzWmP0p zxvXj5n9dcKmELX~3*R|9_hMyjnu|ai8SMT_I#p+8dhvKDOS7OQ<9+49Sb`T#(gqh7 z$DLPy>p$w*kgR_8T_-&-fWCtZCwe;HS$S)u&EJBt60?zW*1*Fk&6%>gc^X1o(&c%T z@k|noA0|I9h(5F#j9LZkYq$ewrt_s5s3e_I1O(h!4PnHwKW8vhk^9VW7C@J>BJRe<`dqQ%7|~?tHsTR;+|fR8G;wF$g@rve~LpG zJ_wTTGFZOqA3tAD$8QGXxVneET3$VDn|I!DuzV0Ri$n#?{pm~k?9;ZLf0iAhK59FP zcf!VH8Z86w+SE7Q*t$AG?#C$$Qgg;+RgI#!HL4VPRs}`BoG}T)^Na}Ilu}j-!`K(* zqOLGvaHDsNOCm{yyE(vHm)`w0!s3b)5cf0TRXf;Umg8`rqZx2-2-R^3P1KjX3D~rZ5pfhie*wH(L=}l!{e`KE&%CrW z(dKjpd#EO|wU4&l}rZTQzM2oDg?l)KHd zS55LxQ~i{XfPGF88(Y|Q(q#qD>Etd$0=0E5Kc+Hp9FUJiXai*3<*jG%s!W+W%&;&} ztN%P(7GY>4vmNA~K|dQJOgEJ=T*TR>lzrpj?YL)nsb?1hcAy9oJcrNMLphQT+51-L zEz%$rc`vGAlC1N%XR>(BHZS6!7XOpOty%s_=2f0c(ZZ;$2Q%0W5P=TbuEMJ|S+&4B zaBtNEXwJBoGvh^AXzoQqaRYh-Bu z#jAaT!Acgqynffd%RqWP9~Q~YJ|Wecrx2sUHy~M?@^G7FEtqHdtC6CRU0y}s#W@4b3f$>q{o?oWZ=Vq&XGb4Ncrk7V*@q<($B*+jnkf`49T>NRqgEYk2uvyb%F) z3NqVa_Yfo8E6WdI7hDeS96Q)S7uLw3C=}bnaL(fRVnV=l=)?YUYSL_z9=i@4ZO<8^ zXd{(vqj=3{B*Yf043nUP6uhlTC9FIP&!0ln^16H>bd*UBnpM;I20~5M#}`ES%d_X~ zZDQUr=C%eOV$AKn%<;C=-y_q%!Jv7+!EpO++tjZY{#`>QfE82{*y>BFatH64AM&mW zZtykT#deQPe-Bw4e0MfUaLBYjC~*=U@~hPKBt!wVm{7x zDV!SmQCL(7s=JaZC_!%1$va zeRTNhSk)g|Gfh7a+nV11td5{JhtEC(h=m!+<5W6*g5v+w`>413Tk(Qf9GYB*X)?IA zN>p`V88L~@k(``#wsk_kx_~vqOp^5XNU#9q`KCIawr~7r{3E46gMs4r3MTmVBIU|L zLegpcB|PAuXXi}IvR9RiHW**W$Z9kElClEkZ#x3R!Wu{+rdoPjSVJ{DAl~A|AE`|07-7V@PQ|*-K*Iom4(hV{7+)BwZn^L?B*$JjW zNbr(nu$CnYZA=qOyL40Uz-Vo|h)zCwj(>3U*5Of*6JW8!Er!!OuxiroTw_D#7QPiO zM3`g5_-`jEo|8$q{O5O+eO=|#>b7CrG5b8miuI%*hifJBbzZluN)_Pgf)s59NFO{T8qiZ%dn}d7(UV?hq^#*o73%D8|}K)~1_}h|Mxj9>++a zatC2>bLJ2)>>rtS2yPdf-w=VBjJld$kPw|ZvnLSsHgU*4)#KW;JNd?{$K4l;CBy90 zQ|KK@V2RF#`4tX^NM%$%x1`ABp)w8K%s=)XG=q8pt4TYzS=70fS2S)ln;J1`lAP84 z0LjZHOQ)D4!%{L0;fStsXAi*kMCZCwiv<})3yS9X|NQfDgy;vMzkdB_Y&=~FtqA5C zXKd_@FVmxTGDE(nj3g-e2P%wuqQK_Q;VjvUtu3tFEkT%xoz5kM6PN={&#W8@*ki9(5nw#nHU7#GW3{E+YvWF zRVrO}&J0Ky{6tHG1_{VCYJcDI+qC>BW^-PE3-_z4)Y=#{8_xOzQ4%;`lMuckoFR)S zWUr0PY9#pdM>%uxqoS7sxT(pBME=SAbn}A=oq`lyn0x>~c~Ga>Fi{yERum98 z(0|JPGh@_|WsZ5X*L>j1bdp{FLS$W;G!8q35+P!T`%)+=YmxRh6Y#~#*>pb{aPVTl z>!k_{w}JH#rEI@H`E@wUxJ8$Fvd2S`#YAUb33QmLi`_$47RWxE#6o3mcL3IiYqR^(0VwnI!GcL{?c8j&kL%Eg-vj@|Ue9Qkntj z^!7kVv1{mIAd4-7Ww}DO3)my-`VnX%>hf>2wNmyX2g6kU1eY{5Md8}~5J#Eq%N7fE zpGU&9eK3pDX)Oh|zu?vYzshZ06*AX>RgE@7e52UeNtNS(2n4&$RNsc+#Ig$ zQfk!KS_U@40iG{$ezct!QG%W3bE*RMgyt)DHsY+BM{j*TX1*v53Kk$(+1=+eWN>O* z8#!pYe0Vaf%1QKZ1LrLNVfG1U4!-PySDtu%Ng@NzRv`k?0F6AMj9YzUMn&G0yFoR} zs;RNCVqR6gnGSVC4x%p8b)s5EZ)u3sC~_U^PE^Fbt7Bc1vElU1nCH7_o?o0t{h_)V zHt*M``qP?KyU|87pD7=OV$XvKKGxynb{(C8OkrWpo>OVTxxe%-n(48dkC>`(<)K-e z%Y4=)cg?x-bEL=iMmROFN3V*UOJ}v~&9$_J2WLF0NRF5T+F`4!{2iG#PLZFa*bYs? z0Xh~(9FDPMja+HdT-2(um7vOW+Ds=sL$njuRO(;4RTih`H4lAjRvq;0)k#&c2`o}X zF%icM6X-Swm97KxMk(j_w;Js%5r1vpQ<(?FM^+uwL==&PxLT6Y7SdOrlCo9P&K!p@ zgnqc-0}Gz`PhCUIO)S7Q?B67$#b@syS2%rqPLMZ^)I*L-5LL?fbd~qy0@VRyh+7nq z1d9-XND^qgOiE_|u;>I9mE$O$&w5W%L!(rM8>jOUbMM@7mHVbi{GM;jKItE;>R2n% zY}wx3Z%wyL2W}x(wQb@}c&dGPMZekn(jKPU4rHRVu0~Wn$he(M**jPE_HVArOZ6mp z^M3xD4`r4_>Ts;9?y_&4=C9o4lx$&7mDNe#(L69u(NFP2%8&iY>HW$Ma3kbQ|GM;n zwMZj%vm6O7CbTw?ptJH1%14PGqps52Id4Nva&U2egYlMOSUH*hQUs|<8No3(Ax7qy z4QyLqR!_(Q{#e$yw9Wk-UTVX}8=#~)S_UFDA18(C#mUW!S zB+H#3Tu_5$lIv%r7$aWzkW^QuN6v$1+Ft_)6ZFGuW{a)p+SHni>S~%+q1-dl{%CDoB0Cuf zA?OIdib$DNlg_K?&nWsrI1gm5B0AVPiDVmiqhaolD!z6_(v7e&E&Bw>&$bo(k>Ga&;PHK<4p)%Jx4aJ^bAB0|wq2n`o>IwLOV37J^HzJ9m|y@yFg!oiknA^LhuP zHA-$Mm&qY$6=h79^MbJGFqx-2ZEMhBa%T|2UQ?jH{L#qLkT=vOP8VEulyJN!zbLn< z<<~|0`YtRnyk>c_d;T!=d%Op|5--$?o^QU5^*iF~;koF|sRUZO_4QaNzfid`Br6U{ zz3hW%rORD9Bp)Qy-yN*3jAm#c9IuNA*wn+r7hWZqI+vr#E>a9C-B3q)67$(lB@5xu z%m{`~i=0lZ3;Ib(U0~~4q-%14Ej$MNBPpgM z{vB*Spr}SXFDN-3pbRsTbbY%)srOw@6*3tg@DO**jSNR+pv_P*Sd!^a3f z3&jp)(b-^~5lSlPLr6cQdb;inXGY{-*VoFNFl60r>g=No%j_K@F0SZk zhfdwY{4izC*mg;A{#RySS1N9P4YzaFQFDX|niv7sUJ;~J+EDmQLjHSf!T2ds{#4TV zk;iXtN0xYd`G^uUvijs9l*(lbGF%4+1jG60lgHx+!%5h_Q7%{IwVt`${^1iSga}nc zcp7I0er>=F1_>_5<4gKAsrDV?^=tpM&C>2(we_T*TW~=MDo~>kPC#zFl01i6OoIm_ zI&b_Mxy5-ci**-I88gh!k7-IdlX1Pw5<#1oU|+yRotOHy2Ew{ZT-;~VQ*SO0GCeMi zr@G#Z&TY_y3Qq#@(thbBL`I7yiO99j;k zCwzED4li3{<_0uW8BW$T?9)DUES?-6-NCM~YWd@1Z0H&G zYdkV?bzZN3T83^)&wfPi6s=x`PjS$#{&UWrF^31X{o!a#NQuQ=h_1M4SP}Uu)%uo2 z%C=3WSMiToC3zkjsX`)7(<`q(^R5)3so8!xf%117mfMuPJHFEWq7IoRB!Ain^#dE711H zx+zVrRC@I%rQ#j)z4l&XXBeTZmlzXAJ zG9+>T!Ys#okYTuvdgwhgl||Zg6*>Ny27icYzd7c|mN047y=9zB667Y{MV5u1DeQ&| z+50*#X1%)|isD>)GN@HR;T2W=tAV~wnTHz#)VF*SjkWeO3|f6{P=AIU;`KDbYglg- zB07_>W0sAdm{OViRL)5rUw7!g#5%KW#Cy)yk6nbL&`(ZOFEPXKGcVPKP6lE)q#ALH z7XK9fP?;y}AvEh>%O79QR%K#C7fV*Vic5v1#{U>~DC4I^S3NJ>7pyNNMrNjcIb0mO zEhT|uzY)cb2gVzuLAH3znV)kHq|-+d`I+F;{#JXUi6gS1!S%UfXxf+Ix#N>ZQMG2kPO_aapzj-Y;}Io7kZLxg!TzmDND(<;j^xGMq7+H{F6SPo~4 zAtW7Q8G;T5x1ng8R?mO^qN$UT)Nh&&XRAU{RE;Cf=r=zo8Yk+5lL{?Tw1R6tOIn$x zA;mMX6$Eq=@vUYB#AKB9Di&Ibw5{=!OV>b+N1R$adC1IAm__*JvnWAdEP3mK&dyS!biVgjs?Q1hRPz|ZwFZ%CEAsN$J6 z03S)cX%?B&`w05kfP5$XPs|V6i$Sjwt-e)NY3Cl;)XP0Z>;=~=$Jz$M0{sxkRcXmg zZFgTw*lr_)j`bFG8pYJrcMDR9duh`MUahEh}ZCFe= zV~S&x*-qYzW3xB$OPsBGEr+}RL<#mH1xq>2&W~1i48>MTE_RI8{8n%OsZz{?K|Qfp zthTq85+~GNMp@dPjeD~Ze--I8kS5Kje=YSi=- z?Wbavdk7ejZz2Dbx91=uY2of#82J_Ds4KAfjZAC zRQAqm4XdQesYOVkUuU1?I%aeL$rnyB2w!Kgv2C_ROFq${SzQ~FdG(#SO3h|WgwAU} zJfG)1^lfSN6SBu>=IHF6@ONRc2l*>54^u-b^Ms}+_~-fZ>eTc_1SU+{Jf?tQFG%s- zOt}Ch2`)8&)y~zE{`y83He?G<%p)n_P5zMbGXK1=aLGODepV&K^~V)kmPtkv(XOtHg?oB`FNj5 z4Rk%UkWY_@#dYS?>1;7kdvB@@D#3TH4LpHZs!=1^B97Z5=QU*L;XAF&PT*V7)_m1k z-f9~XmmkMdu9=)qb(PiBSW3YQsO0z&=?;He#Zw!50*K+h`Jdh`@wCq=sCeGvV`-)F zKKs+A%?!D;hB1;GmoAI`?u+9AyAbm=C{_l^Uu^f#D&yT&mTEqHGSY_ueEW3u@PeA* z-0!2Ux|9T3kfvf`Cjz~*o|w-Ao0u#mSh=Uo92Os4d9M}^dV+IX)+x}4@4{Q1E^ z{$rKf#5Vx@?ARC0$yvjR7*x*5s~Q{4)VK>y`$(O={{0GsUKYG}VDfRQ8#sf;+3MKP zUyK>}u_lf>yZP3>&H>wr^N1|MzQQA$n0xUz<7 zDS>fIiGrMmWYsFE_IrWm<=uW`U&bSKb~TT#dPWl}$H40Y9^p(sT`>4+7~wTN3%A)O z!?vmCQj~rf$xB*61}fwE)zh6%??um=0t%N?8`}?jUFD5*rb62CDTxy;4^j-a8W4WK z*6JHS;q9j!+6rny-n44N(8>E*A+^$gqu7+H+H^sEJQ9njV|&FvZq;m)Y5xy87-Tkk zI-VbpWo41CHF|*Qh%KIK?KmGT{p@sFKTv>>jznEkxOPsUhBjJb>|DB82=4w;g%V+( z2(t+n4JVt;r8Qpl7dV7U%2&*dH2baRg8fP`tStT{Zwa=9e}T7jo@)vBBUxM`<@k3B z>7yVk&7D`>BjI!Dc=3~1Fx9puW784D;*7(X8ne!l32%mv$NDa#jl>QMB0+(UBKZy5 z)+cNJi!3(xr~Wx?n=QiMHXFDY{9t9i+X7bpm6;E5cif(addIl?#wW_4Fq=&?ry=|-Q6X)ySqz(1b24{?(XhE zgS$hL`<>@K=c)52oT~1RUHxTu*KhB&*0o%h{c2u{JYU-U8~@F+tqTU?$T)Q&+!0R; zDrrpho#f{{Mov4NPBv6-FwG%tfjzTjqk|Fn7yXJh66BBV%`R)vrI)cc`#C zceBO01qB%246`2BtLgl9v66?8X>ft!2KWP~e zDRQ)E`wd8RhHBe_BIDI@7}FB$IA+Uxmp!w^xS=8z*+-VXyVqKjqghoMZ;`~8oz+JN#?m@;o~ zf52hDvB*@*I0zQMU#~YmriApe!&&*6Jv7Ky;v&3|-GRP3g}UPsZ2>>4Pru@>S|8-x ztQgqCBE7&}MntH~?bqTD!|%~mY02|(u&ebHX@O2c?J?-wh9c18HWt-6q9X;rjO*oPxI=wJRNRgO^G7gLYlFb z|A3cD6r#ziDFQF&^@nkB2}Yg#e6cO^hL&8#ktQix5T0~wbe-hGE7TF+!o`sHWXt9N z*N5_iTrVjC?^qrv^aSB9_;DPJZe(=9wCM}Vt@)%8StY_g2+&Xi%53j!Uqa4be|ApZ zSSm{QFS{cTrDdu6-ig?p1767lXns#Z-HiG(-B*B0`^u5qwS99;Lwhm@UU@KAX@H&c z?37@88aR=Gk!_)Rob+rfKMjyPKzlx3pq(pFg>^hR{La%Y(XsL@VR>mOx0=5=#ppUl zWpT97MlJk-;y@s}N>7)caxg%1Oh2ru>?L3}tmz%hM3o`~M6y-#M~xNr#!KT)rPQR! zU!C%FV3P@x3)$ndv`j!dc#;GZJi8v3hPAkMu0~m8jlZD$VZsl^;4*-RyAi_<=@n9 z_v`EQ>Wc8%_<_-0^RJ$iGG1f+S`(vhVZQYp&afVYu(+5fRnieN_*OU%5-or4W%7$2uapft^6ajT}vQ$poJXS zQmTA*-H>=)mYk_rEzB6OlkKmZ+Wp1ZfI7<3v)A2%zBf~Ov&wW(>!(&ndk`UV#8E`H z)KUBs`|DlXs2wvko>7n6oAX`ko-DTm8gZHKIg|0wBxM4DELwEfC*5nNHvKH;BUUn& zNB%9Gp4F@O*RS84Q5JJhq=G#+uRO+*Ofkn|(?>*=Yh>}+_;VOch9zBFh#6e1BFfC{ zs#CxG2e|n1q(4ikfW)IKJN*UY)p~1isA;N6)3^6|VZ7jQZg6q;AddJ|foj7&32Q%izj4$l>dWc(YQ;T%g+<_T3>@8C` z*IPB4DleO?%`KwsqD+$5e?Dr7Fd36q8KnVr|4OtYjT3V4+Es#%p*qNNRtbgSH;Anj&fKN)piWbBiNyh^?~q zQrlwQ-(0euV_hwObNvxnEn56#f!ZvEA;F-6PV{D7?wEmj8pqN$l*HAtME4&6ONJ6r z7U8M+uyRdL_vR(T!0m=|P)NN3eyi5LesIwUoQ2HiPxkfI?}{oF-mkgtokd98|DkEu zjQ9FpinU`gpJD*Pg6gYm=Fjyw<2nj9qJe=#2a`Q4^)jN@*UcNwwJ`AP7^X~IbRuC# zpdI53!#Bn&@*Dnqng<**pgJ_#9M9ZrDn%a4ih`QqD|OMM{zI(#SN2U)W}d8;xh^(J zj(TPo7ml{AX)l!m3Fs3nDhDTg^w8?DeY}_bk0v=vbE@KJ^Ja{xFz-0?UPA>2m5vxN zrv22baw@ADS3he!MuhOY{Y?u6MO@Q4acU}@k5-NoQElu4U-A+-C?3Zep)>w!+5jH1@ewWnH?1~X< zdVQU~@bpNh@FS$gs{}RYRKVXcQC9eR@4^+nL1XJfzF3>6UhFQ(_y+A)-W~OUR`y^7 z%2@FIHgl6ig% zpu}B3u+hExqV4%>Y^pEPpoV)bJtLiNFw8yYj`XH1vx`|MT^e8zL5tSH?^kKHX}Y2A z#dH&p8jN9h`AEvy*0xJiXdk*R0=PwWjE}MyO~0Cph`+}q!#LO|vBnM(;{2C6I63E) z!HV_m0scgQ>(H8V$4NfImdsiV)i!*IaZT{?s{KX2L?(l8)x@D9-!5ZY08* zG z;d3Cz8^$ z-|Dw%uO9h#x@NUdS7T|l-^n9-cVb_XYWg)kMPgKLzUc$c8&i;P^A2{Duys>9$*MKl zQg;c#@p-QvX}@rFtxZMq$URImQQ_O9XIZ!OlK6X6%@IR^97@ys$dB*QlE1eXJ* z_%>a)>qC=o(NrPhBas^PflYT_-4pG36cNb82T?3h!du)#o7wuX2V^B$wfeN)IiDRV z0=!-84BIk@q7vx$H;Z@H+4)Wer(n9j`7LMRp$pDrNC7a9TZK?e9pQzT+9$gWcsj@qOoST}zi zdF0CMTRFpls*tCrljC}H3T5JBVzZ1Kog`iR3H&B?~T1TDx~Z&DS&Zc6Re`M4gM{{B|R( zbtz?y{~u&r^96B`)#O!eKtlyteO$rXN|^y$Q*$~MOWk0i85X&2E_rg1j7mfAyZiQR(FD!VmUt1(x63A^mJi7M4^KVVq1Mi<2Nt$KT8@Sg*{{S&C-F}bj_n9(vG(<++^#fk3;veedE_1u%$8ZWvgXE>Z>g1Duqz5O2gEujp9 z-LAs&Khk!Kys4u3!dG-sImb`AY8{eA2}Uq&s%>sCrbyPubk$la=6Rf$?Dx%1EYhF! z+@WPEt1G+e z-`U7(tBYZ7%G+=CpQ=)H$F~ZYge15|Z z_B^M)_{E_9mg(L#)FrYs_+h~iN1n1KfJGAftSvC9T{{PB1HaRH{y@C5dqs3bz}%D$ zmvuIEB5&Sp__>S8R=1epsXeZxMb?Se)0Kou+w1V#hi)i0+}^4KfMbblG&rB(fQ+sv zt%a_#Ov2j8u&vXl?jjoB2_@q($_uoA9JdYlC|VOJ(J`a|8oqb)FJFC0DC<#*zoVwF z;#kdOpFIJ5wk8D=_0_NKuppCgM|4&7)&0zy)#|sTxS`K3)|ox4*b)Ep`FC3)Q@5J{ zNM=ILWm-FOSF5bJFp|_k%EPcvi1;DYJ!vZ8ITU_W73N*1 zan&+IFu_P;mamPrg?N?UHgwwdpH8pRqm;XA5$DyNsWGm+cvA2-+FV4hSh$ZwZH< zfo-F+P0j?wrfMu%8p|f%HWPwt@UU<(`7TfAxnex zEmx6tLH?yo?MOIAF+AzQSh7E`Ww&d{!kWr<5O0P&hDw(okP)Tct}lzSQ0Px3O{dpl zo%O1-UH|P!=ghE$?Xb+pOfS|lpOBG9%qg|9vZvcr$|SU^rM|gx*-{=Kf2lqS)vMRz zt$f{1PY^{2^d7j#O$G|eGQj7F?`imjqo3r6KVvdHN3{vMk z4vYj*nc22a%@Whv_GqVLl2oMDF>8N~3>1~Lq)&xfwd?BI{gk)KR9rd=gl_-lw8$rY1B5X>op?bE8Husl}+^nuNwc*vWDGGH0 zD|!ZbnYHLYubBEir~Ua;O-rPFJqG=}o*)BW0rsKy&Fi)5{-2L6l!z$@Os!Mbx1Wau zFsNbZ25m%1gykyV6NHz9R%J7JE%Acgs+R${Eo*y%r4539(=EyBQl);~$zzQfL!k<> zJZe9#dPVK>u%;%*2df4n*NeNZe$0b*R1J(vvv=aU2r?a&SMxHz(H>Tb{QT|Rejw=M zBh|Jzyo7OVKW+XgGW!^9v}%2p5!w`cU0dG}JgwlJp{^!%ONwl7!#vN-ckDnG=qW>C zw$LJXh-01Ed(-4_{Y}@25kbA#AhUZ8nQ2z^_YCHhrS3k8^M3$jByDedi{S0i8AYiN zGvcgjJuBD6#R2Cq5am8g`~Y z>a!3u&;HS!{Wr+6`GcZfW|Rdozbdnus(stSbJ2RXiDOhnJa$tT?y26cTyVcn9WxT0 zH)-j3WLc*R^(A4ON7c!m9~-<`9(75_`>YCz+MlcZ3o>-Um}u35RxW1r!lm>s>7!kuxu#u~^or*NBU;nc}3geJ_k=L@b=UU6yuHOR{DVmo) zeVWbF$_j(MjdeUcoPr#_9@iG;xg&aoAUk3YMVYk}%qJ+Lk$f0^%@|x{KKmGAyL*@0 zmd*?@yrMyQf)=Gu7@_I-GiZb%q9{6@@m}u ze-N=-l8Cug6H+loe*|{Q|7Z%2yyX!On%-Bsdu5rYZp1zS)DNy;4gAtK%*g*pW2Rm9 zGq9g~e|cl>;u4^x(k)5NX5t{>EG~xocjHs(vz*whw^+ZoCN^a8GzE-mUpww zqd=?DW8okho~mzrF_}5;;|Z-Es6|`Y^yfu&|00N*scUJ=f`oL{j3i{Iw(GPokGe*C zuL2CW{3-XEk1X5Lw~KF4N4-fz)01!P)nhu=kYYKcXI5CBUh5THNh-8TVIV-@WL}Dz zcgI#DE0-s>X6k{d270o_f@@hCn($1O4QJ(L8=ryZhRGdX7)pNI{`h^{c1rxmzI;7b zon(1(cK;91Xu5K@_K8E#CDUxh?pR&4ymQgLMI9lSj%bRay)_DVf2jS1+R?M~V5}j= zd_+zwG&2c<7wcer-Oc749Nf{Zs{x^&x`NcXu`zVA;Yy6{P z!Pk#khO2DmF*NZc!G}M!Lj6;J4-CK(xT1O&*B_i~`h)qLWlIEPk5(D`C!?d*=_ljQQhV@8?F5H&lfl&SGC&6H*k0nEksLnaPxJrm}LXIr83JbQeA`<0OE_XC3i|8bcd1RY6zXLh!0@FE&ZYmHp_Ptt=+ z!3XAU0n)$fV#^pG?TA!&XEP5J!iJ6XRP0ECQ0+r2aLrmCu7~4I5Mx4Vx12py6vhYF zG~M5tY7FenCKVTi-{xB2gW%#yoaYPKTtKun{;9~V|X!i8TDd^ADBLihe9+u4Y zVNC(5$I{=+X2a|25ww}QE-@8#Nxlj`);AmB4go#gA%j6Y4PcvA)8GCb~AYOIs%5067fDmKI6C$%?jMr@~uFDo|A9^y_XLx`6r zO2#P|6H$v__nq{c2WN<cNo`iVH7tLlRyy zP|;DGln+kok>zfD*~Ua7@r;rF17!aEOTQ^!GkD9d7`Jm9>#&S^c(cQubL`eNJ=Kd_?6+RRzvcR2`*_wt5JaYn|*jjlnhhS}s@ zHA+EUKk>ijkZ^s0%2g3L5~VvJyZ}Uji_Hy80pU#yptW0srldTHR-#`j*Y-3TakHcI zV)aIb-SY1l8y1A)er$1~C}fzOG(A!8KI(U`T`PRnf6xxc&VW#x+-%E%SbkeGGznc6 zSKKYRWyyWzLL&L<27P%rMsHL$wR{N}$MnVBMzx>nkF6VDYZ6~=7w$cFTzT7+XtA52f)8Hy*yv3nBt>-jjKcqlw_Q+m~C!9M@_hlzW%&nFQ(wW?{l za{A-!E1ZX}5|?q!QK7OBf1jlZJyMSr%D#)j@1bo0+m6jivg4L7n`a9P7Adevqg!Z+ zKh>`D+K>)gSMM7xExvzFy3u1Ooq-4wDKj9Y*&rh<_fYa`N7QQziks@GWp-YgtNZ4< zw8S&W8)(In))Auf>qzY5aB(4prZ>H8*);DQ;sHvM#O<3}8s%d` z9uE@L0-Ntqm=jRQyX=zCEN*j-ifG0QnL893#+5dH^c-$Y9=fH(Khy1eiI zmTcGUsLk(Mw0jeCv?A6x6VAj<*4n>AkHb>sPIgSz+?~<m{BkKO1Y? z90eo4So|!lhKkw0%Q9=4IHSHpP0G4>QkxZgq|9^{wuIkv)*&|1gyt!mQol#bmScS= zi87)at*Eo^xGiK2F*+w}QyMJH;yLMU9E_xxPqfU{kI)I5c%Rbe*Hi73O8)14{{djs zb~ClpUN_qYzh!Isz;iPWHwr4YK`nuS{cg(t?`!_u&u_8ARtaYR2Uybmu7c{=%YM_A z@36Yzq+fa0)^>qTX!+>7y1Kc=c$M6)wQ=ka$za7)+r=_DjY(UlO@GG^<%mw`h^=DQChrIz(LzGneId6+ zk6v7~CE2dxy~Xy(&b_Q30mTyh|8zyA={vW@{RdF_4*`TFL4!dcDA^gx zfyN*Qu!*XgLR_GHkdPFSLKP??Of14w}kV7Z`93eqtj6Y6-Xe4$`LySRn+O{Mn z;(PsbvN!1u8@Xt+vD!sHKK%z68l?R^w!9hqcCtqjh;b00y?z3fC;s=|i!#4egTgk+^i}R|L`b#9FsgRo}jo!%vis+BI zW#nbIuYKh(w*R_wK*DIRJYmPClS&)scNQ?mfwfs-53~I@L&_3A(eHIzI=mIcei@Ay(S358H$d zmz~nw0_RN^RPt<&nttjihDJcyPhs1g(Uw^nvravO%J%T;TdS|h^BUPQJCk~ReF(pdVVlYs++ zY*-3zd=I6fw%wizQo#O#SwIr;5GM_f5jg9*AHndO?I6fsJ6IhOBc(4SE={94Q0gb? zB7C~D6j((S-$u<5xS)`&w2Xf0gn~9>NSn%)_!uCL7_PwzxH2Y{ZMH>q?+P6H;n{H6WD6R&<3<;;= zqfa&>1ItUreoLML+a)TPY{*GAk7g6_>r@m zoDU`o0!$L)tP-_kc=fuVl7Gf-Xq&$1hn?=V`1Z@utM;FKq#oFu~kh0#I)n^ znmPcHa1n?QU3rz?{zM8hNUkHx;`Biyk6mcM);+2S>|$df$wh`u6>=%S(}^qs+)e^P z|4$bxD=;UyDFhLm=Q$cdP1&Ntq{Su?>>K;YJzhhIUx=08qadDhT8m8sk$qja{&&$-Yb9*&hM~0k}?O*I-|aZCX$_ zA;M*XhNEB^ULtJEW$RC6w9z68?nYkh1rZ1Bg=$bjn>}Qh;Ndh7O+CKO@i?Bh<17k z#it6sd^&lIS53d!~!O)ToyB3L!s3Vh)N{1aT}c?k9|i>5@iI-U}-B^ zmT-?c*psKF`v!-jL8K`ASTmq{=50vH2Em=wMO9nWm35hZ9gou87bthA&hKFx+Vk%1 zfrSAo=oO9Hd3nTut3-y!8djvUUC*y`a)d=R6R7)hYhZH=2JpiqTeGQuvMvZpD#eYa z4_1_`pIl2yq>q-W0L34b1=M2a>s&x^smh(22*arKqIFa5o|UilUCpu;7+!yDqjO*Sbx+DM{qC6#~>i^#ycRbd7Z>bz zJLo4DE=@r%sCuTY9wISD;!Ab3k*va`&&4XXwP63VmKx0MB;LF=EFKXC0w5kCFxOwi zPxM=;Uj=`_*YU<_goK11z(HECj7Tl$Ra*;2Isws^&>aeIQ_<(hJcH@G*&vNlX!4 zR*UB5DUKmS_!Z4VDotgE@lj7N@!( zi;g5Xy#$KOXO22mJo{(r_uR}A{XYxloE{~#vxw3e6{BU*p~K>H?Ocn^%gBYhWH5Mi zk%`MIwLi_mR+C!t3Y_zJC!8rIRTr*MF#g3*LY@ zhz{d)@tdD6bdV2GR|wgf{YA})D!MDRP)J#_W6J#ddMaBgr;-?<5IBe2fMMqmDTW?F zwdhhD3;~>?7vlEE0yT3X9+@2ZrkSM{oS`bk1p1#l+}L6gW8RC|o$*=y%mRllk_s5c zVera`!9+K4^iPJ&Ssa9dFQa@wQ4NU(Xv`Xh*Fz1VP*fQ-bosu|k&aF6fJ{QxW=&3p zj)herb4zUsAVrTMOQtQrz@R&`f6(<7m1Q@*C6&$+QT?=`E&ml>Vvj3BhyrOs_%|%q zfshGPr+B5ip;yTJdTTG{&m$q;`HkRgT53R;(YyN{sKye&qR5I@f65NkV%kZm(5!{H z_LEP^-<@)*=cQ<}%844%D^|4IPoJ{;WuhkdY&0|FV2xqn-o)qT6T>}12m$qJT0|=2 zGg8A9k>O6F>bb2w!8ycWvW?;>$wAi8=!jsln$AI&oTrt2IXW`(Km+n^CI(#8dV(`d z7wM7rH}8qOFhR^EqF+nAzy!45t3tnneK(d-SkzBXA1A$j?p3IJKBeRoDFOx;d6Mv6 zeK7CY4FPk$x*Wg#NN+->`uuwMfqjgCbeicQQZghyKP zi%2q-Plk-lsK@~k*lS!qDJfZUio^@}d^M}#ER1$HwE3)(#16?($F3A?RnIq&}V0p9Du^4&UMte>e@GPg4bl+zrXGFw>_Q*?ptB zMYR3Ng==UwZQ73)`}xAQ?tO0oqjSm>Xw>yQ$~WA?dxr}p_jc;fTh$#iYSLuZIqr(p zFudo52+;>o)U>R@j402qSN(GyOzxGn{XGp{&3MxvC{aTiXaJ!9*xVXFE(R)W$EZOC zC+<%X3cfg%EGZV=KT(Ge7f!JepmZ1t8I)*9FJjomk9)XKC``&tEe+!UMmG#7mQKH@ zUgP`f%5NAn# z*~nDx7R_?HfGC7w`mrn{cM4H@N&noN@IwH&h!g|kNLWW5dZ$RLWfeSAgwkpR6zX_M z#vS)iKrJFb!H`-Sf1JZ!r>VrFElv|3aVoq2De8ez6f)=)3eS^^F0ww7Lw0wLA&&pjQ1;;HJbvkRi!z-gF9XlVxRx|BN> zv2X?qs4cPzvx8a`Bbrr4#Q}bTSDA##;u5c#E*fyRf^90QvvDeL&-hzl0urq?$SMv4 zKA`H)6UtDQrG` zN)IQ1PB;p{^jUmjtq&=nDQwNsE5%}(&vy`QXgq;Nv=8$E6mCYKpGB#~$4_Fq3a6!e z(npfy#KIe7GgwTPrh^y7L(k?rRHBSXV>^t?4Jee7CHM;v^gcThTgO3e_;K!`>>m$C z#B~)00m;r>QPrtX(kW&ouxRw|`++1;#zin1sl{yY{?glr=X;y(Y77ek{4;x?p>q)_ zImFG_1#fTf;5d`rbPO!nIhOD2{{beB6lAiWmXkElQd;9e7QK&Na{xFA5)UMEUJ2;n zZY(@)qwa2H`U`4NK)U1Rvnfv~wQxLw?fvavl@Nwg0D9OLr(Q!*%q!FpjI$7U5^{?W z`7;9zhyYqB=SY78rp&U?3mkg{fpZ}CxL5)CSBlS0b8Hi@Kw_c(5jd|O=P*|xkxD1g zr@efzR&12zV$j0mrCtPzdLN^ZD}BjMh>}A;kem~N3hc!sq00#yE`op(MU7E;gf=?Rq-^gT08lUIfrh!u>YeYANwBbW;m9xui!WjT4*@Tnp5%(JY| z%V^`mycfc61$rhlJlsyRVSigA;@unaCbvkTAyg2c&a<3FjyFgVjd_+5Ce8D7|1^Un zWo8JwR@<0`vWZFs77I0FA`!3e8xv+e0I5b#xGUJ!$vHf>u<~ELZvCQlxup|MNm00& zpluGHwR1sbfCY(geI|~$Bx7+n-A_)NZ*cK=p?N0KGx9I716KcWK4*H{*YLvIy7%3P-9-6Vf7k|0si%d_v|NkzRIkSW?AB5oy@(K&_DL*&dT3n!Rg z@VL!%`o0ADk|`08%~!(l`}*;w)4+ed47_=nY3&2TG_hCmG#-SQG{91jIHMnu4`ryy z*uoe6w*9uR&mwN+x($QmiT?TP33Y69E^9Hiqu5@L&^LIqBLIDYZOHTG z_`kQE%gIj#RKz7?Yp}RTMZ*Zh(u@Euu~=5lauabdH9|Q|kpv-2GUjE71f-!)ab>GX z+XCCfh!1cLptq#6TCn@}5eYxO6s>6ITrw?X0C8jO@d;O&354ONQ`+ZrRnn0O0gL6> zc6Z{BHh{@8Qg=&^a7ra{=tNy``{Ip|#hH+Knigaz#wF6C0xk>CEl+19R!x*eKiCc~^nI-@V(wbUJ3!VjHFmfVuxcS)~m17QV(i`sk+ zG3JZ`q1eThg+zO=im?4?`D{Z~guotkdTJk@FI`n2iBRy0lW)F8!On`0^)L%(&Mig4eHd4j=imXTPHp*5d>3HwKCOQ7B*(e|ZS>=teT1 zU@8tq`MT%v(d7$unHP&6B6OPgu@7 zvtRa}Fzi*)ldbcxKE91FFw*6|Nlrmlow(&y;eRUAN9Fx>Mj*P56ZI9|^`X!prvKdi zG^}xKUZEkx+5k=Q6-sEaxfF5WaiDSPM+Y~+{f_EmM%|%H_RL{Np?HlI%wj7IMx|SS z^Y`iY{!3Mm-lL&CsgFoklp#@I5E+eB_t2vp;Wf@h_{+0(?8nQT+T?N6)5rMsMluBV z(=qwwkNflIc4=cA$KKM#+J@P%+tu~!DHCn_} zzu4Wv++mznuXxtI_`3^lFH#FPwozxI_it_d2G632UG`(WqGROs2cO^%fx}WLrc9(% zs0t)#5X!}N9Ne6`$%W8Ki_T5*COFTcc3zYF{^)`!g;AoyEQ*lZ*qA+gc!?yd6&erTQsT!G$5%>z)oHgjkA%HHzgqb%RZZwJ@sVipTR~R`O;@_LQF{}cpO#IRJYu+ImQk3Gl$j+hR8X%$x zv$J353oxDzsza11lJdQRd5gR+U^JNYD7{ztN#ar3n*t3k0!?}ukG`o0jE6QVKIJwX zB6>;DnsfpHA)a>=J9#^B#DIpTt{GdL&(x}+cw2O%4$jd8jN}KP-mu8@0yd}`MEQPL(SJkd_oGz+Cb{t)mQLys zdhP&_(2dj62g#x6m9`iQ{d9%Qnp+27f zH*Z{oDfy|hyNw=lHLWWG(rOWdrS|immp`s|Zo5h<^nvk|b2>P}Kuok{TtP_1Dt&4h zd1?|_4%$~p($PzSuTtytR@1PB!oMHa$#?o zbi5YwbQ9;Un(i4NWxAVBakeEdc}jtJyKAa&_;km?}Pl{in+H%%~;*+4uXdk0!xXNaGVVX6fC`F0cqd@qB za$8Vn;-azwopjBYI*zya>?}ZhrC&6!(=#e#38WB_`b?mR%z`4csj|%%jpu+Ybr^|X zC1;t;xJvW(BsHG1p}avZMro2wkk&l@ox~Crh~>}bzSQiq`;{)0fLaTn16=w;>B|q@ z<&=v!JLAqQUGisyY)2X1&oxlofDD1C((YlSF|>y2BCsa7MJ8}USwNdR*iYWz_d1ud zO4Z~RN$sd{U=09IG@Zcx00u}^3DK+)?n^?(2OJhmdNGw(uzFy&2 zmMlrk9HgT3i{``&dWRUD>U-WrB0ZiI1L$WB6VkWgVhfbo6N*0A-d4a$j#=pYB1oA! z(=HZ4gPKJ6i*dL+lM7VnrFkmx9{}XJ_41C^4pW9UiASvu62&Fy6&Ecx0Bfio30NMkQD0#c7I@?xWYfs zK^RF|T~3lv%&_m3DiUF+x;LYI8iaVLJd)UyZzBYZ(+>c`x#M)rq_PhrUdEv?Z@?0v z8-9fr13VUt4wMpOfC(fg%SIDr`ec^~?1JV+z1DtC{#0ES1VQe(pzGb_zGg|Hl%+rR zabgA$c|ozPzY3Jr-YX{z?3YUahk-kg8ths?h1E#ESg{n7gJSDLspL#&Qeah-8-=sf zyqY{H%E|4yAOg@70ek@92mV+cmQZ-v1hD79NF#s)BZ ze>|Z63Vc&cS1FKi(HH(hK|uvU(?+U865^}D5hPI^94PF$gXoH(YI-;!y(z&I06!0G zcJp53Fyjd*<>m30YI&voff-L*`t^R2?7poB2wqly@)o5m;P$4Q(Z}^Fqz&JEaf!dv{*Dy-jjKrwQfi(L|9<@b@Bq}$nabm*}&NZ(X zyJC-htX>Xb6f&&fDt&gEKp#X>uda zZ>um5H9dJ6_l`bS@=iUe;70Q5;EC)J)qvmgRTBm5{mc&-?p9v^0f18aT^1M-*cEC0 z{H#lowp-&<*8ouwd_ZV)+S1Xwpi8wUn2=SbG)n{6c-R8#00;s`EibXx1v9|tKs8f; zbp{@0EE)e$Nm~$iwc)4#L)}}4we@WMqX`5E9;8Td_u>?HcZcFGZPDVE;8L6-rMMI* z6e$!a#ofI~p#&>Z+&#T%zvsN~IludR?*BL0&pd0d`OKQVGc%dldzKvEtchq@y?j7K z!>zE&Cb8eWwSa0cJW?GI?PzxCMlt0@!{wNK5lti_7m53crz9|40WWVO!gLahjoKEW z$)?O+lq-%U&=~iDTxA1eXqaQIs2phJHAz6%W0wUe=!8h4IemGJ?ouvBkf_+_p`zl& z^#srdoA^2u4BCQlF_e7^c-v`ds;522|4opUq7R{)5kBe1G)&10R{pB0N3bG5&3^+9 zE8fgX%A59Xc#npk%{gs^@6?5=+_lIsSypX41elgzDxp$ftDI*_N`)Ll=OM^8lUo=& z<_!$on!8FZ=IHvQmQ3O?D zCL^8jljxNF7XN}iF$T6t-pq)VqI{Gz-$I4rI$dqdy|vTx2;!<5Q6o7VJZ2tZ%CC2e z;ok+Hi_vpqD@Q(T-)BPxvKHmOpT3FS6Y6HC)`cEiaA-vttZpk4p5?s zLQnkw6Y1w!gftDumw)CCYNenswj!=^bab>+%!X7D?-7*0EpE4r ztgiQv>rSbO8dLt!&C(%zJGy?s4)@!>59)gv>l{?HXp1CE%|ZEUuw*Cb7~`Jq{LQ2! z5nG&6jS^+1-T(ml#GeM zPM9ud;Ra{v2A&}e`2yDXE@FijQv89fNWYY??Ny%xY|#$2HsIJ}NQZ`el3Pp--jog0 zPP~37t#h{B5e8;_W25^a)p^XV#p<~t%tK#UluP$ENu`w9!uue*qQ&hL>ey~MSI7He zV}RN6#6Y(lwf-}e4|zO>6IUKC=E3v02s_lZ`Ee1US1%{Nma13eQJn3tGDJ$uz&qqM z5$Ex%4ir1gXfNBZ3mp}5mah1eJIVZpr|h{b2y)LG=3p7iFL)pCl!yN6d<4WzS>sb zV9=723%v42oqhgST_{9^Gc4dWeI!}ffYBrWEdlhUgnFAtfIP5#PW~>s{~dz@8SX0JPd|d zue8HuEL-}^`!y1<13j`eY<>WMg#Zj07GNS?jHAcfSB_?Cd_I6VJiT2~eTm!?mC>lh za_s`$Dli^cjwibh?cFsZYwF7$0%uuAhn9+tPK|X}gsNcmwH%oG1o$%N09}+MMu;g+ zk5FNLnO_h{cs;2nK!06m&VZ?I(qDVytW8WsXyE>_*J)NS-Qzi7?qWncNLYlBOoYlf zoEOpIf>9fCZ}k&3>zG6OLk*PD?lIYJ&?|~m5EDb~mF;5GmNbV(IXSEOj=v)#0vVCC z9;9unVZqm@9|S;s8IJ#j0N!JV@l{@+06!1iGy+$LhgzMbXOoic*^X7{yYDzR>-H}R zWb}D>$oxYMYH+)r_S8sSua%?Fwm;Rlk$-|n6p%?9*~fVMM0U(L>4YV`Y;w{ z`mcN4x!l+h7;fx`mmd%13b08oWvnn-EXwld4bwxkX`e(u5~@qrEN*8|N~Ia|NXBlf zs&kuaiXn+bpJY6+En)m&Tuy-NB4$I0^vlz}#~^cM&Y1(}+1omO2gz0CH43G2cMkl#|I{QL+sxG2pBVtSB?16=+2*a)i5_)!S&4#Wz>MZb8qG~Rzrfg zcif}n0AB~K2$tHFv@x=1Ec7JhIF`64u?vWAzrLA(duNDO4OOAwh)<1ajWXuFQ^=S1 zGGBB-h9$ z=JZSxSG26{3{?9gl6Q$ZK|g4MkH?IIQQCZetjt@N6Tf#hw(OkRzl+_?UA7yP$@WsZ zfmS;@11@zCrq>V2c(HdbZ<8kQnmUdxb|jDHg>@bQ&84l6LSwQC*+S6dy4yZ{;`beZ z>M6_Vmd6&)IZxXv#Y%UTJ}PWXZpeCFpZfT*Gy9FqqcU~#hs_0!)la7rma(i>F^#M{ z#^cS20>&sG+JHR~5#1Ft#AV(2QYM2D%Y5lXwEC>r!c6tSdIg34l(u+uoW^gd$tRh+ zdxu|?b@@;}I!axbjr8Tm`)YKBo}{jv&9Fuze)u_K$6Hnx^g@5#ig%K&yg}JqARP1Q z-S&Vom9Z%HiAwq@ALeLFCeTsvkQpHmci;7fVnIgnkJuU@frl zyJ2DC;n9QK2|Cf9Q>DaVs;%e0ipBCqK`|`f1rEzIq%YC}bi`MSO2U?LfMbspR{_>^ z<0CeWAY8rvo7`ph?n*dEG$RO5Pb<`aq$AQZKzi-*k?jLw-(^kT}h;pV#)Vft(diW^GYlsP7FpWtjV zi9RuY7xre8+N&ndT0<{g;js|AO`*S&NgZvu*^D1w?>*HqT8tRE_8!OV+#9zPb%?Iu z!V?y0RNWcW?@5yBo-}+<#%p{F<*(_ic!|0LHaI!m(gs-vwxk@>w1r(8jMAk+B+xF+ zO@f$@=)h8+?ZGvyNC%scEYqhu{?9=A1R9jGk~Y1zy-l6Y)Hp8^t5>KQa0i~-h$J#* zouocdv8Ur`AU@l^B23xK9SY<@$fgY!e-Jk|?r_y60TCNq85k`Eo!ri4xW7JE7t((| zn9ZH{B`lpdEIwc;`Hr%eM^q#%0i?-bODm(Mr*$mn*@XK(r3#L@IIZsU+2)aZ($<%} z3|b}Se6psW=>BUNSSj4fxt9Au?z{wi(zET{MrkMw1zys-GUw5~>sYm)SA`kw1&iHT zAGKlQQGF7Qy8+7WYw!6}3~KKL{096u8>n(R&DPmhW=a`Xy+->Qm*RuEka7CDkPq^R zV49x3a!O|n@WytbOO1I1sqhU;R~>pO)j2GdJf$eyE4C^61V9N?2Z-$~_TU{&03Q87 zDv@>+x!9Ewv#+uloMM4sI+hL(&6)hB#NPy{Gp>TPmL2&vzz(9UuILo8{%<0$uZBJO z=yV03XD7Xi0`CejOP&h}v!sAmWCHyfLlV6Hs)BL<43T{Z-9lrNbD60=;fE}kc@ucfk3%4 zgnGpNzBGwkfzj&Ek@H`L?T@7|-vq@x&}SF9`{;b^tfU-BnS*5MVVZ-v<~_$bNui0} z{m$zr#o{(uDKmZ+*)77a#gcR#(~`_o4UsyE57XP4KwTpc#z>8Pus2W$sT7BTGPQhixyF(UAUv@03)p zt-WfQQi1OWvfEW%Gr$mr9=Pi((CVXBZa`Co=6HHd7yZVJU zmI2f}s6|EBJDTmWJea$yKpf$8q*JH8ohUXv_`yRC^l5@D!{%=QE=az(%a}GqdYGX% z`s=${$u24|R%DB=K8Awdt-H9FKdZKLV!=shFg!kswF`CeBm_S2aXsX{03(x`_Wsze zFnFHM$ijFkTR&8<_n^ODO33lMoye& zvk`TEbQN+x8Tmzk!d28&27R-T6B7zi>0V~C17Jtnmh3 zY(k?^lSg4bw2w;P%9IOgHOPN}aVwbvH-71*9HaOF%F02M#JXG*JCB;kYMiv*xoIja4Kv%>RZ+^cKOuT2wtaFt0n6%=pli-8yy=A5XYV4;Ns-%rQYJ%%qko(FvovNr@$co;?87wkzF(T;+MVD+RvE_ z(2R|Mh%fox?iGe)FZx5V+plq71P6uOah9Sn7Qu832K!`wBt}!^&yVHgwH)UagSn|9@iR9Ljv_xz&+KA5+#zG8c{#l6kDHc0 z#TI3VsQkVS@c=pnUuS0kDbaE4ZQ{F<9$VFs@9$0v3gK6C>CLiH=6ZpFm6(#{?ml#( zZ7TdoO^Oo2I8OWAi4Wse#WKhjrEYtYa7!;>hyU2XD<9wR6zDp%5?c=1p$ zGyn^^3(qExGm(RGZLe&}0Z-muYE8GbyN?>Kg#j|2i(GNN2yS|wlJ z)ArzK2aBqPD!$}BW{#q5!tqrzlHX%w{fv9rW(Pm1vIWktf@Rcbce`>?RR!etAFQVV z`rksY^ri9`0>@qID#6?@w(h^ib{xN|Pm6!q%XHBb>T_4XM1l<1djijh^~DEc5tg}e z#ri9dr`6s(Q#)Bf)K2f z=bl7*a3xyB+$tT6PV7^uN#8^s4fNGR?YP6v(J^3B{V6CbfL4N{a1Uw`FMmgh;#CdF z9ou2~Y#%?L`N|IX$I;AEp^C(0r_FvKE^VU=z~%Hr-^&p8A;SC2?Xi=?w+K{2hCGhR zV}{k~1OhP;mjU1X@S;bIi)D5k^j~BR0)=9a$1$?(8<7#buRsF(zX9Rlv;iN)hLD%B z*igdJw4L#6myDmej`>~j*z-tiV?E+j{tDjycw>oxz<64x;AYj%)JlOCG?uiMqiZKd z83}O~I*ZL1(->Xygx(_U$3j6cMwt1U4%LDiKHltKf7$b^PxtcRjgXN$koupK%Q9*bl_ER-X#32+*z(m+rN84ZVcPD zE!mHgx+)=wI*k((=|yk>dWO({+hrI~Kz5hgeeRhKc^$eAE`ibZoAx@GDT$#zZmQLd z{w1W2>t8CU9+uF;u2<7RC5{G3wMHS2t8^6_e89hfQj?}Yu(V_s^}Y0^rKCkjtZve0IY6TAPXRv#y0!0-TrYx&XX2x8!yiXjFDt~?QB#R(M*D*Fa3KS;d zSyFP9&vLhxBCj+6_@$fg&vblq8j|?6FmDCwqz$Dh74OQ~(YqQvR`|qc&lq|(g0x&1 znAj~UooPpR(rg>cS<>3g;(icTt0d(`E@yYp00uk43_8@2C+EgLXr}Sqh`0)|4bG`M zLds4F}-PN)kGr%VPWU?#hT@A`*s|Mz060Fg+RuH zh-#Y>-8>j<6cro~aM@fKw84WqKb$)9-e04A*Ox?E`$+9Y;~soWLO?re@UUPs6Ir|o zq-Bu>yj_b(+m0icdqZZ9`{DPm1_$kaZ0}Kwz(HZTn(iO=T{^#MoFc`cV`OY(z5{{%uY<__am~le?sREuNY$c|${==7{``BreA4qjhGiQ#ZXE;)AryXM zQs-+W^ZDYcukl~sZmr6qT=f-6iF!CBy=y&GI{XcY7?Zj7-^0He-w)mvmCB_CetTN7 zF-bG-xzgcpEVmaMPSJ}U-80N(aL{oS%a`vweqN&&9zHU)@&Wqawnc8HiZ(+=SJgo*iF&;Z(DRY zk9g3C^@35Cr8c^ZvF<&KuZ>`NMsEAh-ig0DM)sF@9-53(xZLV`ul?1wrRbpGXc74Jq&4%~jWAsiOa0Ei=?-$UW%z7LG7;KB zg49`4A#Ar0Q6Xv^7sOH;+PgICIqTBYB<KR4L&m$hZ4{r7ey}w9W#xFP25_zm!zk-u?dXSt`jTc70)T9c}|;U&gT;igg!7U?3) z4oRBu^Y8c?ogcbFQy)^!s49;3EC|`!zgmNnZnn4lZ}LJM^WXmejQ~wytgSNUUvyH{ z98L5=5z$EFM;uh7og@Gi002NzRT%$uXq5af{XfkACf=R8C;vC+zl$(0!&P{|OaCyF zr5OoT2%}^euP_-?HU3?Tihyh0Xv2PlSBQFSmgyCH0{puwTh%njn zIj68fXS|$lA0_mbj#%#pAto zK9srr!Q3YRxHnTZHq)RY9H>kj>qad|l=5&i_lUd%OH=hufd4`1I!y*92ziUC%8H=K z6uOEUNhGaqUz9fy=1oDLJPCctVtOX=&kvKTLQ7rdlu;n_&4ue6d5WT(K_)oz zX-(;~vgU)dcb{qdzcF;C)ybk?{|eR8cjoT0F(>M7*LRfS{T?9Y#zMhS}RQWp9ak*Xq*(t54Y`?Ay9)u;9-F`YzcDGeHz~Ww zZvUi;Z(skwE>+9!bhmZ=zcIEs!*GyVhnlWHZDh?F3S zG`Q<}-CwW@^UOoLC-5KoZ>qLUdG-gB8ay`q>>oZlvYp>g|5MFBsValv;@>=(M^Y+( z(JK5MaBhF=4F|Q3dz4uk^dkj zf5zkgacJzPY83x3Q_g7R{{Z|s{gf(0`o9?Y!@o2jRT?>p8IftS%wMr`cK?fce)^ZD zB~%7LFd37T|Dz55N4}a@stO1R3q$?`OVfs_&?1}ae?{rCcuB?{zWFMFhVdHkyFzD*9Q|>_P-_n z-%gRf05}Q$I08TcfiV8~1o-noTD{Qm${a&kI(tE1B6fbb7+@P(0F`WHKD5sewKPHa7D36FTHo#7Lqz4!Es{yCcEEYmh{G zqh8Ruc!+0e$^baBI|z~$CZ|9;5(^P2d~>X?JH0Gz-D$;}xz1XgD7-#i?)Tb*kkb;9 z<1XCJ{&u~9w|9*QB5tQA+(gu^LK{|H3#Vf)eO*19yb zV|_)sK>?(E)4sG9W5wz3_QF_=w%2cE6qQ#%@W)m8LX}&{Nppwb)xuCjXj-13gvaJ8 zNq2 zyUwM8WEtf;J7owWI{0>$GOo5U54u{+r9vi6VuNZjkDk48XsFe7`aBK$iZ1}J_%-xP z^D}&(t~e{S^&xg=85_MzNpCI&`FiQdEbFs(VnsKsfGsDPgR=GYpeAzLHMyL_BxFFYz_NomA!H&)s1C8yUfq!upa9K&13F?LuN`n1 z&02-amC&?LKow59{F^NLvsl@ADTEhn`jv~C+fzw(jE35SoiE`T8y`g$5W7eX5` z;ttfo!63$aJLHMGg)}XO52@H zt%3n(BE`mI)h17B2@G?cs>CiSZ$hy&u%+vEt6fNLWE{q`DDFLZ+V-Thf^$ZoZnXH- z;!z+=g;z6vo1^GRFUYOu7pGC9j8ywq(@*RXUPmJh%nS)vK@IaIwA%S0H?1pePQx&0 z;P>cW`O6=jGA|KtjOef0n#ruh#J5Mz;=~KXB)dBNUa+IMJJhlAv*TTjWANZ$Y$*bt zlG&S9yBmZr1#UxPV%U1zdrmLqYUzqp48b9Wb%`jSA7xG;AMxnpQ^g8frS&HVLV_#2 z-RUUFZHN?MipiMq(-0?VRKd1&N@6-?EPmd6oFSVqgQ67xM8{2c{O!~w0*1Sk$=x&B zr{?xJ_i}rf*c&c$AMYkUv4G<_5Y*Wbbbj93KS1ksD6nU)ThJ|g=Q*&Gz#WE0kp{GV znA0tkaJ_?b%an+59YOQJM4rjRs2;SP=5$Q#bj&y`DJM9r>&kKLd)3hdnM+?m@| z)F|k@J2T#sotd*6Bj#VD3Wcq2-1W)zgR_LNB#!b@08MQv?x}+4VFd+pkX&$_u;L!Z z%v{yvbKL$OiOh9}t3gZnVT)Sf;~X-G8>BxrvYDojlFUo=70bCb1f4QYa2adM>j;4U z^)z<2@}+-PLJkD;$;&R|C&qn+%SJaKMaaj>vq!&rds$g$BdwL49LI2Z*}M_B-barM zRy}$5qPg0(vc5bd{Hyx;M=j! z9?yz~_ddkDj$qukSef3n~u3%OhiN*;>oDNn%0xC@ zR+$dvg;+1di#I5zx{~sy(+xk(WD>vcVvf%Wi^<%Z`^QxorqdGX_H)8}iSv0^0@zH3 z*sTj0Jz94yqbwO#?8+GmtPlv8jESsb>1BDejE-ZF8NX^~tmh-?arw`$|)R>9iG zLuBbvTS)a0x)>sApkh#W6p%VOl9;}kf+$54E;y3UI?zD9Bsd4aY-;Cd%#U*=M=rWL zG`m0mGK*}S+uOeEFQSiS05(_cE%Jkq``6@XZMyf}b{AJIRJ6Y+R(51C0kVp=FM#fl zQF#nNgc!>mkRs!fZVH(H3_<(!a&lp?JlHrIR75F#6gX!_uyWUJdw6s=hmOvA(>X+L zLGl?(cI7wV8-bE+;(czTu>HTUj|aRDJn^hArm6-GlzWN1h4#S7Mr-v0)S>%d4$TxBio zFVBQ&!muY-ZhLvdMdPX{7B6B<5!-Jlqlt;$9tWefD##6-!uKvIaTuYc76NBG6A)qN z2p&PVU|Mgb=L*clwbGo%H#}WZfGna;ur_QR`R*}!5}-SGHW9EafK6sGq41v0f!f^J zQB%eAX{joV4(sP0Ty56>8&J23 z6`A1+B#L;+@3tt7$C=300QmD<)b~8$PaThq?o7b9=U!p>EJ#S z!{zFJcq;G+?d{XH6ucm#cEoW7s|iVvd~_?N8mi;nxP;>{O3&-4IIExp4_yRm=^a(T zlF#|7Dkv1?l|IUFMCDF}H4a4;b0Q}ymPN>rPLG0atek~MstMcGf$uD=DvMAPVm(&~;=-Bb>B7iw6?`dsOMNwN z`g|N|cvwbHa(^j4_@>HxrQIV%w0j;6IjJ_w&$#1+Xt#QxD#wEo-~e+nq!D((mp!~v zZdZ?IWIX*^y($ecGaPrYvaq&VZRPqZ?kqDD?$~0a>+a12y`B=~96A~hr)f%YVhP&{C zn4};ely&%x;1f%{BLL+ZxE_-ZtRO9Ge2-pA03)0}!2?I;ZQE4@6M9XQl@S3b%#gkq2(A{zy1p1yl;?_(-iVEWSka=f zhC&rsmv=j}o*Y~*0qek_K%y7|IVf@1`nq3OsUB<)!g4Cd5= zwLVSoZvX>n+d(I8P+SQqfIK1|4^W7EpU?^+rY2~%Si|1wT!`rzcw}V16(PT|y`Y{F$sYSN;c-I#zYYlMhVoeyskA#FJf97uu}A zbs(m8=2^p=+iQ8ZNwkY|#h|++MDW0GKsog9W7%I9Z9o(>lz%;#0RaSbybu|re>Q1t zox&+=kIiC-Djp6BY4CmlG9{C>cL6E z#wMSi&%Pb|Y?b9O(+#p89=lU2Sz0F+`uHIHtIKAlhvbP7HbzWT&-BPNQ8TSW`~X^M ziH{z3sbsK1*-Wi*L)|etQyB?|P*9PbpOITa<5Eyoy+iM3s2B;?{lWbzt#O^rKqNJ} ziqDS@zIGW~`-by|y2bD2JTk|2K*gkNlHyH?W&$j8egK3=olJ{_@k4Z>R;VfN;& zl}lB3u&85-LsgOBj8Havox1I?So=Ol?Pn60IiUj{;c1C-6b-UmK(q`3EU(@e{~K96R`wyu7}U@T|a(Xb@cL^LPp z5#jObP-H_Z5|YT-j%{^oQkPUD!^BAS{rY7KsX1X!fLjOjauaQ9xVKn~=xx1Nk4tLI z1dN4-OWqauUY){b=1t9U^AjHI;U8q(4&t`TH_`krmf+WQzcM4DOotH2Yg2Z48IaCv zwjpWUkQO%btuF@1g~KUc2uzH9_8r4VkHkYl2h|I633Frjn$%VL)vv(;gN+lr0sdED zvVywxMKP-}R9_a>_6)|b(ncN{9gp4)vHjEM#kr1;~O^GApU!s@%5bm|GmyM%~p zD(T~Gc*pnQDa6Cw{j-vVAD{gi2ZfUiFL>|{PQz=1Yqz09Ho1J{xUZg9w?82Azf*Vi zTO^eB5&aUc#_qy`f6e4ITO4P(3as_8F^VmkCusmpa>5}4nQ%sAzi1&WQo#q#Zoi5k$|7DbxDaTGSfw;9j)s%A3Ij$M0P9iJ=^+| zxhIT45*h&kf%@`*JJQWkevU@_S^+A$Ek<&6#Lu852SnKNQ;qdDj#G28AIkzOb zYV^(H2A=9nOso1juRCVxn`q1Q!jH`}TrPw)L(MnQrL_!E&j^+)U*q3fMoHWuq`C>- z4IRO+xh*}@rp1I>vE#B|k=kJ{)m<;l^9Lgba*W7Dp7`y4FUfI822aMXXC9+0ewwH` zKeqQ1lt9~*hgQZCj4RdSDq@(Yjn*p@y#>RM@}|4uJ-eOGVRDY|JFk@@VNbCgXwnMu z2?Ej*+cEG)&5FisIhq(I`Z=NhuRh8_>d_8u}scB#>G1$tkG3FXHQIh}E* zr^K^RNFEtmWKWNX)^ny^UMSZMHWSF@7BLeCiv_q9#sz#fQrX(9-d~jMiik zyS^lkj=X5j4Qf=8!)+u;*De=E@3U!gie6v2 zzWP;`Ti@!M=sxb&p>)fe!z5RH`lvSkAa_eTfRUf5M{;`R*ZceB**ke*B8Eff3e zSDbKAlacfrlGTa)N}mO9(_hDw8TRka0vivp-&pM|3#%=stjpsQ8a}+iD1C*|lUwF< zePpBo6TZm}!4F|P5;My*rEtqDo^4Y1wVls$OPrNZn_T3*V|^De1y4mkeAcV@v??*g zO{Hlf1odfcQ=4xPz*wl6~mXVNOYq8m5bg{dush%VS$^__O+>y}Xb41VczQl;zt8 zrhV_;gQisF1_lkQVP4=VaF$H z|KlMS`BI!~nkn)c6L%Bw^X4pZN{{2rI%r4Wx0?Xu#%V`e>jw*_$*Vp%@{bw0(YjJT;CV8W*N-TN z!UOs+Ca~^n9^Ni4={cz6+LyqgZhL%xzV^@r7xtsUH2VXhH z^Cg5@`usgSUslO=#4!btmsDwb0q1}#2CTfhaZSHNl%xINBUAdZw^yMy9Dp|!OeI0i ze!lze3F3oe>EsA?2V3!XqE|?Fu4ysqP>p1@x zjnK`T+tNAet&q!iNsJ8AR9Hq=mY|+@^!4$jR~_9!F`&Lf6FZ)wQl(o~@H{H72lb`d zf-LojS+QG-mU?~%%Q8*@#;uu8|7=ozEzl12H=tgn_N2BtujcqhmPMhJ#5Jk7_v+-Z zP5j_~zGB81>bLBMuj&8G^y;<&hFDvM)BU)P5dJzBy7WcPaV?XsrXt;ej@-DpF7gof z{@(W{r#nvCtQ(Gr20Ej{&=qf6d86*3|H}NRB{&;8YzDvGgbdM~_BfkhDfw2{+&sF9 z>8|A8eb4a7Rb&RJ9YQ`Cteb%EhNg5Em|lW6_3-dZ>NBzD6|2sXpSOMpu1#OW$NSU3 zqweD10H5`rH(9p`Uz3(t0=Q(gV{ublUa|k|>C4G=(I$!^E>kH)0Z|EmNt}lGPl&+~9=*sbUBr)MgY@dupdZZ6Q`;S6?jy-#} zJJWXda48r28-OTQ&EGVG)LcwB()l|Y7Ww#sGHNBQ9VZ-P_mD8s9mpdk{c}@eeUwCfH#GiTanj6CGovS zo`=8|5>F6P{g`G?C{rI8wb6cQZ(%S029R@orI%bW+Al8CGG8p3zSGpoQ`r8LI&iZE-{a|MD9kNxZ(D1UJ6fH4h{mFb{m@ z^Etzk@)LslwH5JqFV#D@PiQB|@YN8xS}WDJQLfbvm#$Vlb1zKV3>n2gu_<8iz&J#Q zrdIn4e&L@T8Pz0;R~u{@y?MUqBg0B9Y^8YEaY(4tL085np5CvXm+Mws$|464oKP~k z&tFx=NF<})Bb1SmpNZy40RxB%$=NI9e zNeS%UXz1iv6Hs-541DlF*6NhwcP2ZK zX&wN7T(_O%Ewp|48*o-LJ%QhJInw{FWByiYS?|ejfH7V(<7)N!%%N(&B3AaidHCxJ zc+1i&<9LxOV8?7_QzGyJH7zCre4$hM)(GA7Ai4C{== z#UtZQWfCLB#FobLA`^URzkKvFHNN5LIi>L?ozyZ?T@~r47dLtsOqndnx`Z0Mfgr~* zK_}RG$P&&WbQyvP`rtfk08qG0zy)>veWOFMCV{hSU?tpMSOGV5lLp@IouFAwCnNtk z;{*&qS8DWrDK8D8CyI|_{bs6m!HagN(nVg-iN#P<-@(&M_rgNI2d7~WWsV@M@|^Qa z)_SO!cl09J`>mz(pwW5U;3nuI`TMYW?N_hGsqS6ALe|m-Ez z<~I!!Y{)EMzuR`5TUbNDquyU1>?OU3I>awwN~$}4wn7Ll8~&;`dX@eY>1H!e?8b11 zu6{HobyC>96aGA6K?Zu5qE#_k+Wfc8s*;v9RqxX*QKh!^k2gG zI{|p(PjCRCea2NbgPlxw1`Gi738`NU5p{t~od97!s|tErt07^sURG2At|ZHupVPH{ z7o7l$n4}2ECr2%s*k?%=to^$DVBwCN*T*?NP3mH_JHGWAd|XYHEXT9SBJj%z^<+Gx zx1&xg?H{bX!Bf8h=FLM5Yxhapmr&$R5B1*K?xX76g9M)!d|;axyBseqvWL@7CzN14 z0uq!@=mgvm(s6S<4s_CFI(%KAMCvaTECTMuoMIK$c>4tnEUp~yhRBr{dqN6jLMJdR z1J)vM+|o9#ler>$KKmSEm{onMH>0$IY{AQS5b{Pm=lt-aOttJKQ*w5$&m}dt^G|&e z_nz;es^mX4LJ4eILIi&zwS8Eb{B9LRT|aI_|41(h1^eOM4vFeU5tz8548I2epfZlhcX~M_6c6e4e^jQmV8@94303iz56yrRN2I+)nvya$j7& z+iq)o8H>l$4oAMAh=u~^~#teW%R*H~Mwz?QA^FZyF8w$-r8Cg$N zU}6%;Nutg7$YUKbc6ur|d7 z^CmS4c)9UXD=G}N<(_7Bq_gA<2mB1_dLtigYJ$PS(4+|EtpBL$*S$FF2McK27D}r3 z>a+f!LDl}s(v>@bCHJMwA!m9_&2o1lY<6W_E&Dj+q&^d3TYY^mB-d4q$|DYz#!l0$ z^KO;Tfv8GAJ%IovN;6uX3+NtF^PXFeZOHN=*7Os_oFB);_Sb}N*K4|)foo@`iZN{< z)S;oo9q^P8U*jkZ1+~7RnQKRASN$>geV8zE7<)-szrD%A%6R>u=2B&y-of{g-T}$; z6NvbmFiy)VUKI{okILVG0jRoQNEAc&qmW;FV<3t8k?wHg>WUpm*TE|$`Z&t_Tmw5Q zdoM|(s~SE`-vf~&bmFggJcd@*KeA&pr#!yvFw@#VFy?JK7XebS81OYUo0d}twwr3y z{WZ>@Ublq2`(>e@$%VHAt5aSHZuLhAK|&MlWyh_%vp$Yjs#Xgo?9f!qDhqR1rmt;s z^jhp-x)X!SfjYI@bI@$eb#z7b3-KsM&UW+?wE!nKnSNQw3ma)B>~exhT7YlFTCTIR zmBd+(o|y?RQTEc7Lh4|R_)eyq8%?X}oxy|D(J>DMK_SmOc1sqve->wWqqUSA{Qm^_ z5(n+&l7>3FQO!n6^#`9SDjlwH0UvQw00Q?#Oqn1Q$NX=Z02y*hBp@L_pA)dO6+j}w z_tAGOWu(+_p#5u?xnK3B6z6yPKwla_yZDSp7#EaUtE-xnB=>yfe4h@pw#Do70TFN` z&SQb@M6;&f^P4A#i+CJ(w&dzNYf9IR9E=?aCu zf@S&*(Fo|r{lM;yq70K8E#GMgFkj2kPU$y=W1t5}lD=Rp^p*UL4-H5eQb+_-#;^tA z_t(|(ks%=bQJ5kTxJvLq3krESVwedv;1$gZ{(gu6yS7bm5dkP1OIrNN4FEpu@e#d! zsS!_P!kX*2w_k^pO2f|N}Zv$Gj%~?=em|@=B_NEje^}`bq0J}6~V zystY9{{WKEZ%M7W)|%Js?Q0*y@vz$6M(m?!3?n`8{{SvuY=N<6BbS4|AA%0NM*skA zL%sw62r-!f4;msU3qLABra_6&jmOOFqYw#O;i>0>tKnww&e{czlo6mIjr~k((u(Z; z+F2L?MOL&L0TjCR#g~YPfg83RsjZ{5FVeuJ^I1yOp?%WV6mLP7;IJgf5ivb8OPzPM zBC8Zq!O!{g34j30aKY**fVl)_KaBtjhW?&rVf;?j7ds4ewx3xx zwQ@jLPaer2#14F%Zt%bW3Gott@*4mc?*fi97zo|F8NiT0=0PN7kRmYjEZmOe2s}li z&Q<5w`QoK=XU_mPe>VQHk5%|DS4^FUJv5L`$yPO8<>-aQS+?~=H^#}g|f4}GNUWxJl0OAWvmBYJl z8!&}#TYpXz6$`$~v!lJ$*VlvB&;J0_NMTFoBl<7_HLyy68l4|74hk>`m(!f+)G>sQ z&wzwWsYV1=&Z8+Jekc<99w=Y|<3R8m!;Zj-6GkCF@QkdOgg}bkt+7b~1SIg73PZXx z1LfDE00Ud57yu9&*h6Vh!*d7UCKe0$YJ;Som0yt2ztbrYoi;w4Ucr$udUL?K+|BsT z7w&oQa=F<%vdd}v{{TO~Yo%|D{rC%7S{8sHk(*_f13dDl2Z7FUH!WTO0QIqhVcba! z@Lznj&|j0Ej%CkrI9*39{{a60&!IK*J{|SZA5L_=nb>&@Q47!;6MON z$MkcNMxgUoQV{ko=X|)4>AziT=JPUNP`fPivkg^jU%na;VB>%+OoD{;j#r*zHolPc za~3+UwAkC!iNzDmXsFWcZ+MS!HiMME({r<3)o6oN5}L>B*$x)-B`T*i;bh4j&p0gu zH21PW>v{Zl$?^Ek0AZOoyQd&M&Kr2Z^1wTWf7y&hn-xHSK{b)7VT`O~K=ERDxJz$E zqoN4_W^UWNmUJ|Yd%uzZP#Ncg%{IYCr==nUkhaZb7zAvNrsi684*vj$_kZ5?rWKlO zD^BCG&JB!Oj5hQ@P-DlEGgL%iks&O3$-nSTv<&Y%u`L z%yB@Zziv9ZBiMiAapGnF0C_X_e$`lAHH3x4MHW=^{q-PwE(-vPfyRHy1}4&k7jU>i zI$KMbP6lh;`n~zT=Ysp*lkQiaEDm^R!a!5M8&YUl6~w*IH9Y=(&U zyEi8jY%^FCeHS7CrJb678@dC&ur9*}oyQ}#kl`C)jp7GeFHbcH133HRAdi*tw*9O5 zeR}Wz0QRKEk#9Hq{{Wfg6ItY82`H_vgNYx(@Vk(1{8~4c{&GEtI1z^Pv~a>>&^*TS z)a|gNl8v8MTsHP*-w>^60-_c02m-V#50Mrbz#+CKMRwAG@#vah;KGZ9Nj`{&s}%nL z&^}fI5J6}|^Y{Rq?k+CzA_A&{*kH&4h=dDq3AeGx?*1SFlXJcf--yBeww;(+N{%E% z>>y?T09jY@C?FUf_mkIqY6$^hbU=dU4D>KZDd>a%sG^?7?(WO9=G6Vv@!WpjMQfaw zpEJJvpY=BL!!Ic9mIQSk7jHvXi=P!|ZFcy5HsOb}O=x2<6q~l_%T(-7 z0Ygr#3CU{;CUGIF1k7OR?inXFh`;(Q1rp#owa+7V`I;!?f-ZX&rb zEke%>Ko(S};P4AksL^C@+DPzYz~cuT57*FvXAF9e9Yz5MN0{l0&0pUwSLI$l+!gYI zxku7z{{Z{!lgRJh?db~4BPe~3s3Zgad3(52>~$JH&1brOJSvzofsb$f@9lPq)BO{- zX^4OYPZV~Xw5%wNC>Ki4r^uvMO4ekChK$vdzh+ z=S`oh9f~W)3=}{iPsLxEIBOSuSGx7=QSuzNtq2ZWN!QnE(ceEGTzlDc@Ac3)vJD}2 z?e=nNe&<$?<`C?VZj=Gj**W*vH1l)cd+gg|YVBXD!)5kD{i@i?gsStixS7R>3IH?X zpbEPo%qUqJ`!jsUmDLa6T55IU?D~Aa&_OGR6Ob=lsm{m&PrEXH5C@`)28Viu)7F6} zfXqNckKmr?))L6o*+RgqU)K0vxphWQZC@Q${_EqQm(<2z>Br4Vpb4A|Pa&l6n+wZ< z`Y17L?xR}X;?-~PrRUlE4Zc4%{?)5@{t@RHmBIpz!-#FLT&M+tA?4nQ)qo#X6s&X*Q9WH8{$?#D{o7XZcd3v700DdS z2g{$0l-By#%uc{dtA%kJqh}Sb3%-D1TNKt>{dU> z-^Ry2XTNRZAM>RZ>hE8DU%dtJb zc%#FpMtJ$9bt<@o5JmuQ5imG|DJMT2A$z%~aBZ&M``HPITwmx5K37gK_HWmmE^aNy z*I$^2k8At`Q;E&>=bpkx#r^YAt#Ie$^J1T~lsC*~wf3qrv3ghIGB$2qub#T%F{uHs zTa}(%1EyU{03G_^`D}0sNPt^5e?|5Qa-TaB0Kb36{Lye1 zua&-?aXM9L{EEXtrQiPmJ@M^8W$Wj%`%F8x4Cd%CA3U{5cz^_+zn^A)m295ZaMbXV zf2+e$lkm?z$+;_)Ka2rZ8Pj|KRD_5E{{U3GjzS$#GQ*-k3opMs(5X|G-~44lB7ldn z0p6a22n9TC!?Ix@qo?Qk&*N?N*F!D(FZfj^$oF}_yW?5dv!u7`SOuk?Dlx+#kSY_= zvhKxROhK0a0IF*_Cb^SBU(cn|jkLR0^ zz=y7k&Ng6RN55S({{Wak`Py2t8zA%QFTD3IAr6K(0v*V z4oATPUW766a7VB?UN~9*074@GPI@PBCWsf#%er5Wg?vH;w11lyz%(X5*4lZspCBG) z{)cE>3=^6#L$q~&)&U|eHJO+*P|A0)HfAoD!5+WCSe_7X>gJLH0luzVQ=x>|f}udZ%rJ{@DxkVD{B9=$WncE_W(Pp2}EVN7qH=c@kqBku=NF0c9pvl$eDCQ)Us z-i%-YbFa$(09Cs8`;REMY&~m34#YfO-vv+Z(3ILu{y)6@JOt&-;NueZ4$e*EaJ2xq zaBlgodemRGwNmAmJo7Ghx3wNcTSENs@>#=?Q{& zeC%>#e@tVu-b?YP)1N=Mp0oIM^NT*=)VE~kwP@Lw3zwS3fD~$}aY5$ggHIE%1q+hv z@P32Tg;UVx!0Lx3j(rB@4 zD}Cb+R+KK@;14D;668>IW%5DntMZNJxH%UrT3z$)9EHLNK;GCnGsPpGL5;oV_xr^BD|C#o%x+(YpUPIsN%k-dXOioYl#g?XtBpCN4_ zh|ovSM%3lma;9@pprnHC=sVHP0uHVe5S8C*Z_IW27gUVBl|>&~+S9p&Pu8_P=@Us- zwFhfU4I?|*p7t(jlJW=I(#>4+Ob$ibqK_!4gr(^1Xkn0w1s#PkKIpz@BwFM-o>)Re z4T;Qx#KEB4ix#%)-U0?Xh&Cc}VQ}DG0YIYaJwUZ-??{iyE$Hs9*j%XziAYUpt@%Y7 zc0~6E$yD9Zhy|jw0riXXCgenE1hG$sCi^r=wO4AsafLkZwph8%ec}8p!4>o_>;)t8 zD|$PtwkBOo0dp$VJ*y-DK?59%OIvmC{-_T7QtR@?U$xn%-kY6Lz zQ%AeVh}ik}=4G43sQ&={xjFL2^BQz_7#^+9vUa=A!ppmhcUoh%bAp$0_iC4P8_H^a zSY}!Mt+N}i!7H={mfkygR&Q8}y5;T6D0k0&?m_zJ3=Bd_T*7$I76zzS#cZL4| z?9=7MefPRo?ceZPTP1$X^`W1-9e3Q!W@ct)W@ct)W@cwbW@ct)W@ct)W@ct)W@ct) aW@ct)W`C^A%*@Qp%*@Y0+Fd#S0RP#3f$1** diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 5c019d3ec9..aa10c34c3d 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -52,7 +52,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - + const renderAscatAnimated = false; /** * Return a layer, or layergroup, created with the supplied function @@ -542,7 +542,7 @@ export default function mapLayerBuilder(config, cache, store) { // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) // Setting the radius to 0 includes each point but hides the visual image: new CircleStyle({ - radius: 0, + radius: renderAscatAnimated ? 0 : 2, fill: new Fill({ color: 'green', }), @@ -559,9 +559,13 @@ export default function mapLayerBuilder(config, cache, store) { }), }); + applyStyle(def, layer, state, layeroptions); + layer.wrap = day; + layer.wv = attributes; + layer.isVector = true; let windTileLayer; - if (def.id === 'ascat') { + if (def.id === 'ascat' && renderAscatAnimated) { // Add z-index property to existing canvas // FIND THE PROPER WAY TO DO THIS! document.querySelectorAll('canvas')[0].style.zIndex = -1; @@ -570,12 +574,6 @@ export default function mapLayerBuilder(config, cache, store) { // console.log(windTileLayer); } - - applyStyle(def, layer, state, layeroptions); - layer.wrap = day; - layer.wv = attributes; - layer.isVector = true; - if (breakPointLayerDef && !animationIsPlaying) { const newDef = { ...def, ...breakPointLayerDef }; const wmsLayer = createLayerWMS(newDef, layeroptions, day, state); From b2483e9df1b06f073010ac36e726a331720a7ea0 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 3 Nov 2022 11:23:28 -0400 Subject: [PATCH 55/85] ASCAT animation set to true. --- web/js/map/layerbuilder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index aa10c34c3d..1d473c0835 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -52,7 +52,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - const renderAscatAnimated = false; + const renderAscatAnimated = true; /** * Return a layer, or layergroup, created with the supplied function From 8fbdc75745a3ea44f6718e4aaef31a7d2e472801 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 3 Nov 2022 17:02:50 -0400 Subject: [PATCH 56/85] Preliminary configs added for oscar_sd & oscar_uv. --- .../layers/oscar/oscar_currents_final_sd.md | 1 + .../layers/oscar/oscar_currents_final_uv.md | 1 + .../common/config/wv.json/layerOrder.json | 2 ++ .../layers/oscar/OSCAR_currents_final_sd.json | 23 +++++++++++++ .../layers/oscar/OSCAR_currents_final_uv.json | 23 +++++++++++++ .../vectorstyles/oscar_currents-final_sd.json | 34 +++++++++++++++++++ .../vectorstyles/oscar_currents-final_uv.json | 34 +++++++++++++++++++ schemas/layer-config.json | 2 ++ web/js/map/layerbuilder.js | 9 +++-- web/js/vectorflow/index.js | 6 +++- 10 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md create mode 100644 config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md create mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json create mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json create mode 100644 config/default/common/vectorstyles/oscar_currents-final_sd.json create mode 100644 config/default/common/vectorstyles/oscar_currents-final_uv.json diff --git a/config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md b/config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md new file mode 100644 index 0000000000..5ae72b66f2 --- /dev/null +++ b/config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md @@ -0,0 +1 @@ +oscar_currents_final_sd description \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md b/config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md new file mode 100644 index 0000000000..c6bc05c86d --- /dev/null +++ b/config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md @@ -0,0 +1 @@ +oscar_currents_final_uv description \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 346aff5e54..7007de5c1a 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -635,6 +635,8 @@ "MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI", "OSCAR_Sea_Surface_Currents_Meridional", "OSCAR_Sea_Surface_Currents_Zonal", + "oscar_currents_final_sd", + "oscar_currents_final_uv", "JPL_MEaSUREs_L4_Sea_Surface_Height_Anomalies", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_GDR_Cycles", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_US_West_Coast_GAFECC", diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json new file mode 100644 index 0000000000..fd9892878d --- /dev/null +++ b/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json @@ -0,0 +1,23 @@ +{ + "layers": { + "oscar_currents_final_sd": { + "id": "oscar_currents_final_sd", + "title": "oscar_currents_final_sd", + "subtitle": "oscar_currents_final_sd subtitle", + "description": "oscar_currents_final_sd description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "oscar_currents_final_sd" + }, + "transition": true, + "projections": { + "geographic": { + "source": "GITC:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json new file mode 100644 index 0000000000..729e0e5c06 --- /dev/null +++ b/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json @@ -0,0 +1,23 @@ +{ + "layers": { + "oscar_currents_final_uv": { + "id": "oscar_currents_final_uv", + "title": "oscar_currents_final_uv", + "subtitle": "oscar_currents_final_uv subtitle", + "description": "oscar_currents_final_uv description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "oscar_currents_final_uv" + }, + "transition": true, + "projections": { + "geographic": { + "source": "GITC:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/vectorstyles/oscar_currents-final_sd.json b/config/default/common/vectorstyles/oscar_currents-final_sd.json new file mode 100644 index 0000000000..12a958e70d --- /dev/null +++ b/config/default/common/vectorstyles/oscar_currents-final_sd.json @@ -0,0 +1,34 @@ +{ + "version": 8, + "name": "oscar_currents_final_sd", + "sources": { + "ascat": { + "type": "vector", + "tiles": [ + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/oscar_currents_final_sd/default/2020-01-01/2km/0/0/0.mvt" + ] + } + }, + "layers": [ + { + "id": "oscar_currents_final_sd", + "source": "oscar_currents_final_sd", + "source-layer": "oscar_currents_final_sd", + "type": "circle", + "paint": { + "circle-radius": [ + "step", + [ + "zoom" + ], + 1, + 1, + 2, + 3, + 3 + ], + "circle-color": "rgb(160, 229, 26)" + } + } + ] +} \ No newline at end of file diff --git a/config/default/common/vectorstyles/oscar_currents-final_uv.json b/config/default/common/vectorstyles/oscar_currents-final_uv.json new file mode 100644 index 0000000000..57735c1403 --- /dev/null +++ b/config/default/common/vectorstyles/oscar_currents-final_uv.json @@ -0,0 +1,34 @@ +{ + "version": 8, + "name": "oscar_currents_final_uv", + "sources": { + "ascat": { + "type": "vector", + "tiles": [ + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/oscar_currents_final_uv/default/2020-01-01/2km/0/0/0.mvt" + ] + } + }, + "layers": [ + { + "id": "oscar_currents_final_uv", + "source": "oscar_currents_final_uv", + "source-layer": "oscar_currents_final_uv", + "type": "circle", + "paint": { + "circle-radius": [ + "step", + [ + "zoom" + ], + 1, + 1, + 2, + 3, + 3 + ], + "circle-color": "rgb(160, 229, 26)" + } + } + ] +} \ No newline at end of file diff --git a/schemas/layer-config.json b/schemas/layer-config.json index 8f5e80e10e..eb384bd964 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -176,6 +176,8 @@ "Urban Extents", "Vectors", "ascat", + "oscar_currents_final_sd", + "oscar_currents_final_uv", "Vegetation Indices", "Vegetation Light Use Efficiency", "Volcano Hazard", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 1d473c0835..743609c46a 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -52,7 +52,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - const renderAscatAnimated = true; + const renderAnimation = true; /** * Return a layer, or layergroup, created with the supplied function @@ -542,7 +542,7 @@ export default function mapLayerBuilder(config, cache, store) { // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) // Setting the radius to 0 includes each point but hides the visual image: new CircleStyle({ - radius: renderAscatAnimated ? 0 : 2, + radius: renderAnimation ? 0 : 2, fill: new Fill({ color: 'green', }), @@ -565,7 +565,10 @@ export default function mapLayerBuilder(config, cache, store) { layer.isVector = true; let windTileLayer; - if (def.id === 'ascat' && renderAscatAnimated) { + console.log(def); + const animationAllowed = def.id === 'ascat' || def.id === 'oscar_currents_final_sd' || def.id === 'oscar_currents_final_uv'; + + if (animationAllowed && renderAnimation) { // Add z-index property to existing canvas // FIND THE PROPER WAY TO DO THIS! document.querySelectorAll('canvas')[0].style.zIndex = -1; diff --git a/web/js/vectorflow/index.js b/web/js/vectorflow/index.js index 49b138d38d..0706f8507b 100644 --- a/web/js/vectorflow/index.js +++ b/web/js/vectorflow/index.js @@ -59,11 +59,15 @@ const base = new OLTile({ }), }), }); + +// Modify to allow dynamic url for ascat/oscar +const dataSourceUrl = 'https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt'; + const source = new SourceVectorTile({ visible: true, projection: get('EPSG:4326'), // url: 'https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?TIME=2020-03-21&layer=MISR_Cloud_Motion_Vector&tilematrixset=2km&Service=WMTS&Request=GetTile&Version=1.0.0&FORMAT=application%2Fvnd.mapbox-vector-tile&TileMatrix={z}&TileCol={x}&TileRow={y}', - url: 'https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt', + url: dataSourceUrl, format: new MVT(), tileGrid: new WMTSTileGrid({ extent: [-180, -90, 180, 90], From 64df4108cf7f83ccd30a70b91825f0f5d3f661f7 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 7 Nov 2022 15:16:38 -0500 Subject: [PATCH 57/85] Configured WV to include MISR cloud motion vectors (Ben's demo). --- .../layers/misr/MISR_Cloud_Motion_Vector.md | 1 + .../common/config/wv.json/layerOrder.json | 1 + .../layers/misr/misr_cloud_motion_vector.json | 23 +++ .../misr_cloud_motion_vector.json | 34 ++++ config/default/release/config.json | 11 ++ .../release/config/wv.json/sources.json | 3 + schemas/layer-config.json | 1 + web/js/map/layerbuilder.js | 60 +++++- web/js/vectorflow/index.js | 177 ------------------ 9 files changed, 132 insertions(+), 179 deletions(-) create mode 100644 config/default/common/config/metadata/layers/misr/MISR_Cloud_Motion_Vector.md create mode 100644 config/default/common/config/wv.json/layers/misr/misr_cloud_motion_vector.json create mode 100644 config/default/common/vectorstyles/misr_cloud_motion_vector.json delete mode 100644 web/js/vectorflow/index.js diff --git a/config/default/common/config/metadata/layers/misr/MISR_Cloud_Motion_Vector.md b/config/default/common/config/metadata/layers/misr/MISR_Cloud_Motion_Vector.md new file mode 100644 index 0000000000..acceb43573 --- /dev/null +++ b/config/default/common/config/metadata/layers/misr/MISR_Cloud_Motion_Vector.md @@ -0,0 +1 @@ +MISR_Cloud_Motion_Vector Description \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 7007de5c1a..e50a0915d8 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -743,6 +743,7 @@ "MISR_Aerosol_Optical_Depth_Avg_Green_Monthly", "MISR_Radiance_Average_Infrared_Color_Monthly", "MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly", + "MISR_Cloud_Motion_Vector", "RSS_Merged_Wind_Climatology_Monthly", "RSS_Total_Precipitable_Water_Climatology_Monthly", "MEaSUREs_Ice_Velocity_Greenland", diff --git a/config/default/common/config/wv.json/layers/misr/misr_cloud_motion_vector.json b/config/default/common/config/wv.json/layers/misr/misr_cloud_motion_vector.json new file mode 100644 index 0000000000..430b06218f --- /dev/null +++ b/config/default/common/config/wv.json/layers/misr/misr_cloud_motion_vector.json @@ -0,0 +1,23 @@ +{ + "layers": { + "MISR_Cloud_Motion_Vector": { + "id": "MISR_Cloud_Motion_Vector", + "title": "MISR_Cloud_Motion_Vector", + "subtitle": "MISR_Cloud_Motion_Vector subtitle", + "description": "MISR_Cloud_Motion_Vector description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "MISR_Cloud_Motion_Vector" + }, + "transition": true, + "projections": { + "geographic": { + "source": "UAT:GIBS:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/vectorstyles/misr_cloud_motion_vector.json b/config/default/common/vectorstyles/misr_cloud_motion_vector.json new file mode 100644 index 0000000000..bbccf4516d --- /dev/null +++ b/config/default/common/vectorstyles/misr_cloud_motion_vector.json @@ -0,0 +1,34 @@ +{ + "version": 8, + "name": "MISR_Cloud_Motion_Vector", + "sources": { + "ascat": { + "type": "vector", + "tiles": [ + "https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/MISR_Cloud_Motion_Vector/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt" + ] + } + }, + "layers": [ + { + "id": "MISR_Cloud_Motion_Vector", + "source": "MISR_Cloud_Motion_Vector", + "source-layer": "MISR_Cloud_Motion_Vector", + "type": "circle", + "paint": { + "circle-radius": [ + "step", + [ + "zoom" + ], + 1, + 1, + 2, + 3, + 3 + ], + "circle-color": "rgb(160, 229, 26)" + } + } + ] +} \ No newline at end of file diff --git a/config/default/release/config.json b/config/default/release/config.json index 6d4177e5c6..55d56fba1e 100644 --- a/config/default/release/config.json +++ b/config/default/release/config.json @@ -15,6 +15,10 @@ { "from": "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?request=GetCapabilities", "to": "gitc-geographic.xml" + }, + { + "from": "https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?request=GetCapabilities", + "to": "uat-gibs-geographic.xml" } ], "wv-options-wmts": [ @@ -32,6 +36,13 @@ "projection": "geographic", "maxResolution": 0.5625 }, + { + "source": "UAT:GIBS:geographic", + "from": "uat-gibs-geographic.xml.xml", + "to": "uat-gibs-geographic.xml.json", + "projection": "geographic", + "maxResolution": 0.5625 + }, { "source": "GIBS:arctic", "from": "gibs-arctic.xml", diff --git a/config/default/release/config/wv.json/sources.json b/config/default/release/config/wv.json/sources.json index 4f2d77b347..54f1bdded6 100644 --- a/config/default/release/config/wv.json/sources.json +++ b/config/default/release/config/wv.json/sources.json @@ -23,6 +23,9 @@ }, "WDPA:wms": { "url": "https://gis.unep-wcmc.org/arcgis/services/wdpa/public/MapServer/WMSServer" + }, + "UAT:GIBS:geographic": { + "url": "https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi" } } } \ No newline at end of file diff --git a/schemas/layer-config.json b/schemas/layer-config.json index eb384bd964..f68807d44c 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -178,6 +178,7 @@ "ascat", "oscar_currents_final_sd", "oscar_currents_final_uv", + "MISR_Cloud_Motion_Vector", "Vegetation Indices", "Vegetation Light Use Efficiency", "Volcano Hazard", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 743609c46a..5e367995a2 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -475,6 +475,62 @@ export default function mapLayerBuilder(config, cache, store) { if (!source) { throw new Error(`${def.id}: Invalid source: ${def.source}`); } + + + // These checks are for the misr_cloud_motion_vector layer + // this is just to visualize the dataset from the demo instance so we can compare the demo to WV + if (!source.matrixSets) { + source.matrixSets = { + '2km': { + id: '2km', + maxResolution: 0.5625, + resolutions: [ + 0.5625, + 0.28125, + 0.140625, + 0.0703125, + 0.03515625, + 0.017578125, + ], + tileSize: [ + 512, + 512, + ], + tileMatrices: [ + { + matrixWidth: 2, + matrixHeight: 1, + }, + { + matrixWidth: 3, + matrixHeight: 2, + }, + { + matrixWidth: 5, + matrixHeight: 3, + }, + { + matrixWidth: 10, + matrixHeight: 5, + }, + { + matrixWidth: 20, + matrixHeight: 10, + }, + { + matrixWidth: 40, + matrixHeight: 20, + }, + ], + }, + }; + } + + if (!def.matrixSet) { + def.matrixSet = '2km'; + } + // end of misr_cloud_motion_vector code + const matrixSet = source.matrixSets[def.matrixSet]; if (!matrixSet) { throw new Error(`${def.id}: Undefined matrix set: ${def.matrixSet}`); @@ -565,8 +621,8 @@ export default function mapLayerBuilder(config, cache, store) { layer.isVector = true; let windTileLayer; - console.log(def); - const animationAllowed = def.id === 'ascat' || def.id === 'oscar_currents_final_sd' || def.id === 'oscar_currents_final_uv'; + const vectorLayers = ['ascat', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; + const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { // Add z-index property to existing canvas diff --git a/web/js/vectorflow/index.js b/web/js/vectorflow/index.js deleted file mode 100644 index 0706f8507b..0000000000 --- a/web/js/vectorflow/index.js +++ /dev/null @@ -1,177 +0,0 @@ - -import * as dat from 'dat.gui'; -import OLTile from 'ol/layer/Tile'; -import WMTS from 'ol/source/WMTS'; -import WMTSTileGrid from 'ol/tilegrid/WMTS'; -import MVT from 'ol/format/MVT'; -import { get } from 'ol/proj'; -import SourceVectorTile from 'ol/source/VectorTile'; -import LayerVectorTile from 'ol/layer/VectorTile'; -import OLMap from 'ol/Map'; -import OLView from 'ol/View'; -import WindTile from './renderer'; -import { throttle } from './util'; -// import './App.css'; -// import Style from 'ol/style/Style'; -// import Stroke from 'ol/style/Stroke'; - -const gui = new dat.GUI(); - -const tileGridSizes = [ - { - matrixWidth: 2, - matrixHeight: 1, - }, - { - matrixWidth: 3, - matrixHeight: 2, - }, - { - matrixWidth: 5, - matrixHeight: 3, - }, - { - matrixWidth: 10, - matrixHeight: 5, - }, - { - matrixWidth: 20, - matrixHeight: 10, - }, - { - matrixWidth: 40, - matrixHeight: 20, - }, -]; -const base = new OLTile({ - extent: [-180, -90, 180, 90], - crossOrigin: 'anonymous', - source: new WMTS({ - url: '//gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?TIME=2020-04-27', - layer: 'BlueMarble_NextGeneration', - format: 'image/jpeg', - matrixSet: '500m', - tileGrid: new WMTSTileGrid({ - origin: [-180, 90], - resolutions: [0.140625, 0.0703125, 0.03515625, 0.017578125, 0.0087890625, 0.00439453125, 0.002197265625], - matrixIds: [2, 3, 4, 5, 6, 7, 8], - tileSize: 512, - }), - }), -}); - -// Modify to allow dynamic url for ascat/oscar -const dataSourceUrl = 'https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt'; - -const source = new SourceVectorTile({ - visible: true, - projection: get('EPSG:4326'), - // url: 'https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?TIME=2020-03-21&layer=MISR_Cloud_Motion_Vector&tilematrixset=2km&Service=WMTS&Request=GetTile&Version=1.0.0&FORMAT=application%2Fvnd.mapbox-vector-tile&TileMatrix={z}&TileCol={x}&TileRow={y}', - url: dataSourceUrl, - format: new MVT(), - tileGrid: new WMTSTileGrid({ - extent: [-180, -90, 180, 90], - resolutions: [0.5625, 0.28125, 0.140625, 0.0703125, 0.03515625, 0.017578125], - tileSize: [512, 512], - sizes: tileGridSizes, - }), -}); - -// console.log(staticStyle); -const vectorLayer = new LayerVectorTile({ - source, - // Removing the style array renders each point in the default style (blue circles at each point, not animated) - // style: [], -}); -const map = new OLMap({ - layers: [base, vectorLayer], - target: 'map', - view: new OLView({ - center: [0, 0], - maxZoom: 12, - zoom: 1, - extent: [-180, -90, 180, 90], - projection: get('EPSG:4326'), - }), -}); - -let i = 0; -source.on('tileloadstart', (e) => { - i += 1; -}); -let windRender; -source.on('tileloadend', (e) => { - if (!windRender) { - const mapSize = map.getSize(); - const options = { - uMin: -76.57695007324219, - uMax: 44.30181884765625, - vMin: -76.57695007324219, - vMax: 44.30181884765625, - width: mapSize[0], - height: mapSize[1], - }; - windRender = new WindTile(options); - } - i -= 1; - if (i === 1 && !windRender.stopped && windRender) { - windRender.stop(); - } - if (i === 0 && !moving && windRender) { - if (!initiatedGUI) { - setTimeout(() => { updateRenderer(); }, 1); - } else { - updateRendererThrottled(); - } - } -}); -let moving = false; -map.getView().on('change:center', () => { - windRender.stop(); - moving = true; -}); -map.getView().on('propertychange', (e) => { - if (e.key === 'resolution' && windRender) { - windRender.stop(); - moving = true; - } -}); -map.on('moveend', (e) => { - moving = false; - if (i === 0 && windRender) updateRendererThrottled(); -}); -let initiatedGUI = false; -let currentFeatures; let zoom; let extent; let - options; -const updateRenderer = () => { - const view = map.getView(); - const mapSize = map.getSize(); - extent = view.calculateExtent(mapSize); - currentFeatures = vectorLayer.getSource().getFeaturesInExtent(extent); - zoom = view.getZoom(); - options = { - uMin: -55.806217193603516, - uMax: 45.42329406738281, - vMin: -5.684286117553711, - vMax: 44.30181884765625, - width: mapSize[0], - height: mapSize[1], - ts: Date.now(), - }; - windRender.updateData(currentFeatures, extent, zoom, options); - if (!initiatedGUI) initGUI(); -}; -const updateRendererThrottled = throttle(updateRenderer, 150); -const initGUI = function() { - const { wind } = windRender; - gui.add(wind, 'numParticles', 144, 248832); - gui.add(wind, 'fadeOpacity', 0.96, 0.999).step(0.001).updateDisplay(); - gui.add(wind, 'speedFactor', 0.05, 1.0); - gui.add(wind, 'dropRate', 0, 0.1); - gui.add(wind, 'dropRateBump', 0, 0.2); - gui.add(windRender, 'dataGridWidth', 18, 360).step(2).onChange(updateTexture); - initiatedGUI = true; -}; -const updateTexture = function() { - windRender.updateData(currentFeatures, extent, zoom, options); -}; From e18a54dcb5060b56319d0922008e10b170a24c61 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 7 Nov 2022 16:59:43 -0500 Subject: [PATCH 58/85] Moved vector animation code block into it's own function. --- web/js/map/layerbuilder.js | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 5e367995a2..d0efc04418 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -151,6 +151,7 @@ export default function mapLayerBuilder(config, cache, store) { break; case 'vector': layer = getLayer(createLayerVector, def, options, attributes, wrapLayer); + console.log('Calling createLayerVector'); break; case 'wms': layer = getLayer(createLayerWMS, def, options, attributes, wrapLayer); @@ -195,6 +196,7 @@ export default function mapLayerBuilder(config, cache, store) { const dateOptions = { date, nextDate, previousDate }; const key = layerKey(def, options, state); const layer = await createLayerWrapper(def, key, options, dateOptions); + console.log(layer); return layer; }; @@ -446,7 +448,20 @@ export default function mapLayerBuilder(config, cache, store) { + const animateVectors = function(layerName, tileSource, selected, layer) { + let windTileLayer; + const vectorLayers = ['ascat', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; + const animationAllowed = vectorLayers.indexOf(layerName) > -1; + + if (animationAllowed && renderAnimation) { + // Add z-index property to existing canvas + // FIND THE PROPER WAY TO DO THIS! + document.querySelectorAll('canvas')[0].style.zIndex = -1; + windTileLayer = createWindtile(tileSource, selected, layer); + // console.log(windTileLayer); + } + }; /** Create a new Vector Layer @@ -620,18 +635,21 @@ export default function mapLayerBuilder(config, cache, store) { layer.wv = attributes; layer.isVector = true; - let windTileLayer; const vectorLayers = ['ascat', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; - if (animationAllowed && renderAnimation) { - // Add z-index property to existing canvas - // FIND THE PROPER WAY TO DO THIS! - document.querySelectorAll('canvas')[0].style.zIndex = -1; - - windTileLayer = createWindtile(tileSource, selected, layer); - // console.log(windTileLayer); + animateVectors(layerName, tileSource, selected, layer); } + // let windTileLayer; + + // if (animationAllowed && renderAnimation) { + // // Add z-index property to existing canvas + // // FIND THE PROPER WAY TO DO THIS! + // document.querySelectorAll('canvas')[0].style.zIndex = -1; + + // windTileLayer = createWindtile(tileSource, selected, layer); + // // console.log(windTileLayer); + // } if (breakPointLayerDef && !animationIsPlaying) { const newDef = { ...def, ...breakPointLayerDef }; From dc5a1ffabb5c92b1fa84df0275263f66fc7b0724 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 8 Nov 2022 14:18:12 -0500 Subject: [PATCH 59/85] Minor adjustment in layerbuilder.js --- web/js/map/layerbuilder.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index d0efc04418..9af4d52ad2 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -196,7 +196,6 @@ export default function mapLayerBuilder(config, cache, store) { const dateOptions = { date, nextDate, previousDate }; const key = layerKey(def, options, state); const layer = await createLayerWrapper(def, key, options, dateOptions); - console.log(layer); return layer; }; @@ -454,12 +453,13 @@ export default function mapLayerBuilder(config, cache, store) { const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { - // Add z-index property to existing canvas - // FIND THE PROPER WAY TO DO THIS! - document.querySelectorAll('canvas')[0].style.zIndex = -1; - + const canvasElem = document.querySelectorAll('canvas'); + if (canvasElem.length > 0) { + // Add z-index property to existing OL canvas. This ensures that the visualization is on the top layer. + // The z-index should be applied with CSS on map generation to avoid this code entirely. + canvasElem[0].style.zIndex = -1; + } windTileLayer = createWindtile(tileSource, selected, layer); - // console.log(windTileLayer); } }; From 9b5625536ce17ba8bffb6a8dd0f7e4ab47686edb Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 10 Nov 2022 09:24:04 -0500 Subject: [PATCH 60/85] Update ascat reference to ASCAT_Ocean_Surface_Wind_Speed throughout. --- ...t.md => ASCAT_Ocean_Surface_Wind_Speed.md} | 2 +- .../common/config/wv.json/layerOrder.json | 2 +- .../ascat/ASCAT_Ocean_Surface_Wind_Speed.json | 23 +++++++++++++++++++ .../config/wv.json/layers/ascat/ascat.json | 23 ------------------- .../ASCAT_Ocean_Surface_Wind_Speed.json | 19 +++++++++++++++ .../config/wv.json/measurements/ascat.json | 19 --------------- ...on => ASCAT_Ocean_Surface_Wind_Speed.json} | 12 +++++----- .../misr_cloud_motion_vector.json | 2 +- .../vectorstyles/oscar_currents-final_sd.json | 2 +- .../vectorstyles/oscar_currents-final_uv.json | 2 +- schemas/layer-config.json | 2 +- web/js/map/layerbuilder.js | 20 +++------------- web/js/modules/vector-styles/selectors.js | 4 ++-- web/js/vectorflow/renderer.js | 5 ++-- 14 files changed, 61 insertions(+), 76 deletions(-) rename config/default/common/config/metadata/layers/ascat/{ascat.md => ASCAT_Ocean_Surface_Wind_Speed.md} (94%) create mode 100644 config/default/common/config/wv.json/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.json delete mode 100644 config/default/common/config/wv.json/layers/ascat/ascat.json create mode 100644 config/default/common/config/wv.json/measurements/ASCAT_Ocean_Surface_Wind_Speed.json delete mode 100644 config/default/common/config/wv.json/measurements/ascat.json rename config/default/common/vectorstyles/{ascat.json => ASCAT_Ocean_Surface_Wind_Speed.json} (59%) diff --git a/config/default/common/config/metadata/layers/ascat/ascat.md b/config/default/common/config/metadata/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.md similarity index 94% rename from config/default/common/config/metadata/layers/ascat/ascat.md rename to config/default/common/config/metadata/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.md index 071d2b8c24..9609f4d03d 100644 --- a/config/default/common/config/metadata/layers/ascat/ascat.md +++ b/config/default/common/config/metadata/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.md @@ -16,4 +16,4 @@ Overpasses: ???
Orbit: ??? #### References -Data Product: ascat \ No newline at end of file +Data Product: ASCAT_Ocean_Surface_Wind_Speed \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index e50a0915d8..ad079bf24a 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,6 +1,6 @@ { "layerOrder": [ - "ascat", + "ASCAT_Ocean_Surface_Wind_Speed", "VIIRS_SNPP_CorrectedReflectance_TrueColor", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1", diff --git a/config/default/common/config/wv.json/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.json b/config/default/common/config/wv.json/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.json new file mode 100644 index 0000000000..27faac1bbe --- /dev/null +++ b/config/default/common/config/wv.json/layers/ascat/ASCAT_Ocean_Surface_Wind_Speed.json @@ -0,0 +1,23 @@ +{ + "layers": { + "ASCAT_Ocean_Surface_Wind_Speed": { + "id": "ASCAT_Ocean_Surface_Wind_Speed", + "title": "ASCAT_Ocean_Surface_Wind_Speed", + "subtitle": "ASCAT_Ocean_Surface_Wind_Speed subtitle", + "description": "ASCAT_Ocean_Surface_Wind_Speed description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "ASCAT_Ocean_Surface_Wind_Speed" + }, + "transition": true, + "projections": { + "geographic": { + "source": "GITC:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/ascat/ascat.json b/config/default/common/config/wv.json/layers/ascat/ascat.json deleted file mode 100644 index 61e6e1b7cd..0000000000 --- a/config/default/common/config/wv.json/layers/ascat/ascat.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "layers": { - "ascat": { - "id": "ascat", - "title": "ascat", - "subtitle": "ascat subtitle", - "description": "ascat description", - "tags": "", - "group": "overlays", - "type": "vector", - "layergroup": "Vectors", - "vectorStyle": { - "id": "ascat" - }, - "transition": true, - "projections": { - "geographic": { - "source": "GITC:geographic" - } - } - } - } -} \ No newline at end of file diff --git a/config/default/common/config/wv.json/measurements/ASCAT_Ocean_Surface_Wind_Speed.json b/config/default/common/config/wv.json/measurements/ASCAT_Ocean_Surface_Wind_Speed.json new file mode 100644 index 0000000000..84426c611b --- /dev/null +++ b/config/default/common/config/wv.json/measurements/ASCAT_Ocean_Surface_Wind_Speed.json @@ -0,0 +1,19 @@ +{ + "measurements": { + "ASCAT_Ocean_Surface_Wind_Speed": { + "id": "ASCAT_Ocean_Surface_Wind_Speed", + "title": "ASCAT_Ocean_Surface_Wind_Speed title", + "subtitle": "ASCAT_Ocean_Surface_Wind_Speed Testing", + "sources": { + "tbd": { + "id": "ASCAT_Ocean_Surface_Wind_Speed", + "title": "ASCAT_Ocean_Surface_Wind_Speed Title", + "description": "", + "image": "", + "settings": [ + ] + } + } + } + } +} diff --git a/config/default/common/config/wv.json/measurements/ascat.json b/config/default/common/config/wv.json/measurements/ascat.json deleted file mode 100644 index cf163244b2..0000000000 --- a/config/default/common/config/wv.json/measurements/ascat.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "measurements": { - "ascat": { - "id": "ascat", - "title": "ascat title", - "subtitle": "ascat Testing", - "sources": { - "tbd": { - "id": "ascat", - "title": "ascat Title", - "description": "", - "image": "", - "settings": [ - ] - } - } - } - } -} diff --git a/config/default/common/vectorstyles/ascat.json b/config/default/common/vectorstyles/ASCAT_Ocean_Surface_Wind_Speed.json similarity index 59% rename from config/default/common/vectorstyles/ascat.json rename to config/default/common/vectorstyles/ASCAT_Ocean_Surface_Wind_Speed.json index 1bc24c866d..622b007f05 100644 --- a/config/default/common/vectorstyles/ascat.json +++ b/config/default/common/vectorstyles/ASCAT_Ocean_Surface_Wind_Speed.json @@ -1,19 +1,19 @@ { "version": 8, - "name": "ascat", + "name": "ASCAT_Ocean_Surface_Wind_Speed", "sources": { - "ascat": { + "ASCAT_Ocean_Surface_Wind_Speed": { "type": "vector", "tiles": [ - "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ascat/default/2020-01-01/16km/0/0/0.mvt" + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/ASCAT_Ocean_Surface_Wind_Speed/default/2020-01-01/16km/0/0/0.mvt" ] } }, "layers": [ { - "id": "ascat", - "source": "ascat", - "source-layer": "ascat", + "id": "ASCAT_Ocean_Surface_Wind_Speed", + "source": "ASCAT_Ocean_Surface_Wind_Speed", + "source-layer": "ASCAT_Ocean_Surface_Wind_Speed", "type": "circle", "paint": { "circle-radius": [ diff --git a/config/default/common/vectorstyles/misr_cloud_motion_vector.json b/config/default/common/vectorstyles/misr_cloud_motion_vector.json index bbccf4516d..9ea9a3679d 100644 --- a/config/default/common/vectorstyles/misr_cloud_motion_vector.json +++ b/config/default/common/vectorstyles/misr_cloud_motion_vector.json @@ -2,7 +2,7 @@ "version": 8, "name": "MISR_Cloud_Motion_Vector", "sources": { - "ascat": { + "MISR_Cloud_Motion_Vector": { "type": "vector", "tiles": [ "https://uat.gibs.earthdata.nasa.gov/wmts/epsg4326/best/MISR_Cloud_Motion_Vector/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.mvt" diff --git a/config/default/common/vectorstyles/oscar_currents-final_sd.json b/config/default/common/vectorstyles/oscar_currents-final_sd.json index 12a958e70d..9347d2308a 100644 --- a/config/default/common/vectorstyles/oscar_currents-final_sd.json +++ b/config/default/common/vectorstyles/oscar_currents-final_sd.json @@ -2,7 +2,7 @@ "version": 8, "name": "oscar_currents_final_sd", "sources": { - "ascat": { + "oscar_currents_final_sd": { "type": "vector", "tiles": [ "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/oscar_currents_final_sd/default/2020-01-01/2km/0/0/0.mvt" diff --git a/config/default/common/vectorstyles/oscar_currents-final_uv.json b/config/default/common/vectorstyles/oscar_currents-final_uv.json index 57735c1403..8a2687ab7a 100644 --- a/config/default/common/vectorstyles/oscar_currents-final_uv.json +++ b/config/default/common/vectorstyles/oscar_currents-final_uv.json @@ -2,7 +2,7 @@ "version": 8, "name": "oscar_currents_final_uv", "sources": { - "ascat": { + "oscar_currents_final_uv": { "type": "vector", "tiles": [ "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/oscar_currents_final_uv/default/2020-01-01/2km/0/0/0.mvt" diff --git a/schemas/layer-config.json b/schemas/layer-config.json index f68807d44c..1532f636b8 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -175,7 +175,7 @@ "Urban Expansion", "Urban Extents", "Vectors", - "ascat", + "ASCAT_Ocean_Surface_Wind_Speed", "oscar_currents_final_sd", "oscar_currents_final_uv", "MISR_Cloud_Motion_Vector", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 9af4d52ad2..721dd6dd6a 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -449,7 +449,7 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { let windTileLayer; - const vectorLayers = ['ascat', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -613,7 +613,7 @@ export default function mapLayerBuilder(config, cache, store) { // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) // Setting the radius to 0 includes each point but hides the visual image: new CircleStyle({ - radius: renderAnimation ? 0 : 2, + radius: renderAnimation ? 6 : 2, fill: new Fill({ color: 'green', }), @@ -635,21 +635,11 @@ export default function mapLayerBuilder(config, cache, store) { layer.wv = attributes; layer.isVector = true; - const vectorLayers = ['ascat', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { animateVectors(layerName, tileSource, selected, layer); } - // let windTileLayer; - - // if (animationAllowed && renderAnimation) { - // // Add z-index property to existing canvas - // // FIND THE PROPER WAY TO DO THIS! - // document.querySelectorAll('canvas')[0].style.zIndex = -1; - - // windTileLayer = createWindtile(tileSource, selected, layer); - // // console.log(windTileLayer); - // } if (breakPointLayerDef && !animationIsPlaying) { const newDef = { ...def, ...breakPointLayerDef }; @@ -782,10 +772,6 @@ export default function mapLayerBuilder(config, cache, store) { const updateTexture = function() { windRender.updateData(currentFeatures, extent, zoom, options); }; - - // console.log('returning windRender'); - // console.log(windRender); - return windRender; }; /** diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 5079258441..3a1ad8b813 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -96,7 +96,7 @@ export function setRange(layerId, props, index, palettes, state) { }; } -// Review calls to this function & determine if calls are necessary for ASCAT +// Review calls to this function & determine if calls are necessary for Vector Flow Layers export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { const map = lodashGet(state, 'map.ui.selected'); if (!map) return; @@ -107,7 +107,7 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; const glStyle = vectorStyles[styleId]; - // ASCAT does not include a glStyle, so we early return here in that instance + // ASCAT_Ocean_Surface_Wind_Speed does not include a glStyle, so we early return here in that instance if (glStyle === undefined) { return; } diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index a5fa11f910..f0e47e6de0 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -11,6 +11,7 @@ export default class WindTile { console.log('options'); console.log(options); + // options.canvas needs to be found, otherwise a NEW canvas is being generated! this.glCanvas = options.canvas || document.createElement('canvas'); this.olmap = options.olmap; @@ -24,10 +25,8 @@ export default class WindTile { // BUT, we still get a second canvas :-( // this.parent = options.parent || document.getElementById('app'); const targetDiv = document.querySelector('#wv-map-geographic > div > div.ol-unselectable.ol-layers > div'); - console.log('targetDiv'); - console.log(targetDiv); this.parent = targetDiv; - // this.glCanvas.id = 'ben-canvas'; + this.glCanvas.id = ' animated-vector'; this.stopped = false; this.init(); this.callback = options.callback; From 79d9c83d899f845a5d8bc3a108f41f65e6d072fb Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 10 Nov 2022 09:35:09 -0500 Subject: [PATCH 61/85] Update oscar_currents_final_sd reference to OSCAR_Sea_Surface_Currents_Final_SD throughout. --- .../OSCAR_Sea_Surface_Currents_Final_SD.md | 1 + .../layers/oscar/oscar_currents_final_sd.md | 1 - .../common/config/wv.json/layerOrder.json | 2 +- .../OSCAR_Sea_Surface_Currents_Final_SD.json | 23 +++++++++++++++++++ .../layers/oscar/OSCAR_currents_final_sd.json | 23 ------------------- ... OSCAR_Sea_Surface_Currents_Final_SD.json} | 12 +++++----- schemas/layer-config.json | 2 +- web/js/map/layerbuilder.js | 4 ++-- 8 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md delete mode 100644 config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md create mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json delete mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json rename config/default/common/vectorstyles/{oscar_currents-final_sd.json => OSCAR_Sea_Surface_Currents_Final_SD.json} (57%) diff --git a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md new file mode 100644 index 0000000000..be4c1db82c --- /dev/null +++ b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md @@ -0,0 +1 @@ +OSCAR_Sea_Surface_Currents_Final_SD description \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md b/config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md deleted file mode 100644 index 5ae72b66f2..0000000000 --- a/config/default/common/config/metadata/layers/oscar/oscar_currents_final_sd.md +++ /dev/null @@ -1 +0,0 @@ -oscar_currents_final_sd description \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index ad079bf24a..5a4c2d6000 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -635,7 +635,7 @@ "MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI", "OSCAR_Sea_Surface_Currents_Meridional", "OSCAR_Sea_Surface_Currents_Zonal", - "oscar_currents_final_sd", + "OSCAR_Sea_Surface_Currents_Final_SD", "oscar_currents_final_uv", "JPL_MEaSUREs_L4_Sea_Surface_Height_Anomalies", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_GDR_Cycles", diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json new file mode 100644 index 0000000000..c049aeca5f --- /dev/null +++ b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json @@ -0,0 +1,23 @@ +{ + "layers": { + "OSCAR_Sea_Surface_Currents_Final_SD": { + "id": "OSCAR_Sea_Surface_Currents_Final_SD", + "title": "OSCAR_Sea_Surface_Currents_Final_SD", + "subtitle": "OSCAR_Sea_Surface_Currents_Final_SD subtitle", + "description": "OSCAR_Sea_Surface_Currents_Final_SD description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "OSCAR_Sea_Surface_Currents_Final_SD" + }, + "transition": true, + "projections": { + "geographic": { + "source": "GITC:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json deleted file mode 100644 index fd9892878d..0000000000 --- a/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_sd.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "layers": { - "oscar_currents_final_sd": { - "id": "oscar_currents_final_sd", - "title": "oscar_currents_final_sd", - "subtitle": "oscar_currents_final_sd subtitle", - "description": "oscar_currents_final_sd description", - "tags": "", - "group": "overlays", - "type": "vector", - "layergroup": "Vectors", - "vectorStyle": { - "id": "oscar_currents_final_sd" - }, - "transition": true, - "projections": { - "geographic": { - "source": "GITC:geographic" - } - } - } - } -} \ No newline at end of file diff --git a/config/default/common/vectorstyles/oscar_currents-final_sd.json b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_SD.json similarity index 57% rename from config/default/common/vectorstyles/oscar_currents-final_sd.json rename to config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_SD.json index 9347d2308a..24b8156d33 100644 --- a/config/default/common/vectorstyles/oscar_currents-final_sd.json +++ b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_SD.json @@ -1,19 +1,19 @@ { "version": 8, - "name": "oscar_currents_final_sd", + "name": "OSCAR_Sea_Surface_Currents_Final_SD", "sources": { - "oscar_currents_final_sd": { + "OSCAR_Sea_Surface_Currents_Final_SD": { "type": "vector", "tiles": [ - "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/oscar_currents_final_sd/default/2020-01-01/2km/0/0/0.mvt" + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/OSCAR_Sea_Surface_Currents_Final_SD/default/2020-01-01/2km/0/0/0.mvt" ] } }, "layers": [ { - "id": "oscar_currents_final_sd", - "source": "oscar_currents_final_sd", - "source-layer": "oscar_currents_final_sd", + "id": "OSCAR_Sea_Surface_Currents_Final_SD", + "source": "OSCAR_Sea_Surface_Currents_Final_SD", + "source-layer": "OSCAR_Sea_Surface_Currents_Final_SD", "type": "circle", "paint": { "circle-radius": [ diff --git a/schemas/layer-config.json b/schemas/layer-config.json index 1532f636b8..308bdcad14 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -176,7 +176,7 @@ "Urban Extents", "Vectors", "ASCAT_Ocean_Surface_Wind_Speed", - "oscar_currents_final_sd", + "OSCAR_Sea_Surface_Currents_Final_SD", "oscar_currents_final_uv", "MISR_Cloud_Motion_Vector", "Vegetation Indices", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 721dd6dd6a..b4fc86e1a8 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -449,7 +449,7 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { let windTileLayer; - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'oscar_currents_final_uv']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -635,7 +635,7 @@ export default function mapLayerBuilder(config, cache, store) { layer.wv = attributes; layer.isVector = true; - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'oscar_currents_final_sd', 'oscar_currents_final_uv']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'oscar_currents_final_uv']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { animateVectors(layerName, tileSource, selected, layer); From 8efbe1fad4a911f24f46db54002827e06290a607 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Thu, 10 Nov 2022 09:49:25 -0500 Subject: [PATCH 62/85] Update oscar_currents_final_uv reference to OSCAR_Sea_Surface_Currents_Final_UV throughout. --- .../OSCAR_Sea_Surface_Currents_Final_UV.md | 1 + .../layers/oscar/oscar_currents_final_uv.md | 1 - .../common/config/wv.json/layerOrder.json | 2 +- .../OSCAR_Sea_Surface_Currents_Final_UV.json | 23 +++++++++++++++++++ .../layers/oscar/OSCAR_currents_final_uv.json | 23 ------------------- ... OSCAR_Sea_Surface_Currents_Final_UV.json} | 12 +++++----- schemas/layer-config.json | 2 +- web/js/map/layerbuilder.js | 4 ++-- 8 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md delete mode 100644 config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md create mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json delete mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json rename config/default/common/vectorstyles/{oscar_currents-final_uv.json => OSCAR_Sea_Surface_Currents_Final_UV.json} (57%) diff --git a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md new file mode 100644 index 0000000000..886ef2b27b --- /dev/null +++ b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md @@ -0,0 +1 @@ +OSCAR_Sea_Surface_Currents_Final_UV description \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md b/config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md deleted file mode 100644 index c6bc05c86d..0000000000 --- a/config/default/common/config/metadata/layers/oscar/oscar_currents_final_uv.md +++ /dev/null @@ -1 +0,0 @@ -oscar_currents_final_uv description \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 5a4c2d6000..8359af4201 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -636,7 +636,7 @@ "OSCAR_Sea_Surface_Currents_Meridional", "OSCAR_Sea_Surface_Currents_Zonal", "OSCAR_Sea_Surface_Currents_Final_SD", - "oscar_currents_final_uv", + "OSCAR_Sea_Surface_Currents_Final_UV", "JPL_MEaSUREs_L4_Sea_Surface_Height_Anomalies", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_GDR_Cycles", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_US_West_Coast_GAFECC", diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json new file mode 100644 index 0000000000..e91932ab8f --- /dev/null +++ b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json @@ -0,0 +1,23 @@ +{ + "layers": { + "OSCAR_Sea_Surface_Currents_Final_UV": { + "id": "OSCAR_Sea_Surface_Currents_Final_UV", + "title": "OSCAR_Sea_Surface_Currents_Final_UV", + "subtitle": "OSCAR_Sea_Surface_Currents_Final_UV subtitle", + "description": "OSCAR_Sea_Surface_Currents_Final_UV description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "OSCAR_Sea_Surface_Currents_Final_UV" + }, + "transition": true, + "projections": { + "geographic": { + "source": "GITC:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json deleted file mode 100644 index 729e0e5c06..0000000000 --- a/config/default/common/config/wv.json/layers/oscar/OSCAR_currents_final_uv.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "layers": { - "oscar_currents_final_uv": { - "id": "oscar_currents_final_uv", - "title": "oscar_currents_final_uv", - "subtitle": "oscar_currents_final_uv subtitle", - "description": "oscar_currents_final_uv description", - "tags": "", - "group": "overlays", - "type": "vector", - "layergroup": "Vectors", - "vectorStyle": { - "id": "oscar_currents_final_uv" - }, - "transition": true, - "projections": { - "geographic": { - "source": "GITC:geographic" - } - } - } - } -} \ No newline at end of file diff --git a/config/default/common/vectorstyles/oscar_currents-final_uv.json b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json similarity index 57% rename from config/default/common/vectorstyles/oscar_currents-final_uv.json rename to config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json index 8a2687ab7a..e8205ffbe7 100644 --- a/config/default/common/vectorstyles/oscar_currents-final_uv.json +++ b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json @@ -1,19 +1,19 @@ { "version": 8, - "name": "oscar_currents_final_uv", + "name": "OSCAR_Sea_Surface_Currents_Final_UV", "sources": { - "oscar_currents_final_uv": { + "OSCAR_Sea_Surface_Currents_Final_UV": { "type": "vector", "tiles": [ - "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/oscar_currents_final_uv/default/2020-01-01/2km/0/0/0.mvt" + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/OSCAR_Sea_Surface_Currents_Final_UV/default/2020-01-01/2km/0/0/0.mvt" ] } }, "layers": [ { - "id": "oscar_currents_final_uv", - "source": "oscar_currents_final_uv", - "source-layer": "oscar_currents_final_uv", + "id": "OSCAR_Sea_Surface_Currents_Final_UV", + "source": "OSCAR_Sea_Surface_Currents_Final_UV", + "source-layer": "OSCAR_Sea_Surface_Currents_Final_UV", "type": "circle", "paint": { "circle-radius": [ diff --git a/schemas/layer-config.json b/schemas/layer-config.json index 308bdcad14..787d8416aa 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -177,7 +177,7 @@ "Vectors", "ASCAT_Ocean_Surface_Wind_Speed", "OSCAR_Sea_Surface_Currents_Final_SD", - "oscar_currents_final_uv", + "OSCAR_Sea_Surface_Currents_Final_UV", "MISR_Cloud_Motion_Vector", "Vegetation Indices", "Vegetation Light Use Efficiency", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index b4fc86e1a8..52c98e6c5c 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -449,7 +449,7 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { let windTileLayer; - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'oscar_currents_final_uv']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'OSCAR_Sea_Surface_Currents_Final_UV']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -635,7 +635,7 @@ export default function mapLayerBuilder(config, cache, store) { layer.wv = attributes; layer.isVector = true; - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'oscar_currents_final_uv']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'OSCAR_Sea_Surface_Currents_Final_UV']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { animateVectors(layerName, tileSource, selected, layer); From aaf8dbfe3f6ea719680a7b40b5f02da45508c450 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 21 Nov 2022 10:01:48 -0500 Subject: [PATCH 63/85] Adjusted styling so OSCAR static view displays arrows (still need to wire up magnitude & direction indications). --- web/js/map/layerbuilder.js | 70 ++++++++++++++++++++-------- web/js/modules/vector-styles/util.js | 5 ++ web/js/vectorflow/renderer.js | 4 +- web/js/vectorflow/wind/windindex.js | 3 ++ 4 files changed, 59 insertions(+), 23 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 52c98e6c5c..f8e2d350b5 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -15,7 +15,7 @@ import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; import lodashGet from 'lodash/get'; -import { Style, Icon } from 'ol/style'; +import { Style, Icon, RegularShape } from 'ol/style'; import Point from 'ol/geom/Point'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; @@ -448,8 +448,8 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { - let windTileLayer; const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'OSCAR_Sea_Surface_Currents_Final_UV']; + console.log(layerName); const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -459,7 +459,7 @@ export default function mapLayerBuilder(config, cache, store) { // The z-index should be applied with CSS on map generation to avoid this code entirely. canvasElem[0].style.zIndex = -1; } - windTileLayer = createWindtile(tileSource, selected, layer); + createWindtile(tileSource, selected, layer); } }; @@ -601,6 +601,10 @@ export default function mapLayerBuilder(config, cache, store) { }), }); + const arrowSizeMultiplier = 1; + const arrowColor = 'red'; + const radianDirection = 10; + // ol.layer.VectorTile const layer = new LayerVectorTile({ extent: layerExtent, source: tileSource, @@ -609,25 +613,51 @@ export default function mapLayerBuilder(config, cache, store) { ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, // style: [], - style: new Style({ - // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) - // Setting the radius to 0 includes each point but hides the visual - image: new CircleStyle({ - radius: renderAnimation ? 6 : 2, - fill: new Fill({ - color: 'green', + // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) + // Setting the radius to 0 includes each point but hides the visual + // style: new Style({ + // image: new CircleStyle({ + // radius: renderAnimation ? 6 : 10, + // fill: new Fill({ + // color: 'green', + // }), + // }), + + + // The arrow shaft + style: [ + new Style({ + image: new RegularShape({ + points: 2, + radius: 10 * arrowSizeMultiplier, + stroke: new Stroke({ + width: 2, + color: arrowColor, + }), + angle: radianDirection, }), }), - - // Set as point to draw a line - // geometry: new Point(100), - // image: new Icon({ - // src: 'data/arow.png', - // anchor: [0.75, 0.5], - // rotateWithView: true, - // // rotation: -rotation, - // }), - }), + // The arrow head + new Style({ + image: new RegularShape({ + points: 3, + radius: 5 * arrowSizeMultiplier, + angle: radianDirection, + fill: new Fill({ + color: arrowColor, + }), + }), + }), + ], + // Set as point to draw a line + // geometry: new Point(100), + // image: new Icon({ + // src: 'data/arow.png', + // anchor: [0.75, 0.5], + // rotateWithView: true, + // // rotation: -rotation, + // }), + // }), }); applyStyle(def, layer, state, layeroptions); diff --git a/web/js/modules/vector-styles/util.js b/web/js/modules/vector-styles/util.js index 0f47cc30bb..47f3ab6983 100644 --- a/web/js/modules/vector-styles/util.js +++ b/web/js/modules/vector-styles/util.js @@ -225,7 +225,11 @@ function getModalContentsAtPixel(mapProps, config, compareState, isMobile) { const desktopLimit = 12; const mobileLimit = 5; const maxLimitOfResults = isMobile ? mobileLimit : desktopLimit; + console.log(map); map.forEachFeatureAtPixel(pixels, (feature, layer) => { + console.log('forEachFeatureAtPixel'); + console.log(pixels); + console.log(feature); const lengthCheck = (arr) => arr.length >= maxLimitOfResults; const featureId = feature.getId(); if (featureId === 'coordinates-map-marker') { @@ -292,6 +296,7 @@ function getModalContentsAtPixel(mapProps, config, compareState, isMobile) { * @returns {Object} */ export function onMapClickGetVectorFeatures(pixels, map, state, swipeOffset) { + console.log('onMapClickGetVectorFeatures'); const { config, compare } = state; const { screenWidth, screenHeight, isMobileDevice } = state.screenSize; const isMobile = isMobileDevice; diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index f0e47e6de0..03787ede81 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -8,9 +8,6 @@ export default class WindTile { this.height = options.height || 512; this.dataGridWidth = 360; - console.log('options'); - console.log(options); - // options.canvas needs to be found, otherwise a NEW canvas is being generated! this.glCanvas = options.canvas || document.createElement('canvas'); this.olmap = options.olmap; @@ -52,6 +49,7 @@ export default class WindTile { updateData(data, extent, zoom, options) { const windData = this.organizeData(data, extent, zoom, options); this.windData = this.organizeData(data, extent, zoom, options); + console.log(windData); this.wind.setWind(windData); this.stopped = false; // this.glCanvas.style = 'display:block'; diff --git a/web/js/vectorflow/wind/windindex.js b/web/js/vectorflow/wind/windindex.js index fa613f2b77..affa007847 100644 --- a/web/js/vectorflow/wind/windindex.js +++ b/web/js/vectorflow/wind/windindex.js @@ -83,6 +83,9 @@ export default class WindGL { this.windData = windData; const height = windData.textureHeight; const width = windData.textureWidth; + console.log(`height: ${height}`); + console.log(`width: ${width}`); + // console.log(windData.image); this.windTexture = util.createTexture(this.gl, this.gl.LINEAR, windData.image, width, height); } From 59b351ca97770c6d18caec7bac7731c44bde4013 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 21 Nov 2022 16:45:55 -0500 Subject: [PATCH 64/85] Added styleFunction to render direction & speed for OSCAR vector data. --- web/js/map/layerbuilder.js | 105 +++++++++++----------- web/js/modules/vector-styles/selectors.js | 2 +- web/js/vectorflow/renderer.js | 1 - web/js/vectorflow/wind/windindex.js | 2 - 4 files changed, 53 insertions(+), 57 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index f8e2d350b5..37559a270c 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -15,11 +15,9 @@ import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; import lodashGet from 'lodash/get'; -import { Style, Icon, RegularShape } from 'ol/style'; -import Point from 'ol/geom/Point'; +import { Style, RegularShape } from 'ol/style'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; -import CircleStyle from 'ol/style/Circle'; import * as dat from 'dat.gui'; // import { Point } from 'proj4'; import WindTile from '../vectorflow/renderer.js'; @@ -52,7 +50,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - const renderAnimation = true; + const renderAnimation = false; /** * Return a layer, or layergroup, created with the supplied function @@ -151,7 +149,6 @@ export default function mapLayerBuilder(config, cache, store) { break; case 'vector': layer = getLayer(createLayerVector, def, options, attributes, wrapLayer); - console.log('Calling createLayerVector'); break; case 'wms': layer = getLayer(createLayerWMS, def, options, attributes, wrapLayer); @@ -449,7 +446,6 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'OSCAR_Sea_Surface_Currents_Final_UV']; - console.log(layerName); const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -601,9 +597,8 @@ export default function mapLayerBuilder(config, cache, store) { }), }); - const arrowSizeMultiplier = 1; - const arrowColor = 'red'; - const radianDirection = 10; + let counter = 0; + // ol.layer.VectorTile const layer = new LayerVectorTile({ extent: layerExtent, @@ -612,52 +607,58 @@ export default function mapLayerBuilder(config, cache, store) { preload: 0, ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, - // style: [], - // force a style onto the LayerVectorTile. This causes the ASCAT data to render as GREEN circles (if "radius" is > 0) - // Setting the radius to 0 includes each point but hides the visual - // style: new Style({ - // image: new CircleStyle({ - // radius: renderAnimation ? 6 : 10, - // fill: new Fill({ - // color: 'green', - // }), - // }), - - - // The arrow shaft - style: [ - new Style({ - image: new RegularShape({ - points: 2, - radius: 10 * arrowSizeMultiplier, - stroke: new Stroke({ - width: 2, - color: arrowColor, + style (feature, resolution) { + counter += 1; + + // Due to processing issues, I am only rendering every 25th feature + if (counter % 25 !== 0) return []; + + // This function styles each feature individually based on the feature specific data + let arrowSizeMultiplier; + let arrowColor; + const radianDirection = feature.get('dir'); + const magnitude = feature.get('speed'); + + console.log(`radianDirection; ${radianDirection}`); + + // Adjust color & arrow length based on magnitude + if (magnitude < 0.08) { + arrowColor = 'red'; + arrowSizeMultiplier = 1; + } else if (magnitude < 0.17) { + arrowColor = 'blue'; + arrowSizeMultiplier = 1.25; + } else { + arrowColor = 'green'; + arrowSizeMultiplier = 1.5; + } + + // The arrow shaft + return [ + new Style({ + image: new RegularShape({ + points: 2, + radius: 10 * arrowSizeMultiplier, + stroke: new Stroke({ + width: 2, + color: arrowColor, + }), + angle: radianDirection, }), - angle: radianDirection, }), - }), - // The arrow head - new Style({ - image: new RegularShape({ - points: 3, - radius: 5 * arrowSizeMultiplier, - angle: radianDirection, - fill: new Fill({ - color: arrowColor, + // The arrow head + new Style({ + image: new RegularShape({ + points: 3, + radius: 5 * arrowSizeMultiplier, + angle: radianDirection, + fill: new Fill({ + color: arrowColor, + }), }), }), - }), - ], - // Set as point to draw a line - // geometry: new Point(100), - // image: new Icon({ - // src: 'data/arow.png', - // anchor: [0.75, 0.5], - // rotateWithView: true, - // // rotation: -rotation, - // }), - // }), + ]; + }, }); applyStyle(def, layer, state, layeroptions); @@ -703,8 +704,6 @@ export default function mapLayerBuilder(config, cache, store) { * @returns {object} OpenLayers WMS layer -- INCORRECT~! */ const createWindtile = function(tileSource, selected, layer) { - console.log('Generating WindTile'); - // Vars to generate the animation & support the mini-GUI to play with the animation settings let i = 0; let moving = false; diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 3a1ad8b813..47a6d0e522 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -230,7 +230,7 @@ export const applyStyle = (def, olVectorLayer, state) => { return; } - // iterate to find the matching layer data & apply the associated style + // iterate to find the matching layer data & apply the custom style activeLayers.forEach((layer) => { if (layer.id === layerName && layer.custom) { vectorStyleId = layer.custom; diff --git a/web/js/vectorflow/renderer.js b/web/js/vectorflow/renderer.js index 03787ede81..1dcac09603 100644 --- a/web/js/vectorflow/renderer.js +++ b/web/js/vectorflow/renderer.js @@ -49,7 +49,6 @@ export default class WindTile { updateData(data, extent, zoom, options) { const windData = this.organizeData(data, extent, zoom, options); this.windData = this.organizeData(data, extent, zoom, options); - console.log(windData); this.wind.setWind(windData); this.stopped = false; // this.glCanvas.style = 'display:block'; diff --git a/web/js/vectorflow/wind/windindex.js b/web/js/vectorflow/wind/windindex.js index affa007847..8e46871500 100644 --- a/web/js/vectorflow/wind/windindex.js +++ b/web/js/vectorflow/wind/windindex.js @@ -83,8 +83,6 @@ export default class WindGL { this.windData = windData; const height = windData.textureHeight; const width = windData.textureWidth; - console.log(`height: ${height}`); - console.log(`width: ${width}`); // console.log(windData.image); this.windTexture = util.createTexture(this.gl, this.gl.LINEAR, windData.image, width, height); } From 063c33c3b2edd4a594af994d6378fbcfe5b6a8f2 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 28 Nov 2022 14:43:00 -0500 Subject: [PATCH 65/85] minor tweaks --- web/js/map/layerbuilder.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 37559a270c..6fac3674bc 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -609,9 +609,9 @@ export default function mapLayerBuilder(config, cache, store) { ...isMinBreakPoint && { minResolution: breakPointResolution }, style (feature, resolution) { counter += 1; - + console.log(`counter: ${counter}`); // Due to processing issues, I am only rendering every 25th feature - if (counter % 25 !== 0) return []; + if (counter % 15 !== 0) return []; // This function styles each feature individually based on the feature specific data let arrowSizeMultiplier; @@ -619,8 +619,6 @@ export default function mapLayerBuilder(config, cache, store) { const radianDirection = feature.get('dir'); const magnitude = feature.get('speed'); - console.log(`radianDirection; ${radianDirection}`); - // Adjust color & arrow length based on magnitude if (magnitude < 0.08) { arrowColor = 'red'; From 7951e4c818578e5f9d9f5f583824dfdb07e03d0a Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 29 Nov 2022 09:33:19 -0500 Subject: [PATCH 66/85] Logging --- web/js/map/layerbuilder.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 6fac3674bc..24d4b70066 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -470,6 +470,7 @@ export default function mapLayerBuilder(config, cache, store) { * @returns {object} OpenLayers Vector layer */ const createLayerVector = function(def, layeroptions, day, state, attributes) { + console.log('createLayerVector'); const { proj, animation, map: { ui: { selected } } } = state; let date; let gridExtent; @@ -609,7 +610,10 @@ export default function mapLayerBuilder(config, cache, store) { ...isMinBreakPoint && { minResolution: breakPointResolution }, style (feature, resolution) { counter += 1; - console.log(`counter: ${counter}`); + + console.log(feature); + + // Due to processing issues, I am only rendering every 25th feature if (counter % 15 !== 0) return []; From 0066155c9fb61e0d59940d76d5c44caafab10769 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 29 Nov 2022 15:00:47 -0500 Subject: [PATCH 67/85] Update OSCAR Sea Surface configurations. --- .../oscar/OSCAR_Sea_Surface_Currents_Final.md | 1 + .../OSCAR_Sea_Surface_Currents_Final_SD.md | 1 - .../OSCAR_Sea_Surface_Currents_Final_UV.md | 1 - .../common/config/wv.json/layerOrder.json | 3 +- .../OSCAR_Sea_Surface_Currents_Final.json | 23 +++++++++++++ .../OSCAR_Sea_Surface_Currents_Final_SD.json | 23 ------------- .../OSCAR_Sea_Surface_Currents_Final_UV.json | 23 ------------- ... => OSCAR_Sea_Surface_Currents_Final.json} | 12 +++---- .../OSCAR_Sea_Surface_Currents_Final_UV.json | 34 ------------------- schemas/layer-config.json | 3 +- web/js/map/layerbuilder.js | 6 ++-- web/js/modules/vector-styles/selectors.js | 2 ++ 12 files changed, 37 insertions(+), 95 deletions(-) create mode 100644 config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md delete mode 100644 config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md delete mode 100644 config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md create mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json delete mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json delete mode 100644 config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json rename config/default/common/vectorstyles/{OSCAR_Sea_Surface_Currents_Final_SD.json => OSCAR_Sea_Surface_Currents_Final.json} (57%) delete mode 100644 config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json diff --git a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md new file mode 100644 index 0000000000..e16343d996 --- /dev/null +++ b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md @@ -0,0 +1 @@ +OSCAR_Sea_Surface_Currents_Final description \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md deleted file mode 100644 index be4c1db82c..0000000000 --- a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.md +++ /dev/null @@ -1 +0,0 @@ -OSCAR_Sea_Surface_Currents_Final_SD description \ No newline at end of file diff --git a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md deleted file mode 100644 index 886ef2b27b..0000000000 --- a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.md +++ /dev/null @@ -1 +0,0 @@ -OSCAR_Sea_Surface_Currents_Final_UV description \ No newline at end of file diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 8359af4201..bcac1b2912 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -635,8 +635,7 @@ "MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI", "OSCAR_Sea_Surface_Currents_Meridional", "OSCAR_Sea_Surface_Currents_Zonal", - "OSCAR_Sea_Surface_Currents_Final_SD", - "OSCAR_Sea_Surface_Currents_Final_UV", + "OSCAR_Sea_Surface_Currents_Final", "JPL_MEaSUREs_L4_Sea_Surface_Height_Anomalies", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_GDR_Cycles", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_US_West_Coast_GAFECC", diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json new file mode 100644 index 0000000000..6e6eadde16 --- /dev/null +++ b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json @@ -0,0 +1,23 @@ +{ + "layers": { + "OSCAR_Sea_Surface_Currents_Final": { + "id": "OSCAR_Sea_Surface_Currents_Final", + "title": "OSCAR_Sea_Surface_Currents_Final", + "subtitle": "OSCAR_Sea_Surface_Currents_Final subtitle", + "description": "OSCAR_Sea_Surface_Currents_Final description", + "tags": "", + "group": "overlays", + "type": "vector", + "layergroup": "Vectors", + "vectorStyle": { + "id": "OSCAR_Sea_Surface_Currents_Final" + }, + "transition": true, + "projections": { + "geographic": { + "source": "GITC:geographic" + } + } + } + } +} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json deleted file mode 100644 index c049aeca5f..0000000000 --- a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_SD.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "layers": { - "OSCAR_Sea_Surface_Currents_Final_SD": { - "id": "OSCAR_Sea_Surface_Currents_Final_SD", - "title": "OSCAR_Sea_Surface_Currents_Final_SD", - "subtitle": "OSCAR_Sea_Surface_Currents_Final_SD subtitle", - "description": "OSCAR_Sea_Surface_Currents_Final_SD description", - "tags": "", - "group": "overlays", - "type": "vector", - "layergroup": "Vectors", - "vectorStyle": { - "id": "OSCAR_Sea_Surface_Currents_Final_SD" - }, - "transition": true, - "projections": { - "geographic": { - "source": "GITC:geographic" - } - } - } - } -} \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json deleted file mode 100644 index e91932ab8f..0000000000 --- a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final_UV.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "layers": { - "OSCAR_Sea_Surface_Currents_Final_UV": { - "id": "OSCAR_Sea_Surface_Currents_Final_UV", - "title": "OSCAR_Sea_Surface_Currents_Final_UV", - "subtitle": "OSCAR_Sea_Surface_Currents_Final_UV subtitle", - "description": "OSCAR_Sea_Surface_Currents_Final_UV description", - "tags": "", - "group": "overlays", - "type": "vector", - "layergroup": "Vectors", - "vectorStyle": { - "id": "OSCAR_Sea_Surface_Currents_Final_UV" - }, - "transition": true, - "projections": { - "geographic": { - "source": "GITC:geographic" - } - } - } - } -} \ No newline at end of file diff --git a/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_SD.json b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final.json similarity index 57% rename from config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_SD.json rename to config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final.json index 24b8156d33..9444727f78 100644 --- a/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_SD.json +++ b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final.json @@ -1,19 +1,19 @@ { "version": 8, - "name": "OSCAR_Sea_Surface_Currents_Final_SD", + "name": "OSCAR_Sea_Surface_Currents_Final", "sources": { - "OSCAR_Sea_Surface_Currents_Final_SD": { + "OSCAR_Sea_Surface_Currents_Final": { "type": "vector", "tiles": [ - "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/OSCAR_Sea_Surface_Currents_Final_SD/default/2020-01-01/2km/0/0/0.mvt" + "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/OSCAR_Sea_Surface_Currents_Final/default/2020-01-01/2km/0/0/0.mvt" ] } }, "layers": [ { - "id": "OSCAR_Sea_Surface_Currents_Final_SD", - "source": "OSCAR_Sea_Surface_Currents_Final_SD", - "source-layer": "OSCAR_Sea_Surface_Currents_Final_SD", + "id": "OSCAR_Sea_Surface_Currents_Final", + "source": "OSCAR_Sea_Surface_Currents_Final", + "source-layer": "OSCAR_Sea_Surface_Currents_Final", "type": "circle", "paint": { "circle-radius": [ diff --git a/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json b/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json deleted file mode 100644 index e8205ffbe7..0000000000 --- a/config/default/common/vectorstyles/OSCAR_Sea_Surface_Currents_Final_UV.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 8, - "name": "OSCAR_Sea_Surface_Currents_Final_UV", - "sources": { - "OSCAR_Sea_Surface_Currents_Final_UV": { - "type": "vector", - "tiles": [ - "https://sit.gitc.earthdata.nasa.gov/wmts/epsg4326/best/OSCAR_Sea_Surface_Currents_Final_UV/default/2020-01-01/2km/0/0/0.mvt" - ] - } - }, - "layers": [ - { - "id": "OSCAR_Sea_Surface_Currents_Final_UV", - "source": "OSCAR_Sea_Surface_Currents_Final_UV", - "source-layer": "OSCAR_Sea_Surface_Currents_Final_UV", - "type": "circle", - "paint": { - "circle-radius": [ - "step", - [ - "zoom" - ], - 1, - 1, - 2, - 3, - 3 - ], - "circle-color": "rgb(160, 229, 26)" - } - } - ] -} \ No newline at end of file diff --git a/schemas/layer-config.json b/schemas/layer-config.json index 787d8416aa..e834dbf9b0 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -176,8 +176,7 @@ "Urban Extents", "Vectors", "ASCAT_Ocean_Surface_Wind_Speed", - "OSCAR_Sea_Surface_Currents_Final_SD", - "OSCAR_Sea_Surface_Currents_Final_UV", + "OSCAR_Sea_Surface_Currents_Final", "MISR_Cloud_Motion_Vector", "Vegetation Indices", "Vegetation Light Use Efficiency", diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 24d4b70066..e0ff0c9702 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -50,7 +50,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - const renderAnimation = false; + const renderAnimation = true; /** * Return a layer, or layergroup, created with the supplied function @@ -445,7 +445,7 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'OSCAR_Sea_Surface_Currents_Final_UV']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -668,7 +668,7 @@ export default function mapLayerBuilder(config, cache, store) { layer.wv = attributes; layer.isVector = true; - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final_SD', 'OSCAR_Sea_Surface_Currents_Final_UV']; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { animateVectors(layerName, tileSource, selected, layer); diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 47a6d0e522..c33e793db6 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -108,6 +108,8 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const glStyle = vectorStyles[styleId]; // ASCAT_Ocean_Surface_Wind_Speed does not include a glStyle, so we early return here in that instance + console.log('glStyle'); + console.log(glStyle); if (glStyle === undefined) { return; } From 1969400fc3ac84d835e6aafbf9921f82963401e0 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 13 Dec 2022 10:39:06 -0500 Subject: [PATCH 68/85] Saving tests --- web/js/map/layerbuilder.js | 24 ++++++++++++++++++----- web/js/modules/vector-styles/selectors.js | 2 -- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index e0ff0c9702..3da99e1348 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -51,6 +51,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); const renderAnimation = true; + const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; /** * Return a layer, or layergroup, created with the supplied function @@ -445,7 +446,6 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { @@ -470,7 +470,7 @@ export default function mapLayerBuilder(config, cache, store) { * @returns {object} OpenLayers Vector layer */ const createLayerVector = function(def, layeroptions, day, state, attributes) { - console.log('createLayerVector'); + console.log('createLayerVector function called'); const { proj, animation, map: { ui: { selected } } } = state; let date; let gridExtent; @@ -547,6 +547,9 @@ export default function mapLayerBuilder(config, cache, store) { if (!matrixSet) { throw new Error(`${def.id}: Undefined matrix set: ${def.matrixSet}`); } + + console.log(def); + // ASCAT does not have def.matrixIds data if (typeof def.matrixIds === 'undefined') { matrixIds = []; lodashEach(matrixSet.resolutions, (resolution, index) => { @@ -581,6 +584,7 @@ export default function mapLayerBuilder(config, cache, store) { const isMaxBreakPoint = breakPointType === 'max'; const isMinBreakPoint = breakPointType === 'min'; + console.log(tileMatrixSet); const tileSource = new SourceVectorTile({ url: source.url + urlParameters, layer: layerName, @@ -600,7 +604,10 @@ export default function mapLayerBuilder(config, cache, store) { let counter = 0; + // ASCAT errors out but not sure why yet. OSCAR & MISR work properly // ol.layer.VectorTile + console.log('Creating LayerVectorTile'); + const layer = new LayerVectorTile({ extent: layerExtent, source: tileSource, @@ -611,6 +618,7 @@ export default function mapLayerBuilder(config, cache, store) { style (feature, resolution) { counter += 1; + console.log('style feature:'); console.log(feature); @@ -620,8 +628,14 @@ export default function mapLayerBuilder(config, cache, store) { // This function styles each feature individually based on the feature specific data let arrowSizeMultiplier; let arrowColor; - const radianDirection = feature.get('dir'); - const magnitude = feature.get('speed'); + let radianDirection = feature.get('direction'); // was "dir" + const magnitude = feature.get('magnitude'); // was "speed" + + // If OSCAR/ASCAT we need to adjust the radian angle + // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize + if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { + radianDirection -= 180; + } // Adjust color & arrow length based on magnitude if (magnitude < 0.08) { @@ -663,12 +677,12 @@ export default function mapLayerBuilder(config, cache, store) { }, }); + console.log('Applying style'); applyStyle(def, layer, state, layeroptions); layer.wrap = day; layer.wv = attributes; layer.isVector = true; - const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; const animationAllowed = vectorLayers.indexOf(layerName) > -1; if (animationAllowed && renderAnimation) { animateVectors(layerName, tileSource, selected, layer); diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index c33e793db6..47a6d0e522 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -108,8 +108,6 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const glStyle = vectorStyles[styleId]; // ASCAT_Ocean_Surface_Wind_Speed does not include a glStyle, so we early return here in that instance - console.log('glStyle'); - console.log(glStyle); if (glStyle === undefined) { return; } From 1bb9632067054f4de7eaf72b5edbc2a2978cb716 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 19 Dec 2022 11:20:14 -0500 Subject: [PATCH 69/85] Condition added to ignore ASCAT GC style in favor of the local custom vector style. --- web/js/map/layerbuilder.js | 17 +++++------------ web/js/modules/vector-styles/selectors.js | 10 +++++++++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 3da99e1348..67d0a5298b 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -50,7 +50,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - const renderAnimation = true; + const renderAnimation = false; const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; /** @@ -470,7 +470,6 @@ export default function mapLayerBuilder(config, cache, store) { * @returns {object} OpenLayers Vector layer */ const createLayerVector = function(def, layeroptions, day, state, attributes) { - console.log('createLayerVector function called'); const { proj, animation, map: { ui: { selected } } } = state; let date; let gridExtent; @@ -548,7 +547,6 @@ export default function mapLayerBuilder(config, cache, store) { throw new Error(`${def.id}: Undefined matrix set: ${def.matrixSet}`); } - console.log(def); // ASCAT does not have def.matrixIds data if (typeof def.matrixIds === 'undefined') { matrixIds = []; @@ -584,7 +582,6 @@ export default function mapLayerBuilder(config, cache, store) { const isMaxBreakPoint = breakPointType === 'max'; const isMinBreakPoint = breakPointType === 'min'; - console.log(tileMatrixSet); const tileSource = new SourceVectorTile({ url: source.url + urlParameters, layer: layerName, @@ -604,10 +601,7 @@ export default function mapLayerBuilder(config, cache, store) { let counter = 0; - // ASCAT errors out but not sure why yet. OSCAR & MISR work properly - // ol.layer.VectorTile console.log('Creating LayerVectorTile'); - const layer = new LayerVectorTile({ extent: layerExtent, source: tileSource, @@ -618,9 +612,8 @@ export default function mapLayerBuilder(config, cache, store) { style (feature, resolution) { counter += 1; - console.log('style feature:'); - console.log(feature); - + // console.log('style feature:'); + // console.log(feature); // Due to processing issues, I am only rendering every 25th feature if (counter % 15 !== 0) return []; @@ -628,8 +621,8 @@ export default function mapLayerBuilder(config, cache, store) { // This function styles each feature individually based on the feature specific data let arrowSizeMultiplier; let arrowColor; - let radianDirection = feature.get('direction'); // was "dir" - const magnitude = feature.get('magnitude'); // was "speed" + let radianDirection = feature.get('direction'); + const magnitude = feature.get('magnitude'); // If OSCAR/ASCAT we need to adjust the radian angle // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 47a6d0e522..f69b51b825 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -107,11 +107,19 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; const glStyle = vectorStyles[styleId]; - // ASCAT_Ocean_Surface_Wind_Speed does not include a glStyle, so we early return here in that instance + // OSCAR_Cloud & ASCAT_Ocean_Surface_Wind_Speed do not include a glStyle from /getCapabilities yet, + // so we early return here so we can apply our own styling. Ultimately these styles will be served from + // the provider(s) and this check will go away. if (glStyle === undefined) { return; } + // This is temporary until the ASCAT JSON files from /getCapabilities are updated with + // the appropriate vector style name. + if (glStyle.name === 'OSCAR_Sea_Surface_Currents') { + return; + } + if (!layer || layer.isWMS) { return; // WMS breakpoint tile } From 936cc60070e82670d5975e2541fb077256372869 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 4 Apr 2023 08:33:49 -0400 Subject: [PATCH 70/85] added dat.gui to package.json --- package-lock.json | 29002 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 29003 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..32dd05d677 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,29002 @@ +{ + "name": "worldview", + "version": "4.2.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "worldview", + "version": "4.2.0", + "hasInstallScript": true, + "license": "NASA-1.3", + "dependencies": { + "@elastic/react-search-ui": "^1.5.1", + "@elastic/react-search-ui-views": "^1.5.1", + "@fortawesome/fontawesome-svg-core": "^1.2.27", + "@fortawesome/free-brands-svg-icons": "^5.12.1", + "@fortawesome/free-regular-svg-icons": "^5.12.1", + "@fortawesome/free-solid-svg-icons": "^5.13.0", + "@fortawesome/react-fontawesome": "^0.1.9", + "@khanisak/temperature-converter": "^1.2.0", + "@redux-devtools/extension": "^3.2.2", + "bluebird": "3.7.2", + "bootstrap": "4.4.1", + "cachai": "^1.0.2", + "compression": "^1.7.4", + "coordinate-parser": "^1.0.4", + "copy-to-clipboard": "^3.3.1", + "dat.gui": "^0.7.9", + "element-resize-detector": "^1.2.4", + "elm-pep": "^1.0.6", + "file-saver": "^2.0.2", + "geographiclib": "^1.50.0", + "glslify-loader": "^2.0.0", + "history": "^4.7.2", + "imagesloaded": "^5.0.0", + "immutability-helper": "^3.0.1", + "jsdom-worker": "^0.3.0", + "lodash": "^4.17.21", + "masonry-layout": "^4.2.2", + "moment": "^2.29.4", + "moment-locales-webpack-plugin": "^1.2.0", + "node-dir": "^0.1.17", + "ol": "7.2.2", + "ol-mapbox-style": "9.4.0", + "p-queue": "^7.3.0", + "proj4": "2.6.1", + "prop-types": "^15.7.2", + "raw-loader": "^4.0.2", + "rc-slider": "9.2.2", + "react": "^16.14.0", + "react-autocomplete": "^1.8.1", + "react-beautiful-dnd": "^13.1.1", + "react-contextmenu": "^2.14.0", + "react-device-detect": "^2.2.2", + "react-dom": "^16.12.0", + "react-draggable": "^4.1.0", + "react-image-crop": "^9.1.1", + "react-infinite-scroller": "^1.2.4", + "react-joyride": "^2.3.0", + "react-mobile-datepicker": "^4.0.1", + "react-portal": "^4.2.1", + "react-redux": "^8.0.5", + "react-resizable": "^1.9.0", + "react-swipe-to-delete-component": "1.0.5", + "react-visibility-sensor": "^5.1.1", + "reactstrap": "8.1.x", + "redux": "^4.0.4", + "redux-location-state": "^2.6.0", + "redux-logger": "^3.0.6", + "redux-thunk": "^2.4.2", + "regenerator-runtime": "^0.13.3", + "reselect": "^4.0.0", + "rgbcolor": "^1.0.1", + "simplebar": "^6.2.1", + "simplebar-react": "^2.1.0", + "stackblur": "^1.0.0", + "supercluster": "7.0.0", + "url-template": "^3.1.0", + "what-input": "^5.2.7" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/eslint-parser": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@playwright/test": "^1.30.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", + "@webpack-cli/serve": "^2.0.1", + "ajv": "^8.11.2", + "autoprefixer": "^10.4.13", + "axios": "^1.2.2", + "babel-loader": "^9.1.2", + "cheerio": "^1.0.0-rc.12", + "clean-webpack-plugin": "^4.0.0", + "cross-env": "^7.0.2", + "css-loader": "^6.7.3", + "css-minimizer-webpack-plugin": "^4.2.2", + "css-url-relative-plugin": "^1.1.0", + "cssnano": "^5.1.15", + "eslint": "^8.31.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-standard": "^17.0.0", + "eslint-import-resolver-webpack": "^0.13.2", + "eslint-plugin-import": "^2.27.4", + "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-no-storage": "^1.0.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.32.0", + "eslint-plugin-standard": "^5.0.0", + "express": "^4.18.2", + "fetch-mock": "^9.1.1", + "glob": "^9.2.1", + "husky": "^8.0.3", + "jest": "^29.3.1", + "jest-canvas-mock": "^2.2.0", + "jest-environment-jsdom": "^29.3.1", + "mini-css-extract-plugin": "^2.7.2", + "node-dir": "^0.1.17", + "node-fetch": "^3.3.0", + "node-ssh": "^13.0.0", + "npm-run-all": "^4.1.5", + "patch-package": "^6.5.1", + "postcss": "^8.4.21", + "postcss-loader": "^7.0.2", + "react-refresh": "^0.14.0", + "react-test-renderer": "^16.14.0", + "redux-mock-store": "^1.5.3", + "run-script-os": "^1.1.5", + "sass": "^1.57.1", + "sass-loader": "^13.2.0", + "shelljs": "^0.8.5", + "showdown": "^2.1.0", + "stylelint": "^14.16.1", + "stylelint-config-standard-scss": "^6.1.0", + "stylelint-high-performance-animation": "^1.7.0", + "tar": "^6.1.13", + "terser-webpack-plugin": "^5.3.6", + "webpack": "^5.75.0", + "webpack-bundle-analyzer": "^4.7.0", + "webpack-cli": "^5.0.1", + "webpack-dev-middleware": "^6.0.1", + "webpack-dev-server": "^4.11.1", + "xml-js": "^1.6.11", + "xml2js": "^0.4.23", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.21.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.3", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.20.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@choojs/findup/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.1.1", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4", + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@elastic/react-search-ui": { + "version": "1.19.1", + "license": "Apache-2.0", + "dependencies": { + "@elastic/react-search-ui-views": "1.19.1", + "@elastic/search-ui": "1.19.1" + }, + "peerDependencies": { + "react": ">= 16.8.0 <= 18", + "react-dom": ">= 16.8.0 <= 18" + } + }, + "node_modules/@elastic/react-search-ui-views": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@elastic/react-search-ui-views/-/react-search-ui-views-1.19.1.tgz", + "integrity": "sha512-1IOVoG5GYKvrKoYZL247bd7eKVQAR4iJaYBkA4KOa8CEXdc3+N0Z63uAit+4+pAH6Z6IONNwk2iQPMDf2zjQGA==", + "dependencies": { + "@elastic/search-ui": "1.19.1", + "downshift": "^3.2.10", + "rc-pagination": "^1.20.1", + "react-select": "^5.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 <= 18", + "react-dom": ">= 16.8.0 <= 18" + } + }, + "node_modules/@elastic/search-ui": { + "version": "1.19.1", + "license": "Apache-2.0", + "dependencies": { + "date-fns": "^1.30.1", + "deep-equal": "^1.0.1", + "history": "^4.9.0", + "qs": "^6.7.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.5.tgz", + "integrity": "sha512-qrcbyfnRVziRlB6IYwjCopYhO7Vud750JlJyuljruIXcPxr22y8zdckcJGsuOdnQ639uVD1tTXddrcH3t3QYIQ==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "dependencies": { + "@floating-ui/core": "^1.2.4" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.x" + } + }, + "node_modules/@gilbarbara/deep-equal": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.8.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "node_modules/@khanisak/temperature-converter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@khanisak/temperature-converter/-/temperature-converter-1.2.0.tgz", + "integrity": "sha512-pT9on/IIU4Qab3C5RAJkPR239qYL2ZBUCiEK6s27yV5pXntxceckwDFDPYTUmsC5s+ZnZYDsoV9oWrIyvJbEzw==", + "dependencies": { + "@types/node": "^12.7.2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-style-spec": { + "version": "13.28.0", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.6", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + }, + "bin": { + "gl-style-composite": "bin/gl-style-composite.js", + "gl-style-format": "bin/gl-style-format.js", + "gl-style-migrate": "bin/gl-style-migrate.js", + "gl-style-validate": "bin/gl-style-validate.js" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "license": "ISC" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "license": "BSD-2-Clause" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@petamoriken/float16": { + "version": "3.7.1", + "license": "MIT" + }, + "node_modules/@playwright/test": { + "version": "1.32.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "playwright-core": "1.32.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <4.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "dev": true, + "license": "MIT" + }, + "node_modules/@redux-devtools/extension": { + "version": "3.2.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "immutable": "^4.2.2" + }, + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.31", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/jsdom/node_modules/entities": { + "version": "4.4.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@types/jsdom/node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "12.20.50", + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.0.28", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.22", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.51.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.51.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.51.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.51.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.51.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/add-dom-event-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", + "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", + "dependencies": { + "object-assign": "4.x" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/aria-query/node_modules/deep-equal": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aria-query/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/array-find": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.6.3", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/axobject-query/node_modules/deep-equal": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axobject-query/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/batch-processor": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.0.14", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/bonjour-service/node_modules/array-flatten": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/bootstrap": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/buildcheck": { + "version": "0.0.3", + "dev": true, + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cachai": { + "version": "1.0.2", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/can-use-dom": { + "version": "0.1.0", + "license": "MIT" + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001465", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.4.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "4.4.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.3.2", + "license": "MIT" + }, + "node_modules/clean-webpack-plugin": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, + "node_modules/clean-webpack-plugin/node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-webpack-plugin/node_modules/del": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-webpack-plugin/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/clean-webpack-plugin/node_modules/globby": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-webpack-plugin/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-webpack-plugin/node_modules/p-map": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-webpack-plugin/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clean-webpack-plugin/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/coordinate-parser": { + "version": "1.0.7", + "license": "Apache-2.0" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.22.3", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.27.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpu-features": { + "version": "0.0.4", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "0.0.3", + "nan": "^2.15.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-url-relative-plugin": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "parse-import": "^2.0.0", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/css-url-relative-plugin/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/css-url-relative-plugin/node_modules/loader-utils": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-url-relative-plugin/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-url-relative-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfontparser": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cssnano": { + "version": "5.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.1", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "1.30.1", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "0.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/desandro-matches-selector": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/downshift": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-3.4.8.tgz", + "integrity": "sha512-dZL3iNL/LbpHNzUQAaVq/eTD1ocnGKKjbAl/848Q0KEp6t81LJbS37w3f93oD6gqqAnjdgM7Use36qZSipHXBw==", + "dependencies": { + "@babel/runtime": "^7.4.5", + "compute-scroll-into-view": "^1.0.9", + "prop-types": "^15.7.2", + "react-is": "^16.9.0" + }, + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/earcut": { + "version": "2.2.4", + "license": "ISC" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.328", + "license": "ISC" + }, + "node_modules/element-resize-detector": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "batch-processor": "1.0.0" + } + }, + "node_modules/elm-pep": { + "version": "1.0.6", + "license": "MPL-2.0" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "0.9.1", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.1", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "license": "MIT" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack": { + "version": "0.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find": "^1.0.0", + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "has": "^1.0.3", + "interpret": "^1.4.0", + "is-core-module": "^2.7.0", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^1.20.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0", + "webpack": ">=1.11.0" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-webpack/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-n/node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-n/node_modules/eslint-utils": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-no-storage": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "5.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ev-emitter": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exenv": { + "version": "1.2.2", + "license": "BSD-3-Clause" + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fetch-mock": { + "version": "9.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependencies": { + "node-fetch": "*" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, + "node_modules/fetch-mock/node_modules/path-to-regexp": { + "version": "2.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/fizzy-ui-utils": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "desandro-matches-selector": "^2.0.0" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/geographiclib": { + "version": "1.52.2", + "license": "MIT" + }, + "node_modules/geotiff": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.1", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "engines": { + "node": ">=10.19" + } + }, + "node_modules/geotiff/node_modules/pako": { + "version": "2.1.0", + "license": "(MIT AND Zlib)" + }, + "node_modules/geotiff/node_modules/quick-lru": { + "version": "6.1.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-imports": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1", + "import-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-size": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "9.3.2", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "7.4.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minipass": { + "version": "4.2.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "dependencies": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "node_modules/glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "dependencies": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + } + }, + "node_modules/glsl-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + }, + "node_modules/glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" + }, + "node_modules/glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "dependencies": { + "glsl-tokenizer": "^2.0.0" + } + }, + "node_modules/glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" + }, + "node_modules/glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "dependencies": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "node_modules/glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" + }, + "node_modules/glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" + }, + "node_modules/glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" + }, + "node_modules/glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "node_modules/glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "dependencies": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "node_modules/glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "dependencies": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "node_modules/glslify-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glslify-loader/-/glslify-loader-2.0.0.tgz", + "integrity": "sha512-oOdmTX1BSPG75o3gNZToemfbbuN5dgi4Pco/aRfjbwGxPIfflYLuok6JCf2kDBPHjP+tV+imNsj6YRJg9gKJ1A==", + "dependencies": { + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.3.0", + "loader-utils": "^1.1.0", + "resolve": "^1.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glslify-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/glslify-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "4.4.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imagesloaded": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "ev-emitter": "^2.1.2" + } + }, + "node_modules/imagesloaded/node_modules/ev-emitter": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/immutability-helper": { + "version": "3.1.1", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "4.2.4", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-regex": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lite": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-canvas-mock": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.8.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/acorn-globals": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/entities": { + "version": "4.4.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "20.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ws": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jquery": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", + "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==", + "peer": true + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom-worker": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "mitt": "^3.0.0", + "uuid-v4": "^0.1.0" + }, + "peerDependencies": { + "node-fetch": "*" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kdbush": { + "version": "3.0.0", + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "dev": true, + "license": "ODC-By-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/lerc": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mapbox-to-css-font": { + "version": "2.4.2", + "license": "BSD-2-Clause" + }, + "node_modules/masonry-layout": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "get-size": "^2.0.2", + "outlayer": "^2.1.0" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "license": "MIT" + }, + "node_modules/memory-fs": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mgrs": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.5", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "license": "MIT" + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mitt": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.29.4", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-locales-webpack-plugin": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "lodash.difference": "^4.5.0" + }, + "peerDependencies": { + "moment": "^2.8.0", + "webpack": "^1 || ^2 || ^3 || ^4 || ^5" + } + }, + "node_modules/moo-color": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4" + } + }, + "node_modules/moo-color/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, + "node_modules/nan": { + "version": "2.16.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.10", + "license": "MIT" + }, + "node_modules/node-ssh": { + "version": "13.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "make-dir": "^3.1.0", + "sb-promise-queue": "^2.1.0", + "sb-scandir": "^3.1.0", + "shell-escape": "^0.2.0", + "ssh2": "^1.5.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ol": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/ol/-/ol-7.2.2.tgz", + "integrity": "sha512-eqJ1hhVQQ3Ap4OhYq9DRu5pz9RMpLhmoTauDoIqpn7logVi1AJE+lXjEHrPrTSuZYjtFbMgqr07sxoLNR65nrw==", + "dependencies": { + "earcut": "^2.2.3", + "geotiff": "^2.0.7", + "ol-mapbox-style": "^9.2.0", + "pbf": "3.2.1", + "rbush": "^3.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/openlayers" + } + }, + "node_modules/ol-mapbox-style": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-9.4.0.tgz", + "integrity": "sha512-I9dK1K41P8DjozFeQ4x1pfou86q/WedRzjCMpNhtHW9APJ/l3UT6aGsp2HcbG7cLfx3EpzK4Q7HxKwcQYR5Chw==", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.23.1", + "mapbox-to-css-font": "^2.4.1" + } + }, + "node_modules/ol/node_modules/ol-mapbox-style": { + "version": "9.7.0", + "license": "BSD-2-Clause", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.23.1", + "mapbox-to-css-font": "^2.4.1" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/outlayer": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ev-emitter": "^1.0.0", + "fizzy-ui-utils": "^2.0.0", + "get-size": "^2.0.2" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "7.3.4", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.7", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-timeout": { + "version": "5.0.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/parse-import": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-imports": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { + "version": "4.4.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/patch-package": { + "version": "6.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=10", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/patch-package/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/patch-package/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/patch-package/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/patch-package/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/patch-package/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/patch-package/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/patch-package/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/patch-package/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.6.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "7.18.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "4.2.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbf": { + "version": "3.2.1", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright-core": { + "version": "1.32.0", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.0.0", + "klona": "^2.0.6", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/postcss-loader/node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", + "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.19" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proj4": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.1.tgz", + "integrity": "sha512-RP5EcrfrLcARy+Zjjz1wIeqZzZdPtQNl685asHcwdU/MQ/dvydmf1XWM4mgok6wPaNsXZ8IFrM4qadO3g46PiQ==", + "dependencies": { + "mgrs": "1.0.0", + "wkt-parser": "^1.2.4" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/rbush": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "quickselect": "^2.0.0" + } + }, + "node_modules/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-align/node_modules/rc-util": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.3.tgz", + "integrity": "sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-1.1.2.tgz", + "integrity": "sha512-YC/E7SSWKBFakYg4PENhSRWD4ZLDqkI7FKmutJcrMewZ91/ZIWfoZSDvPaBdKO0hsFrrzWepFhXQIq0FNnCMWA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "raf": "^3.4.1", + "rc-util": "^5.0.6" + }, + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + } + }, + "node_modules/rc-motion/node_modules/rc-util": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.3.tgz", + "integrity": "sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-1.21.1.tgz", + "integrity": "sha512-Z+iYLbrJOBKHdgoAjLhL9jOgb7nrbPzNmV31p0ikph010/Ov1+UkrauYzWhumUyR+GbRFi3mummdKW/WtlOewA==", + "dependencies": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "prop-types": "^15.5.7", + "react-lifecycles-compat": "^3.0.4" + } + }, + "node_modules/rc-slider": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.2.tgz", + "integrity": "sha512-WwdNHb/cvnQXMhp8cRhxOM0pGnVG4fPoaFE31yVkyJUAZiHq3siQgwzAeYl11fyszwhrEXkpGU7tEAfClh0AaQ==", + "dependencies": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.4", + "rc-tooltip": "^4.0.0", + "rc-util": "^4.0.4", + "shallowequal": "^1.1.0", + "warning": "^4.0.3" + } + }, + "node_modules/rc-tooltip": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.2.3.tgz", + "integrity": "sha512-7ySkaPGeqLLM4a/QYrKQ280aDthPxyvjJqQMstWX/AWX7/b1p23HIdHXdjBkziuvcnvXkW4lgZdFTVsylDiX1w==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "rc-trigger": "^4.2.1" + } + }, + "node_modules/rc-trigger": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.4.3.tgz", + "integrity": "sha512-yq/WyuiPwxd2q6jy+VPyy0GUCRFJ2eFqAaCwPE27AOftXeIupOcJ/2t1wakSq63cfk7qtzev5DKHUAjb8LOJCw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "raf": "^3.4.1", + "rc-align": "^4.0.0", + "rc-motion": "^1.0.0", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/rc-trigger/node_modules/rc-util": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.3.tgz", + "integrity": "sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "dependencies": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" + } + }, + "node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-autocomplete": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/react-autocomplete/-/react-autocomplete-1.8.1.tgz", + "integrity": "sha512-YQGVN5POdcI3G89wUVWnJhk9rLF6JeB6Ik6xnNpfvSMG4tJkksBzqOE4mkFNGqEz+2AaQw13xNmVXresg9E3zg==", + "dependencies": { + "dom-scroll-into-view": "1.0.1", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^0.14.7 || ^15.0.0-0 || ^16.0.0-0", + "react-dom": "^0.14.7 || ^15.0.0-0 || ^16.0.0-0" + } + }, + "node_modules/react-autocomplete/node_modules/dom-scroll-into-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.0.1.tgz", + "integrity": "sha512-1Dmy6uH1vRcm2+Lvggyrlc04cMh+mr+VA+qcgs085hAEZp+v+6NT/xhRjfc6vRc7965sCSDdQcw063VkG+eNmQ==" + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-beautiful-dnd/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT" + }, + "node_modules/react-beautiful-dnd/node_modules/react-redux": { + "version": "7.2.9", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-contextmenu": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.14.0.tgz", + "integrity": "sha512-ktqMOuad6sCFNJs/ltEwppN8F0YeXmqoZfwycgtZR/MxOXMYx1xgYC44SzWH259HdGyshk1/7sXGuIRwj9hzbw==", + "dependencies": { + "classnames": "^2.2.5", + "object-assign": "^4.1.0" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.1", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.1" + } + }, + "node_modules/react-device-detect": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "ua-parser-js": "^1.0.33" + }, + "peerDependencies": { + "react": ">= 0.14.0", + "react-dom": ">= 0.14.0" + } + }, + "node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-floater": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/react-floater/-/react-floater-0.7.6.tgz", + "integrity": "sha512-tt/15k/HpaShbtvWCwsQYLR+ebfUuYbl+oAUJ3DcEDkgYKeUcSkDey2PdAIERdVwzdFZANz47HbwoET2/Rduxg==", + "dependencies": { + "deepmerge": "^4.2.2", + "exenv": "^1.2.2", + "is-lite": "^0.8.2", + "popper.js": "^1.16.0", + "prop-types": "^15.8.1", + "react-proptype-conditional-require": "^1.0.4", + "tree-changes": "^0.9.1" + }, + "peerDependencies": { + "react": "15 - 18", + "react-dom": "15 - 18" + } + }, + "node_modules/react-floater/node_modules/is-lite": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz", + "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==" + }, + "node_modules/react-image-crop": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-9.1.1.tgz", + "integrity": "sha512-n7O3Cn7RuZJF8ooau2atwCGWZHqO7akl/pa6IR+1jWy5X0x4enTOCWOeswYhcBOv0ohmDHctAlf6mcUuSSwsow==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-infinite-scroller": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-joyride": { + "version": "2.5.3", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "exenv": "^1.2.2", + "is-lite": "^0.9.2", + "prop-types": "^15.8.1", + "react-floater": "^0.7.6", + "react-is": "^16.13.1", + "scroll": "^3.0.1", + "scrollparent": "^2.0.1", + "tree-changes": "^0.9.2" + }, + "peerDependencies": { + "react": "15 - 18", + "react-dom": "15 - 18" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-mobile-datepicker": { + "version": "4.0.2", + "license": "ISC", + "peerDependencies": { + "react": ">=0.14", + "react-dom": ">=0.14" + } + }, + "node_modules/react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "peerDependencies": { + "react": "0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-portal": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/react-proptype-conditional-require": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", + "integrity": "sha512-nopsRn7KnGgazBe2c3H2+Kf+Csp6PGDRLiBkYEDMKY8o/EIgft/WnIm/OnAKTawZiLnJXHAqhpFBddvs6NiXlw==" + }, + "node_modules/react-redux": { + "version": "8.0.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-resizable": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-1.11.1.tgz", + "integrity": "sha512-S70gbLaAYqjuAd49utRHibtHLrHXInh7GuOR+6OO6RO6uleQfuBnWmZjRABfqNEx3C3Z6VPLg0/0uOYFrkfu9Q==", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.0.3" + }, + "peerDependencies": { + "react": "0.14.x || 15.x || 16.x || 17.x", + "react-dom": "0.14.x || 15.x || 16.x || 17.x" + } + }, + "node_modules/react-select": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.2.tgz", + "integrity": "sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-select/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/react-swipe-to-delete-component": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "prop-types": "^15.8.1", + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "engines": { + "node": "^10.0.0" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^16.1.1", + "react-dom": "^16.1.1" + } + }, + "node_modules/react-swipe-to-delete-component/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-swipe-to-delete-component/node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-swipe-to-delete-component/node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/react-test-renderer": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", + "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-visibility-sensor": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/reactstrap": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-8.1.1.tgz", + "integrity": "sha512-m4IIdTHBT5wtcPts4w4rYngKuqIUC1BpncVxCTeIj4BQDxwjdab0gGyKJKfgXgArn6iI6syiDyez/h2tLWFjsw==", + "dependencies": { + "@babel/runtime": "^7.2.0", + "classnames": "^2.2.3", + "prop-types": "^15.5.8", + "react-lifecycles-compat": "^3.0.4", + "react-popper": "^1.3.3", + "react-transition-group": "^2.3.1" + }, + "peerDependencies": { + "react": "^16.3.0", + "react-dom": "^16.3.0" + } + }, + "node_modules/reactstrap/node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/reactstrap/node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-location-state": { + "version": "2.8.2", + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.13.1" + }, + "engines": { + "node": ">4.0" + }, + "peerDependencies": { + "redux": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/redux-logger": { + "version": "3.0.6", + "license": "MIT", + "dependencies": { + "deep-diff": "^0.3.5" + } + }, + "node_modules/redux-logger/node_modules/deep-diff": { + "version": "0.3.8", + "license": "MIT" + }, + "node_modules/redux-mock-store": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.isplainobject": "^4.0.6" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "license": "MIT", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/reselect": { + "version": "4.1.7", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", + "engines": { + "node": ">= 0.8.15" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-script-os": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "bin": { + "run-os": "index.js", + "run-script-os": "index.js" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.59.3", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "klona": "^2.0.6", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "dev": true, + "license": "ISC" + }, + "node_modules/sb-promise-queue": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/sb-scandir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "sb-promise-queue": "^2.1.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/scroll": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/scrollparent": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-escape": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "dev": true, + "license": "MIT" + }, + "node_modules/shelljs": { + "version": "0.8.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/showdown": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" + } + }, + "node_modules/showdown/node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simplebar": { + "version": "6.2.2", + "license": "MIT", + "dependencies": { + "can-use-dom": "^0.1.0", + "simplebar-core": "^1.2.2" + } + }, + "node_modules/simplebar-core": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "can-use-dom": "^0.1.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21" + } + }, + "node_modules/simplebar-react": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz", + "integrity": "sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg==", + "dependencies": { + "prop-types": "^15.6.1", + "simplebar": "^5.3.9" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", + "react-dom": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0" + } + }, + "node_modules/simplebar-react/node_modules/simplebar": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz", + "integrity": "sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag==", + "dependencies": { + "@juggle/resize-observer": "^3.3.1", + "can-use-dom": "^0.1.0", + "core-js": "^3.0.1", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.throttle": "^4.1.1" + } + }, + "node_modules/sirv": { + "version": "1.0.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-asc": { + "version": "0.1.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.1.1", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-object": { + "version": "0.3.2", + "dependencies": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssh2": { + "version": "1.11.0", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackblur": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "node_modules/stackframe": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylelint": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", + "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^7.1.0", + "css-functions-list": "^3.1.0", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^6.0.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.1", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.26.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.19", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.3.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.2" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", + "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", + "dev": true, + "peerDependencies": { + "stylelint": "^14.10.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz", + "integrity": "sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==", + "dev": true, + "dependencies": { + "postcss-scss": "^4.0.2", + "stylelint-config-recommended": "^9.0.0", + "stylelint-scss": "^4.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^14.10.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^9.0.0" + }, + "peerDependencies": { + "stylelint": "^14.14.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz", + "integrity": "sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==", + "dev": true, + "dependencies": { + "stylelint-config-recommended-scss": "^8.0.0", + "stylelint-config-standard": "^29.0.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^14.14.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-high-performance-animation": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/stylelint-scss": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.6.0.tgz", + "integrity": "sha512-M+E0BQim6G4XEkaceEhfVjP/41C9Klg5/tTPTCQVlgw/jm2tvB+OXJGaU0TDP5rnTCB62aX6w+rT+gqJW/uwjA==", + "dev": true, + "dependencies": { + "dlv": "^1.1.3", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "stylelint": "^14.5.1 || ^15.0.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "node_modules/supercluster": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.0.0.tgz", + "integrity": "sha512-8VuHI8ynylYQj7Qf6PBMWy1PdgsnBiIxujOgc9Z83QvJ8ualIYWNx2iMKyKeC4DZI5ntD9tz/CIwwZvIelixsA==", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/table": { + "version": "6.8.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/tapable": { + "version": "0.1.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.16.6", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.7", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/through2/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tree-changes": { + "version": "0.9.3", + "license": "MIT", + "dependencies": { + "@gilbarbara/deep-equal": "^0.1.1", + "is-lite": "^0.8.2" + } + }, + "node_modules/tree-changes/node_modules/is-lite": { + "version": "0.8.2", + "license": "MIT" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.33", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-template": { + "version": "3.1.0", + "license": "BSD-3-Clause", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-v4": { + "version": "0.1.0", + "engines": { + "node": "*" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.76.3", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "8.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.10.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/what-input": { + "version": "5.2.12", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wkt-parser": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "7.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml-utils": { + "version": "1.3.0", + "license": "CC0-1.0" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.14", + "dev": true + }, + "@babel/core": { + "version": "7.21.3", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + } + }, + "@babel/eslint-parser": { + "version": "7.21.3", + "dev": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.21.3", + "dev": true, + "requires": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.21.0", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.21.2", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "dev": true, + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.20.5", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + } + }, + "@babel/helpers": { + "version": "7.21.0", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.21.3", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.20.15", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.20.13", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.20.2", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "dev": true + }, + "@babel/runtime": { + "version": "7.20.13", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.21.3", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.21.3", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "@csstools/selector-specificity": { + "version": "2.1.1", + "dev": true, + "requires": {} + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true + }, + "@elastic/react-search-ui": { + "version": "1.19.1", + "requires": { + "@elastic/react-search-ui-views": "1.19.1", + "@elastic/search-ui": "1.19.1" + } + }, + "@elastic/react-search-ui-views": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@elastic/react-search-ui-views/-/react-search-ui-views-1.19.1.tgz", + "integrity": "sha512-1IOVoG5GYKvrKoYZL247bd7eKVQAR4iJaYBkA4KOa8CEXdc3+N0Z63uAit+4+pAH6Z6IONNwk2iQPMDf2zjQGA==", + "requires": { + "@elastic/search-ui": "1.19.1", + "downshift": "^3.2.10", + "rc-pagination": "^1.20.1", + "react-select": "^5.0.0" + } + }, + "@elastic/search-ui": { + "version": "1.19.1", + "requires": { + "date-fns": "^1.30.1", + "deep-equal": "^1.0.1", + "history": "^4.9.0", + "qs": "^6.7.0" + } + }, + "@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + } + }, + "@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "@eslint-community/eslint-utils": { + "version": "4.2.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.4.0", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.1", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "globals": { + "version": "13.20.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.36.0", + "dev": true + }, + "@floating-ui/core": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.5.tgz", + "integrity": "sha512-qrcbyfnRVziRlB6IYwjCopYhO7Vud750JlJyuljruIXcPxr22y8zdckcJGsuOdnQ639uVD1tTXddrcH3t3QYIQ==" + }, + "@floating-ui/dom": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.5.tgz", + "integrity": "sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==", + "requires": { + "@floating-ui/core": "^1.2.4" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-brands-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "requires": { + "prop-types": "^15.8.1" + } + }, + "@gilbarbara/deep-equal": { + "version": "0.1.2" + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true + }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "dev": true + }, + "@jest/console": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "3.8.0", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + } + }, + "@jest/expect": { + "version": "29.5.0", + "dev": true, + "requires": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + } + }, + "@jest/expect-utils": { + "version": "29.5.0", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3" + } + }, + "@jest/fake-timers": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "@jest/globals": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + } + }, + "@jest/reporters": { + "version": "29.5.0", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "29.4.3", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.25.16" + } + }, + "@jest/source-map": { + "version": "29.4.3", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.5.0", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0" + }, + "@jridgewell/set-array": { + "version": "1.1.0" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "@khanisak/temperature-converter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@khanisak/temperature-converter/-/temperature-converter-1.2.0.tgz", + "integrity": "sha512-pT9on/IIU4Qab3C5RAJkPR239qYL2ZBUCiEK6s27yV5pXntxceckwDFDPYTUmsC5s+ZnZYDsoV9oWrIyvJbEzw==", + "requires": { + "@types/node": "^12.7.2" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2" + }, + "@mapbox/mapbox-gl-style-spec": { + "version": "13.28.0", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.6", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + } + }, + "@mapbox/point-geometry": { + "version": "0.1.0" + }, + "@mapbox/unitbezier": { + "version": "0.0.0" + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "dev": true, + "requires": { + "eslint-scope": "5.1.1" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@petamoriken/float16": { + "version": "3.7.1" + }, + "@playwright/test": { + "version": "1.32.0", + "dev": true, + "requires": { + "@types/node": "*", + "fsevents": "2.3.2", + "playwright-core": "1.32.0" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "dev": true + } + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "dev": true + }, + "@redux-devtools/extension": { + "version": "3.2.5", + "requires": { + "@babel/runtime": "^7.20.7", + "immutable": "^4.2.2" + } + }, + "@sinclair/typebox": { + "version": "0.25.24", + "dev": true + }, + "@sinonjs/commons": { + "version": "2.0.0", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.0.2", + "dev": true, + "requires": { + "@sinonjs/commons": "^2.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "dev": true + }, + "@types/babel__core": { + "version": "7.20.0", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.3", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.6", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51" + }, + "@types/express": { + "version": "4.17.14", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.31", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.6", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/http-proxy": { + "version": "1.17.9", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jsdom": { + "version": "20.0.1", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + }, + "dependencies": { + "entities": { + "version": "4.4.0", + "dev": true + }, + "parse5": { + "version": "7.1.2", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + } + } + }, + "@types/json-schema": { + "version": "7.0.11" + }, + "@types/json5": { + "version": "0.0.29", + "dev": true + }, + "@types/mime": { + "version": "3.0.1", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "dev": true + }, + "@types/node": { + "version": "12.20.50" + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prettier": { + "version": "2.7.2", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5" + }, + "@types/qs": { + "version": "6.9.7", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "dev": true + }, + "@types/react": { + "version": "18.0.28", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-redux": { + "version": "7.1.25", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "requires": { + "@types/react": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "dev": true + }, + "@types/scheduler": { + "version": "0.16.2" + }, + "@types/semver": { + "version": "7.3.13", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.2", + "dev": true + }, + "@types/use-sync-external-store": { + "version": "0.0.3" + }, + "@types/ws": { + "version": "8.5.3", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.22", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "dev": true + }, + "@typescript-eslint/scope-manager": { + "version": "5.51.0", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0" + } + }, + "@typescript-eslint/types": { + "version": "5.51.0", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.51.0", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/visitor-keys": "5.51.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.51.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.51.0", + "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/typescript-estree": "5.51.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.51.0", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.51.0", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.0.1", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.1", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.1", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0" + }, + "@xtuc/long": { + "version": "4.2.2" + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true + }, + "abab": { + "version": "2.0.6", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2" + }, + "acorn-jsx": { + "version": "5.3.2", + "dev": true, + "requires": {} + }, + "add-dom-event-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", + "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", + "requires": { + "object-assign": "4.x" + } + }, + "agent-base": { + "version": "6.0.2", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "8.12.0", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "dev": true + }, + "aria-query": { + "version": "5.1.3", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + }, + "dependencies": { + "deep-equal": { + "version": "2.2.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "isarray": { + "version": "2.0.5", + "dev": true + } + } + }, + "array-find": { + "version": "1.0.0", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "arrify": { + "version": "1.0.1", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "dev": true + }, + "autoprefixer": { + "version": "10.4.14", + "dev": true, + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "dev": true + }, + "axe-core": { + "version": "4.6.3", + "dev": true + }, + "axios": { + "version": "1.3.4", + "dev": true, + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "axobject-query": { + "version": "3.1.1", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + }, + "dependencies": { + "deep-equal": { + "version": "2.2.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "isarray": { + "version": "2.0.5", + "dev": true + } + } + }, + "babel-jest": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-loader": { + "version": "9.1.2", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.5.0", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.5.0", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12" + }, + "regenerator-runtime": { + "version": "0.11.1" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "dev": true + }, + "batch": { + "version": "0.6.1", + "dev": true + }, + "batch-processor": { + "version": "1.0.0" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2" + }, + "binary-extensions": { + "version": "2.2.0", + "dev": true + }, + "bluebird": { + "version": "3.7.2" + }, + "body-parser": { + "version": "1.20.1", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "dev": true + }, + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.0.14", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "dev": true + }, + "bootstrap": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==", + "requires": {} + }, + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "bser": { + "version": "2.1.1", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2" + }, + "buildcheck": { + "version": "0.0.3", + "dev": true, + "optional": true + }, + "builtins": { + "version": "5.0.1", + "dev": true, + "requires": { + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "bytes": { + "version": "3.0.0" + }, + "cachai": { + "version": "1.0.2" + }, + "call-bind": { + "version": "1.0.2", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0" + }, + "camelcase": { + "version": "5.3.1", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "can-use-dom": { + "version": "0.1.0" + }, + "caniuse-api": { + "version": "3.0.0", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001465" + }, + "chalk": { + "version": "2.4.2", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.12", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.4.0", + "dev": true + }, + "parse5": { + "version": "7.1.2", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + } + } + }, + "cheerio-select": { + "version": "2.1.0", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "dependencies": { + "css-select": { + "version": "5.1.0", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.4.0", + "dev": true + } + } + }, + "chokidar": { + "version": "3.5.3", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3" + }, + "ci-info": { + "version": "2.0.0", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "dev": true + }, + "classnames": { + "version": "2.3.2" + }, + "clean-webpack-plugin": { + "version": "4.0.0", + "dev": true, + "requires": { + "del": "^4.1.1" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "del": { + "version": "4.1.1", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "6.1.0", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "dev": true + }, + "pify": { + "version": "4.0.1", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "cliui": { + "version": "8.0.1", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "clsx": { + "version": "1.2.1" + }, + "co": { + "version": "4.6.0", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3" + }, + "colord": { + "version": "2.9.3", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "7.2.0", + "dev": true + }, + "common-path-prefix": { + "version": "3.0.0", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0" + } + } + }, + "compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "concat-map": { + "version": "0.0.1", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.11", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.5", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.5.0", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "dev": true + }, + "coordinate-parser": { + "version": "1.0.7" + }, + "copy-to-clipboard": { + "version": "3.3.3", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-js": { + "version": "3.22.3" + }, + "core-js-compat": { + "version": "3.27.2", + "dev": true, + "requires": { + "browserslist": "^4.21.4" + } + }, + "core-js-pure": { + "version": "3.27.2", + "dev": true + }, + "core-util-is": { + "version": "1.0.3" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "cpu-features": { + "version": "0.0.4", + "dev": true, + "optional": true, + "requires": { + "buildcheck": "0.0.3", + "nan": "^2.15.0" + } + }, + "cross-env": { + "version": "7.0.3", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-box-model": { + "version": "1.2.1", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-declaration-sorter": { + "version": "6.3.1", + "dev": true, + "requires": {} + }, + "css-functions-list": { + "version": "3.1.0", + "dev": true + }, + "css-loader": { + "version": "6.7.3", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-minimizer-webpack-plugin": { + "version": "4.2.2", + "dev": true, + "requires": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "css-select": { + "version": "4.3.0", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "css-url-relative-plugin": { + "version": "1.1.0", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "parse-import": "^2.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "css-what": { + "version": "6.1.0", + "dev": true + }, + "csscolorparser": { + "version": "1.0.3" + }, + "cssesc": { + "version": "3.0.0", + "dev": true + }, + "cssfontparser": { + "version": "1.2.1", + "dev": true + }, + "cssnano": { + "version": "5.1.15", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "dev": true, + "requires": {} + }, + "csso": { + "version": "4.2.0", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "cssom": { + "version": "0.5.0", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.1" + }, + "damerau-levenshtein": { + "version": "1.0.8", + "dev": true + }, + "dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" + }, + "data-uri-to-buffer": { + "version": "4.0.1" + }, + "data-urls": { + "version": "3.0.2", + "dev": true, + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "tr46": { + "version": "3.0.0", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "whatwg-url": { + "version": "11.0.0", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "date-fns": { + "version": "1.30.1" + }, + "debug": { + "version": "4.3.4", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.4.3", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "dev": true + }, + "deepmerge": { + "version": "4.2.2" + }, + "default-gateway": { + "version": "6.0.3", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "dev": true + }, + "depd": { + "version": "2.0.0", + "dev": true + }, + "desandro-matches-selector": { + "version": "2.0.2" + }, + "destroy": { + "version": "1.2.0", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "dev": true + }, + "diff-sequences": { + "version": "29.4.3", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "dev": true + }, + "dns-packet": { + "version": "5.4.0", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-serializer": { + "version": "1.4.1", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "dev": true + }, + "domexception": { + "version": "4.0.0", + "dev": true, + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "downshift": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-3.4.8.tgz", + "integrity": "sha512-dZL3iNL/LbpHNzUQAaVq/eTD1ocnGKKjbAl/848Q0KEp6t81LJbS37w3f93oD6gqqAnjdgM7Use36qZSipHXBw==", + "requires": { + "@babel/runtime": "^7.4.5", + "compute-scroll-into-view": "^1.0.9", + "prop-types": "^15.7.2", + "react-is": "^16.9.0" + } + }, + "duplexer": { + "version": "0.1.2", + "dev": true + }, + "earcut": { + "version": "2.2.4" + }, + "ee-first": { + "version": "1.1.1", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.328" + }, + "element-resize-detector": { + "version": "1.2.4", + "requires": { + "batch-processor": "1.0.0" + } + }, + "elm-pep": { + "version": "1.0.6" + }, + "emittery": { + "version": "0.13.1", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "dev": true + }, + "emojis-list": { + "version": "3.0.0" + }, + "encodeurl": { + "version": "1.0.2", + "dev": true + }, + "enhanced-resolve": { + "version": "0.9.1", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "entities": { + "version": "2.2.0", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.7", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.21.1", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-get-iterator": { + "version": "1.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "dev": true + } + } + }, + "es-module-lexer": { + "version": "0.9.3" + }, + "es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1" + }, + "escape-html": { + "version": "1.0.3", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5" + }, + "escodegen": { + "version": "2.0.0", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.36.0", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "19.0.4", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + } + }, + "eslint-config-standard": { + "version": "17.0.0", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-webpack": { + "version": "0.13.2", + "dev": true, + "requires": { + "array-find": "^1.0.0", + "debug": "^3.2.7", + "enhanced-resolve": "^0.9.1", + "find-root": "^1.1.0", + "has": "^1.0.3", + "interpret": "^1.4.0", + "is-core-module": "^2.7.0", + "is-regex": "^1.1.4", + "lodash": "^4.17.21", + "resolve": "^1.20.0", + "semver": "^5.7.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-jest": { + "version": "27.2.1", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^5.10.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + } + }, + "eslint-plugin-n": { + "version": "15.6.1", + "dev": true, + "requires": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "dependencies": { + "eslint-plugin-es": { + "version": "4.1.0", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-no-storage": { + "version": "1.0.2", + "dev": true + }, + "eslint-plugin-node": { + "version": "11.1.0", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + } + }, + "eslint-plugin-promise": { + "version": "6.1.1", + "dev": true, + "requires": {} + }, + "eslint-plugin-react": { + "version": "7.32.2", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.5.0", + "dev": true, + "peer": true, + "requires": {} + }, + "eslint-plugin-standard": { + "version": "5.0.0", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0" + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "dev": true + }, + "espree": { + "version": "9.5.0", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0" + }, + "esutils": { + "version": "2.0.3", + "dev": true + }, + "etag": { + "version": "1.8.1", + "dev": true + }, + "ev-emitter": { + "version": "1.1.1" + }, + "eventemitter3": { + "version": "4.0.7" + }, + "events": { + "version": "3.3.0" + }, + "execa": { + "version": "5.1.1", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "dev": true + } + } + }, + "exenv": { + "version": "1.2.2" + }, + "exit": { + "version": "0.1.2", + "dev": true + }, + "expect": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "express": { + "version": "4.18.2", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3" + }, + "fast-glob": { + "version": "3.2.12", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0" + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fetch-blob": { + "version": "3.2.0", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "fetch-mock": { + "version": "9.11.0", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + }, + "dependencies": { + "path-to-regexp": { + "version": "2.4.0", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-saver": { + "version": "2.0.5" + }, + "fill-range": { + "version": "7.0.1", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0" + }, + "find-up": { + "version": "5.0.0", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "requires": { + "micromatch": "^4.0.2" + } + }, + "fizzy-ui-utils": { + "version": "2.0.7", + "requires": { + "desandro-matches-selector": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "dev": true + }, + "function-bind": { + "version": "1.1.1" + }, + "function.prototype.name": { + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3" + }, + "gensync": { + "version": "1.0.0-beta.2", + "dev": true + }, + "geographiclib": { + "version": "1.52.2" + }, + "geotiff": { + "version": "2.0.7", + "requires": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.1", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "dependencies": { + "pako": { + "version": "2.1.0" + }, + "quick-lru": { + "version": "6.1.1" + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "get-imports": { + "version": "1.0.0", + "dev": true, + "requires": { + "array-uniq": "^1.0.1", + "import-regex": "^1.1.0" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "dev": true + }, + "get-size": { + "version": "2.0.3" + }, + "get-symbol-description": { + "version": "1.0.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "9.3.2", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "7.4.2", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "4.2.4", + "dev": true + } + } + }, + "glob-parent": { + "version": "5.1.2", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1" + }, + "global-modules": { + "version": "2.0.0", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "dev": true + }, + "globalthis": { + "version": "1.0.3", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "dev": true + }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + } + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "glslify-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glslify-loader/-/glslify-loader-2.0.0.tgz", + "integrity": "sha512-oOdmTX1BSPG75o3gNZToemfbbuN5dgi4Pco/aRfjbwGxPIfflYLuok6JCf2kDBPHjP+tV+imNsj6YRJg9gKJ1A==", + "requires": { + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.3.0", + "loader-utils": "^1.1.0", + "resolve": "^1.3.3" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "gopd": { + "version": "1.0.1", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10" + }, + "grapheme-splitter": { + "version": "1.0.4", + "dev": true + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "6.0.0", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "dev": true + }, + "hard-rejection": { + "version": "2.1.0", + "dev": true + }, + "has": { + "version": "1.0.3", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "dev": true + }, + "has-flag": { + "version": "3.0.0" + }, + "has-property-descriptors": { + "version": "1.0.0", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "dev": true + }, + "has-symbols": { + "version": "1.0.3" + }, + "has-tostringtag": { + "version": "1.0.0", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "requires": { + "react-is": "^16.7.0" + } + }, + "hosted-git-info": { + "version": "4.1.0", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "dev": true + }, + "html-tags": { + "version": "3.2.0", + "dev": true + }, + "htmlparser2": { + "version": "8.0.1", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.4.0", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.6", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "dev": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "dev": true + }, + "husky": { + "version": "8.0.3", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1" + }, + "ignore": { + "version": "5.2.4", + "dev": true + }, + "imagesloaded": { + "version": "5.0.0", + "requires": { + "ev-emitter": "^2.1.2" + }, + "dependencies": { + "ev-emitter": { + "version": "2.1.2" + } + } + }, + "immutability-helper": { + "version": "3.1.1" + }, + "immutable": { + "version": "4.2.4" + }, + "import-fresh": { + "version": "3.3.0", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "dev": true + }, + "import-local": { + "version": "3.1.0", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "import-regex": { + "version": "1.1.0", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4" + }, + "ini": { + "version": "1.3.8", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1" + }, + "is-bigint": { + "version": "1.0.4", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-lite": { + "version": "0.9.2" + }, + "is-map": { + "version": "2.0.2", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "2.2.0", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "3.0.3", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-subset": { + "version": "0.1.1", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakmap": { + "version": "2.0.1", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "is-wsl": { + "version": "2.2.0", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + } + }, + "jest-canvas-mock": { + "version": "2.5.0", + "dev": true, + "requires": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "jest-changed-files": { + "version": "29.5.0", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "29.5.0", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "3.8.0", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "29.5.0", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "29.4.3", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0", + "jsdom": "^20.0.0" + }, + "dependencies": { + "acorn-globals": { + "version": "7.0.1", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "acorn-walk": { + "version": "8.2.0", + "dev": true + }, + "entities": { + "version": "4.4.0", + "dev": true + }, + "jsdom": { + "version": "20.0.3", + "dev": true, + "requires": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + } + }, + "parse5": { + "version": "7.1.2", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "saxes": { + "version": "6.0.0", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "tr46": { + "version": "3.0.0", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "whatwg-url": { + "version": "11.0.0", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "ws": { + "version": "8.12.0", + "dev": true, + "requires": {} + } + } + }, + "jest-environment-node": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + } + }, + "jest-get-type": { + "version": "29.4.3", + "dev": true + }, + "jest-haste-map": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.5.0", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + } + }, + "jest-matcher-utils": { + "version": "29.5.0", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "29.5.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.4.3", + "dev": true + }, + "jest-resolve": { + "version": "29.5.0", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "29.5.0", + "dev": true, + "requires": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + } + }, + "jest-runner": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-snapshot": { + "version": "29.5.0", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "3.7.1", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "29.5.0", + "dev": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jquery": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", + "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==", + "peer": true + }, + "js-sdsl": { + "version": "4.3.0", + "dev": true + }, + "js-tokens": { + "version": "4.0.0" + }, + "js-yaml": { + "version": "4.1.0", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsdom-worker": { + "version": "0.3.0", + "requires": { + "mitt": "^3.0.0", + "uuid-v4": "^0.1.0" + } + }, + "jsesc": { + "version": "2.5.2", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1" + }, + "json-schema-traverse": { + "version": "1.0.0", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "json-stringify-pretty-compact": { + "version": "2.0.0" + }, + "json5": { + "version": "2.2.3" + }, + "jsonfile": { + "version": "6.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "dev": true + } + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "kdbush": { + "version": "3.0.0" + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "klaw-sync": { + "version": "6.0.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "kleur": { + "version": "3.0.3", + "dev": true + }, + "klona": { + "version": "2.0.6", + "dev": true + }, + "known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true + }, + "language-subtag-registry": { + "version": "0.3.21", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "launch-editor": { + "version": "2.6.0", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "lerc": { + "version": "3.0.0" + }, + "leven": { + "version": "3.1.0", + "dev": true + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.0.6", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4" + }, + "load-json-file": { + "version": "4.0.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "dev": true + } + } + }, + "loader-runner": { + "version": "4.3.0" + }, + "loader-utils": { + "version": "2.0.4", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "6.0.0", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21" + }, + "lodash-es": { + "version": "4.17.21" + }, + "lodash.debounce": { + "version": "4.0.8" + }, + "lodash.difference": { + "version": "4.5.0" + }, + "lodash.isequal": { + "version": "4.5.0", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2" + }, + "lodash.merge": { + "version": "4.6.2", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "lodash.truncate": { + "version": "4.4.2", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "makeerror": { + "version": "1.0.12", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "requires": { + "wrappy": "1" + } + } + } + }, + "map-obj": { + "version": "4.3.0", + "dev": true + }, + "mapbox-to-css-font": { + "version": "2.4.2" + }, + "masonry-layout": { + "version": "4.2.2", + "requires": { + "get-size": "^2.0.2", + "outlayer": "^2.1.0" + } + }, + "mathml-tag-names": { + "version": "2.1.3", + "dev": true + }, + "mdn-data": { + "version": "2.0.14", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "dev": true + }, + "memfs": { + "version": "3.4.13", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoize-one": { + "version": "5.2.1" + }, + "memory-fs": { + "version": "0.2.0", + "dev": true + }, + "memorystream": { + "version": "0.3.1", + "dev": true + }, + "meow": { + "version": "9.0.0", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "dev": true + }, + "merge-stream": { + "version": "2.0.0" + }, + "merge2": { + "version": "1.4.1", + "dev": true + }, + "methods": { + "version": "1.1.2", + "dev": true + }, + "mgrs": { + "version": "1.0.0" + }, + "micromatch": { + "version": "4.0.5", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "dev": true + }, + "mime-db": { + "version": "1.52.0" + }, + "mime-types": { + "version": "2.1.35", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.7.5", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6" + }, + "minimist-options": { + "version": "4.1.0", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "3.1.6", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mitt": { + "version": "3.0.0" + }, + "moment": { + "version": "2.29.4" + }, + "moment-locales-webpack-plugin": { + "version": "1.2.0", + "requires": { + "lodash.difference": "^4.5.0" + } + }, + "moo-color": { + "version": "1.0.3", + "dev": true, + "requires": { + "color-name": "^1.1.4" + }, + "dependencies": { + "color-name": { + "version": "1.1.4", + "dev": true + } + } + }, + "mrmime": { + "version": "1.0.1", + "dev": true + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, + "nan": { + "version": "2.16.0", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.3.4", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "negotiator": { + "version": "0.6.3" + }, + "neo-async": { + "version": "2.6.2" + }, + "nice-try": { + "version": "1.0.5", + "dev": true + }, + "node-dir": { + "version": "0.1.17", + "dev": true, + "requires": { + "minimatch": "^3.0.2" + } + }, + "node-domexception": { + "version": "1.0.0" + }, + "node-fetch": { + "version": "3.3.1", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "node-forge": { + "version": "1.3.1", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "dev": true + }, + "node-releases": { + "version": "2.0.10" + }, + "node-ssh": { + "version": "13.0.1", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "make-dir": "^3.1.0", + "sb-promise-queue": "^2.1.0", + "sb-scandir": "^3.1.0", + "shell-escape": "^0.2.0", + "ssh2": "^1.5.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "normalize-path": { + "version": "3.0.0", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "dev": true + }, + "semver": { + "version": "5.7.1", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "dev": true + }, + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.2", + "dev": true + }, + "object-assign": { + "version": "4.1.1" + }, + "object-inspect": { + "version": "1.12.2" + }, + "object-is": { + "version": "1.1.5", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1" + }, + "object.assign": { + "version": "4.1.4", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "dev": true + }, + "ol": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/ol/-/ol-7.2.2.tgz", + "integrity": "sha512-eqJ1hhVQQ3Ap4OhYq9DRu5pz9RMpLhmoTauDoIqpn7logVi1AJE+lXjEHrPrTSuZYjtFbMgqr07sxoLNR65nrw==", + "requires": { + "earcut": "^2.2.3", + "geotiff": "^2.0.7", + "ol-mapbox-style": "^9.2.0", + "pbf": "3.2.1", + "rbush": "^3.0.1" + }, + "dependencies": { + "ol-mapbox-style": { + "version": "9.7.0", + "requires": { + "@mapbox/mapbox-gl-style-spec": "^13.23.1", + "mapbox-to-css-font": "^2.4.1" + } + } + } + }, + "ol-mapbox-style": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-9.4.0.tgz", + "integrity": "sha512-I9dK1K41P8DjozFeQ4x1pfou86q/WedRzjCMpNhtHW9APJ/l3UT6aGsp2HcbG7cLfx3EpzK4Q7HxKwcQYR5Chw==", + "requires": { + "@mapbox/mapbox-gl-style-spec": "^13.23.1", + "mapbox-to-css-font": "^2.4.1" + } + }, + "on-finished": { + "version": "2.4.1", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2" + }, + "once": { + "version": "1.4.0", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.2", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "dev": true + }, + "outlayer": { + "version": "2.1.1", + "requires": { + "ev-emitter": "^1.0.0", + "fizzy-ui-utils": "^2.0.0", + "get-size": "^2.0.2" + } + }, + "p-limit": { + "version": "3.1.0", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-queue": { + "version": "7.3.4", + "requires": { + "eventemitter3": "^4.0.7", + "p-timeout": "^5.0.2" + } + }, + "p-retry": { + "version": "4.6.2", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "dev": true + } + } + }, + "p-timeout": { + "version": "5.0.2" + }, + "p-try": { + "version": "2.2.0", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-headers": { + "version": "2.0.5" + }, + "parse-import": { + "version": "2.0.0", + "dev": true, + "requires": { + "get-imports": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "dependencies": { + "domhandler": { + "version": "5.0.3", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "entities": { + "version": "4.4.0", + "dev": true + }, + "parse5": { + "version": "7.1.2", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + } + } + }, + "parseurl": { + "version": "1.3.3", + "dev": true + }, + "patch-package": { + "version": "6.5.1", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "fs-extra": { + "version": "9.1.0", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "dev": true + }, + "slash": { + "version": "2.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "dev": true + }, + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "path-exists": { + "version": "4.0.0", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-parse": { + "version": "1.0.7" + }, + "path-scurry": { + "version": "1.6.1", + "dev": true, + "requires": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.1", + "dev": true + }, + "minipass": { + "version": "4.2.4", + "dev": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "dev": true + }, + "path-type": { + "version": "4.0.0" + }, + "pbf": { + "version": "3.2.1", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picocolors": { + "version": "1.0.0" + }, + "picomatch": { + "version": "2.3.1", + "dev": true + }, + "pidtree": { + "version": "0.3.1", + "dev": true + }, + "pify": { + "version": "3.0.0", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.5", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "playwright-core": { + "version": "1.32.0", + "dev": true + }, + "popper.js": { + "version": "1.16.1" + }, + "postcss": { + "version": "8.4.21", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "dev": true, + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "dev": true, + "requires": {} + }, + "postcss-loader": { + "version": "7.1.0", + "dev": true, + "requires": { + "cosmiconfig": "^8.0.0", + "klona": "^2.0.6", + "semver": "^7.3.8" + }, + "dependencies": { + "cosmiconfig": { + "version": "8.1.3", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "semver": { + "version": "7.3.8", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "dev": true + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "dev": true, + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "dev": true, + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "dev": true + }, + "postcss-safe-parser": { + "version": "6.0.0", + "dev": true, + "requires": {} + }, + "postcss-scss": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", + "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "dev": true, + "requires": {} + }, + "postcss-selector-parser": { + "version": "6.0.11", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "pretty-format": { + "version": "29.5.0", + "dev": true, + "requires": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + }, + "react-is": { + "version": "18.2.0", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "dev": true + }, + "proj4": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.1.tgz", + "integrity": "sha512-RP5EcrfrLcARy+Zjjz1wIeqZzZdPtQNl685asHcwdU/MQ/dvydmf1XWM4mgok6wPaNsXZ8IFrM4qadO3g46PiQ==", + "requires": { + "mgrs": "1.0.0", + "wkt-parser": "^1.2.4" + } + }, + "prompts": { + "version": "2.4.2", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "protocol-buffers-schema": { + "version": "3.6.0" + }, + "proxy-addr": { + "version": "2.0.7", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "dev": true + }, + "psl": { + "version": "1.9.0", + "dev": true + }, + "punycode": { + "version": "2.3.0" + }, + "pure-rand": { + "version": "6.0.0", + "dev": true + }, + "qs": { + "version": "6.11.0", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.1", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "dev": true + }, + "quickselect": { + "version": "2.0.0" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "raf-schd": { + "version": "4.0.3" + }, + "randombytes": { + "version": "2.1.0", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "dev": true + } + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "rbush": { + "version": "3.0.1", + "requires": { + "quickselect": "^2.0.0" + } + }, + "rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "dependencies": { + "rc-util": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.3.tgz", + "integrity": "sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + } + } + } + }, + "rc-motion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-1.1.2.tgz", + "integrity": "sha512-YC/E7SSWKBFakYg4PENhSRWD4ZLDqkI7FKmutJcrMewZ91/ZIWfoZSDvPaBdKO0hsFrrzWepFhXQIq0FNnCMWA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "raf": "^3.4.1", + "rc-util": "^5.0.6" + }, + "dependencies": { + "rc-util": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.3.tgz", + "integrity": "sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + } + } + } + }, + "rc-pagination": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-1.21.1.tgz", + "integrity": "sha512-Z+iYLbrJOBKHdgoAjLhL9jOgb7nrbPzNmV31p0ikph010/Ov1+UkrauYzWhumUyR+GbRFi3mummdKW/WtlOewA==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.6", + "prop-types": "^15.5.7", + "react-lifecycles-compat": "^3.0.4" + } + }, + "rc-slider": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.2.2.tgz", + "integrity": "sha512-WwdNHb/cvnQXMhp8cRhxOM0pGnVG4fPoaFE31yVkyJUAZiHq3siQgwzAeYl11fyszwhrEXkpGU7tEAfClh0AaQ==", + "requires": { + "babel-runtime": "6.x", + "classnames": "^2.2.5", + "prop-types": "^15.5.4", + "rc-tooltip": "^4.0.0", + "rc-util": "^4.0.4", + "shallowequal": "^1.1.0", + "warning": "^4.0.3" + } + }, + "rc-tooltip": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.2.3.tgz", + "integrity": "sha512-7ySkaPGeqLLM4a/QYrKQ280aDthPxyvjJqQMstWX/AWX7/b1p23HIdHXdjBkziuvcnvXkW4lgZdFTVsylDiX1w==", + "requires": { + "@babel/runtime": "^7.11.2", + "rc-trigger": "^4.2.1" + } + }, + "rc-trigger": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.4.3.tgz", + "integrity": "sha512-yq/WyuiPwxd2q6jy+VPyy0GUCRFJ2eFqAaCwPE27AOftXeIupOcJ/2t1wakSq63cfk7qtzev5DKHUAjb8LOJCw==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "raf": "^3.4.1", + "rc-align": "^4.0.0", + "rc-motion": "^1.0.0", + "rc-util": "^5.0.1" + }, + "dependencies": { + "rc-util": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.29.3.tgz", + "integrity": "sha512-wX6ZwQTzY2v7phJBquN4mSEIFR0E0qumlENx0zjENtDvoVSq2s7cR95UidKRO1hOHfDsecsfM9D1gO4Kebs7fA==", + "requires": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + } + } + } + }, + "rc-util": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", + "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", + "requires": { + "add-dom-event-listener": "^1.1.0", + "prop-types": "^15.5.10", + "react-is": "^16.12.0", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0" + } + }, + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-autocomplete": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/react-autocomplete/-/react-autocomplete-1.8.1.tgz", + "integrity": "sha512-YQGVN5POdcI3G89wUVWnJhk9rLF6JeB6Ik6xnNpfvSMG4tJkksBzqOE4mkFNGqEz+2AaQw13xNmVXresg9E3zg==", + "requires": { + "dom-scroll-into-view": "1.0.1", + "prop-types": "^15.5.10" + }, + "dependencies": { + "dom-scroll-into-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.0.1.tgz", + "integrity": "sha512-1Dmy6uH1vRcm2+Lvggyrlc04cMh+mr+VA+qcgs085hAEZp+v+6NT/xhRjfc6vRc7965sCSDdQcw063VkG+eNmQ==" + } + } + }, + "react-beautiful-dnd": { + "version": "13.1.1", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "dependencies": { + "react-is": { + "version": "17.0.2" + }, + "react-redux": { + "version": "7.2.9", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + } + } + } + }, + "react-contextmenu": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.14.0.tgz", + "integrity": "sha512-ktqMOuad6sCFNJs/ltEwppN8F0YeXmqoZfwycgtZR/MxOXMYx1xgYC44SzWH259HdGyshk1/7sXGuIRwj9hzbw==", + "requires": { + "classnames": "^2.2.5", + "object-assign": "^4.1.0" + } + }, + "react-device-detect": { + "version": "2.2.3", + "requires": { + "ua-parser-js": "^1.0.33" + } + }, + "react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "requires": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + } + }, + "react-floater": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/react-floater/-/react-floater-0.7.6.tgz", + "integrity": "sha512-tt/15k/HpaShbtvWCwsQYLR+ebfUuYbl+oAUJ3DcEDkgYKeUcSkDey2PdAIERdVwzdFZANz47HbwoET2/Rduxg==", + "requires": { + "deepmerge": "^4.2.2", + "exenv": "^1.2.2", + "is-lite": "^0.8.2", + "popper.js": "^1.16.0", + "prop-types": "^15.8.1", + "react-proptype-conditional-require": "^1.0.4", + "tree-changes": "^0.9.1" + }, + "dependencies": { + "is-lite": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz", + "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==" + } + } + }, + "react-image-crop": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-9.1.1.tgz", + "integrity": "sha512-n7O3Cn7RuZJF8ooau2atwCGWZHqO7akl/pa6IR+1jWy5X0x4enTOCWOeswYhcBOv0ohmDHctAlf6mcUuSSwsow==", + "requires": { + "clsx": "^1.1.1" + } + }, + "react-infinite-scroller": { + "version": "1.2.6", + "requires": { + "prop-types": "^15.5.8" + } + }, + "react-is": { + "version": "16.13.1" + }, + "react-joyride": { + "version": "2.5.3", + "requires": { + "deepmerge": "^4.2.2", + "exenv": "^1.2.2", + "is-lite": "^0.9.2", + "prop-types": "^15.8.1", + "react-floater": "^0.7.6", + "react-is": "^16.13.1", + "scroll": "^3.0.1", + "scrollparent": "^2.0.1", + "tree-changes": "^0.9.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-mobile-datepicker": { + "version": "4.0.2", + "requires": {} + }, + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + }, + "react-portal": { + "version": "4.2.2", + "requires": { + "prop-types": "^15.5.8" + } + }, + "react-proptype-conditional-require": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz", + "integrity": "sha512-nopsRn7KnGgazBe2c3H2+Kf+Csp6PGDRLiBkYEDMKY8o/EIgft/WnIm/OnAKTawZiLnJXHAqhpFBddvs6NiXlw==" + }, + "react-redux": { + "version": "8.0.5", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0" + } + } + }, + "react-refresh": { + "version": "0.14.0", + "dev": true + }, + "react-resizable": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-1.11.1.tgz", + "integrity": "sha512-S70gbLaAYqjuAd49utRHibtHLrHXInh7GuOR+6OO6RO6uleQfuBnWmZjRABfqNEx3C3Z6VPLg0/0uOYFrkfu9Q==", + "requires": { + "prop-types": "15.x", + "react-draggable": "^4.0.3" + } + }, + "react-select": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.2.tgz", + "integrity": "sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "dependencies": { + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + } + } + }, + "react-swipe-to-delete-component": { + "version": "1.0.5", + "requires": { + "@babel/runtime": "^7.12.5", + "prop-types": "^15.8.1", + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "dependencies": { + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-test-renderer": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", + "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.19.1" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-visibility-sensor": { + "version": "5.1.1", + "requires": { + "prop-types": "^15.7.2" + } + }, + "reactstrap": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-8.1.1.tgz", + "integrity": "sha512-m4IIdTHBT5wtcPts4w4rYngKuqIUC1BpncVxCTeIj4BQDxwjdab0gGyKJKfgXgArn6iI6syiDyez/h2tLWFjsw==", + "requires": { + "@babel/runtime": "^7.2.0", + "classnames": "^2.2.3", + "prop-types": "^15.5.8", + "react-lifecycles-compat": "^3.0.4", + "react-popper": "^1.3.3", + "react-transition-group": "^2.3.1" + }, + "dependencies": { + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + } + } + }, + "read-pkg": { + "version": "3.0.0", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.2.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "redux": { + "version": "4.2.1", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-location-state": { + "version": "2.8.2", + "requires": { + "lodash": "^4.13.1" + } + }, + "redux-logger": { + "version": "3.0.6", + "requires": { + "deep-diff": "^0.3.5" + }, + "dependencies": { + "deep-diff": { + "version": "0.3.8" + } + } + }, + "redux-mock-store": { + "version": "1.5.4", + "dev": true, + "requires": { + "lodash.isplainobject": "^4.0.6" + } + }, + "redux-thunk": { + "version": "2.4.2", + "requires": {} + }, + "regenerate": { + "version": "1.4.2", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11" + }, + "regenerator-transform": { + "version": "0.15.1", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "dev": true + }, + "regexpu-core": { + "version": "5.3.0", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "dev": true + }, + "reselect": { + "version": "4.1.7" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.22.1", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0" + }, + "resolve-pathname": { + "version": "3.0.0" + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve.exports": { + "version": "2.0.1", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "dev": true + }, + "rgbcolor": { + "version": "1.0.1" + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-script-os": { + "version": "1.1.6", + "dev": true + }, + "rw": { + "version": "1.3.3" + }, + "safe-buffer": { + "version": "5.1.2" + }, + "safe-regex-test": { + "version": "1.0.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "dev": true + }, + "sass": { + "version": "1.59.3", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "13.2.1", + "dev": true, + "requires": { + "klona": "^2.0.6", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "dev": true + }, + "sb-promise-queue": { + "version": "2.1.0", + "dev": true + }, + "sb-scandir": { + "version": "3.1.0", + "dev": true, + "requires": { + "sb-promise-queue": "^2.1.0" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "3.1.1", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1" + } + } + }, + "scroll": { + "version": "3.0.1" + }, + "scrollparent": { + "version": "2.0.1" + }, + "select-hose": { + "version": "2.0.0", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "6.3.0", + "dev": true + }, + "send": { + "version": "0.18.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "dev": true + }, + "ms": { + "version": "2.0.0", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "shell-escape": { + "version": "0.2.0", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "dev": true + }, + "shelljs": { + "version": "0.8.5", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "showdown": { + "version": "2.1.0", + "dev": true, + "requires": { + "commander": "^9.0.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "dev": true + } + } + }, + "side-channel": { + "version": "1.0.4", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "dev": true + }, + "simplebar": { + "version": "6.2.2", + "requires": { + "can-use-dom": "^0.1.0", + "simplebar-core": "^1.2.2" + } + }, + "simplebar-core": { + "version": "1.2.2", + "requires": { + "can-use-dom": "^0.1.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21" + } + }, + "simplebar-react": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz", + "integrity": "sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg==", + "requires": { + "prop-types": "^15.6.1", + "simplebar": "^5.3.9" + }, + "dependencies": { + "simplebar": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz", + "integrity": "sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag==", + "requires": { + "@juggle/resize-observer": "^3.3.1", + "can-use-dom": "^0.1.0", + "core-js": "^3.0.1", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.throttle": "^4.1.1" + } + } + } + }, + "sirv": { + "version": "1.0.19", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "dev": true + }, + "slash": { + "version": "3.0.0", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.24", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "sort-asc": { + "version": "0.1.0" + }, + "sort-desc": { + "version": "0.1.1" + }, + "sort-object": { + "version": "0.3.2", + "requires": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + } + }, + "source-list-map": { + "version": "2.0.1", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "source-map-js": { + "version": "1.0.2", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1" + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "dev": true + }, + "ssh2": { + "version": "1.11.0", + "dev": true, + "requires": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2", + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "stable": { + "version": "0.1.8", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "dev": true + } + } + }, + "stackblur": { + "version": "1.0.0" + }, + "stackframe": { + "version": "1.2.1", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "dev": true + }, + "stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "requires": { + "internal-slot": "^1.0.4" + } + }, + "string_decoder": { + "version": "1.3.0", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + } + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.padend": { + "version": "3.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "6.0.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "dev": true + }, + "style-search": { + "version": "0.1.0", + "dev": true + }, + "stylehacks": { + "version": "5.1.1", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylelint": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", + "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^7.1.0", + "css-functions-list": "^3.1.0", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^6.0.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.1", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.26.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.19", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.3.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.2" + }, + "dependencies": { + "balanced-match": { + "version": "2.0.0", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "dev": true + } + } + }, + "stylelint-config-recommended": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", + "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", + "dev": true, + "requires": {} + }, + "stylelint-config-recommended-scss": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz", + "integrity": "sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==", + "dev": true, + "requires": { + "postcss-scss": "^4.0.2", + "stylelint-config-recommended": "^9.0.0", + "stylelint-scss": "^4.0.0" + } + }, + "stylelint-config-standard": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^9.0.0" + } + }, + "stylelint-config-standard-scss": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz", + "integrity": "sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==", + "dev": true, + "requires": { + "stylelint-config-recommended-scss": "^8.0.0", + "stylelint-config-standard": "^29.0.0" + } + }, + "stylelint-high-performance-animation": { + "version": "1.8.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "stylelint-scss": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.6.0.tgz", + "integrity": "sha512-M+E0BQim6G4XEkaceEhfVjP/41C9Klg5/tTPTCQVlgw/jm2tvB+OXJGaU0TDP5rnTCB62aX6w+rT+gqJW/uwjA==", + "dev": true, + "requires": { + "dlv": "^1.1.3", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + } + }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "supercluster": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.0.0.tgz", + "integrity": "sha512-8VuHI8ynylYQj7Qf6PBMWy1PdgsnBiIxujOgc9Z83QvJ8ualIYWNx2iMKyKeC4DZI5ntD9tz/CIwwZvIelixsA==", + "requires": { + "kdbush": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0" + }, + "svg-tags": { + "version": "1.0.0", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "symbol-tree": { + "version": "3.2.4", + "dev": true + }, + "table": { + "version": "6.8.1", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "tapable": { + "version": "0.1.10", + "dev": true + }, + "tar": { + "version": "6.1.13", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "4.0.3", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + } + } + }, + "terser": { + "version": "5.16.6", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.7", + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0" + }, + "jest-worker": { + "version": "27.5.1", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.1", + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "8.1.1", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, + "thunky": { + "version": "1.1.0", + "dev": true + }, + "tiny-invariant": { + "version": "1.2.0" + }, + "tiny-warning": { + "version": "1.0.3" + }, + "tmp": { + "version": "0.0.33", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0" + }, + "to-regex-range": { + "version": "5.0.1", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6" + }, + "toidentifier": { + "version": "1.0.1", + "dev": true + }, + "totalist": { + "version": "1.1.0", + "dev": true + }, + "tough-cookie": { + "version": "4.1.2", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "1.0.1", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "tree-changes": { + "version": "0.9.3", + "requires": { + "@gilbarbara/deep-equal": "^0.1.1", + "is-lite": "^0.8.2" + }, + "dependencies": { + "is-lite": { + "version": "0.8.2" + } + } + }, + "trim-newlines": { + "version": "3.0.1", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.1", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-length": { + "version": "1.0.4", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, + "typescript": { + "version": "4.9.5", + "dev": true, + "peer": true + }, + "ua-parser-js": { + "version": "1.0.33" + }, + "unbox-primitive": { + "version": "1.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true + }, + "universalify": { + "version": "0.2.0", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.10", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-template": { + "version": "3.1.0" + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-memo-one": { + "version": "1.1.2", + "requires": {} + }, + "use-sync-external-store": { + "version": "1.2.0", + "requires": {} + }, + "util-deprecate": { + "version": "1.0.2", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "dev": true + }, + "uuid-v4": { + "version": "0.1.0" + }, + "v8-compile-cache": { + "version": "2.3.0", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "1.0.1" + }, + "vary": { + "version": "1.1.2" + }, + "walker": { + "version": "1.0.8", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "warning": { + "version": "4.0.3", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "2.4.0", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-streams-polyfill": { + "version": "3.2.1" + }, + "web-worker": { + "version": "1.2.0" + }, + "webidl-conversions": { + "version": "7.0.0", + "dev": true + }, + "webpack": { + "version": "5.76.3", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "acorn-import-assertions": { + "version": "1.8.0", + "requires": {} + }, + "enhanced-resolve": { + "version": "5.10.0", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "tapable": { + "version": "2.2.1" + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.8.0", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "webpack-cli": { + "version": "5.0.1", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "dev": true + }, + "interpret": { + "version": "3.1.1", + "dev": true + }, + "rechoir": { + "version": "0.8.0", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "6.0.2", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.13.1", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "2.0.1", + "dev": true + }, + "open": { + "version": "8.4.0", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "schema-utils": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "ws": { + "version": "8.13.0", + "dev": true, + "requires": {} + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3" + }, + "websocket-driver": { + "version": "0.7.4", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "dev": true + }, + "what-input": { + "version": "5.2.12" + }, + "whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + }, + "dependencies": { + "webidl-conversions": { + "version": "4.0.2", + "dev": true + } + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wildcard": { + "version": "2.0.0", + "dev": true + }, + "wkt-parser": { + "version": "1.3.2" + }, + "word-wrap": { + "version": "1.2.3", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2" + }, + "write-file-atomic": { + "version": "4.0.2", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "ws": { + "version": "7.5.7", + "dev": true, + "requires": {} + }, + "xml-js": { + "version": "1.6.11", + "dev": true, + "requires": { + "sax": "^1.2.4" + } + }, + "xml-name-validator": { + "version": "4.0.0", + "dev": true + }, + "xml-utils": { + "version": "1.3.0" + }, + "xml2js": { + "version": "0.4.23", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "dev": true + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==" + }, + "y18n": { + "version": "5.0.8", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yaml": { + "version": "1.10.2" + }, + "yargs": { + "version": "17.7.1", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "yargs-parser": { + "version": "21.1.1", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "dev": true + } + } +} diff --git a/package.json b/package.json index 3cef0b4a17..b604d5c452 100644 --- a/package.json +++ b/package.json @@ -160,6 +160,7 @@ "compression": "^1.7.4", "coordinate-parser": "^1.0.4", "copy-to-clipboard": "^3.3.1", + "dat.gui": "^0.7.9", "element-resize-detector": "^1.2.4", "elm-pep": "^1.0.6", "file-saver": "^2.0.2", From 791a77af883fcce7d5f3475baa636dca51e089a9 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 4 Apr 2023 09:00:33 -0400 Subject: [PATCH 71/85] Working through merge conflict issues --- config/default/common/config/wv.json/layerOrder.json | 3 --- web/js/modules/product-picker/format-config.js | 2 ++ web/js/modules/product-picker/selectors.js | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 2df687d909..8c63d6c89e 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,15 +1,12 @@ { "layerOrder": [ -<<<<<<< HEAD "ASCAT_Ocean_Surface_Wind_Speed", -======= "VIIRS_SNPP_CorrectedReflectance_TrueColor_Granule", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1_Granule", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11_Granule", "VIIRS_NOAA20_CorrectedReflectance_TrueColor_Granule", "VIIRS_NOAA20_CorrectedReflectance_BandsM11-I2-I1_Granule", "VIIRS_NOAA20_CorrectedReflectance_BandsM3-I3-M11_Granule", ->>>>>>> develop "VIIRS_SNPP_CorrectedReflectance_TrueColor", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1", diff --git a/web/js/modules/product-picker/format-config.js b/web/js/modules/product-picker/format-config.js index 8eff910ac5..516e814f09 100644 --- a/web/js/modules/product-picker/format-config.js +++ b/web/js/modules/product-picker/format-config.js @@ -110,6 +110,8 @@ export default function buildLayerFacetProps(config, selectedDate) { } layer.daynight = layer.daynight.map(capitalizeFirstLetter); } + console.log('layer'); + console.log(layer); return layer; }); } diff --git a/web/js/modules/product-picker/selectors.js b/web/js/modules/product-picker/selectors.js index 29d0097341..0327169dd3 100644 --- a/web/js/modules/product-picker/selectors.js +++ b/web/js/modules/product-picker/selectors.js @@ -16,6 +16,7 @@ const getCategoryType = ({ productPicker }) => productPicker.categoryType; export const getLayersForProjection = createSelector( [getConfig, getProjection, getSelectedDate], (config, projection, selectedDate) => { + console.log(`getProjection: ${getProjection}`); const layersWithFacetProps = buildLayerFacetProps(config, selectedDate) // Only use the layers for the active projection .filter((layer) => layer.projections[projection]) From 14b9e008e50d55d4631d01ea1c10f830479e6bb0 Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 4 Apr 2023 10:17:10 -0400 Subject: [PATCH 72/85] Fixed glsl/webpack issues, tracking layer errors --- web/js/modules/product-picker/format-config.js | 4 ++-- web/js/modules/product-picker/selectors.js | 1 - webpack.config.js | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/web/js/modules/product-picker/format-config.js b/web/js/modules/product-picker/format-config.js index 516e814f09..3062a58501 100644 --- a/web/js/modules/product-picker/format-config.js +++ b/web/js/modules/product-picker/format-config.js @@ -110,8 +110,8 @@ export default function buildLayerFacetProps(config, selectedDate) { } layer.daynight = layer.daynight.map(capitalizeFirstLetter); } - console.log('layer'); - console.log(layer); + console.log(layer.id); + console.log(layer.projections); return layer; }); } diff --git a/web/js/modules/product-picker/selectors.js b/web/js/modules/product-picker/selectors.js index 0327169dd3..29d0097341 100644 --- a/web/js/modules/product-picker/selectors.js +++ b/web/js/modules/product-picker/selectors.js @@ -16,7 +16,6 @@ const getCategoryType = ({ productPicker }) => productPicker.categoryType; export const getLayersForProjection = createSelector( [getConfig, getProjection, getSelectedDate], (config, projection, selectedDate) => { - console.log(`getProjection: ${getProjection}`); const layersWithFacetProps = buildLayerFacetProps(config, selectedDate) // Only use the layers for the active projection .filter((layer) => layer.projections[projection]) diff --git a/webpack.config.js b/webpack.config.js index 871a3ae3e2..f6d314394f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -107,8 +107,8 @@ module.exports = { test: /\.(glsl|frag|vert)$/, use: [ require.resolve('raw-loader'), - require.resolve('glslify-loader'), - ], + require.resolve('glslify-loader') + ] }, { test: /\.(sa|sc|c)ss$/, From 504383cb69991ca660d3efb836fc4d9d5e5ca0ce Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 4 Apr 2023 11:28:32 -0400 Subject: [PATCH 73/85] Removed 6 layers that did not have projections assigned which led to a crash --- config/default/common/config/wv.json/layerOrder.json | 9 +-------- web/js/modules/product-picker/format-config.js | 2 -- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 8c63d6c89e..78e2140936 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,6 +1,7 @@ { "layerOrder": [ "ASCAT_Ocean_Surface_Wind_Speed", + "OSCAR_Sea_Surface_Currents_Final", "VIIRS_SNPP_CorrectedReflectance_TrueColor_Granule", "VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1_Granule", "VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11_Granule", @@ -480,7 +481,6 @@ "SMAP_L3_Active_Sigma0_HH_QA", "SMAP_L3_Active_Sigma0_VV_QA", "SMAP_L3_Active_Sigma0_XPOL_QA", - "SMAP_L3_Active_Day_Freeze_Thaw", "SMAP_L3_Passive_Enhanced_Day_Freeze_Thaw", "SMAP_L3_Passive_Enhanced_Night_Freeze_Thaw", "SMAP_L3_Passive_Day_Freeze_Thaw", @@ -637,7 +637,6 @@ "MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI", "OSCAR_Sea_Surface_Currents_Meridional", "OSCAR_Sea_Surface_Currents_Zonal", - "OSCAR_Sea_Surface_Currents_Final", "JPL_MEaSUREs_L4_Sea_Surface_Height_Anomalies", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_GDR_Cycles", "TOPEX-Poseidon_JASON_Sea_Surface_Height_Anomalies_US_West_Coast_GAFECC", @@ -716,8 +715,6 @@ "SSMI_DMSP_F17_Rain_Rate_Over_Oceans_Descending", "SSMI_DMSP_F17_Wind_Speed_Over_Oceans_Ascending", "SSMI_DMSP_F17_Wind_Speed_Over_Oceans_Descending", - "SSMIS_Sea_Ice_Concentration", - "SSMIS_Sea_Ice_Concentration_Snow_Extent", "MISR_AM1_Ellipsoid_Radiance_RGB_AA", "MISR_AM1_Ellipsoid_Radiance_RGB_AF", "MISR_AM1_Ellipsoid_Radiance_RGB_AN", @@ -744,12 +741,8 @@ "MISR_Aerosol_Optical_Depth_Avg_Green_Monthly", "MISR_Radiance_Average_Infrared_Color_Monthly", "MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly", - "MISR_Cloud_Motion_Vector", "RSS_Merged_Wind_Climatology_Monthly", "RSS_Total_Precipitable_Water_Climatology_Monthly", - "MEaSUREs_Ice_Velocity_Greenland", - "MEaSUREs_Ice_Velocity_Antarctica", - "MEaSUREs_Sea_Ice_Snow_Extent", "LIS_ISS_Flash_Count", "LIS_ISS_Flash_Radiance", "LIS_High_Resolution_Full_Climatology_LIS_Raw_Flashes", diff --git a/web/js/modules/product-picker/format-config.js b/web/js/modules/product-picker/format-config.js index 3062a58501..8eff910ac5 100644 --- a/web/js/modules/product-picker/format-config.js +++ b/web/js/modules/product-picker/format-config.js @@ -110,8 +110,6 @@ export default function buildLayerFacetProps(config, selectedDate) { } layer.daynight = layer.daynight.map(capitalizeFirstLetter); } - console.log(layer.id); - console.log(layer.projections); return layer; }); } From 98428dc70611bdda4f39c95e1943aee29ae96e9e Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Tue, 3 Jan 2023 09:31:09 -0500 Subject: [PATCH 74/85] logging --- web/js/map/layerbuilder.js | 134 ++++++++++++++++++++-- web/js/modules/vector-styles/selectors.js | 2 + 2 files changed, 128 insertions(+), 8 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 0539326f75..77b4a6e87a 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -11,6 +11,7 @@ import MVT from 'ol/format/MVT'; import LayerVectorTile from 'ol/layer/VectorTile'; import SourceVectorTile from 'ol/source/VectorTile'; +import WebGLPointsLayer from 'ol/layer/WebGLPoints'; import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; @@ -21,6 +22,7 @@ import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; import * as dat from 'dat.gui'; // import { Point } from 'proj4'; +import Bluebird from 'bluebird'; import WindTile from '../vectorflow/renderer.js'; import { throttle } from '../vectorflow/util'; import util from '../util/util'; @@ -657,10 +659,40 @@ export default function mapLayerBuilder(config, cache, store) { }), }); - let counter = 0; + // Attempting to create a layer utilizing WebGL to improve performance + const webGLlayer = new WebGLPointsLayer({ + source: tileSource, + style: { + symbol: { + symbolType: 'triangle', + size: 18, + color: 'green', + }, + }, + // extent: layerExtent, + // renderMode: 'vector', + // preload: 0, + // ...isMaxBreakPoint && { maxResolution: breakPointResolution }, + // ...isMinBreakPoint && { minResolution: breakPointResolution }, + // style (feature, resolution) { + // return new Style({ + // image: new RegularShape({ + // size: 2, + // // points: 2, + // // radius: 10, + // // stroke: new Stroke({ + // // width: 2, + // // color: 'red', + // // }), + // // angle: 53, + // }), + // }); + // }, + }); - console.log('Creating LayerVectorTile'); - const layer = new LayerVectorTile({ + let counter = 0; + // Creating a layer with arrows, modifying color, scale & direction + const vectorlayer = new LayerVectorTile({ extent: layerExtent, source: tileSource, renderMode: 'vector', @@ -669,11 +701,7 @@ export default function mapLayerBuilder(config, cache, store) { ...isMinBreakPoint && { minResolution: breakPointResolution }, style (feature, resolution) { counter += 1; - - // console.log('style feature:'); - // console.log(feature); - - // Due to processing issues, I am only rendering every 25th feature + // Due to processing issues, I am only rendering every 15th feature if (counter % 15 !== 0) return []; // This function styles each feature individually based on the feature specific data @@ -728,6 +756,96 @@ export default function mapLayerBuilder(config, cache, store) { }, }); + // This is the style associated with misr_cloud from getCapabilities. + const misrStyle = + // 'circle-radius': { + // base: 2, + // stops: [[12, 1], [22, 7]], + // }, + // 'circle-color': [ + // 'case', + // ['<', ['get', 'magnitude'], 4.0], 'rgb(0, 7, 255)', + // ['all', ['>=', ['get', 'magnitude'], 4.0], ['<', ['get', 'magnitude'], 8.0]], 'rgb(0,143,255)', + // ['all', ['>=', ['get', 'magnitude'], 8.0], ['<', ['get', 'magnitude'], 12.0]], 'rgb(15,255,239)', + // ['all', ['>=', ['get', 'magnitude'], 12.0], ['<', ['get', 'magnitude'], 16.0]], 'rgb(151,255,103)', + // ['all', ['>=', ['get', 'magnitude'], 16.0], ['<', ['get', 'magnitude'], 20.0]], 'rgb(255,223,0)', + // ['all', ['>=', ['get', 'magnitude'], 20.0], ['<', ['get', 'magnitude'], 24.0]], 'rgb(255,91,0)', + // ['all', ['>=', ['get', 'magnitude'], 24.0], ['<', ['get', 'magnitude'], 28.0]], 'rgb(206,0,0)', + // 'rgb(131,0,0)', + // ], + + [ + new Style({ + image: new RegularShape({ + points: 2, + radius: 10, + stroke: new Stroke({ + width: 2, + color: 'red', + }), + angle: 45, + }), + }), + ]; + + // Creating a layer with cones, modifying color, scale & direction + const vectorlayerCones = new LayerVectorTile({ + extent: layerExtent, + source: tileSource, + renderMode: 'vector', + preload: 0, + ...isMaxBreakPoint && { maxResolution: breakPointResolution }, + ...isMinBreakPoint && { minResolution: breakPointResolution }, + style (feature, resolution) { + console.log(feature); + counter += 1; + // Due to processing issues, I am only rendering every 15th feature + if (counter % 15 !== 0) return []; + + // This function styles each feature individually based on the feature specific data + let arrowSizeMultiplier; + let arrowColor; + let radianDirection = feature.get('direction'); + const magnitude = feature.get('magnitude'); + + // If OSCAR/ASCAT we need to adjust the radian angle + // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize + if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { + radianDirection -= 180; + } + + // Adjust color & arrow length based on magnitude + if (magnitude < 0.08) { + arrowColor = 'red'; + arrowSizeMultiplier = 1; + } else if (magnitude < 0.17) { + arrowColor = 'blue'; + arrowSizeMultiplier = 1.25; + } else { + arrowColor = 'green'; + arrowSizeMultiplier = 1.5; + } + + return [ + // The Cone + new Style({ + image: new RegularShape({ + scale: [1, 4], // width, height + points: 3, + radius: 5 * arrowSizeMultiplier, + angle: radianDirection, + fill: new Fill({ + color: arrowColor, + }), + }), + }), + ]; + }, + }); + + // Select the layer to load (vectorlayer, webGLLayer, vectorlayerCones) + const layer = vectorlayer; + console.log('Applying style'); applyStyle(def, layer, state, layeroptions); layer.wrap = day; diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index f69b51b825..2b2e335ae6 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -120,6 +120,8 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) return; } + console.log(glStyle); + if (!layer || layer.isWMS) { return; // WMS breakpoint tile } From a0cf49c619ff71948256f4f3858410b366e5e76f Mon Sep 17 00:00:00 2001 From: Tom Cariello Date: Mon, 23 Jan 2023 11:55:57 -0500 Subject: [PATCH 75/85] Config adjustments --- .../oscar/OSCAR_Sea_Surface_Currents_Final.md | 2 +- .../OSCAR_Sea_Surface_Currents_Final.json | 15 ++-- .../components/layer/settings/vector-style.js | 1 + web/js/map/layerbuilder.js | 75 ++++++++----------- web/js/modules/vector-styles/actions.js | 1 + web/js/modules/vector-styles/selectors.js | 40 +++++++--- web/js/modules/vector-styles/util.js | 1 + 7 files changed, 73 insertions(+), 62 deletions(-) diff --git a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md index e16343d996..df7c8a5214 100644 --- a/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md +++ b/config/default/common/config/metadata/layers/oscar/OSCAR_Sea_Surface_Currents_Final.md @@ -1 +1 @@ -OSCAR_Sea_Surface_Currents_Final description \ No newline at end of file +OSCAR_Sea_Surface_Currents description \ No newline at end of file diff --git a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json index 6e6eadde16..13e3b962d5 100644 --- a/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json +++ b/config/default/common/config/wv.json/layers/oscar/OSCAR_Sea_Surface_Currents_Final.json @@ -2,16 +2,19 @@ "layers": { "OSCAR_Sea_Surface_Currents_Final": { "id": "OSCAR_Sea_Surface_Currents_Final", - "title": "OSCAR_Sea_Surface_Currents_Final", - "subtitle": "OSCAR_Sea_Surface_Currents_Final subtitle", - "description": "OSCAR_Sea_Surface_Currents_Final description", + "description": "OSCAR_Sea_Surface_Currents description", "tags": "", "group": "overlays", - "type": "vector", "layergroup": "Vectors", + + "title": "OSCAR_Sea_Surface_Currents_Final", + "subtitle": "OSCAR_Sea_Surface_Currents subtitle", + "type": "vector", + "vectorStyle": { - "id": "OSCAR_Sea_Surface_Currents_Final" + "id": "OSCAR_Sea_Surface_Currents" }, + "transition": true, "projections": { "geographic": { @@ -20,4 +23,4 @@ } } } -} \ No newline at end of file +} diff --git a/web/js/components/layer/settings/vector-style.js b/web/js/components/layer/settings/vector-style.js index 2cf757cef8..670677d466 100644 --- a/web/js/components/layer/settings/vector-style.js +++ b/web/js/components/layer/settings/vector-style.js @@ -140,6 +140,7 @@ class VectorStyleSelect extends React.Component { const { index, vectorStyles, layer } = this.props; const vectorStyleId = layer.vectorStyle.id; const vectorStyle = vectorStyles[vectorStyleId]; + console.log('vectorStyles['); const vectorStyleLayers = vectorStyle.layers; const uniqueStyleLayers = vectorStyleLayers.filter((a) => { diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 77b4a6e87a..21ecb0db95 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -629,12 +629,20 @@ export default function mapLayerBuilder(config, cache, store) { } } - const layerName = def.layer || def.id; + let layerName = def.layer || def.id; + console.log(`layerName: ${layerName}`); + if (layerName === 'OSCAR_Sea_Surface_Currents_Final') { + layerName = 'OSCAR_Sea_Surface_Currents'; + } const tileMatrixSet = def.matrixSet; date = layeroptions.date || getSelectedDate(state); if (day && def.wrapadjacentdays) date = util.dateAdd(date, 'day', day); - const urlParameters = createVectorUrl(date, layerName, tileMatrixSet); + let urlParameters = createVectorUrl(date, layerName, tileMatrixSet); + console.log(`url: ${urlParameters}`); + if (layerName === 'OSCAR_Sea_Surface_Currents') { + urlParameters = urlParameters.replace('OSCAR_Sea_Surface_Currents', 'OSCAR_Sea_Surface_Currents_Final'); + } const wrapX = !!(day === 1 || day === -1); const breakPointLayerDef = def.breakPointLayer; const breakPointResolution = lodashGet(def, `breakPointLayer.projections.${proj.id}.resolutionBreakPoint`); @@ -700,6 +708,7 @@ export default function mapLayerBuilder(config, cache, store) { ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, style (feature, resolution) { + // console.log(feature); counter += 1; // Due to processing issues, I am only rendering every 15th feature if (counter % 15 !== 0) return []; @@ -707,15 +716,9 @@ export default function mapLayerBuilder(config, cache, store) { // This function styles each feature individually based on the feature specific data let arrowSizeMultiplier; let arrowColor; - let radianDirection = feature.get('direction'); + const radianDirection = feature.get('direction'); const magnitude = feature.get('magnitude'); - // If OSCAR/ASCAT we need to adjust the radian angle - // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize - if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { - radianDirection -= 180; - } - // Adjust color & arrow length based on magnitude if (magnitude < 0.08) { arrowColor = 'red'; @@ -757,36 +760,19 @@ export default function mapLayerBuilder(config, cache, store) { }); // This is the style associated with misr_cloud from getCapabilities. - const misrStyle = - // 'circle-radius': { - // base: 2, - // stops: [[12, 1], [22, 7]], - // }, - // 'circle-color': [ - // 'case', - // ['<', ['get', 'magnitude'], 4.0], 'rgb(0, 7, 255)', - // ['all', ['>=', ['get', 'magnitude'], 4.0], ['<', ['get', 'magnitude'], 8.0]], 'rgb(0,143,255)', - // ['all', ['>=', ['get', 'magnitude'], 8.0], ['<', ['get', 'magnitude'], 12.0]], 'rgb(15,255,239)', - // ['all', ['>=', ['get', 'magnitude'], 12.0], ['<', ['get', 'magnitude'], 16.0]], 'rgb(151,255,103)', - // ['all', ['>=', ['get', 'magnitude'], 16.0], ['<', ['get', 'magnitude'], 20.0]], 'rgb(255,223,0)', - // ['all', ['>=', ['get', 'magnitude'], 20.0], ['<', ['get', 'magnitude'], 24.0]], 'rgb(255,91,0)', - // ['all', ['>=', ['get', 'magnitude'], 24.0], ['<', ['get', 'magnitude'], 28.0]], 'rgb(206,0,0)', - // 'rgb(131,0,0)', - // ], - - [ - new Style({ - image: new RegularShape({ - points: 2, - radius: 10, - stroke: new Stroke({ - width: 2, - color: 'red', - }), - angle: 45, - }), - }), - ]; + const misrStyle = [ + new Style({ + image: new RegularShape({ + points: 2, + radius: 10, + stroke: new Stroke({ + width: 2, + color: 'red', + }), + angle: 45, + }), + }), + ]; // Creating a layer with cones, modifying color, scale & direction const vectorlayerCones = new LayerVectorTile({ @@ -805,14 +791,14 @@ export default function mapLayerBuilder(config, cache, store) { // This function styles each feature individually based on the feature specific data let arrowSizeMultiplier; let arrowColor; - let radianDirection = feature.get('direction'); + const radianDirection = feature.get('direction'); const magnitude = feature.get('magnitude'); // If OSCAR/ASCAT we need to adjust the radian angle // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize - if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { - radianDirection -= 180; - } + // if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { + // radianDirection -= 180; + // } // Adjust color & arrow length based on magnitude if (magnitude < 0.08) { @@ -845,9 +831,10 @@ export default function mapLayerBuilder(config, cache, store) { // Select the layer to load (vectorlayer, webGLLayer, vectorlayerCones) const layer = vectorlayer; + console.log(layer); - console.log('Applying style'); applyStyle(def, layer, state, layeroptions); + console.log(layer); layer.wrap = day; layer.wv = attributes; layer.isVector = true; diff --git a/web/js/modules/vector-styles/actions.js b/web/js/modules/vector-styles/actions.js index a12d1a8ef9..0714ce2816 100644 --- a/web/js/modules/vector-styles/actions.js +++ b/web/js/modules/vector-styles/actions.js @@ -16,6 +16,7 @@ import { * @param {String} groupName | layer group string */ export function setFilterRange(layerId, props, index, groupName) { + console.log('setfilterrange'); return (dispatch, getState) => { const state = getState(); const newActiveVectorStylesObj = setRangeSelector( diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index 2b2e335ae6..eb751ebd9b 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -16,9 +16,8 @@ import { } from '../layers/selectors'; /** - * Get OpenLayers layers from state that were created from WV vector - * layer definiteions. NOTE: This currently also will include the associate WMS - * breakpoint layers as well. + * Get OpenLayers layers from state that were created from WV vector layer + * definitions. NOTE: This includes the associated WMS breakpoint layers as well. * * @param {*} state * @returns @@ -67,6 +66,7 @@ export function getAllVectorStyles(layerId, index, state) { vectorStyle = vectorStyle.layers[index]; } } + return vectorStyle; } @@ -107,19 +107,17 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleId = lodashGet(def, `vectorStyle.${proj.id}.id`) || vectorStyleId || lodashGet(def, 'vectorStyle.id') || layerId; const glStyle = vectorStyles[styleId]; - // OSCAR_Cloud & ASCAT_Ocean_Surface_Wind_Speed do not include a glStyle from /getCapabilities yet, - // so we early return here so we can apply our own styling. Ultimately these styles will be served from - // the provider(s) and this check will go away. if (glStyle === undefined) { + console.log('glStyle not found!!'); return; } - // This is temporary until the ASCAT JSON files from /getCapabilities are updated with - // the appropriate vector style name. - if (glStyle.name === 'OSCAR_Sea_Surface_Currents') { - return; + // Custom dealing with OSCAR + if (styleId === 'OSCAR_Sea_Surface_Currents') { + // return here if we want to apply our custom arrow styling (NOT the glStyle) + // return; } - + console.log('glStyle'); console.log(glStyle); if (!layer || layer.isWMS) { @@ -133,8 +131,24 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state) const styleFunction = stylefunction(layer, glStyle, layerId, resolutions); const selectedFeatures = selected[layerId]; + // Explore layer data! + // const maxNumberToPrint = 500; + // if (glStyle.name === 'OSCAR_Sea_Surface_Currents' || glStyle.name === 'MISR_Cloud_Motion_Vector') { + // let count = 0; + // console.log('listing features'); + // layer.setStyle((feature, resolution) => { + // count += 1; + // if (count < maxNumberToPrint) { + // console.log(feature.flatCoordinates_); + // } + // return styleFunction(feature, resolution); + // }); + // } + + // Handle selected feature style if ((glStyle.name !== 'Orbit Tracks') && selectedFeatures) { + console.log('handle features'); const extentStartX = layer.getExtent()[0]; const acceptableExtent = extentStartX === 180 ? [-180, -90, -110, 90] @@ -190,12 +204,16 @@ export function getKey(layerId, groupStr, state) { export function isActive(layerId, group, state) { group = group || state.compare.activeString; + if (layerId === 'OSCAR_Sea_Surface_Currents_Final') { + layerId = 'OSCAR_Sea_Surface_Currents'; + } if (state.vectorStyles.custom[layerId]) { return state.vectorStyles[group][layerId]; } } export function clearStyleFunction(def, vectorStyleId, vectorStyles, layer, state) { + console.log('clearStyleFunction'); const layerId = def.id; const glStyle = vectorStyles[layerId]; const olMap = lodashGet(state, 'legacy.map.ui.selected'); diff --git a/web/js/modules/vector-styles/util.js b/web/js/modules/vector-styles/util.js index 6c55ca7426..9e5413e5ef 100644 --- a/web/js/modules/vector-styles/util.js +++ b/web/js/modules/vector-styles/util.js @@ -336,6 +336,7 @@ export function updateVectorSelection(selectionObj, lastSelection, layers, type, const def = lodashFind(layers, { id: key }); if (!def) return; const olLayer = vectorLayers.find((layer) => layer.wv.id === key); + console.log('calling stylefunction...'); setStyleFunction(def, def.vectorStyle.id, vectorStyles, olLayer, state); } } From 5187b67dd37e2fc2250aef8e4f9bfe7b01216a26 Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Tue, 4 Apr 2023 14:20:34 -0400 Subject: [PATCH 76/85] Improved arrows significantly --- web/js/keys/keys.js | 4 ++ web/js/map/layerbuilder.js | 141 +++++++++++++++++++++++-------------- 2 files changed, 94 insertions(+), 51 deletions(-) create mode 100644 web/js/keys/keys.js diff --git a/web/js/keys/keys.js b/web/js/keys/keys.js new file mode 100644 index 0000000000..47d89ee61f --- /dev/null +++ b/web/js/keys/keys.js @@ -0,0 +1,4 @@ +const clientId = 'nope'; +const clientSecret = 'secret'; + +export { clientId, clientSecret }; diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 3da99e1348..6133ae2c2c 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -16,10 +16,12 @@ import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; import lodashGet from 'lodash/get'; import { Style, RegularShape } from 'ol/style'; +import Draw from 'ol/interaction/Draw.js'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; import * as dat from 'dat.gui'; // import { Point } from 'proj4'; +import Polygon from 'ol/geom/Polygon.js'; import WindTile from '../vectorflow/renderer.js'; import { throttle } from '../vectorflow/util'; import util from '../util/util'; @@ -50,7 +52,7 @@ import { export default function mapLayerBuilder(config, cache, store) { const { getGranuleLayer } = granuleLayerBuilder(cache, store, createLayerWMTS); - const renderAnimation = true; + const renderParticleFlow = false; const vectorLayers = ['ASCAT_Ocean_Surface_Wind_Speed', 'MISR_Cloud_Motion_Vector', 'OSCAR_Sea_Surface_Currents_Final']; /** @@ -448,7 +450,7 @@ export default function mapLayerBuilder(config, cache, store) { const animateVectors = function(layerName, tileSource, selected, layer) { const animationAllowed = vectorLayers.indexOf(layerName) > -1; - if (animationAllowed && renderAnimation) { + if (animationAllowed && renderParticleFlow) { const canvasElem = document.querySelectorAll('canvas'); if (canvasElem.length > 0) { // Add z-index property to existing OL canvas. This ensures that the visualization is on the top layer. @@ -618,62 +620,99 @@ export default function mapLayerBuilder(config, cache, store) { style (feature, resolution) { counter += 1; - console.log('style feature:'); - console.log(feature); - - // Due to processing issues, I am only rendering every 25th feature if (counter % 15 !== 0) return []; // This function styles each feature individually based on the feature specific data - let arrowSizeMultiplier; - let arrowColor; - let radianDirection = feature.get('direction'); // was "dir" + // let arrowSizeMultiplier; + // let arrowColor; + const radianDirection = feature.get('direction'); // was "dir" const magnitude = feature.get('magnitude'); // was "speed" - // If OSCAR/ASCAT we need to adjust the radian angle - // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize - if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { - radianDirection -= 180; - } - - // Adjust color & arrow length based on magnitude - if (magnitude < 0.08) { - arrowColor = 'red'; - arrowSizeMultiplier = 1; - } else if (magnitude < 0.17) { - arrowColor = 'blue'; - arrowSizeMultiplier = 1.25; - } else { - arrowColor = 'green'; - arrowSizeMultiplier = 1.5; - } - - // The arrow shaft - return [ - new Style({ - image: new RegularShape({ - points: 2, - radius: 10 * arrowSizeMultiplier, - stroke: new Stroke({ - width: 2, - color: arrowColor, - }), - angle: radianDirection, - }), + // // If OSCAR/ASCAT we need to adjust the radian angle + // // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize + // if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { + // radianDirection -= 180; + // } + + // // Adjust color & arrow length based on magnitude + // if (magnitude < 0.08) { + // arrowColor = 'red'; + // arrowSizeMultiplier = 1; + // } else if (magnitude < 0.17) { + // arrowColor = 'blue'; + // arrowSizeMultiplier = 1.25; + // } else { + // arrowColor = 'green'; + // arrowSizeMultiplier = 1.5; + // } + + // // The arrow shaft + // const arrowShape = [ + // new Style({ + // image: new RegularShape({ + // points: 2, + // radius: 10 * arrowSizeMultiplier, + // displacement: [10, 0], + // stroke: new Stroke({ + // width: 2, + // color: arrowColor, + // }), + // angle: radianDirection, + // }), + // }), + // // The arrow head + // new Style({ + // image: new RegularShape({ + // points: 3, + // radius: 5 * arrowSizeMultiplier, + // angle: radianDirection, + // // displacement: [5, 25], + // fill: new Fill({ + // color: arrowColor, + // }), + // }), + // }), + // ]; + // return arrowShape; + + // arrow attempt #2 + // https://openlayers.org/en/latest/examples/wind-arrows.html + const shaft = new RegularShape({ + points: 2, + radius: 5, + stroke: new Stroke({ + width: 2, + color: 'yellow', }), - // The arrow head - new Style({ - image: new RegularShape({ - points: 3, - radius: 5 * arrowSizeMultiplier, - angle: radianDirection, - fill: new Fill({ - color: arrowColor, - }), - }), + rotateWithView: true, + }); + + const head = new RegularShape({ + points: 3, + radius: 5, + fill: new Fill({ + color: 'yellow', }), - ]; + rotateWithView: true, + }); + + const styles = [new Style({ image: shaft }), new Style({ image: head })]; + + // const wind = feature.get('wind'); + // rotate arrow away from wind origin + // const angle = ((wind.deg - 180) * Math.PI) / 180; + // const scale = wind.speed / 10; + const angle = ((radianDirection - 180) * Math.PI) / 180; + const scale = magnitude * 10; + shaft.setScale([1, scale]); + shaft.setRotation(angle); + head.setDisplacement([ + 0, + head.getRadius() / 2 + shaft.getRadius() * scale, + ]); + head.setRotation(angle); + return styles; }, }); @@ -684,7 +723,7 @@ export default function mapLayerBuilder(config, cache, store) { layer.isVector = true; const animationAllowed = vectorLayers.indexOf(layerName) > -1; - if (animationAllowed && renderAnimation) { + if (animationAllowed && renderParticleFlow) { animateVectors(layerName, tileSource, selected, layer); } From 75c813d4c69104f2b2e6d852e036a683c33f68fd Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Tue, 4 Apr 2023 15:45:37 -0400 Subject: [PATCH 77/85] Clean up, arrow style improved, color gradient work in progress --- web/js/map/layerbuilder.js | 115 +++++++++++++++---------------------- 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index 6133ae2c2c..d00f616c4b 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -550,7 +550,6 @@ export default function mapLayerBuilder(config, cache, store) { throw new Error(`${def.id}: Undefined matrix set: ${def.matrixSet}`); } - console.log(def); // ASCAT does not have def.matrixIds data if (typeof def.matrixIds === 'undefined') { matrixIds = []; @@ -586,7 +585,6 @@ export default function mapLayerBuilder(config, cache, store) { const isMaxBreakPoint = breakPointType === 'max'; const isMinBreakPoint = breakPointType === 'min'; - console.log(tileMatrixSet); const tileSource = new SourceVectorTile({ url: source.url + urlParameters, layer: layerName, @@ -606,10 +604,6 @@ export default function mapLayerBuilder(config, cache, store) { let counter = 0; - // ASCAT errors out but not sure why yet. OSCAR & MISR work properly - // ol.layer.VectorTile - console.log('Creating LayerVectorTile'); - const layer = new LayerVectorTile({ extent: layerExtent, source: tileSource, @@ -620,91 +614,53 @@ export default function mapLayerBuilder(config, cache, store) { style (feature, resolution) { counter += 1; - // Due to processing issues, I am only rendering every 25th feature - if (counter % 15 !== 0) return []; + // Due to the large number of points to render for OSCAR, I am only rendering every 25th feature + if (counter % 25 !== 0) return []; // This function styles each feature individually based on the feature specific data - // let arrowSizeMultiplier; - // let arrowColor; + let arrowSizeMultiplier; const radianDirection = feature.get('direction'); // was "dir" const magnitude = feature.get('magnitude'); // was "speed" - // // If OSCAR/ASCAT we need to adjust the radian angle - // // OSCAR/ASCAT are in 0-360 format while MISR is in -180 to 180, so we need to normalize - // if (layerName === 'ASCAT_Ocean_Surface_Wind_Speed' || layerName === 'OSCAR_Sea_Surface_Currents_Final') { - // radianDirection -= 180; - // } - - // // Adjust color & arrow length based on magnitude - // if (magnitude < 0.08) { - // arrowColor = 'red'; - // arrowSizeMultiplier = 1; - // } else if (magnitude < 0.17) { - // arrowColor = 'blue'; - // arrowSizeMultiplier = 1.25; - // } else { - // arrowColor = 'green'; - // arrowSizeMultiplier = 1.5; - // } - - // // The arrow shaft - // const arrowShape = [ - // new Style({ - // image: new RegularShape({ - // points: 2, - // radius: 10 * arrowSizeMultiplier, - // displacement: [10, 0], - // stroke: new Stroke({ - // width: 2, - // color: arrowColor, - // }), - // angle: radianDirection, - // }), - // }), - // // The arrow head - // new Style({ - // image: new RegularShape({ - // points: 3, - // radius: 5 * arrowSizeMultiplier, - // angle: radianDirection, - // // displacement: [5, 25], - // fill: new Fill({ - // color: arrowColor, - // }), - // }), - // }), - // ]; - // return arrowShape; - - // arrow attempt #2 + // This returns an array, but doesn't render. Too slow?? + let arrowColor = colorGradient(magnitude); + + // Adjust color & arrow length based on magnitude + if (magnitude < 0.08) { + arrowColor = [255, 0, 0]; + arrowSizeMultiplier = 1; + } else if (magnitude < 0.17) { + arrowColor = [0, 0, 255]; + arrowSizeMultiplier = 1.25; + } else { + arrowColor = [0, 255, 0]; + arrowSizeMultiplier = 1.5; + } + console.log(`arrowColor2: ${arrowColor}`); + // https://openlayers.org/en/latest/examples/wind-arrows.html const shaft = new RegularShape({ points: 2, radius: 5, stroke: new Stroke({ - width: 2, - color: 'yellow', + width: 4, + color: arrowColor, }), rotateWithView: true, }); const head = new RegularShape({ points: 3, - radius: 5, + radius: 8, fill: new Fill({ - color: 'yellow', + color: arrowColor, }), rotateWithView: true, }); const styles = [new Style({ image: shaft }), new Style({ image: head })]; - - // const wind = feature.get('wind'); - // rotate arrow away from wind origin - // const angle = ((wind.deg - 180) * Math.PI) / 180; - // const scale = wind.speed / 10; const angle = ((radianDirection - 180) * Math.PI) / 180; - const scale = magnitude * 10; + const scale = (magnitude + 1) * arrowSizeMultiplier; shaft.setScale([1, scale]); shaft.setRotation(angle); head.setDisplacement([ @@ -716,7 +672,28 @@ export default function mapLayerBuilder(config, cache, store) { }, }); - console.log('Applying style'); + function colorGradient(fadeFraction) { + const color1 = { + red: 19, green: 233, blue: 19, + }; + const color2 = { + red: 255, green: 255, blue: 0, + }; + const fade = fadeFraction; + + const diffRed = color2.red - color1.red; + const diffGreen = color2.green - color1.green; + const diffBlue = color2.blue - color1.blue; + + const gradient = { + red: parseInt(Math.floor(color1.red + (diffRed * fade)), 10), + green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10), + blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10), + }; + console.log('returning'); + return [gradient.red, gradient.green, gradient.blue]; + } + applyStyle(def, layer, state, layeroptions); layer.wrap = day; layer.wv = attributes; From 8f9ee8c561e1e1e97302d93138a70bde93328324 Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Wed, 5 Apr 2023 09:51:01 -0400 Subject: [PATCH 78/85] Vector Arrow style improved & gradient colors based on magnitude --- web/js/map/layerbuilder.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index d00f616c4b..59f4346215 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -623,20 +623,19 @@ export default function mapLayerBuilder(config, cache, store) { const magnitude = feature.get('magnitude'); // was "speed" // This returns an array, but doesn't render. Too slow?? - let arrowColor = colorGradient(magnitude); + const arrowColor = colorGradient(magnitude); // Adjust color & arrow length based on magnitude if (magnitude < 0.08) { - arrowColor = [255, 0, 0]; + // arrowColor = [255, 0, 0]; arrowSizeMultiplier = 1; } else if (magnitude < 0.17) { - arrowColor = [0, 0, 255]; + // arrowColor = [0, 0, 255]; arrowSizeMultiplier = 1.25; } else { - arrowColor = [0, 255, 0]; + // arrowColor = [0, 255, 0]; arrowSizeMultiplier = 1.5; } - console.log(`arrowColor2: ${arrowColor}`); // https://openlayers.org/en/latest/examples/wind-arrows.html const shaft = new RegularShape({ @@ -674,13 +673,24 @@ export default function mapLayerBuilder(config, cache, store) { function colorGradient(fadeFraction) { const color1 = { - red: 19, green: 233, blue: 19, + red: 0, green: 255, blue: 0, }; const color2 = { - red: 255, green: 255, blue: 0, + red: 255, green: 0, blue: 0, }; + // const color3 = { + // red: 255, green: 0, blue: 0, + // }; + const fade = fadeFraction; + // Find which interval to use and adjust the fade percentage + // if (fade >= 1) { + // fade -= 1; + // color1 = color2; + // color2 = color3; + // } + const diffRed = color2.red - color1.red; const diffGreen = color2.green - color1.green; const diffBlue = color2.blue - color1.blue; @@ -690,7 +700,6 @@ export default function mapLayerBuilder(config, cache, store) { green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10), blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10), }; - console.log('returning'); return [gradient.red, gradient.green, gradient.blue]; } From 059eed4634863cf55401d229275f66331b6fb626 Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Thu, 13 Apr 2023 11:24:56 -0400 Subject: [PATCH 79/85] Refactoring & modification of the vector arrow gradient. --- web/js/map/layerbuilder.js | 41 +------------------------------------- web/js/vectorflow/util.js | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index e8ba8856b3..fcf15ea4b4 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -12,7 +12,6 @@ import MVT from 'ol/format/MVT'; import LayerVectorTile from 'ol/layer/VectorTile'; import SourceVectorTile from 'ol/source/VectorTile'; import WebGLPointsLayer from 'ol/layer/WebGLPoints'; - import lodashCloneDeep from 'lodash/cloneDeep'; import lodashMerge from 'lodash/merge'; import lodashEach from 'lodash/each'; @@ -21,6 +20,7 @@ import { Style, RegularShape } from 'ol/style'; import Stroke from 'ol/style/Stroke'; import Fill from 'ol/style/Fill'; import * as dat from 'dat.gui'; +import { colorGradient } from '../vectorflow/util'; import WindTile from '../vectorflow/renderer.js'; import { throttle } from '../vectorflow/util'; import util from '../util/util'; @@ -706,29 +706,22 @@ export default function mapLayerBuilder(config, cache, store) { ...isMaxBreakPoint && { maxResolution: breakPointResolution }, ...isMinBreakPoint && { minResolution: breakPointResolution }, style (feature, resolution) { - // console.log(feature); counter += 1; // Due to the large number of points to render for OSCAR, I am only rendering every 25th feature if (counter % 25 !== 0) return []; - // This function styles each feature individually based on the feature specific data let arrowSizeMultiplier; const radianDirection = feature.get('direction'); // was "dir" const magnitude = feature.get('magnitude'); // was "speed" - - // This returns an array, but doesn't render. Too slow?? const arrowColor = colorGradient(magnitude); // Adjust color & arrow length based on magnitude if (magnitude < 0.08) { - // arrowColor = [255, 0, 0]; arrowSizeMultiplier = 1; } else if (magnitude < 0.17) { - // arrowColor = [0, 0, 255]; arrowSizeMultiplier = 1.25; } else { - // arrowColor = [0, 255, 0]; arrowSizeMultiplier = 1.5; } @@ -766,38 +759,6 @@ export default function mapLayerBuilder(config, cache, store) { }, }); - function colorGradient(fadeFraction) { - const color1 = { - red: 0, green: 255, blue: 0, - }; - const color2 = { - red: 255, green: 0, blue: 0, - }; - // const color3 = { - // red: 255, green: 0, blue: 0, - // }; - - const fade = fadeFraction; - - // Find which interval to use and adjust the fade percentage - // if (fade >= 1) { - // fade -= 1; - // color1 = color2; - // color2 = color3; - // } - - const diffRed = color2.red - color1.red; - const diffGreen = color2.green - color1.green; - const diffBlue = color2.blue - color1.blue; - - const gradient = { - red: parseInt(Math.floor(color1.red + (diffRed * fade)), 10), - green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10), - blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10), - }; - return [gradient.red, gradient.green, gradient.blue]; - } - applyStyle(def, layer, state, layeroptions); console.log(layer); layer.wrap = day; diff --git a/web/js/vectorflow/util.js b/web/js/vectorflow/util.js index 914155ea28..b9d8796d71 100644 --- a/web/js/vectorflow/util.js +++ b/web/js/vectorflow/util.js @@ -43,3 +43,24 @@ export function throttle(fn, wait) { } }; } + +export function colorGradient(fadeFraction) { + const color1 = { + red: 246, green: 219, blue: 160, + }; + const color2 = { + red: 245, green: 165, blue: 157, + }; + + const fade = fadeFraction; + const diffRed = color2.red - color1.red; + const diffGreen = color2.green - color1.green; + const diffBlue = color2.blue - color1.blue; + + const gradient = { + red: parseInt(Math.floor(color1.red + (diffRed * fade)), 10), + green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10), + blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10), + }; + return [gradient.red, gradient.green, gradient.blue]; +} From ff7bd94f68800bc6a066a6f63d59af212efb473c Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Mon, 2 Oct 2023 16:33:27 -0400 Subject: [PATCH 80/85] Removed remnant of merge commit --- config/default/common/config/wv.json/layerOrder.json | 2 -- schemas/layer-config.json | 2 -- 2 files changed, 4 deletions(-) diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index 269408d301..ebbf81e509 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,7 +1,5 @@ { "layerOrder": [ - "ASCAT_Ocean_Surface_Wind_Speed", - "OSCAR_Sea_Surface_Currents_Final", "HLS_S30_Nadir_BRDF_Adjusted_Reflectance", "HLS_L30_Nadir_BRDF_Adjusted_Reflectance", "HLS_Customizable_Landsat", diff --git a/schemas/layer-config.json b/schemas/layer-config.json index 10f793243e..e34ee497a0 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -176,8 +176,6 @@ "Urban Expansion", "Urban Extents", "Vectors", - "ASCAT_Ocean_Surface_Wind_Speed", - "OSCAR_Sea_Surface_Currents_Final", "MISR_Cloud_Motion_Vector", "Vegetation Indices", "Vegetation Light Use Efficiency", From 38e30939a9682808e21264b6a92e393a347ba3f7 Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Mon, 2 Oct 2023 16:51:44 -0400 Subject: [PATCH 81/85] Removed remnant of merge commit --- config/default/release/config/wv.json/sources.json | 1 - 1 file changed, 1 deletion(-) diff --git a/config/default/release/config/wv.json/sources.json b/config/default/release/config/wv.json/sources.json index d1b4360c32..c457f7ee77 100644 --- a/config/default/release/config/wv.json/sources.json +++ b/config/default/release/config/wv.json/sources.json @@ -89,7 +89,6 @@ "matrixHeight": 1280 } ] ->>>>>>> develop } } } From 0b321b5d87ca9af0cbf0e95a657484a022e35fb9 Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Mon, 2 Oct 2023 17:06:11 -0400 Subject: [PATCH 82/85] Building again with latest from develop --- config/default/common/config/wv.json/layerOrder.json | 2 ++ schemas/layer-config.json | 2 ++ web/js/modules/vector-styles/selectors.js | 2 +- web/js/vectorflow/util.js | 5 +++-- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/config/default/common/config/wv.json/layerOrder.json b/config/default/common/config/wv.json/layerOrder.json index ebbf81e509..269408d301 100644 --- a/config/default/common/config/wv.json/layerOrder.json +++ b/config/default/common/config/wv.json/layerOrder.json @@ -1,5 +1,7 @@ { "layerOrder": [ + "ASCAT_Ocean_Surface_Wind_Speed", + "OSCAR_Sea_Surface_Currents_Final", "HLS_S30_Nadir_BRDF_Adjusted_Reflectance", "HLS_L30_Nadir_BRDF_Adjusted_Reflectance", "HLS_Customizable_Landsat", diff --git a/schemas/layer-config.json b/schemas/layer-config.json index e34ee497a0..10f793243e 100644 --- a/schemas/layer-config.json +++ b/schemas/layer-config.json @@ -176,6 +176,8 @@ "Urban Expansion", "Urban Extents", "Vectors", + "ASCAT_Ocean_Surface_Wind_Speed", + "OSCAR_Sea_Surface_Currents_Final", "MISR_Cloud_Motion_Vector", "Vegetation Indices", "Vegetation Light Use Efficiency", diff --git a/web/js/modules/vector-styles/selectors.js b/web/js/modules/vector-styles/selectors.js index c64bcfd989..7e85e89dbc 100644 --- a/web/js/modules/vector-styles/selectors.js +++ b/web/js/modules/vector-styles/selectors.js @@ -157,7 +157,7 @@ export function setStyleFunction(def, vectorStyleId, vectorStyles, layer, state, // Custom dealing with OSCAR if (styleId === 'OSCAR_Sea_Surface_Currents') { // return here if we want to apply our custom arrow styling (NOT the glStyle) - // return; + return; } console.log('glStyle'); console.log(glStyle); diff --git a/web/js/vectorflow/util.js b/web/js/vectorflow/util.js index b9d8796d71..cf80d1d748 100644 --- a/web/js/vectorflow/util.js +++ b/web/js/vectorflow/util.js @@ -44,12 +44,13 @@ export function throttle(fn, wait) { }; } +// Establish color gradient to differentiate lower & higher magnitudes export function colorGradient(fadeFraction) { const color1 = { - red: 246, green: 219, blue: 160, + red: 100, green: 100, blue: 100, }; const color2 = { - red: 245, green: 165, blue: 157, + red: 255, green: 255, blue: 255, }; const fade = fadeFraction; From c03999500f434a1e6dd00f8d4edc2e6eadfa4740 Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Tue, 3 Oct 2023 14:08:49 -0400 Subject: [PATCH 83/85] Improved vector point gradient --- web/js/map/layerbuilder.js | 6 ++---- web/js/vectorflow/util.js | 22 ++++++++++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index fe1a0152e6..cef26fa6a7 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -806,7 +806,6 @@ export default function mapLayerBuilder(config, cache, store) { } let layerName = def.layer || def.id; - console.log(`layerName: ${layerName}`); if (layerName === 'OSCAR_Sea_Surface_Currents_Final') { layerName = 'OSCAR_Sea_Surface_Currents'; } @@ -815,7 +814,6 @@ export default function mapLayerBuilder(config, cache, store) { if (day && def.wrapadjacentdays) date = util.dateAdd(date, 'day', day); let urlParameters = createVectorUrl(date, layerName, tileMatrixSet); - console.log(`url: ${urlParameters}`); if (layerName === 'OSCAR_Sea_Surface_Currents') { urlParameters = urlParameters.replace('OSCAR_Sea_Surface_Currents', 'OSCAR_Sea_Surface_Currents_Final'); } @@ -887,7 +885,7 @@ export default function mapLayerBuilder(config, cache, store) { counter += 1; // Due to the large number of points to render for OSCAR, I am only rendering every 25th feature - if (counter % 25 !== 0) return []; + if (counter % 15 !== 0) return []; let arrowSizeMultiplier; const radianDirection = feature.get('direction'); // was "dir" @@ -908,7 +906,7 @@ export default function mapLayerBuilder(config, cache, store) { points: 2, radius: 5, stroke: new Stroke({ - width: 4, + width: 2, color: arrowColor, }), rotateWithView: true, diff --git a/web/js/vectorflow/util.js b/web/js/vectorflow/util.js index cf80d1d748..6b695abef9 100644 --- a/web/js/vectorflow/util.js +++ b/web/js/vectorflow/util.js @@ -45,15 +45,25 @@ export function throttle(fn, wait) { } // Establish color gradient to differentiate lower & higher magnitudes -export function colorGradient(fadeFraction) { - const color1 = { - red: 100, green: 100, blue: 100, +export function colorGradient(pointMagnitude) { + let color1 = { + red: 0, green: 255, blue: 0, // green }; - const color2 = { - red: 255, green: 255, blue: 255, + let color2 = { + red: 255, green: 255, blue: 0, // yellow }; + const color3 = { + red: 255, green: 0, blue: 0, // red + }; + // console.log('pointMagnitude', pointMagnitude); + let fade = pointMagnitude * 2; - const fade = fadeFraction; + if (fade >= 1) { + // console.log('fade is 1+', fade); + fade -= 1; + color1 = color2; + color2 = color3; + } const diffRed = color2.red - color1.red; const diffGreen = color2.green - color1.green; const diffBlue = color2.blue - color1.blue; From 51cc7a7ad491251407de714a8cb02bf412a202fe Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Tue, 3 Oct 2023 16:14:16 -0400 Subject: [PATCH 84/85] Oscar Sea Surface arrows w/gradients looking pretty good --- web/js/map/layerbuilder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index cef26fa6a7..a3ee641296 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -885,7 +885,7 @@ export default function mapLayerBuilder(config, cache, store) { counter += 1; // Due to the large number of points to render for OSCAR, I am only rendering every 25th feature - if (counter % 15 !== 0) return []; + // if (counter % 50 !== 0) return []; let arrowSizeMultiplier; const radianDirection = feature.get('direction'); // was "dir" From 53935ad776bb3e5d3cea7e60c38f07c10af0338f Mon Sep 17 00:00:00 2001 From: Thomas Cariello Date: Tue, 3 Oct 2023 16:15:07 -0400 Subject: [PATCH 85/85] Re-enabled rendering of every 25th vector point to achieve decent performance --- web/js/map/layerbuilder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/js/map/layerbuilder.js b/web/js/map/layerbuilder.js index a3ee641296..1d082c759a 100644 --- a/web/js/map/layerbuilder.js +++ b/web/js/map/layerbuilder.js @@ -885,7 +885,7 @@ export default function mapLayerBuilder(config, cache, store) { counter += 1; // Due to the large number of points to render for OSCAR, I am only rendering every 25th feature - // if (counter % 50 !== 0) return []; + if (counter % 25 !== 0) return []; let arrowSizeMultiplier; const radianDirection = feature.get('direction'); // was "dir"

El2a_7ETKiiIw9wMRdTUXl^l>Cs33E}mW`oI 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