diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..88fa742
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,11 @@
+module.exports = {
+  extends: ['@impargo/eslint-config'],
+  plugins: ['react-hooks'],
+  rules: {
+    'react-hooks/rules-of-hooks': 'error',
+    'react-hooks/exhaustive-deps': 'warn',
+  },
+  env: {
+    browser: true,
+  },
+}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e56bee3..422e8d6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -8,9 +8,9 @@ jobs:
       runs-on: ubuntu-latest
       steps:
         - uses: actions/checkout@v2
-        - uses: actions/setup-node@v1
+        - uses: actions/setup-node@v4
           with:
-            node-version: 14
+            node-version: 20
         - name: Cache
           uses: actions/cache@v1.0.3
           with:
@@ -24,9 +24,9 @@ jobs:
       runs-on: ubuntu-latest
       steps:
         - uses: actions/checkout@v2
-        - uses: actions/setup-node@v1
+        - uses: actions/setup-node@v4
           with:
-            node-version: 14
+            node-version: 20
         - name: Restore cache
           uses: actions/cache@v1.0.3
           with:
@@ -40,9 +40,9 @@ jobs:
       runs-on: ubuntu-latest
       steps:
         - uses: actions/checkout@v2
-        - uses: actions/setup-node@v1
+        - uses: actions/setup-node@v4
           with:
-            node-version: 14
+            node-version: 20
         - name: Restore cache
           uses: actions/cache@v1.0.3
           with:
@@ -55,9 +55,9 @@ jobs:
     #   runs-on: ubuntu-latest
     #   steps:
     #     - uses: actions/checkout@v2
-    #     - uses: actions/setup-node@v1
+    #     - uses: actions/setup-node@v4
     #       with:
-    #         node-version: 14
+    #         node-version: 20
     #     - name: Restore cache
     #       uses: actions/cache@v1.0.3
     #       with:
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..3662b37
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+  "typescript.tsdk": "node_modules/typescript/lib"
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index cf2dcbd..1c7dc63 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
     "coverage:post": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
     "prepublishOnly": "gulp",
     "transpile": "gulp transpile",
-    "lint": "tslint --config tslint.json --project tsconfig.json --type-check",
+    "lint": "eslint 'src/**/*.{js,ts,tsx}' 'test/**/*.{js,ts,tsx}' 'testbench/**/*.{js,ts,tsx}'",
     "dev": "parcel testbench/index.html"
   },
   "repository": {
@@ -46,6 +46,7 @@
   "homepage": "https://github.com/impargo/react-here-maps#readme",
   "devDependencies": {
     "@babel/core": "^7.12.0",
+    "@impargo/eslint-config": "^1.4.0",
     "@types/chai": "^4.0.1",
     "@types/enzyme": "^3.10.8",
     "@types/heremaps": "^3.1.5",
@@ -67,6 +68,7 @@
     "coveralls": "^2.11.12",
     "css-loader": "^0.28.4",
     "enzyme": "^3.11.0",
+    "eslint-plugin-react-hooks": "^4.6.0",
     "gulp": "^4.0.2",
     "gulp-sass": "^5.1.0",
     "gulp-typescript": "^5.0.1",
@@ -105,8 +107,6 @@
     "source-map-loader": "^0.2.1",
     "style-loader": "^0.18.2",
     "ts-loader": "^2.2.2",
-    "tslint": "^5.5.0",
-    "tslint-react": "^3.0.0",
     "typescript": "^4.0.5",
     "vinyl-source-stream": "^1.1.0",
     "watchify": "^3.7.0"
diff --git a/src/Cluster.tsx b/src/Cluster.tsx
index 32058da..59e483c 100644
--- a/src/Cluster.tsx
+++ b/src/Cluster.tsx
@@ -1,14 +1,15 @@
-import { useCallback, useContext, useEffect, useMemo, useRef } from "react";
-import { HEREMapContext } from "./context";
-import getMarkerIcon from "./utils/get-marker-icon";
+import { useCallback, useContext, useEffect, useMemo, useRef } from 'react'
+
+import { HEREMapContext } from './context'
+import getMarkerIcon from './utils/get-marker-icon'
 
 export interface Datapoint<T> {
-  lat: number;
-  lon: number;
+  lat: number,
+  lon: number,
   /**
    * Any generic data that can be stored in the datapoint.
    */
-  data: T;
+  data: T,
 }
 
 export interface ClusterProps<T> {
@@ -16,32 +17,32 @@ export interface ClusterProps<T> {
    * The datapoints that should be clustered. They should contain coordinates, a bitmap, and any generic type of data.
    * Note: a change in this array will force a reclustering of the entire cluster.
    */
-  points: Array<Datapoint<T>>;
+  points: Array<Datapoint<T>>,
   /**
    * Clustering options used by HERE maps clustering provider.
    * Note: a change in these options will recreate the clustering provider.
    */
-  clusteringOptions?: H.clustering.Provider.ClusteringOptions;
+  clusteringOptions?: H.clustering.Provider.ClusteringOptions,
   /**
    * A function that should return the marker bitmap to be used for a specific set of cluster points.
    * Note: a change in this function will trigger a redraw for all the datapoints in the cluster.
    * So make sure to wrap it in a `useCallback` and only change its reference when necessary.
    */
-  getBitmapForCluster: (points: T[]) => string;
+  getBitmapForCluster: (points: T[]) => string,
   /**
    * A function that should return the marker bitmap for a single point.
    * Note: a change in this function will trigger a redraw for all the datapoints in the cluster.
    * So make sure to wrap it in a `useCallback` and only change its reference when necessary.
    */
-  getBitmapForPoint: (point: T) => string;
+  getBitmapForPoint: (point: T) => string,
   /**
    * A callback for when a cluster of points are clicked.
    */
-  onClusterClick: (data: T[], e: H.mapevents.Event) => void;
+  onClusterClick: (data: T[], e: H.mapevents.Event) => void,
   /**
    * A callback for when a single point in the cluster is clicked.
    */
-  onPointClick: (data: T, e: H.mapevents.Event) => void;
+  onPointClick: (data: T, e: H.mapevents.Event) => void,
 }
 
 export const defaultClusteringOptions: H.clustering.Provider.ClusteringOptions = {
@@ -53,42 +54,42 @@ export const defaultClusteringOptions: H.clustering.Provider.ClusteringOptions =
    * Minimum weight of points required to form a cluster (default weight for a cluster point is 1).
    */
   minWeight: 2,
-};
+}
 
-function createTheme<T>(
+function createTheme<T> (
   getBitmapForCluster: (points: T[]) => string,
   getBitmapForPoint: (point: T) => string,
 ): H.clustering.ITheme {
   return {
     getClusterPresentation: (cluster) => {
-      const clusterPoints: T[] = [];
-      cluster.forEachDataPoint((point) => clusterPoints.push(point.getData()));
+      const clusterPoints: T[] = []
+      cluster.forEachDataPoint((point) => clusterPoints.push(point.getData()))
       return new H.map.Marker(cluster.getPosition(), {
         data: clusterPoints,
         icon: getMarkerIcon(getBitmapForCluster(clusterPoints)),
         max: cluster.getMaxZoom(),
         min: cluster.getMinZoom(),
-      });
+      })
     },
     getNoisePresentation: (point) => {
-      const data: T = point.getData();
+      const data: T = point.getData()
       return new H.map.Marker(point.getPosition(), {
         data,
         icon: getMarkerIcon(getBitmapForPoint(data)),
         min: point.getMinZoom(),
-      });
+      })
     },
-  };
+  }
 }
 
-function pointToDatapoint<T>(point: Datapoint<T>): H.clustering.DataPoint {
-  return new H.clustering.DataPoint(point.lat, point.lon, null, point.data);
+function pointToDatapoint<T> (point: Datapoint<T>): H.clustering.DataPoint {
+  return new H.clustering.DataPoint(point.lat, point.lon, null, point.data)
 }
 
 /**
  * A component that can automatically cluster a group of datapoints.
  */
-export default function Cluster<T>({
+export default function Cluster<T> ({
   points,
   clusteringOptions = defaultClusteringOptions,
   getBitmapForCluster,
@@ -96,55 +97,55 @@ export default function Cluster<T>({
   onClusterClick,
   onPointClick,
 }: ClusterProps<T>): null {
-  const { map } = useContext(HEREMapContext);
+  const { map } = useContext(HEREMapContext)
 
-  const onClusterClickRef = useRef(onClusterClick);
-  onClusterClickRef.current = onClusterClick;
+  const onClusterClickRef = useRef(onClusterClick)
+  onClusterClickRef.current = onClusterClick
 
-  const onPointClickRef = useRef(onPointClick);
-  onPointClickRef.current = onPointClick;
+  const onPointClickRef = useRef(onPointClick)
+  onPointClickRef.current = onPointClick
 
   const theme: H.clustering.ITheme = useMemo(() => createTheme(
     getBitmapForCluster,
     getBitmapForPoint,
-  ), [getBitmapForCluster, getBitmapForPoint]);
+  ), [getBitmapForCluster, getBitmapForPoint])
 
-  const datapoints = useMemo(() => points.map(pointToDatapoint), [points]);
+  const datapoints = useMemo(() => points.map(pointToDatapoint), [points])
 
   const onClick = useCallback((evt: Event) => {
-    const e = evt as unknown as H.mapevents.Event;
-    const data: T | T[] = (e.target as H.map.Object).getData();
+    const e = evt as unknown as H.mapevents.Event
+    const data: T | T[] = (e.target as H.map.Object).getData()
     if (Array.isArray(data)) {
-      onClusterClickRef.current(data, e);
+      onClusterClickRef.current(data, e)
     } else {
-      onPointClickRef.current(data, e);
+      onPointClickRef.current(data, e)
     }
-  }, []);
+  }, [])
 
   const clusteredDataProvider = useMemo(() => {
     const provider = new H.clustering.Provider(datapoints, {
       clusteringOptions,
       theme,
-    });
-    provider.addEventListener("tap", onClick);
-    return provider;
-  }, [clusteringOptions, onClick /* theme, datapoints */]);
+    })
+    provider.addEventListener('tap', onClick)
+    return provider
+  }, [clusteringOptions, onClick])
 
   useEffect(() => {
-    clusteredDataProvider.setTheme(theme);
-  }, [theme, clusteredDataProvider]);
+    clusteredDataProvider.setTheme(theme)
+  }, [theme, clusteredDataProvider])
 
   useEffect(() => {
-    clusteredDataProvider.setDataPoints(datapoints);
-  }, [datapoints, clusteredDataProvider]);
+    clusteredDataProvider.setDataPoints(datapoints)
+  }, [datapoints, clusteredDataProvider])
 
   useEffect(() => {
-    const layer = new H.map.layer.ObjectLayer(clusteredDataProvider);
-    map?.addLayer(layer);
+    const layer = new H.map.layer.ObjectLayer(clusteredDataProvider)
+    map?.addLayer(layer)
     return () => {
-      map?.removeLayer(layer);
-    };
-  }, [map, clusteredDataProvider]);
+      map?.removeLayer(layer)
+    }
+  }, [map, clusteredDataProvider])
 
-  return null;
+  return null
 }
diff --git a/src/HEREMap.tsx b/src/HEREMap.tsx
index a5720a6..f21515a 100644
--- a/src/HEREMap.tsx
+++ b/src/HEREMap.tsx
@@ -1,67 +1,67 @@
-import { debounce, uniqueId } from "lodash";
-import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "react";
+import { debounce, uniqueId } from 'lodash'
+import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'
 
-import { HEREMapContext } from "./context";
-import { useRasterLayers } from "./useRasterLayers";
-import { useVectorLayers } from "./useVectorLayers";
-import { loadScripts } from "./utils/cache";
-import getPlatform from "./utils/get-platform";
-import { Language } from "./utils/languages";
+import { HEREMapContext } from './context'
+import { useRasterLayers } from './useRasterLayers'
+import { useVectorLayers } from './useVectorLayers'
+import { loadScripts } from './utils/cache'
+import getPlatform from './utils/get-platform'
+import { Language } from './utils/languages'
 
 // declare an interface containing the required and potential
 // props that can be passed to the HEREMap component
 export interface HEREMapProps extends H.Map.Options {
-  children: React.ReactNode;
-  apiKey: string;
-  animateCenter?: boolean;
-  animateZoom?: boolean;
-  hidpi?: boolean;
-  interactive?: boolean;
-  lg?: Language;
-  secure?: boolean;
-  routes?: object[];
-  truckRestrictions?: boolean;
-  trafficLayer?: boolean;
-  incidentsLayer?: boolean;
-  useSatellite?: boolean;
-  disableMapSettings?: boolean;
-  onMapAvailable?: (state: HEREMapState) => void;
-  language?: string;
+  children?: React.ReactNode,
+  apiKey: string,
+  animateCenter?: boolean,
+  animateZoom?: boolean,
+  hidpi?: boolean,
+  interactive?: boolean,
+  lg?: Language,
+  secure?: boolean,
+  routes?: object[],
+  truckRestrictions?: boolean,
+  trafficLayer?: boolean,
+  incidentsLayer?: boolean,
+  useSatellite?: boolean,
+  disableMapSettings?: boolean,
+  onMapAvailable?: (state: HEREMapState) => void,
+  language?: string,
   /**
    * Also known as environmental zones.
    */
-  congestion?: boolean;
+  congestion?: boolean,
   /**
    * Note: this cannot be changed after the map is loaded.
    * If you want to change it, you have to re-mount the map component.
    */
-  useVectorTiles?: boolean;
-  onScriptLoadError?: (failedScripts: string[]) => void;
+  useVectorTiles?: boolean,
+  onScriptLoadError?: (failedScripts: string[]) => void,
 
-  useLegacyTruckLayer?: boolean;
-  useLegacyTrafficLayer?: boolean;
+  useLegacyTruckLayer?: boolean,
+  useLegacyTrafficLayer?: boolean,
 }
 
 // declare an interface containing the potential state flags
 export interface HEREMapState {
-  map?: H.Map;
-  behavior?: H.mapevents.Behavior;
-  ui?: H.ui.UI;
-  markersGroups: Record<string, H.map.Group>;
-  routesGroup?: H.map.Group;
-  trafficLayer?: boolean;
+  map?: H.Map,
+  behavior?: H.mapevents.Behavior,
+  ui?: H.ui.UI,
+  markersGroups: Record<string, H.map.Group>,
+  routesGroup?: H.map.Group,
+  trafficLayer?: boolean,
 }
 
 export interface HEREMapRef {
-  getMap: () => H.Map;
-  getElement: () => Element;
-  setCenter: (point: H.geo.IPoint) => void;
-  setZoom: (zoom: number) => void;
-  screenToGeo: (x: number, y: number) => H.geo.Point;
-  zoomOnMarkers: (animate?: boolean, group?: string) => void;
-  zoomOnMarkersSet: (markersSet: H.map.DomMarker[], animate?: boolean) => void;
-  addToMarkerGroup: (marker: H.map.Marker, group: string) => void;
-  removeFromMarkerGroup: (marker: H.map.Marker, group: string) => void;
+  getMap: () => H.Map,
+  getElement: () => Element,
+  setCenter: (point: H.geo.IPoint) => void,
+  setZoom: (zoom: number) => void,
+  screenToGeo: (x: number, y: number) => H.geo.Point,
+  zoomOnMarkers: (animate?: boolean, group?: string) => void,
+  zoomOnMarkersSet: (markersSet: H.map.DomMarker[], animate?: boolean) => void,
+  addToMarkerGroup: (marker: H.map.Marker, group: string) => void,
+  removeFromMarkerGroup: (marker: H.map.Marker, group: string) => void,
 }
 
 export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
@@ -87,15 +87,15 @@ export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
   useVectorTiles,
   useLegacyTrafficLayer,
   useLegacyTruckLayer,
-},                                                           ref) => {
-  const uniqueIdRef = useRef<string>(uniqueId());
+}, ref) => {
+  const uniqueIdRef = useRef<string>(uniqueId())
 
-  const [map, setMap] = useState<H.Map>(null);
-  const [routesGroup, setRoutesGroup] = useState(null);
+  const [map, setMap] = useState<H.Map>(null)
+  const [routesGroup, setRoutesGroup] = useState(null)
 
-  const markersGroupsRef = useRef<Record<string, H.map.Group>>({});
+  const markersGroupsRef = useRef<Record<string, H.map.Group>>({})
 
-  const defaultLayersRef = useRef<H.service.DefaultLayers>(null);
+  const defaultLayersRef = useRef<H.service.DefaultLayers>(null)
 
   useVectorLayers({
     congestion,
@@ -106,7 +106,7 @@ export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
     truckRestrictions,
     useSatellite,
     useVectorTiles,
-  });
+  })
 
   useRasterLayers({
     apiKey,
@@ -122,61 +122,61 @@ export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
     useLegacyTruckLayer,
     useSatellite,
     useVectorTiles,
-  });
+  })
 
-  const unmountedRef = useRef(false);
+  const unmountedRef = useRef(false)
 
   const screenToGeo = (x: number, y: number): H.geo.Point => {
-    return map.screenToGeo(x, y);
-  };
+    return map.screenToGeo(x, y)
+  }
 
   const zoomOnMarkersGroup = (markersGroup: H.map.Group, animate: boolean = true) => {
-    const DISTANCE_FACTOR = 0.1;
-    const BEARING_TOP_LEFT = 315;
-    const BEARING_BOTTOM_RIGHT = 135;
-    const boundingBox = markersGroup.getBoundingBox();
-    const topLeft = boundingBox.getTopLeft();
-    const bottomRight = boundingBox.getBottomRight();
-    const distance = topLeft.distance(bottomRight) * DISTANCE_FACTOR;
+    const DISTANCE_FACTOR = 0.1
+    const BEARING_TOP_LEFT = 315
+    const BEARING_BOTTOM_RIGHT = 135
+    const boundingBox = markersGroup.getBoundingBox()
+    const topLeft = boundingBox.getTopLeft()
+    const bottomRight = boundingBox.getBottomRight()
+    const distance = topLeft.distance(bottomRight) * DISTANCE_FACTOR
     const viewBounds = H.geo.Rect.fromPoints(
       topLeft.walk(BEARING_TOP_LEFT, distance),
       bottomRight.walk(BEARING_BOTTOM_RIGHT, distance),
-    );
-    if (viewBounds) { map.getViewModel().setLookAtData({ bounds: viewBounds }, animate); }
-  };
+    )
+    if (viewBounds) { map.getViewModel().setLookAtData({ bounds: viewBounds }, animate) }
+  }
 
-  const zoomOnMarkers = (animate: boolean = true, group: string = "default") => {
+  const zoomOnMarkers = (animate: boolean = true, group: string = 'default') => {
     if (map) {
-      if (!markersGroupsRef.current[group]) { return; }
-      zoomOnMarkersGroup(markersGroupsRef.current[group], animate);
+      if (!markersGroupsRef.current[group]) { return }
+      zoomOnMarkersGroup(markersGroupsRef.current[group], animate)
     }
-  };
+  }
 
   const zoomOnMarkersSet = (markersSet: H.map.DomMarker[], animate: boolean = true) => {
-    const markersGroupSet = new H.map.Group();
-    markersSet.map((m) => markersGroupSet.addObject(m));
-    zoomOnMarkersGroup(markersGroupSet, animate);
-  };
+    const markersGroupSet = new H.map.Group()
+    markersSet.map((m) => markersGroupSet.addObject(m))
+    zoomOnMarkersGroup(markersGroupSet, animate)
+  }
 
   const addToMarkerGroup = (marker: H.map.Marker, group: string) => {
     if (!markersGroupsRef.current[group]) {
-      markersGroupsRef.current[group] = new H.map.Group();
-      map.addObject(markersGroupsRef.current[group]);
+      markersGroupsRef.current[group] = new H.map.Group()
+      map.addObject(markersGroupsRef.current[group])
     }
-    markersGroupsRef.current[group].addObject(marker);
-  };
+    markersGroupsRef.current[group].addObject(marker)
+  }
 
   const removeFromMarkerGroup = (marker: H.map.Marker, group: string) => {
     if (markersGroupsRef.current[group]) {
-      markersGroupsRef.current[group].removeObject(marker);
+      markersGroupsRef.current[group].removeObject(marker)
       if (markersGroupsRef.current[group].getObjects().length === 0) {
         if (map.getObjects().length > 0) {
-          map.removeObject(markersGroupsRef.current[group]);
+          map.removeObject(markersGroupsRef.current[group])
         }
-        markersGroupsRef.current[group] = null;
+        markersGroupsRef.current[group] = null
       }
     }
-  };
+  }
 
   useImperativeHandle<HEREMapRef, HEREMapRef>(ref, () => {
     return {
@@ -186,36 +186,36 @@ export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
       removeFromMarkerGroup,
       screenToGeo,
       setCenter: (point: H.geo.IPoint) => {
-        map.setCenter(point, animateCenter);
+        map.setCenter(point, animateCenter)
       },
       setZoom: (newZoom: number) => {
-        map.setZoom(newZoom, animateZoom);
+        map.setZoom(newZoom, animateZoom)
       },
       zoomOnMarkers,
       zoomOnMarkersSet,
-    };
-  }, [map]);
+    }
+  }, [map])
 
   useEffect(() => {
     loadScripts(secure, !useVectorTiles).then(() => {
       if (unmountedRef.current) {
-        return;
+        return
       }
 
       // get the platform to base the maps on
       const platform = getPlatform({
         apikey: apiKey,
         useHTTPS: secure === true,
-      });
+      })
       defaultLayersRef.current = platform.createDefaultLayers({
         lg,
         ppi: hidpi ? 320 : 72,
-      });
+      })
 
-      const hereMapEl = document.querySelector(`#map-container-${uniqueIdRef.current}`);
+      const hereMapEl = document.querySelector(`#map-container-${uniqueIdRef.current}`)
       const baseLayer = useVectorTiles
         ? defaultLayersRef.current.vector.normal.map
-        : defaultLayersRef.current.raster.normal.map;
+        : defaultLayersRef.current.raster.normal.map
       const newMap = new H.Map(
         hereMapEl,
         baseLayer,
@@ -226,34 +226,34 @@ export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
           pixelRatio: hidpi ? 2 : 1,
           zoom,
         },
-      );
+      )
 
-      const routesProvider = new H.map.provider.LocalObjectProvider();
-      const routesLayer = new H.map.layer.ObjectLayer(routesProvider);
-      newMap.addLayer(routesLayer);
+      const routesProvider = new H.map.provider.LocalObjectProvider()
+      const routesLayer = new H.map.layer.ObjectLayer(routesProvider)
+      newMap.addLayer(routesLayer)
 
-      let ui: H.ui.UI;
+      let ui: H.ui.UI
 
       // make the map interactive
       // MapEvents enables the event system
       // Behavior implements default interactions for pan/zoom
-      const behavior = interactive ? new H.mapevents.Behavior(new H.mapevents.MapEvents(newMap)) : undefined;
+      const behavior = interactive ? new H.mapevents.Behavior(new H.mapevents.MapEvents(newMap)) : undefined
 
       if (behavior) {
         if (!useVectorLayers) {
           // @ts-ignore
-          behavior.disable(H.mapevents.Behavior.Feature.FRACTIONAL_ZOOM);
+          behavior.disable(H.mapevents.Behavior.Feature.FRACTIONAL_ZOOM)
         }
 
         // create the default UI for the map
-        ui = H.ui.UI.createDefault(newMap, defaultLayersRef.current, language);
+        ui = H.ui.UI.createDefault(newMap, defaultLayersRef.current, language)
         if (disableMapSettings) {
-          ui.removeControl("mapsettings");
+          ui.removeControl('mapsettings')
         }
       }
 
-      setMap(newMap);
-      setRoutesGroup(routesProvider.getRootGroup());
+      setMap(newMap)
+      setRoutesGroup(routesProvider.getRootGroup())
 
       onMapAvailable({
         behavior,
@@ -262,45 +262,45 @@ export const HEREMap = forwardRef<HEREMapRef, HEREMapProps>(({
         routesGroup: routesProvider.getRootGroup(),
         trafficLayer,
         ui,
-      });
-    }).catch(onScriptLoadError);
+      })
+    }).catch(onScriptLoadError)
 
     return () => {
-      unmountedRef.current = true;
-      map?.dispose();
-    };
-  }, []);
+      unmountedRef.current = true
+      map?.dispose()
+    }
+  }, [])
 
   useEffect(() => {
     if (map) {
       const resizeMap = () => {
-        map.getViewPort().resize();
-      };
+        map.getViewPort().resize()
+      }
 
-      const debouncedResizeMap = debounce(resizeMap, 200);
+      const debouncedResizeMap = debounce(resizeMap, 200)
 
       // make the map resize when the window gets resized
-      window.addEventListener("resize", debouncedResizeMap);
+      window.addEventListener('resize', debouncedResizeMap)
       return () => {
-        window.removeEventListener("resize", debouncedResizeMap);
-      };
+        window.removeEventListener('resize', debouncedResizeMap)
+      }
     }
-  }, [map]);
+  }, [map])
 
   return (
-    <div className="heremap" style={{ height: "100%" }}>
+    <div className="heremap" style={{ height: '100%' }}>
       <div
         className="map-container"
         id={`map-container-${uniqueIdRef.current}`}
-        style={{ height: "100%" }}
+        style={{ height: '100%' }}
       >
         {map && <HEREMapContext.Provider value={{ map, routesGroup, removeFromMarkerGroup, addToMarkerGroup }}>
           {children}
         </HEREMapContext.Provider>}
       </div>
     </div>
-  );
-});
+  )
+})
 
 // make the HEREMap component the default export
-export default HEREMap;
+export default HEREMap
diff --git a/src/Marker.tsx b/src/Marker.tsx
index f8ec9b0..25106a0 100644
--- a/src/Marker.tsx
+++ b/src/Marker.tsx
@@ -1,28 +1,29 @@
-import React, { useContext, useEffect, useState, FC } from "react";
-import * as ReactDOMServer from "react-dom/server";
-import { HEREMapContext, HEREMapContextType } from "./context";
-import { useEventHandlers, EventHandlers } from "./useEventHandlers";
-import getDomMarkerIcon from "./utils/get-dom-marker-icon";
-import getMarkerIcon from "./utils/get-marker-icon";
+import React, { FC, useContext, useEffect, useState } from 'react'
+import * as ReactDOMServer from 'react-dom/server'
+
+import { HEREMapContext, HEREMapContextType } from './context'
+import { EventHandlers, useEventHandlers } from './useEventHandlers'
+import getDomMarkerIcon from './utils/get-dom-marker-icon'
+import getMarkerIcon from './utils/get-marker-icon'
 
 // declare an interface containing the required and potential
 // props that can be passed to the HEREMap Marker componengetMartkerIdt
 export interface MarkerProps extends H.map.Marker.Options, EventHandlers {
-  lat: number;
-  lng: number;
+  lat: number,
+  lng: number,
   /**
    * Either an image URL or an SVG markup.
    */
-  bitmap?: string;
-  data?: any;
-  draggable?: boolean;
+  bitmap?: string,
+  data?: any,
+  draggable?: boolean,
   /**
    * @deprecated use bitmap instead. Passing children in this way has performance
    * implications since the 3.1 version of the API and should be avoided.
    */
-  children?: React.ReactElement<any>;
-  group?: string;
-  anchor?: H.math.IPoint;
+  children?: React.ReactElement<any>,
+  group?: string,
+  anchor?: H.math.IPoint,
 }
 
 /**
@@ -32,7 +33,7 @@ export interface MarkerProps extends H.map.Marker.Options, EventHandlers {
  */
 export const Marker: FC<MarkerProps> = ({
   children,
-  group = "default",
+  group = 'default',
   bitmap,
   data,
   draggable = false,
@@ -48,13 +49,13 @@ export const Marker: FC<MarkerProps> = ({
   onDragStart,
   ...options
 }) => {
-  const { map, removeFromMarkerGroup, addToMarkerGroup } = useContext<HEREMapContextType>(HEREMapContext);
+  const { map, removeFromMarkerGroup, addToMarkerGroup } = useContext<HEREMapContextType>(HEREMapContext)
 
-  const [marker, setMarker] = useState<H.map.DomMarker | H.map.Marker | null>(null);
+  const [marker, setMarker] = useState<H.map.DomMarker | H.map.Marker | null>(null)
 
   const renderChildren = (): H.map.DomIcon => {
     if (!map) {
-      throw new Error("Map has to be loaded before performing this action");
+      throw new Error('Map has to be loaded before performing this action')
     }
 
     // if children are provided, we render the provided react
@@ -63,42 +64,42 @@ export const Marker: FC<MarkerProps> = ({
       <div className="dom-marker">
         {children}
       </div>
-    ));
+    ))
 
     // we then get a dom icon object from the wrapper method
-    return getDomMarkerIcon(html);
-  };
+    return getDomMarkerIcon(html)
+  }
 
   const addMarkerToMap = () => {
     if (!map) {
-      throw new Error("Map has to be loaded before performing this action");
+      throw new Error('Map has to be loaded before performing this action')
     }
 
-    let newMarker = null;
+    let newMarker = null
     if (React.Children.count(children) > 0) {
-      const icon = renderChildren();
-      newMarker = new H.map.DomMarker({ lat, lng }, { icon });
+      const icon = renderChildren()
+      newMarker = new H.map.DomMarker({ lat, lng }, { icon })
     } else if (bitmap) {
       // if we have an image url or an svg markup and no react children, create a
       // regular icon instance
-      const icon = getMarkerIcon(bitmap, anchor);
+      const icon = getMarkerIcon(bitmap, anchor)
       // then create a normal marker instance and attach it to the map
       newMarker = new H.map.Marker({ lat, lng }, {
         icon,
         // @ts-ignore
         volatility: draggable,
         ...options,
-      });
+      })
     } else {
       // create a default marker at the provided location
-      newMarker = new H.map.Marker({ lat, lng });
+      newMarker = new H.map.Marker({ lat, lng })
     }
-    newMarker.draggable = draggable;
-    newMarker.setData(data);
-    addToMarkerGroup(newMarker, group);
-    setMarker(newMarker);
-    return newMarker;
-  };
+    newMarker.draggable = draggable
+    newMarker.setData(data)
+    addToMarkerGroup(newMarker, group)
+    setMarker(newMarker)
+    return newMarker
+  }
 
   useEventHandlers(marker, {
     onDrag,
@@ -108,48 +109,48 @@ export const Marker: FC<MarkerProps> = ({
     onPointerLeave,
     onPointerMove,
     onTap,
-  });
+  })
 
   useEffect(() => {
-    const addedMarker = addMarkerToMap();
+    const addedMarker = addMarkerToMap()
     return () => {
-      removeFromMarkerGroup(addedMarker, group);
-    };
-  }, [group]);
+      removeFromMarkerGroup(addedMarker, group)
+    }
+  }, [group])
 
   useEffect(() => {
     if (marker) {
-      marker.draggable = draggable;
+      marker.draggable = draggable
       // @ts-ignore
-      marker.setVolatility(draggable);
+      marker.setVolatility(draggable)
     }
-  }, [marker, draggable]);
+  }, [marker, draggable])
 
   useEffect(() => {
     marker?.setGeometry({
       lat,
       lng,
-    });
-  }, [marker, lat, lng]);
+    })
+  }, [marker, lat, lng])
 
   useEffect(() => {
-    marker?.setData(data);
-  }, [marker, data]);
+    marker?.setData(data)
+  }, [marker, data])
 
   useEffect(() => {
     if (bitmap) {
-      marker?.setIcon(getMarkerIcon(bitmap, anchor));
+      marker?.setIcon(getMarkerIcon(bitmap, anchor))
     }
-  }, [marker, bitmap, anchor]);
+  }, [marker, bitmap, anchor])
 
   useEffect(() => {
     if (React.Children.count(children)) {
-      const icon = renderChildren();
-      marker?.setIcon(icon);
+      const icon = renderChildren()
+      marker?.setIcon(icon)
     }
-  }, [marker, children?.props]);
+  }, [marker, children?.props])
 
-  return null;
-};
+  return null
+}
 
-export default Marker;
+export default Marker
diff --git a/src/Route.tsx b/src/Route.tsx
index ed76906..0b241dd 100644
--- a/src/Route.tsx
+++ b/src/Route.tsx
@@ -1,37 +1,38 @@
-import { useContext, useEffect, useMemo, useState, FC } from "react";
-import { HEREMapContext, HEREMapContextType } from "./context";
-import { useEventHandlers, EventHandlers } from "./useEventHandlers";
+import { FC, useContext, useEffect, useMemo, useState } from 'react'
+
+import { HEREMapContext, HEREMapContextType } from './context'
+import { EventHandlers, useEventHandlers } from './useEventHandlers'
 
 export interface Coordinates {
-  lat: number;
-  lon: number;
+  lat: number,
+  lon: number,
 }
 
 const defaultMapStyles: object = {
-  fillColor: "blue",
+  fillColor: 'blue',
   lineWidth: 4,
-  strokeColor: "blue",
-};
+  strokeColor: 'blue',
+}
 
 // declare an interface containing the required and potential
 // props that can be passed to the HEREMap Marker component
 export interface RoutesProps extends EventHandlers {
-  points?: Coordinates[];
-  data?: object;
-  zIndex?: number;
-  style?: object;
+  points?: Coordinates[],
+  data?: object,
+  zIndex?: number,
+  style?: object,
   /**
    * This is only supported when using the legacy P2D engine (when not using vector tiles).
    * When using vector tiles and/or the new engine, use lineDash, lineHeadCap, and lineTailCap instead.
    */
-  arrows?: object;
-  draggable?: boolean;
+  arrows?: object,
+  draggable?: boolean,
 }
 
 // declare an interface containing the potential context parameters
 export interface RoutesContext {
-  map: H.Map;
-  routesGroup: H.map.Group;
+  map: H.Map,
+  routesGroup: H.map.Group,
 }
 
 export const Route: FC<RoutesProps> = ({
@@ -49,17 +50,17 @@ export const Route: FC<RoutesProps> = ({
   onTap,
   draggable,
 }) => {
-  const { routesGroup } = useContext<HEREMapContextType>(HEREMapContext);
-  const [polyline, setPolyline] = useState<H.map.Polyline>(null);
+  const { routesGroup } = useContext<HEREMapContextType>(HEREMapContext)
+  const [polyline, setPolyline] = useState<H.map.Polyline>(null)
 
   const line = useMemo(() => {
-    const route = new H.geo.LineString();
+    const route = new H.geo.LineString()
     points.forEach((point) => {
-      const { lat, lon } = point;
-      route.pushPoint(new H.geo.Point(lat, lon));
-    });
-    return route;
-  }, [points]);
+      const { lat, lon } = point
+      route.pushPoint(new H.geo.Point(lat, lon))
+    })
+    return route
+  }, [points])
 
   useEventHandlers(polyline, {
     onDrag,
@@ -69,44 +70,43 @@ export const Route: FC<RoutesProps> = ({
     onPointerLeave,
     onPointerMove,
     onTap,
-  });
+  })
 
   useEffect(() => {
-    if (polyline && typeof draggable === "boolean") {
+    if (polyline && typeof draggable === 'boolean') {
       // @ts-ignore
-      polyline.draggable = draggable;
+      polyline.draggable = draggable
     }
-  }, [polyline, draggable]);
+  }, [polyline, draggable])
 
   useEffect(() => {
-    polyline?.setGeometry(line);
-
-  }, [line]);
+    polyline?.setGeometry(line)
+  }, [line])
 
   useEffect(() => {
-    polyline?.setData(data);
-  }, [polyline, data]);
+    polyline?.setData(data)
+  }, [polyline, data])
 
   useEffect(() => {
-    polyline?.setZIndex(zIndex);
-  }, [polyline, zIndex]);
+    polyline?.setZIndex(zIndex)
+  }, [polyline, zIndex])
 
   useEffect(() => {
-    polyline?.setStyle(style);
-  }, [polyline, style]);
+    polyline?.setStyle(style)
+  }, [polyline, style])
 
   useEffect(() => {
     if (routesGroup) {
-      const routeLine = new H.map.Polyline(line, { style, arrows, zIndex, data });
-      routesGroup.addObject(routeLine);
-      setPolyline(routeLine);
+      const routeLine = new H.map.Polyline(line, { style, arrows, zIndex, data })
+      routesGroup.addObject(routeLine)
+      setPolyline(routeLine)
       return () => {
-        routesGroup.removeObject(routeLine);
-      };
+        routesGroup.removeObject(routeLine)
+      }
     }
-  }, [routesGroup]);
+  }, [routesGroup])
 
-  return null;
-};
+  return null
+}
 
-export default Route;
+export default Route
diff --git a/src/context.ts b/src/context.ts
index 46e322d..8383b44 100644
--- a/src/context.ts
+++ b/src/context.ts
@@ -1,13 +1,13 @@
-import { createContext } from "react";
+import { createContext } from 'react'
 
 export interface HEREMapContextType {
-  map?: H.Map;
-  routesGroup?: H.map.Group;
-  removeFromMarkerGroup: (marker: H.map.Marker, group: string) => void;
-  addToMarkerGroup: (marker: H.map.Marker, group: string) => void;
+  map?: H.Map,
+  routesGroup?: H.map.Group,
+  removeFromMarkerGroup: (marker: H.map.Marker, group: string) => void,
+  addToMarkerGroup: (marker: H.map.Marker, group: string) => void,
 }
 
 export const HEREMapContext = createContext<HEREMapContextType>({
   addToMarkerGroup: () => undefined,
   removeFromMarkerGroup: () => undefined,
-});
+})
diff --git a/src/main.ts b/src/main.ts
index 839b850..f52d3aa 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,24 +1,24 @@
-import Cluster, { defaultClusteringOptions, ClusterProps, Datapoint } from "./Cluster";
-import HEREMap, { HEREMapProps, HEREMapRef, HEREMapState } from "./HEREMap";
-import Marker from "./Marker";
-import Route from "./Route";
-import { loadScripts, loadScriptsStandAlone } from "./utils/cache";
-import { Language } from "./utils/languages";
+import Cluster, { ClusterProps, Datapoint, defaultClusteringOptions } from './Cluster'
+import HEREMap, { HEREMapProps, HEREMapRef, HEREMapState } from './HEREMap'
+import Marker from './Marker'
+import Route from './Route'
+import { loadScripts, loadScriptsStandAlone } from './utils/cache'
+import { Language } from './utils/languages'
 
 export {
+  Cluster,
+  ClusterProps,
+  Datapoint,
+  defaultClusteringOptions,
   HEREMap,
-  HEREMapRef,
   HEREMapProps,
+  HEREMapRef,
   HEREMapState,
   Language,
+  loadScripts,
+  loadScriptsStandAlone,
   Marker,
   Route,
-  Cluster,
-  ClusterProps,
-  Datapoint,
-  defaultClusteringOptions,
-  loadScriptsStandAlone,
-  loadScripts,
-};
+}
 
-export default HEREMap;
+export default HEREMap
diff --git a/src/useEventHandlers.tsx b/src/useEventHandlers.tsx
index 0a29280..c489e4d 100644
--- a/src/useEventHandlers.tsx
+++ b/src/useEventHandlers.tsx
@@ -1,24 +1,24 @@
-import { useEffect } from "react";
+import { useEffect } from 'react'
 
 const useEventHandler = (object: H.util.EventTarget, type: string, handler: (evt: H.mapevents.Event) => void) => {
   useEffect(() => {
     if (object && handler) {
-      object.addEventListener(type, handler as any);
+      object.addEventListener(type, handler as unknown as EventListener)
       return () => {
-        object.removeEventListener(type, handler as any);
-      };
+        object.removeEventListener(type, handler as unknown as EventListener)
+      }
     }
-  }, [object, handler]);
-};
+  }, [object, handler, type])
+}
 
 export interface EventHandlers {
-  onPointerMove?: (evt: H.mapevents.Event) => void;
-  onPointerLeave?: (evt: H.mapevents.Event) => void;
-  onPointerEnter?: (evt: H.mapevents.Event) => void;
-  onDragStart?: (evt: H.mapevents.Event) => void;
-  onDrag?: (evt: H.mapevents.Event) => void;
-  onDragEnd?: (evt: H.mapevents.Event) => void;
-  onTap?: (evt: H.mapevents.Event) => void;
+  onPointerMove?: (evt: H.mapevents.Event) => void,
+  onPointerLeave?: (evt: H.mapevents.Event) => void,
+  onPointerEnter?: (evt: H.mapevents.Event) => void,
+  onDragStart?: (evt: H.mapevents.Event) => void,
+  onDrag?: (evt: H.mapevents.Event) => void,
+  onDragEnd?: (evt: H.mapevents.Event) => void,
+  onTap?: (evt: H.mapevents.Event) => void,
 }
 
 export const useEventHandlers = (object: H.util.EventTarget, {
@@ -30,11 +30,11 @@ export const useEventHandlers = (object: H.util.EventTarget, {
   onDrag,
   onDragEnd,
 }: EventHandlers): void => {
-  useEventHandler(object, "tap", onTap);
-  useEventHandler(object, "pointerleave", onPointerLeave);
-  useEventHandler(object, "pointermove", onPointerMove);
-  useEventHandler(object, "pointerenter", onPointerEnter);
-  useEventHandler(object, "dragstart", onDragStart);
-  useEventHandler(object, "drag", onDrag);
-  useEventHandler(object, "dragend", onDragEnd);
-};
+  useEventHandler(object, 'tap', onTap)
+  useEventHandler(object, 'pointerleave', onPointerLeave)
+  useEventHandler(object, 'pointermove', onPointerMove)
+  useEventHandler(object, 'pointerenter', onPointerEnter)
+  useEventHandler(object, 'dragstart', onDragStart)
+  useEventHandler(object, 'drag', onDrag)
+  useEventHandler(object, 'dragend', onDragEnd)
+}
diff --git a/src/useRasterLayers.ts b/src/useRasterLayers.ts
index 47b5173..fde156e 100644
--- a/src/useRasterLayers.ts
+++ b/src/useRasterLayers.ts
@@ -1,24 +1,25 @@
-import { useEffect, useMemo } from "react";
-import { Language } from "./utils/languages";
+import { useEffect, useMemo } from 'react'
+
+import { Language } from './utils/languages'
 
 export interface UseRasterLayersProps {
-  map?: H.Map;
-  truckRestrictions?: boolean;
-  trafficLayer?: boolean;
-  incidentsLayer?: boolean;
-  useSatellite?: boolean;
-  congestion?: boolean;
-  defaultLayers?: H.service.DefaultLayers;
-  apiKey: string;
-  hidpi?: boolean;
-  useVectorTiles: boolean;
-  locale?: string;
+  map?: H.Map,
+  truckRestrictions?: boolean,
+  trafficLayer?: boolean,
+  incidentsLayer?: boolean,
+  useSatellite?: boolean,
+  congestion?: boolean,
+  defaultLayers?: H.service.DefaultLayers,
+  apiKey: string,
+  hidpi?: boolean,
+  useVectorTiles: boolean,
+  locale?: string,
   /**
    * @deprecated
    */
-  lg?: Language;
-  useLegacyTruckLayer?: boolean;
-  useLegacyTrafficLayer?: boolean;
+  lg?: Language,
+  useLegacyTruckLayer?: boolean,
+  useLegacyTrafficLayer?: boolean,
 }
 
 const getLayers = (
@@ -29,123 +30,123 @@ const getLayers = (
   useLegacyTruckLayer?: boolean,
   useLegacyTrafficLayer?: boolean,
 ) => {
-  const lang = locale ?? "en";
-  const ppi = hidpi ? 400 : 100;
-  const format = "png8";
+  const lang = locale ?? 'en'
+  const ppi = hidpi ? 400 : 100
+  const format = 'png8'
 
   const getTruckLayerProvider = (enableCongestion: boolean): H.map.provider.ImageTileProvider.Options => {
     return {
       max: 20,
       min: 8,
-      getURL(col, row, level) {
+      getURL (col, row, level) {
         const features = enableCongestion
-          ? "vehicle_restrictions:active_and_inactive,environmental_zones:all,congestion_zones:all"
-          : "vehicle_restrictions:active_and_inactive";
-        const style = "logistics.day";
-        return `https://maps.hereapi.com/v3/blank/mc/${level}/${col}/${row}/${format}?apiKey=${apiKey}&features=${features}&lang=${lang}&ppi=${ppi}&style=${style}`;
+          ? 'vehicle_restrictions:active_and_inactive,environmental_zones:all,congestion_zones:all'
+          : 'vehicle_restrictions:active_and_inactive'
+        const style = 'logistics.day'
+        return `https://maps.hereapi.com/v3/blank/mc/${level}/${col}/${row}/${format}?apiKey=${apiKey}&features=${features}&lang=${lang}&ppi=${ppi}&style=${style}`
       },
-    };
-  };
+    }
+  }
   const getTrafficOverlayProvider = (): H.map.provider.ImageTileProvider.Options => {
     return {
-      getURL(col, row, level) {
-        return `https://traffic.maps.hereapi.com/v3/flow/mc/${level}/${col}/${row}/${format}?apiKey=${apiKey}&ppi=${ppi}`;
+      getURL (col, row, level) {
+        return `https://traffic.maps.hereapi.com/v3/flow/mc/${level}/${col}/${row}/${format}?apiKey=${apiKey}&ppi=${ppi}`
       },
-    };
-  };
+    }
+  }
   const getTrafficBaseProvider = (): H.map.provider.ImageTileProvider.Options => {
     return {
-      getURL(col, row, level) {
-        const style = "lite.day";
-        return `https://maps.hereapi.com/v3/base/mc/${level}/${col}/${row}/${format}?apiKey=${apiKey}&lang=${lang}&ppi=${ppi}&style=${style}`;
+      getURL (col, row, level) {
+        const style = 'lite.day'
+        return `https://maps.hereapi.com/v3/base/mc/${level}/${col}/${row}/${format}?apiKey=${apiKey}&lang=${lang}&ppi=${ppi}&style=${style}`
       },
-    };
-  };
+    }
+  }
 
   const getTruckLayerProviderLegacy = (enableCongestion: boolean): H.map.provider.ImageTileProvider.Options => {
     return {
       max: 20,
       min: 8,
-      getURL(col, row, level) {
-        return ["https://",
-          "1.base.maps.ls.hereapi.com/maptile/2.1/truckonlytile/newest/normal.day/",
+      getURL (col, row, level) {
+        return ['https://',
+          '1.base.maps.ls.hereapi.com/maptile/2.1/truckonlytile/newest/normal.day/',
           level,
-          "/",
+          '/',
           col,
-          "/",
+          '/',
           row,
-          "/256/png8",
-          "?style=fleet",
-          "&apiKey=",
+          '/256/png8',
+          '?style=fleet',
+          '&apiKey=',
           apiKey,
-          enableCongestion ? "&congestion" : "",
-          "&lg=",
+          enableCongestion ? '&congestion' : '',
+          '&lg=',
           lg,
-          "&ppi=",
-          hidpi ? "320" : "72",
-        ].join("");
+          '&ppi=',
+          hidpi ? '320' : '72',
+        ].join('')
       },
-    };
-  };
+    }
+  }
   const getTrafficOverlayProviderLegacy = (): H.map.provider.ImageTileProvider.Options => {
     return {
-      getURL(col, row, level) {
-        return ["https://",
-          "1.traffic.maps.ls.hereapi.com/maptile/2.1/flowtile/newest/normal.day/",
+      getURL (col, row, level) {
+        return ['https://',
+          '1.traffic.maps.ls.hereapi.com/maptile/2.1/flowtile/newest/normal.day/',
           level,
-          "/",
+          '/',
           col,
-          "/",
+          '/',
           row,
-          "/256/png8",
-          "?apiKey=",
+          '/256/png8',
+          '?apiKey=',
           apiKey,
-          "&ppi=",
-          hidpi ? "320" : "72",
-        ].join("");
+          '&ppi=',
+          hidpi ? '320' : '72',
+        ].join('')
       },
-    };
-  };
+    }
+  }
   const getTrafficBaseProviderLegacy = (): H.map.provider.ImageTileProvider.Options => {
     return {
-      getURL(col, row, level) {
-        return ["https://",
-          "1.traffic.maps.ls.hereapi.com/maptile/2.1/traffictile/newest/normal.day/",
+      getURL (col, row, level) {
+        return ['https://',
+          '1.traffic.maps.ls.hereapi.com/maptile/2.1/traffictile/newest/normal.day/',
           level,
-          "/",
+          '/',
           col,
-          "/",
+          '/',
           row,
-          "/256/png8",
-          "?apiKey=",
+          '/256/png8',
+          '?apiKey=',
           apiKey,
-          "&ppi=",
-          hidpi ? "320" : "72",
-        ].join("");
+          '&ppi=',
+          hidpi ? '320' : '72',
+        ].join('')
       },
-    };
-  };
+    }
+  }
 
   const truckOverlayProvider = new H.map.provider.ImageTileProvider(useLegacyTruckLayer
     ? getTruckLayerProviderLegacy(false)
-    : getTruckLayerProvider(false));
+    : getTruckLayerProvider(false))
   const truckOverlayCongestionProvider = new H.map.provider.ImageTileProvider(useLegacyTruckLayer
     ? getTruckLayerProviderLegacy(true)
-    : getTruckLayerProvider(true));
+    : getTruckLayerProvider(true))
   const trafficOverlayProvider = new H.map.provider.ImageTileProvider(useLegacyTrafficLayer
     ? getTrafficOverlayProviderLegacy()
-    : getTrafficOverlayProvider());
+    : getTrafficOverlayProvider())
   const trafficBaseProvider = new H.map.provider.ImageTileProvider(useLegacyTrafficLayer
     ? getTrafficBaseProviderLegacy()
-    : getTrafficBaseProvider());
+    : getTrafficBaseProvider())
 
   return {
     trafficBaseLayer: new H.map.layer.TileLayer(trafficBaseProvider),
     trafficOverlayLayer: new H.map.layer.TileLayer(trafficOverlayProvider),
     truckCongestionLayer: new H.map.layer.TileLayer(truckOverlayCongestionProvider),
     truckOverlayLayer: new H.map.layer.TileLayer(truckOverlayProvider),
-  };
-};
+  }
+}
 
 export const useRasterLayers = ({
   map,
@@ -170,56 +171,56 @@ export const useRasterLayers = ({
     hidpi,
     useLegacyTruckLayer,
     useLegacyTrafficLayer),
-    [apiKey, locale, lg, hidpi, map, useLegacyTruckLayer, useLegacyTrafficLayer]);
+  [apiKey, locale, lg, hidpi, map, useLegacyTruckLayer, useLegacyTrafficLayer])
 
   useEffect(() => {
     if (map && layers && !useVectorTiles && defaultLayers) {
-      const satelliteBaseLayer = defaultLayers?.raster.satellite.map;
-      const emptyBaseLayer = defaultLayers?.raster.normal.map;
+      const satelliteBaseLayer = defaultLayers?.raster.satellite.map
+      const emptyBaseLayer = defaultLayers?.raster.normal.map
       const baseLayer = useSatellite
         ? satelliteBaseLayer
         : trafficLayer
           ? layers.trafficBaseLayer
-          : emptyBaseLayer;
+          : emptyBaseLayer
 
-      map.setBaseLayer(baseLayer);
+      map.setBaseLayer(baseLayer)
     }
-  }, [map, useSatellite, defaultLayers, trafficLayer, useVectorTiles, layers]);
+  }, [map, useSatellite, defaultLayers, trafficLayer, useVectorTiles, layers])
 
   useEffect(() => {
     if (map && layers && !useVectorTiles) {
       if (truckRestrictions) {
         if (congestion) {
-          map.removeLayer(layers.truckOverlayLayer);
-          map.addLayer(layers.truckCongestionLayer);
+          map.removeLayer(layers.truckOverlayLayer)
+          map.addLayer(layers.truckCongestionLayer)
         } else {
-          map.removeLayer(layers.truckCongestionLayer);
-          map.addLayer(layers.truckOverlayLayer);
+          map.removeLayer(layers.truckCongestionLayer)
+          map.addLayer(layers.truckOverlayLayer)
         }
       } else {
-        map.removeLayer(layers.truckCongestionLayer);
-        map.removeLayer(layers.truckOverlayLayer);
+        map.removeLayer(layers.truckCongestionLayer)
+        map.removeLayer(layers.truckOverlayLayer)
       }
     }
-  }, [truckRestrictions, congestion, map, useVectorTiles, layers]);
+  }, [truckRestrictions, congestion, map, useVectorTiles, layers])
 
   useEffect(() => {
     if (map && !useVectorTiles && defaultLayers) {
       if (incidentsLayer) {
-        map.addLayer(defaultLayers.raster.normal.trafficincidents!);
+        map.addLayer(defaultLayers.raster.normal.trafficincidents!)
       } else {
-        map.removeLayer(defaultLayers.raster.normal.trafficincidents!);
+        map.removeLayer(defaultLayers.raster.normal.trafficincidents!)
       }
     }
-  }, [incidentsLayer, map, defaultLayers, useVectorTiles]);
+  }, [incidentsLayer, map, defaultLayers, useVectorTiles])
 
   useEffect(() => {
     if (map && layers && !useVectorTiles) {
       if (trafficLayer) {
-        map.addLayer(layers.trafficOverlayLayer);
+        map.addLayer(layers.trafficOverlayLayer)
       } else {
-        map.removeLayer(layers.trafficOverlayLayer);
+        map.removeLayer(layers.trafficOverlayLayer)
       }
     }
-  }, [trafficLayer, map, useVectorTiles, layers]);
-};
+  }, [trafficLayer, map, useVectorTiles, layers])
+}
diff --git a/src/useVectorLayers.ts b/src/useVectorLayers.ts
index 3c0f6f1..c1483b0 100644
--- a/src/useVectorLayers.ts
+++ b/src/useVectorLayers.ts
@@ -1,14 +1,14 @@
-import { useEffect } from "react";
+import { useEffect } from 'react'
 
 export interface UseVectorLayersProps {
-  map?: H.Map;
-  truckRestrictions?: boolean;
-  trafficLayer?: boolean;
-  incidentsLayer?: boolean;
-  useSatellite?: boolean;
-  congestion?: boolean;
-  defaultLayers?: H.service.DefaultLayers;
-  useVectorTiles: boolean;
+  map?: H.Map,
+  truckRestrictions?: boolean,
+  trafficLayer?: boolean,
+  incidentsLayer?: boolean,
+  useSatellite?: boolean,
+  congestion?: boolean,
+  defaultLayers?: H.service.DefaultLayers,
+  useVectorTiles: boolean,
 }
 
 export const useVectorLayers = ({
@@ -25,33 +25,32 @@ export const useVectorLayers = ({
     if (map && defaultLayers && useVectorTiles) {
       if (truckRestrictions) {
         // @ts-ignore
-        map.setBaseLayer(defaultLayers.vector.normal.truck);
+        map.setBaseLayer(defaultLayers.vector.normal.truck)
       } else {
         map.setBaseLayer(useSatellite
           ? defaultLayers.raster.satellite.map
-          : defaultLayers.vector.normal.map);
+          : defaultLayers.vector.normal.map)
       }
     }
-  }, [truckRestrictions, congestion, map, useVectorTiles, useSatellite]);
+  }, [defaultLayers, truckRestrictions, congestion, map, useVectorTiles, useSatellite])
 
   useEffect(() => {
     if (map && defaultLayers && useVectorTiles) {
       if (incidentsLayer) {
-        map.addLayer(defaultLayers.vector.normal.trafficincidents);
+        map.addLayer(defaultLayers.vector.normal.trafficincidents)
       } else {
-        map.removeLayer(defaultLayers.vector.normal.trafficincidents);
+        map.removeLayer(defaultLayers.vector.normal.trafficincidents)
       }
     }
-  }, [incidentsLayer, map, defaultLayers, useVectorTiles]);
+  }, [incidentsLayer, map, defaultLayers, useVectorTiles])
 
   useEffect(() => {
     if (map && defaultLayers && useVectorTiles) {
       if (trafficLayer) {
-        map.addLayer(defaultLayers.vector.normal.traffic);
+        map.addLayer(defaultLayers.vector.normal.traffic)
       } else {
-        map.removeLayer(defaultLayers.vector.normal.traffic);
+        map.removeLayer(defaultLayers.vector.normal.traffic)
       }
     }
-  }, [trafficLayer, map, defaultLayers, useVectorTiles]);
-
-};
+  }, [trafficLayer, map, defaultLayers, useVectorTiles])
+}
diff --git a/src/utils/cache.ts b/src/utils/cache.ts
index 3e7e8d7..80cc3d4 100644
--- a/src/utils/cache.ts
+++ b/src/utils/cache.ts
@@ -1,29 +1,30 @@
 // import from npm
-import loadjs from "loadjs";
-import getScriptMap from "./get-script-map";
+import loadjs from 'loadjs'
 
-/**
- * @deprecated use loadScripts instead
- */
-export const loadScriptsStandAlone = async (secure = true) => {
-  return loadScripts(secure);
-};
+import getScriptMap from './get-script-map'
 
 const loadJsDefaultOptions = {
   numRetries: 3,
   returnPromise: true,
-};
+}
 
 export const loadScripts = async (secure = true, loadLegacyModules = true) => {
-  const { coreScript, coreLegacyScript, serviceLegacyScript, ...scripts } = getScriptMap(secure);
-  if (!loadjs.isDefined("mapsjs-core")) {
+  const { coreScript, coreLegacyScript, serviceLegacyScript, ...scripts } = getScriptMap(secure)
+  if (!loadjs.isDefined('mapsjs-core')) {
     // Make sure this is loaded before the others
-    await loadjs(coreScript, "mapsjs-core", loadJsDefaultOptions);
+    await loadjs(coreScript, 'mapsjs-core', loadJsDefaultOptions)
   }
-  if (!loadjs.isDefined("mapsjs")) {
-    await loadjs(Object.values(scripts), "mapsjs", loadJsDefaultOptions);
+  if (!loadjs.isDefined('mapsjs')) {
+    await loadjs(Object.values(scripts), 'mapsjs', loadJsDefaultOptions)
   }
-  if (loadLegacyModules && !loadjs.isDefined("mapsjs-legacy")) {
-    await loadjs([coreLegacyScript, serviceLegacyScript], "mapsjs-legacy", loadJsDefaultOptions);
+  if (loadLegacyModules && !loadjs.isDefined('mapsjs-legacy')) {
+    await loadjs([coreLegacyScript, serviceLegacyScript], 'mapsjs-legacy', loadJsDefaultOptions)
   }
-};
+}
+
+/**
+ * @deprecated use loadScripts instead
+ */
+export const loadScriptsStandAlone = async (secure = true) => {
+  return loadScripts(secure)
+}
diff --git a/src/utils/get-dom-marker-icon.ts b/src/utils/get-dom-marker-icon.ts
index 991fdea..509d479 100644
--- a/src/utils/get-dom-marker-icon.ts
+++ b/src/utils/get-dom-marker-icon.ts
@@ -1,20 +1,19 @@
-
 /**
  * Map for HTML strings against H.map.DomIcon instances
  * @type {Map<string, ScriptState>}
  */
-export const DomIcons = new Map<string, H.map.DomIcon>();
+export const DomIcons = new Map<string, H.map.DomIcon>()
 
 /**
  * Returns the DOM Icon for the input HTML string, ensuring that no more
  * than one DOM Icon is created for each HTML string
  * @param html {string} - A string containing the markup to be used as a Dom Icon.
  */
-export default function getDomMarkerIcon(html: string): H.map.DomIcon {
+export default function getDomMarkerIcon (html: string): H.map.DomIcon {
   if (!DomIcons.has(html)) {
-    const icon = new H.map.DomIcon(html);
-    DomIcons.set(html, icon);
+    const icon = new H.map.DomIcon(html)
+    DomIcons.set(html, icon)
   }
 
-  return DomIcons.get(html);
+  return DomIcons.get(html)
 }
diff --git a/src/utils/get-marker-icon.ts b/src/utils/get-marker-icon.ts
index b5743a8..840ebe8 100644
--- a/src/utils/get-marker-icon.ts
+++ b/src/utils/get-marker-icon.ts
@@ -1,9 +1,8 @@
-
 /**
  * Map for image URL strings against H.map.Icon instances
  * @type {Map<string, ScriptState>}
  */
-export const Icons = new Map<string, H.map.Icon>();
+export const Icons = new Map<string, H.map.Icon>()
 
 /**
  * Returns the Icon for the input bitmap URL string, ensuring that no more
@@ -11,11 +10,11 @@ export const Icons = new Map<string, H.map.Icon>();
  * @param bitmap {string} - The location of the bitmap to be used as an icon
  * Note: this can cause a memleak if used with dynamically generated bitmaps.
  */
-export default function getMarkerIcon(bitmap: string, anchor?: H.math.IPoint): H.map.Icon {
+export default function getMarkerIcon (bitmap: string, anchor?: H.math.IPoint): H.map.Icon {
   if (!Icons.has(bitmap)) {
-    const icon = new H.map.Icon(bitmap, anchor ? { anchor, crossOrigin: false } : undefined);
-    Icons.set(bitmap, icon);
+    const icon = new H.map.Icon(bitmap, anchor ? { anchor, crossOrigin: false } : undefined)
+    Icons.set(bitmap, icon)
   }
 
-  return Icons.get(bitmap);
+  return Icons.get(bitmap)
 }
diff --git a/src/utils/get-platform.ts b/src/utils/get-platform.ts
index 99aa76a..ef98377 100644
--- a/src/utils/get-platform.ts
+++ b/src/utils/get-platform.ts
@@ -1,16 +1,16 @@
-let platform: H.service.Platform;
+let platform: H.service.Platform
 
 // return the current platform if there is one,
 // otherwise open up a new platform
-export function getPlatform(platformOptions: H.service.Platform.Options) {
+export function getPlatform (platformOptions: H.service.Platform.Options) {
   if (platform) {
-    return platform;
+    return platform
   }
 
-  platform = new H.service.Platform(platformOptions);
+  platform = new H.service.Platform(platformOptions)
 
-  return platform;
+  return platform
 }
 
 // make the getPlatform method the default export
-export default getPlatform;
+export default getPlatform
diff --git a/src/utils/get-script-map.ts b/src/utils/get-script-map.ts
index e4d9ee7..518b8b1 100644
--- a/src/utils/get-script-map.ts
+++ b/src/utils/get-script-map.ts
@@ -1,56 +1,56 @@
 // declare an interface representing the URL map that
 // is returned from this method
 export interface ScriptMap {
-  [key: string]: string;
+  [key: string]: string,
 }
 
-export function getScriptMap(secure?: boolean): ScriptMap {
+export function getScriptMap (secure?: boolean): ScriptMap {
   // store the versions of the HERE API
-  const apiVersion = "v3";
-  const codeVersion = "3.1";
+  const apiVersion = 'v3'
+  const codeVersion = '3.1'
 
   // get the relevant protocol for the HERE Maps API
-  let protocol = "";
+  let protocol = ''
 
   if (secure === true) {
-    protocol = "https:";
+    protocol = 'https:'
   }
 
   // the base url for all scripts from the API
   const baseUrl: string = `${protocol}//js.api.here.com/` +
-    `${apiVersion}/${codeVersion}`;
+    `${apiVersion}/${codeVersion}`
 
   // core code
   const coreScript: string =
-    `${baseUrl}/mapsjs-core.js`;
+    `${baseUrl}/mapsjs-core.js`
 
   // core legacy code
   const coreLegacyScript: string =
-    `${baseUrl}/mapsjs-core-legacy.js`;
+    `${baseUrl}/mapsjs-core-legacy.js`
 
   // service code
   const serviceScript: string =
-    `${baseUrl}/mapsjs-service.js`;
+    `${baseUrl}/mapsjs-service.js`
 
   // service legacy code
   const serviceLegacyScript: string =
-    `${baseUrl}/mapsjs-service-legacy.js`;
+    `${baseUrl}/mapsjs-service-legacy.js`
 
   // default ui code
   const uiScript: string =
-    `${baseUrl}/mapsjs-ui.js`;
+    `${baseUrl}/mapsjs-ui.js`
 
   // map events (pan, scroll wheel zoom) code
   const mapEventsScript: string =
-    `${baseUrl}/mapsjs-mapevents.js`;
+    `${baseUrl}/mapsjs-mapevents.js`
 
   // clustering module
   const clusteringScript: string =
-    `${baseUrl}/mapsjs-clustering.js`;
+    `${baseUrl}/mapsjs-clustering.js`
 
   // default ui css
   const uiCss: string =
-    `${baseUrl}/mapsjs-ui.css`;
+    `${baseUrl}/mapsjs-ui.css`
 
   // return an array with all script names within
   return {
@@ -62,8 +62,8 @@ export function getScriptMap(secure?: boolean): ScriptMap {
     serviceScript,
     uiCss,
     uiScript,
-  };
+  }
 }
 
 // make the getScriptMap method the default export
-export default getScriptMap;
+export default getScriptMap
diff --git a/src/utils/languages.ts b/src/utils/languages.ts
index 0b88295..b4b3155 100644
--- a/src/utils/languages.ts
+++ b/src/utils/languages.ts
@@ -1,50 +1,50 @@
 export enum Language {
-    FRE = "FRE",
-    GER = "GER",
-    SPA = "SPA",
-    ITA = "ITA",
-    SWA = "SWA",
-    DAN = "DAN",
-    NOR = "NOR",
-    FIN = "FIN",
-    AM = "AM",
-    SF = "SF",
-    GSW = "GSW",
-    POR = "POR",
-    TUR = "TUR",
-    ICE = "ICE",
-    RUS = "RUS",
-    HUN = "HUN",
-    DUT = "DUT",
-    BL = "BL",
-    ENG = "ENG",
-    CZE = "CZE",
-    SLO = "SLO",
-    POL = "POL",
-    SLV = "SLV",
-    CHT = "CHT",
-    CHI = "CHI",
-    JPN = "JPN",
-    THA = "THA",
-    AFR = "AFR",
-    ARA = "ARA",
-    BUL = "BUL",
-    CAT = "CAT",
-    SCR = "SCR",
-    EST = "EST",
-    GRE = "GRE",
-    HEB = "HEB",
-    HIN = "HIN",
-    IND = "IND",
-    LAV = "LAV",
-    LIT = "LIT",
-    MAY = "MAY",
-    MAR = "MAR",
-    RUM = "RUM",
-    SRP = "SRP",
-    SWE = "SWE",
-    UKR = "UKR",
-    URD = "URD",
-    VIE = "VIE",
-    BAQ = "BAQ",
+  FRE = 'FRE',
+  GER = 'GER',
+  SPA = 'SPA',
+  ITA = 'ITA',
+  SWA = 'SWA',
+  DAN = 'DAN',
+  NOR = 'NOR',
+  FIN = 'FIN',
+  AM = 'AM',
+  SF = 'SF',
+  GSW = 'GSW',
+  POR = 'POR',
+  TUR = 'TUR',
+  ICE = 'ICE',
+  RUS = 'RUS',
+  HUN = 'HUN',
+  DUT = 'DUT',
+  BL = 'BL',
+  ENG = 'ENG',
+  CZE = 'CZE',
+  SLO = 'SLO',
+  POL = 'POL',
+  SLV = 'SLV',
+  CHT = 'CHT',
+  CHI = 'CHI',
+  JPN = 'JPN',
+  THA = 'THA',
+  AFR = 'AFR',
+  ARA = 'ARA',
+  BUL = 'BUL',
+  CAT = 'CAT',
+  SCR = 'SCR',
+  EST = 'EST',
+  GRE = 'GRE',
+  HEB = 'HEB',
+  HIN = 'HIN',
+  IND = 'IND',
+  LAV = 'LAV',
+  LIT = 'LIT',
+  MAY = 'MAY',
+  MAR = 'MAR',
+  RUM = 'RUM',
+  SRP = 'SRP',
+  SWE = 'SWE',
+  UKR = 'UKR',
+  URD = 'URD',
+  VIE = 'VIE',
+  BAQ = 'BAQ',
 }
diff --git a/src/utils/mixin.ts b/src/utils/mixin.ts
deleted file mode 100644
index f9eef30..0000000
--- a/src/utils/mixin.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-
-export function mixin(behaviour: any, sharedBehaviour: any = {}) {
-  // these keys reflect the behaviour that is to be attached to class instances
-  const instanceKeys = Reflect.ownKeys(behaviour);
-  // these keys reflect static behaviour
-  const sharedKeys = Reflect.ownKeys(sharedBehaviour);
-  const typeTag = Symbol("isA");
-
-  function _mixin(workingClass: any) {
-    // attach instance-oriented behaviour
-    for (const property of instanceKeys) {
-      Object.defineProperty(
-        workingClass.prototype,
-        property,
-        {
-          value: behaviour[property],
-          writable: true,
-        },
-      );
-    }
-
-    Object.defineProperty(workingClass.prototype, typeTag, { value: true });
-
-    // attach static behaviour
-    for (const property of sharedKeys) {
-      Object.defineProperty(
-        workingClass,
-        property,
-        {
-          enumerable: sharedBehaviour.propertyIsEnumerable(property),
-          value: sharedBehaviour[property],
-          writable: true,
-        },
-      );
-    }
-  }
-
-  // this allows you to use "instanceof" on an object that uses a mixin
-  Object.defineProperty(
-    _mixin,
-    Symbol.hasInstance,
-    {
-      value: (instance: any) => !!instance[typeTag],
-      writable: true,
-    },
-  );
-
-  return _mixin;
-}
-
-export default mixin;
diff --git a/test/Circle.tests.tsx b/test/Circle.tests.tsx
deleted file mode 100644
index 888e5d3..0000000
--- a/test/Circle.tests.tsx
+++ /dev/null
@@ -1,311 +0,0 @@
-import * as chai from "chai";
-import { mount, ReactWrapper } from "enzyme";
-import { first } from "lodash";
-import * as React from "react";
-import * as Sinon from "sinon";
-
-import Circle from "../src/Circle";
-import HEREMap, { HEREMapProps, HEREMapState } from "../src/HEREMap";
-
-declare var global: any;
-declare var window: any;
-declare var sinon: Sinon.SinonStatic;
-
-describe("<HEREMap />", () => {
-  describe("<Circle />", () => {
-
-    let wrapper: ReactWrapper<HEREMapProps, HEREMapState>;
-
-    before(() => {
-      // get the page container element
-      const container = document.getElementById("page-container");
-
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // need to use full DOM rendering here to access lifecycle methods
-      wrapper = mount<HEREMapProps, HEREMapState>((
-        <HEREMap
-          apiKey=""
-          appId="NoiW7CS2CC05ppu95hyL"
-          appCode="28L997fKdiJiY7TVVEsEGQ"
-          center={center}
-          zoom={14}
-        />
-      ), {
-        attachTo: container,
-      });
-    });
-
-    it("should be attached to the H.Map instance associated with the map", () => {
-      // set the initial center of this circle
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // get the HEREMap instance
-      const instance: HEREMap = wrapper.instance() as HEREMap;
-
-      // mount a circle instance to the component
-      const circleWrapper = mount((
-        <Circle
-          {...center}
-          strokeColor="#1275E8"
-          fillColor="rgba(18, 117, 232, 0.2)"
-          lineWidth={2}
-          radius={10000}
-        />
-      ), {
-        context: {
-          map: instance.getMap(),
-        },
-      });
-
-      const { state } = instance;
-      const { map } = state;
-      const objects = map.getObjects();
-
-      // check that there is one object at least
-      chai.expect(objects).to.have.length(1);
-
-      circleWrapper.unmount();
-    });
-
-    it("should attach an object to the H.Map that is an instance of H.map.Circle", () => {
-      // set the initial center of this circle
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // get the HEREMap instance
-      const instance: HEREMap = wrapper.instance() as HEREMap;
-
-      // mount a circle instance to the component
-      const circleWrapper = mount((
-        <Circle
-          {...center}
-          strokeColor="#1275E8"
-          fillColor="rgba(18, 117, 232, 0.2)"
-          lineWidth={2}
-          radius={10000}
-        />
-      ), {
-        context: {
-          map: instance.getMap(),
-        },
-      });
-
-      const { state } = instance;
-      const { map } = state;
-      const objects = map.getObjects();
-      const circle = first(objects);
-
-      // check instanceof for this marker
-      chai.expect(circle).to.be.an.instanceof(H.map.Circle);
-
-      circleWrapper.unmount();
-    });
-
-    it("should have the correct center set on the circle", () => {
-      // set the initial center of this circle
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // get the HEREMap instance
-      const instance: HEREMap = wrapper.instance() as HEREMap;
-
-      // mount a circle instance to the component
-      const circleWrapper = mount((
-        <Circle
-          {...center}
-          strokeColor="#1275E8"
-          fillColor="rgba(18, 117, 232, 0.2)"
-          lineWidth={2}
-          radius={10000}
-        />
-      ), {
-        context: {
-          map: instance.getMap(),
-        },
-      });
-
-      const { state } = instance;
-      const { map } = state;
-      const objects = map.getObjects();
-
-      // check that there is one object at least
-      chai.expect(objects).to.have.length(1);
-
-      const circle = first<any>(objects) as H.map.Circle;
-
-      // check center of circle, using equals method of the H.geo.Point class
-      chai.expect(circle.getCenter().equals({ lat: 0, lng: 0 })).to.be.true;
-
-      circleWrapper.unmount();
-    });
-
-    it("should have the correct radius set on the circle", () => {
-      // set the initial center of this circle
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // get the HEREMap instance
-      const instance: HEREMap = wrapper.instance() as HEREMap;
-
-      // mount a circle instance to the component
-      const circleWrapper = mount((
-        <Circle
-          {...center}
-          strokeColor="#1275E8"
-          fillColor="rgba(18, 117, 232, 0.2)"
-          lineWidth={2}
-          radius={10000}
-        />
-      ), {
-        context: {
-          map: instance.getMap(),
-        },
-      });
-
-      const { state } = instance;
-      const { map } = state;
-      const objects = map.getObjects();
-
-      // check that there is one object at least
-      chai.expect(objects).to.have.length(1);
-
-      const circle = first<any>(objects) as H.map.Circle;
-
-      // check radius of circle
-      chai.expect(circle.getRadius()).to.equal(10000);
-
-      circleWrapper.unmount();
-    });
-
-    it("should automatically effect a change of radius when the radius prop is changed", () => {
-      // spy on the componentWillReceiveProps method of the Circle component
-      const willReceivePropsSpy = sinon.spy(Circle.prototype, "componentWillReceiveProps");
-
-      // set the initial center of this circle
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // get the HEREMap instance
-      const instance: HEREMap = wrapper.instance() as HEREMap;
-
-      // mount a circle instance to the component
-      const circleWrapper = mount((
-        <Circle
-          {...center}
-          strokeColor="#1275E8"
-          fillColor="rgba(18, 117, 232, 0.2)"
-          lineWidth={2}
-          radius={10000}
-        />
-      ), {
-        context: {
-          map: instance.getMap(),
-        },
-      });
-
-      const { state } = instance;
-      const { map } = state;
-      const objects = map.getObjects();
-
-      // check that there is one object at least
-      chai.expect(objects).to.have.length(1);
-
-      const circle = first<any>(objects) as H.map.Circle;
-
-      // check radius of circle
-      chai.expect(circle.getRadius()).to.equal(10000);
-
-      // change the radius to something other than the initial value
-      circleWrapper.setProps({
-        radius: 5000,
-      });
-
-      // expect componentWillReceiveProps to have been called once
-      chai.expect(Circle.prototype.componentWillReceiveProps).to.have.property("callCount", 1);
-
-      // check the new radius of the circle
-      chai.expect(circle.getRadius()).to.equal(5000);
-
-      circleWrapper.unmount();
-
-      willReceivePropsSpy.restore();
-    });
-
-    it("should automatically effect a change of center when the lat or lng props are changed", () => {
-      // spy on the componentWillReceiveProps method of the Circle component
-      const willReceivePropsSpy = sinon.spy(Circle.prototype, "componentWillReceiveProps");
-
-      // set the initial center of this circle
-      const center = {
-        lat: 0,
-        lng: 0,
-      };
-
-      // get the HEREMap instance
-      const instance: HEREMap = wrapper.instance() as HEREMap;
-
-      // mount a circle instance to the component
-      const circleWrapper = mount((
-        <Circle
-          {...center}
-          strokeColor="#1275E8"
-          fillColor="rgba(18, 117, 232, 0.2)"
-          lineWidth={2}
-          radius={10000}
-        />
-      ), {
-        context: {
-          map: instance.getMap(),
-        },
-      });
-
-      const { state } = instance;
-      const { map } = state;
-      const objects = map.getObjects();
-
-      // check that there is one object at least
-      chai.expect(objects).to.have.length(1);
-
-      const circle = first<any>(objects) as H.map.Circle;
-
-      // check center of circle, using equals method of the H.geo.Point class
-      chai.expect(circle.getCenter().equals({ lat: 0, lng: 0 })).to.equal(true);
-
-      // change the radius to something other than the initial value
-      circleWrapper.setProps({
-        lat: 1,
-      });
-
-      // expect componentWillReceiveProps to have been called once
-      chai.expect(Circle.prototype.componentWillReceiveProps).to.have.property("callCount", 1);
-
-      // check the new center of the circle, using equals method of the H.geo.Point class
-      chai.expect(circle.getCenter().equals({ lat: 1, lng: 0 })).to.equal(true);
-
-      circleWrapper.unmount();
-
-      willReceivePropsSpy.restore();
-    });
-
-    // unmount the component after all the tests are complete
-    after(() => {
-      wrapper.detach();
-    });
-
-  });
-});
diff --git a/test/HEREMap.tests.tsx b/test/HEREMap.tests.tsx
index 93e7c52..0f1f19d 100644
--- a/test/HEREMap.tests.tsx
+++ b/test/HEREMap.tests.tsx
@@ -1,92 +1,74 @@
-import * as chai from "chai";
-import * as $ from "jquery";
-import { forEach } from "lodash";
-import * as Sinon from "sinon";
+import * as chai from 'chai'
+import * as $ from 'jquery'
+import { forEach } from 'lodash'
+import * as Sinon from 'sinon'
 
-import HEREMap from "../src/HEREMap";
-import cache, { onAllLoad } from "../src/utils/cache";
-import getLink from "../src/utils/get-link";
-import getScriptMap from "../src/utils/get-script-map";
-import mount from "./helpers/mount";
+import HEREMap from '../src/HEREMap'
+import { loadScripts } from '../src/utils/cache'
+import getScriptMap from '../src/utils/get-script-map'
+import mount from './helpers/mount'
 
-declare var global: any;
-declare var window: any;
-declare var sinon: Sinon.SinonStatic;
+declare let sinon: Sinon.SinonStatic
 
-describe("<HEREMap />", () => {
+describe('<HEREMap />', () => {
+  before(function beforeAllHook (done) {
+    this.timeout(5000)
+    loadScripts(true, true).then(done)
+  })
 
-  before(function beforeAllHook(done) {
-    this.timeout(5000);
-
-    const scriptMap = getScriptMap();
-    cache(scriptMap);
-
-    const stylesheetUrl = "//js.api.here.com/v3/3.0/mapsjs-ui.css";
-    getLink(stylesheetUrl, "HERE Maps UI");
-
-    const fixture = "<div id=\"page-container\"></div>";
-    document.body.insertAdjacentHTML("afterbegin", fixture);
-
-    onAllLoad((errors: any[], results?: any[]) => {
-      global.H = window.H;
-      done(errors && errors[0]);
-    });
-  });
-
-  it("should call componentDidMount when the component is mounted", () => {
-    const didMountSpy = sinon.spy(HEREMap.prototype, "componentDidMount");
+  it('should call componentDidMount when the component is mounted', () => {
+    const didMountSpy = sinon.spy(HEREMap.prototype, 'componentDidMount')
 
     // need to use full DOM rendering here to access lifecycle methods
-    const wrapper = mount();
+    const wrapper = mount()
 
-    chai.expect(didMountSpy).to.have.property("callCount", 1);
+    chai.expect(didMountSpy).to.have.property('callCount', 1)
 
     // make sure we restore the original method at the end of the test, removing the spy
-    didMountSpy.restore();
+    didMountSpy.restore()
 
     // remove the test map from the DOM
-    wrapper.unmount();
-  });
+    wrapper.unmount()
+  })
 
-  it("should generate all the necessary script elements within the document", () => {
-    const scriptMap = getScriptMap();
+  it('should generate all the necessary script elements within the document', () => {
+    const scriptMap = getScriptMap()
     // check the length of the script map is equal to the number of script elements on the page
     // - we can do this as there are no other scripts on the page during testing
     forEach(scriptMap, (script: string) => {
-      chai.expect($(`script[src="${script}"]`).length).to.equal(1);
-    });
-  });
+      chai.expect($(`script[src="${script}"]`).length).to.equal(1)
+    })
+  })
 
-  it("should generate all the necessary link elements within the document", () => {
-    const stylesheetUrl = "//js.api.here.com/v3/3.0/mapsjs-ui.css";
+  it('should generate all the necessary link elements within the document', () => {
+    const stylesheetUrl = '//js.api.here.com/v3/3.0/mapsjs-ui.css'
     // check the number of link elements on the page is equal to 1
     // - we can do this as there are no other links on the page during testing
-    chai.expect($(`link[rel=\"stylesheet\"][href="${stylesheetUrl}"]`).length).to.equal(1);
-  });
+    chai.expect($(`link[rel="stylesheet"][href="${stylesheetUrl}"]`).length).to.equal(1)
+  })
 
-  it("should generate a map when the component gets rendered", () => {
+  it('should generate a map when the component gets rendered', () => {
     // need to use full DOM rendering here to access lifecycle methods
-    const wrapper = mount();
-    chai.expect($("canvas").length).to.equal(1);
-    wrapper.unmount();
-  });
+    const wrapper = mount()
+    chai.expect($('canvas').length).to.equal(1)
+    wrapper.unmount()
+  })
 
-  it("should generate a canvas twice the size of the map" +
-    " container when hidpi mode is enabled", () => {
+  it('should generate a canvas twice the size of the map' +
+    ' container when hidpi mode is enabled', () => {
     // need to use full DOM rendering here to access lifecycle methods
     const wrapper = mount({
       hidpi: true,
-    });
+    })
 
     // in hidpi mode, the pixelRatio is set to 2
     // this means the canvas height and width should be twice that of the map container
-    const canvasHeight = parseInt($("canvas").attr("height") as string, 10);
-    const canvasWidth = parseInt($("canvas").attr("width") as string, 10);
-
-    chai.expect(canvasHeight).to.equal($(".map-container").height() * 2);
-    chai.expect(canvasWidth).to.equal($(".map-container").width() * 2);
+    const canvasHeight = parseInt($('canvas').attr('height') as string, 10)
+    const canvasWidth = parseInt($('canvas').attr('width') as string, 10)
 
-    wrapper.unmount();
-  });
+    chai.expect(canvasHeight).to.equal($('.map-container').height()! * 2)
+    chai.expect(canvasWidth).to.equal($('.map-container').width()! * 2)
 
-});
+    wrapper.unmount()
+  })
+})
diff --git a/test/Marker.tests.tsx b/test/Marker.tests.tsx
index 86a7cd3..385160a 100644
--- a/test/Marker.tests.tsx
+++ b/test/Marker.tests.tsx
@@ -1,55 +1,52 @@
-import * as chai from "chai";
-import { mount, ReactWrapper } from "enzyme";
-import * as $ from "jquery";
-import { first } from "lodash";
-import * as React from "react";
-import * as Sinon from "sinon";
+import * as chai from 'chai'
+import { mount, ReactWrapper } from 'enzyme'
+import * as $ from 'jquery'
+import { first } from 'lodash'
+import * as React from 'react'
+import * as Sinon from 'sinon'
 
-import HEREMap, { HEREMapProps, HEREMapState } from "../src/HEREMap";
-import Marker from "../src/Marker";
+import HEREMapComponent, { HEREMapProps, HEREMapRef, HEREMapState } from '../src/HEREMap'
+import Marker from '../src/Marker'
 
-declare var global: any;
-declare var window: any;
-declare var sinon: Sinon.SinonStatic;
+type HEREMap = React.Component<HEREMapProps, HEREMapState> & HEREMapRef
 
-describe("<HEREMap />", () => {
-  describe("<Marker />", () => {
+declare let sinon: Sinon.SinonStatic
 
-    describe("DOM Marker", () => {
-      let wrapper: ReactWrapper<HEREMapProps, HEREMapState>;
+describe('<HEREMap />', () => {
+  describe('<Marker />', () => {
+    describe('DOM Marker', () => {
+      let wrapper: ReactWrapper<HEREMapProps, HEREMapState>
 
       before(() => {
         // get the page container element
-        const container = document.getElementById("page-container");
+        const container = document.getElementById('page-container')
 
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
         // need to use full DOM rendering here to access lifecycle methods
         wrapper = mount<HEREMapProps, HEREMapState>((
-          <HEREMap
+          <HEREMapComponent
             apiKey=""
-            appId="NoiW7CS2CC05ppu95hyL"
-            appCode="28L997fKdiJiY7TVVEsEGQ"
             center={center}
             zoom={14}
           />
         ), {
           attachTo: container,
-        });
-      });
+        })
+      })
 
-      it("should be attached to the H.Map instance associated with the map", () => {
+      it('should be attached to the H.Map instance associated with the map', () => {
         // set the initial center of this circle
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
         // get the HEREMap instance
-        const instance: HEREMap = wrapper.instance() as HEREMap;
+        const instance: HEREMap = wrapper.instance() as HEREMap
 
         // mount a marker to the HEREMap component
         const markerWrapper = mount((
@@ -60,27 +57,27 @@ describe("<HEREMap />", () => {
           context: {
             map: instance.getMap(),
           },
-        });
+        })
 
-        const { state } = instance;
-        const { map } = state;
-        const objects = map.getObjects();
+        const { state } = instance
+        const { map } = state
+        const objects = map?.getObjects()
 
         // check that there is one object at least
-        chai.expect(objects).to.have.length(1);
+        chai.expect(objects).to.have.length(1)
 
-        markerWrapper.unmount();
-      });
+        markerWrapper.unmount()
+      })
 
-      it("should attach an object to the H.Map that is an instance of H.map.DomMarker", () => {
+      it('should attach an object to the H.Map that is an instance of H.map.DomMarker', () => {
         // set the initial center of this circle
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
         // get the HEREMap instance
-        const instance: HEREMap = wrapper.instance() as HEREMap;
+        const instance: HEREMap = wrapper.instance() as HEREMap
 
         // mount a marker to the HEREMap component
         const markerWrapper = mount((
@@ -91,28 +88,28 @@ describe("<HEREMap />", () => {
           context: {
             map: instance.getMap(),
           },
-        });
+        })
 
-        const { state } = instance;
-        const { map } = state;
-        const objects = map.getObjects();
-        const thisMarker = first(objects);
+        const { state } = instance
+        const { map } = state
+        const objects = map?.getObjects()
+        const thisMarker = first(objects)
 
         // check instanceof for this marker
-        chai.expect(thisMarker).to.be.an.instanceof(H.map.DomMarker);
+        chai.expect(thisMarker).to.be.an.instanceof(H.map.DomMarker)
 
-        markerWrapper.unmount();
-      });
+        markerWrapper.unmount()
+      })
 
-      it("should render the DOM marker to the DOM itself", (done) => {
+      it('should render the DOM marker to the DOM itself', (done) => {
         // set the initial center of this circle
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
         // get the HEREMap instance
-        const instance: HEREMap = wrapper.instance() as HEREMap;
+        const instance: HEREMap = wrapper.instance() as HEREMap
 
         // mount a marker to the HEREMap component
         const markerWrapper = mount((
@@ -123,29 +120,29 @@ describe("<HEREMap />", () => {
           context: {
             map: instance.getMap(),
           },
-        });
+        })
 
         // pause for a bit, since for some reason the marker does not appear
         // in the DOM immediately
         setTimeout(() => {
-          chai.expect($(".dom-marker .circle-marker").length).to.equal(1);
-          markerWrapper.unmount();
-          done();
-        }, 500);
-      });
+          chai.expect($('.dom-marker .circle-marker').length).to.equal(1)
+          markerWrapper.unmount()
+          done()
+        }, 500)
+      })
 
-      it("should change the position of the marker automatically", () => {
+      it('should change the position of the marker automatically', () => {
         // spy on the componentWillReceiveProps method of the Marker component
-        const willReceivePropsSpy = sinon.spy(Marker.prototype, "componentWillReceiveProps");
+        const willReceivePropsSpy = sinon.spy(Marker.prototype, 'componentWillReceiveProps')
 
         // set the initial center of this circle
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
         // get the HEREMap instance
-        const instance: HEREMap = wrapper.instance() as HEREMap;
+        const instance: HEREMap = wrapper.instance() as HEREMap
 
         // mount a marker to the HEREMap component
         const markerWrapper = mount((
@@ -156,66 +153,63 @@ describe("<HEREMap />", () => {
           context: {
             map: instance.getMap(),
           },
-        });
+        })
 
-        const { state } = instance;
-        const { map } = state;
-        const objects = map.getObjects();
+        const { state } = instance
+        const { map } = state
+        const objects = map?.getObjects()
 
         // check that there is one object at least
-        chai.expect(objects).to.have.length(1);
+        chai.expect(objects).to.have.length(1)
 
-        const marker = first<any>(objects) as H.map.DomMarker;
+        const marker = first<any>(objects) as H.map.DomMarker
 
         // check position of marker, using equals method of the H.geo.Point class
-        chai.expect(marker.getPosition().equals({ lat: 0, lng: 0 })).to.equal(true);
+        chai.expect(marker.getGeometry().equals({ lat: 0, lng: 0 })).to.equal(true)
 
         // change the radius to something other than the initial value
         markerWrapper.setProps({
           lat: 1,
-        });
+        })
 
         // expect componentWillReceiveProps to have been called once
-        chai.expect(Marker.prototype.componentWillReceiveProps).to.have.property("callCount", 1);
+        chai.expect(Marker.prototype.componentWillReceiveProps).to.have.property('callCount', 1)
 
         // check the new radius of the circle
-        chai.expect(marker.getPosition().equals({ lat: 1, lng: 0 })).to.equal(true);
+        chai.expect(marker.getGeometry().equals({ lat: 1, lng: 0 })).to.equal(true)
 
-        markerWrapper.unmount();
+        markerWrapper.unmount()
 
-        willReceivePropsSpy.restore();
-      });
+        willReceivePropsSpy.restore()
+      })
 
       // unmount the component after all the tests are complete
       after(() => {
-        wrapper.unmount();
-      });
+        wrapper.unmount()
+      })
+    })
 
-    });
+    describe('Marker w/ Bitmap Provided', () => {
+      let wrapper: ReactWrapper<HEREMapProps, HEREMapState>
 
-    describe("Marker w/ Bitmap Provided", () => {
-      let wrapper: ReactWrapper<HEREMapProps, HEREMapState>;
-
-      it("should call the constructor of H.map.Icon with the correct bitmap parameter", () => {
+      it('should call the constructor of H.map.Icon with the correct bitmap parameter', () => {
         // spy on the H.map.Icon constructor
-        const iconSpy = sinon.spy(H.map, "Icon");
+        const iconSpy = sinon.spy(H.map, 'Icon')
 
         // get the page container element
-        const container = document.getElementById("page-container");
+        const container = document.getElementById('page-container')
 
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
-        const bitmap = "https://josh-es.github.io/react-here-maps/images/map-marker.png";
+        const bitmap = 'https://josh-es.github.io/react-here-maps/images/map-marker.png'
 
         // need to use full DOM rendering here to access lifecycle methods
         wrapper = mount<HEREMapProps, HEREMapState>((
-          <HEREMap
+          <HEREMapComponent
             apiKey=""
-            appId="NoiW7CS2CC05ppu95hyL"
-            appCode="28L997fKdiJiY7TVVEsEGQ"
             center={center}
             zoom={14}
           >
@@ -223,114 +217,109 @@ describe("<HEREMap />", () => {
               {...center}
               bitmap={bitmap}
             />
-          </HEREMap>
+          </HEREMapComponent>
         ), {
           attachTo: container,
-        });
+        })
 
-        chai.expect(iconSpy.calledWith(bitmap)).to.equal(true);
+        chai.expect(iconSpy.calledWith(bitmap)).to.equal(true)
 
         // restore the original function
-        iconSpy.restore();
-      });
+        iconSpy.restore()
+      })
 
-      it("should be the single Marker child of the HEREMap component instance", () => {
+      it('should be the single Marker child of the HEREMap component instance', () => {
         // expect that a marker child component must be present
-        chai.expect(wrapper.find(Marker)).to.have.length(1);
-      });
+        chai.expect(wrapper.find(Marker)).to.have.length(1)
+      })
 
-      it("should be attached to the H.Map instance associated with the map", () => {
-        const instance: HEREMap = wrapper.instance() as HEREMap;
-        const { state: { map } } = instance;
-        const objects = map.getObjects();
+      it('should be attached to the H.Map instance associated with the map', () => {
+        const instance: HEREMap = wrapper.instance() as HEREMap
+        const { state: { map } } = instance
+        const objects = map?.getObjects()
 
         // check that there is one object at least
-        chai.expect(objects).to.have.length(1);
-      });
+        chai.expect(objects).to.have.length(1)
+      })
 
-      it("should attach an object to the H.Map that is an instance of H.map.Marker", () => {
-        const instance: HEREMap = wrapper.instance() as HEREMap;
-        const { state: { map } } = instance;
-        const objects = map.getObjects();
-        const thisMarker = first(objects);
+      it('should attach an object to the H.Map that is an instance of H.map.Marker', () => {
+        const instance: HEREMap = wrapper.instance() as HEREMap
+        const { state: { map } } = instance
+        const objects = map?.getObjects()
+        const thisMarker = first(objects)
 
         // check instanceof for this marker
-        chai.expect(thisMarker).to.be.an.instanceof(H.map.Marker);
-      });
+        chai.expect(thisMarker).to.be.an.instanceof(H.map.Marker)
+      })
 
       // unmount the component after all the tests are complete
       after(() => {
-        wrapper.unmount();
-      });
-
-    });
+        wrapper.unmount()
+      })
+    })
 
-    describe("Default Marker", () => {
-      let wrapper: ReactWrapper<HEREMapProps, HEREMapState>;
+    describe('Default Marker', () => {
+      let wrapper: ReactWrapper<HEREMapProps, HEREMapState>
 
-      it("should not have triggered the H.map.Icon or H.map.DomIcon constructors", () => {
+      it('should not have triggered the H.map.Icon or H.map.DomIcon constructors', () => {
         // spy on the H.map.Icon constructor
-        const iconSpy = sinon.spy(H.map, "Icon");
+        const iconSpy = sinon.spy(H.map, 'Icon')
         // spy on the H.map.DomIcon constructor
-        const domIconSpy = sinon.spy(H.map, "DomIcon");
+        const domIconSpy = sinon.spy(H.map, 'DomIcon')
 
         // get the page container element
-        const container = document.getElementById("page-container");
+        const container = document.getElementById('page-container')
 
         const center = {
           lat: 0,
           lng: 0,
-        };
+        }
 
         // need to use full DOM rendering here to access lifecycle methods
         wrapper = mount<HEREMapProps, HEREMapState>((
-          <HEREMap
+          <HEREMapComponent
             apiKey=""
-            appId="NoiW7CS2CC05ppu95hyL"
-            appCode="28L997fKdiJiY7TVVEsEGQ"
             center={center}
             zoom={14}
           >
             <Marker {...center} />
-          </HEREMap>
+          </HEREMapComponent>
         ), {
           attachTo: container,
-        });
+        })
 
-        chai.expect(iconSpy).to.have.property("callCount", 0);
-        chai.expect(domIconSpy).to.have.property("callCount", 0);
-      });
+        chai.expect(iconSpy).to.have.property('callCount', 0)
+        chai.expect(domIconSpy).to.have.property('callCount', 0)
+      })
 
-      it("should be the single Marker child of the HEREMap component instance", () => {
+      it('should be the single Marker child of the HEREMap component instance', () => {
         // expect that a marker child component must be present
-        chai.expect(wrapper.find(Marker)).to.have.length(1);
-      });
+        chai.expect(wrapper.find(Marker)).to.have.length(1)
+      })
 
-      it("should be attached to the H.Map instance associated with the map", () => {
-        const instance: HEREMap = wrapper.instance() as HEREMap;
-        const { state: { map } } = instance;
-        const objects = map.getObjects();
+      it('should be attached to the H.Map instance associated with the map', () => {
+        const instance: HEREMap = wrapper.instance() as HEREMap
+        const { state: { map } } = instance
+        const objects = map?.getObjects()
 
         // check that there is one object at least
-        chai.expect(objects).to.have.length(1);
-      });
+        chai.expect(objects).to.have.length(1)
+      })
 
-      it("should attach an object to the H.Map that is an instance of H.map.Marker", () => {
-        const instance: HEREMap = wrapper.instance() as HEREMap;
-        const { state: { map } } = instance;
-        const objects = map.getObjects();
-        const thisMarker = first(objects);
+      it('should attach an object to the H.Map that is an instance of H.map.Marker', () => {
+        const instance: HEREMap = wrapper.instance() as HEREMap
+        const { state: { map } } = instance
+        const objects = map?.getObjects()
+        const thisMarker = first(objects)
 
         // check instanceof for this marker
-        chai.expect(thisMarker).to.be.an.instanceof(H.map.Marker);
-      });
+        chai.expect(thisMarker).to.be.an.instanceof(H.map.Marker)
+      })
 
       // unmount the component after all the tests are complete
       after(() => {
-        wrapper.unmount();
-      });
-
-    });
-
-  });
-});
+        wrapper.unmount()
+      })
+    })
+  })
+})
diff --git a/test/helpers/mount.tsx b/test/helpers/mount.tsx
index d324b6e..fc00887 100644
--- a/test/helpers/mount.tsx
+++ b/test/helpers/mount.tsx
@@ -1,31 +1,30 @@
-import { mount, ReactWrapper } from "enzyme";
-import { assignIn } from "lodash";
-import * as React from "react";
-import HEREMap, { HEREMapProps } from "../../src/HEREMap";
+import { mount, ReactWrapper } from 'enzyme'
+import { assignIn } from 'lodash'
+import * as React from 'react'
+
+import HEREMap, { HEREMapProps } from '../../src/HEREMap'
 
 // mount a test component to the DOM
-export function mountComponent(userProps?: any): ReactWrapper<any, any> {
-    const props: HEREMapProps = assignIn({
-        appCode: "28L997fKdiJiY7TVVEsEGQ",
-        appId: "NoiW7CS2CC05ppu95hyL",
-        center: { lat: 0, lng: 0 },
-        zoom: 14,
-    }, userProps);
+export function mountComponent (userProps?: any): ReactWrapper<any, any> {
+  const props: HEREMapProps = assignIn({
+    appCode: '28L997fKdiJiY7TVVEsEGQ',
+    appId: 'NoiW7CS2CC05ppu95hyL',
+    center: { lat: 0, lng: 0 },
+    zoom: 14,
+  }, userProps)
 
-    const container = document.getElementById("page-container");
+  const container = document.getElementById('page-container')
 
-    // need to use full DOM rendering here to access lifecycle methods
-    const wrapper = mount((
+  // need to use full DOM rendering here to access lifecycle methods
+  // return the wrapper back
+  return mount((
         <HEREMap
-            {...props}
+          {...props}
         />
-    ), {
-        attachTo: container,
-    });
-
-    // return the wrapper back
-    return wrapper;
+  ), {
+    attachTo: container,
+  })
 }
 
 // make the exported mount function the default export
-export default mountComponent;
+export default mountComponent
diff --git a/test/main.tests.ts b/test/main.tests.ts
index 95589d0..318c3b6 100644
--- a/test/main.tests.ts
+++ b/test/main.tests.ts
@@ -1,12 +1,10 @@
 // the here maps tests make sure the scripts are loaded before proceeding
-import "./HEREMap.tests";
-
+import './HEREMap.tests'
 // then we can complete the other tests
-import "./Circle.tests";
-import "./Marker.tests";
-import "./mixins/h-map-methods.tests";
-import "./utils/cache.tests";
-import "./utils/get-dom-marker-icon.tests";
-import "./utils/get-marker-icon.tests";
-import "./utils/get-script-map.tests";
-import "./utils/mixin.tests";
+import './Circle.tests'
+import './Marker.tests'
+import './utils/cache.tests'
+import './utils/get-dom-marker-icon.tests'
+import './utils/get-marker-icon.tests'
+import './utils/get-script-map.tests'
+import './utils/mixin.tests'
diff --git a/test/mixins/h-map-methods.tests.tsx b/test/mixins/h-map-methods.tests.tsx
deleted file mode 100644
index c1cc6ef..0000000
--- a/test/mixins/h-map-methods.tests.tsx
+++ /dev/null
@@ -1,225 +0,0 @@
-import * as chai from "chai";
-import * as $ from "jquery";
-import "react";
-import * as Sinon from "sinon";
-
-import HEREMap from "../../src/HEREMap";
-import cache, { onAllLoad } from "../../src/utils/cache";
-import getLink from "../../src/utils/get-link";
-import getScriptMap from "../../src/utils/get-script-map";
-import mount from "../helpers/mount";
-
-declare var global: any;
-declare var window: any;
-declare var sinon: Sinon.SinonStatic;
-
-describe("<HEREMap />", () => {
-
-  before((done) => {
-    const scriptMap = getScriptMap();
-    cache(scriptMap);
-
-    const stylesheetUrl = "//js.api.here.com/v3/3.0/mapsjs-ui.css";
-    getLink(stylesheetUrl, "HERE Maps UI");
-
-    const fixture = "<div id=\"page-container\"></div>";
-    document.body.insertAdjacentHTML("afterbegin", fixture);
-
-    onAllLoad((errors: any[], results?: any[]) => {
-      global.H = window.H;
-      done(errors && errors[0]);
-    });
-  });
-
-  describe("HMapMethods Mixin", () => {
-    describe("#getElement()", () => {
-
-      it("should return an element when called on a <HEREMap> component instance", () => {
-        // need to use full DOM rendering here to access lifecycle methods
-        const wrapper = mount();
-
-        // get the component from the ReactWrapper returned by enzyme
-        const component: HEREMap = wrapper.instance() as HEREMap;
-        const componentEl = component.getElement();
-
-        // get the number of map containers and canvas elements
-        const mapContainersLength = $(componentEl).find(".map-container").length;
-        const canvasLength = $(componentEl).find("canvas").length;
-
-        // we should have one map container and one canvas for the one <HEREMap> component instance
-        chai.expect(mapContainersLength).to.equal(1);
-        chai.expect(canvasLength).to.equal(1);
-
-        // remove the test map from the DOM
-        wrapper.unmount();
-      });
-
-    });
-
-    describe("#getMap()", () => {
-
-      it("should return a H.Map instance when called on a <HEREMap> component instance", () => {
-        // need to use full DOM rendering here to access lifecycle methods
-        const wrapper = mount();
-
-        // get the component from the ReactWrapper returned by enzyme
-        const component: HEREMap = wrapper.instance() as HEREMap;
-        const map = component.getMap();
-
-        // expect the returned map to be an instance of H.Map
-        chai.expect(map).to.be.an.instanceof(H.Map);
-
-        // remove the test map from the DOM
-        wrapper.unmount();
-      });
-
-    });
-
-    describe("#setCenter(point: H.geo.IPoint)", () => {
-
-      it("should set the center of the associated H.Map instance " +
-        "when called on a <HEREMap> component instance", () => {
-          // need to use full DOM rendering here to access lifecycle methods
-          const wrapper = mount();
-
-          // get the component from the ReactWrapper returned by enzyme
-          const component: HEREMap = wrapper.instance() as HEREMap;
-          const map = component.getMap();
-
-          // expect the returned map to be an instance of H.Map
-          chai.expect(map).to.be.an.instanceof(H.Map);
-
-          // spy on the map.setCenter method
-          const setCenterSpy = sinon.spy(map, "setCenter");
-
-          component.setCenter({ lat: 51.5, lng: 0 });
-
-          // expect map.setCenter to have been called once
-          chai.expect(map.setCenter).to.have.property("callCount", 1);
-
-          setCenterSpy.restore();
-
-          // remove the test map from the DOM
-          wrapper.unmount();
-        });
-
-    });
-
-    describe("#setZoom(zoom: number)", () => {
-
-      it("should set the zoom of the associated H.Map instance " +
-        "when called on a <HEREMap> component instance", () => {
-          // need to use full DOM rendering here to access lifecycle methods
-          const wrapper = mount();
-
-          // get the component from the ReactWrapper returned by enzyme
-          const component: HEREMap = wrapper.instance() as HEREMap;
-          const map = component.getMap();
-
-          // expect the returned map to be an instance of H.Map
-          chai.expect(map).to.be.an.instanceof(H.Map);
-
-          // spy on the map.setZoom method
-          const setZoomSpy = sinon.spy(map, "setZoom");
-
-          component.setZoom(12);
-
-          // expect map.setZoom to have been called once
-          chai.expect(map.setZoom).to.have.property("callCount", 1);
-
-          setZoomSpy.restore();
-
-          // remove the test map from the DOM
-          wrapper.unmount();
-        });
-
-    });
-
-    describe("#componentWillReceiveProps(nextProps: HEREMapProps)", () => {
-
-      it("should be called when the props on the associated <HEREMap> instance change", () => {
-        // need to use full DOM rendering here to access lifecycle methods
-        const wrapper = mount();
-
-        // spy on the HEREMap.componentWillReceiveProps method
-        const willReceivePropsSpy = sinon.spy(HEREMap.prototype, "componentWillReceiveProps");
-
-        // set the zoom property to something different to the initial value
-        wrapper.setProps({ zoom: 12 });
-
-        // expect map.setZoom to have been called once
-        chai.expect(HEREMap.prototype.componentWillReceiveProps).to.have.property("callCount", 1);
-
-        // restore the original method on the HEREMap class (important)
-        willReceivePropsSpy.restore();
-
-        // remove the test map from the DOM
-        wrapper.unmount();
-      });
-
-      it("should change the zoom level when the zoom prop " +
-        "on the associated <HEREMap> instance changes", (done) => {
-          // need to use full DOM rendering here to access lifecycle methods
-          const wrapper = mount();
-
-          // TODO find way of doing this a bit better
-          // use timeouts to deal with the time it takes to fetch and render a map
-          setTimeout(() => {
-            // get the map associated with the mounted HEREMap instance
-            const instance: HEREMap = wrapper.instance() as HEREMap;
-            const map = instance.getMap();
-
-            // test the original zoom level of the map
-            chai.expect(map.getZoom()).to.equal(14);
-
-            // set the zoom property to something different to the initial value
-            wrapper.setProps({ zoom: 12 });
-
-            setTimeout(() => {
-              // test the new zoom level
-              chai.expect(map.getZoom()).to.equal(12);
-
-              // remove the test map from the DOM
-              wrapper.unmount();
-
-              done();
-            }, 500);
-          }, 500);
-        });
-
-      it("should change the center when the center prop on the associated <HEREMap> instance changes", (done) => {
-        // need to use full DOM rendering here to access lifecycle methods
-        const wrapper = mount();
-
-        // use timeouts to deal with the time it takes to fetch and render a map
-        setTimeout(() => {
-          // get the map associated with the mounted HEREMap instance
-          const instance: HEREMap = wrapper.instance() as HEREMap;
-          const map = instance.getMap();
-
-          // test the original center of the map
-          chai.expect(map.getCenter().equals({ lat: 0, lng: 0 })).to.equal(true);
-
-          // set the zoom property to something different to the initial value
-          wrapper.setProps({
-            center: {
-              lat: 1,
-              lng: 1,
-            },
-          });
-
-          setTimeout(() => {
-            // test the new center
-            chai.expect(map.getCenter().equals({ lat: 1, lng: 1 })).to.equal(true);
-
-            // remove the test map from the DOM
-            wrapper.unmount();
-
-            done();
-          }, 500);
-        }, 500);
-      });
-
-    });
-  });
-});
diff --git a/test/utils/get-dom-marker-icon.tests.ts b/test/utils/get-dom-marker-icon.tests.ts
index 92b8703..b230c93 100644
--- a/test/utils/get-dom-marker-icon.tests.ts
+++ b/test/utils/get-dom-marker-icon.tests.ts
@@ -1,50 +1,48 @@
-import { expect } from "chai";
+import { expect } from 'chai'
 
-import getDomMarkerIcon, { DomIcons } from "../../src/utils/get-dom-marker-icon";
-
-describe("<HEREMap />", () => {
-  describe("#getDomMarkerIcon(html: string): H.map.DomIcon", () => {
+import getDomMarkerIcon, { DomIcons } from '../../src/utils/get-dom-marker-icon'
 
+describe('<HEREMap />', () => {
+  describe('#getDomMarkerIcon(html: string): H.map.DomIcon', () => {
     beforeEach(() => {
-      DomIcons.clear();
-    });
+      DomIcons.clear()
+    })
 
-    it("should create a new dom icon instance if one does not exist", () => {
-      const html: string = "<div class='dom-marker'><div class='circle-marker' /></div>";
+    it('should create a new dom icon instance if one does not exist', () => {
+      const html: string = '<div class=\'dom-marker\'><div class=\'circle-marker\' /></div>'
 
       // test we get an icon instance
-      const icon: H.map.DomIcon = getDomMarkerIcon(html);
-      expect(icon).to.be.an.instanceof(H.map.DomIcon);
-    });
+      const icon: H.map.DomIcon = getDomMarkerIcon(html)
+      expect(icon).to.be.an.instanceof(H.map.DomIcon)
+    })
 
-    it("should add the new dom icon instance to the map", () => {
-      const html: string = "<div class='dom-marker'><div class='circle-marker' /></div>";
+    it('should add the new dom icon instance to the map', () => {
+      const html: string = '<div class=\'dom-marker\'><div class=\'circle-marker\' /></div>'
 
       // expect the map size to be zero
-      expect(DomIcons.size).to.equal(0);
+      expect(DomIcons.size).to.equal(0)
 
       // get an icon instance
-      getDomMarkerIcon(html);
+      getDomMarkerIcon(html)
 
       // test that the size has increased by one
-      expect(DomIcons.size).to.equal(1);
-    });
+      expect(DomIcons.size).to.equal(1)
+    })
 
-    it("shouldn't create two dom icons for the same bitmap", () => {
-      const html: string = "<div class='dom-marker'><div class='circle-marker' /></div>";
+    it('shouldn\'t create two dom icons for the same bitmap', () => {
+      const html: string = '<div class=\'dom-marker\'><div class=\'circle-marker\' /></div>'
 
       // get an icon instance
-      getDomMarkerIcon(html);
+      getDomMarkerIcon(html)
 
       // test that the size has increased to one
-      expect(DomIcons.size).to.equal(1);
+      expect(DomIcons.size).to.equal(1)
 
       // get a second icon instance
-      getDomMarkerIcon(html);
+      getDomMarkerIcon(html)
 
       // test that the size is still one
-      expect(DomIcons.size).to.equal(1);
-    });
-
-  });
-});
+      expect(DomIcons.size).to.equal(1)
+    })
+  })
+})
diff --git a/test/utils/get-marker-icon.tests.ts b/test/utils/get-marker-icon.tests.ts
index 8a0b587..bce4305 100644
--- a/test/utils/get-marker-icon.tests.ts
+++ b/test/utils/get-marker-icon.tests.ts
@@ -1,50 +1,48 @@
-import { expect } from "chai";
+import { expect } from 'chai'
 
-import getMarkerIcon, { Icons } from "../../src/utils/get-marker-icon";
-
-describe("<HEREMap />", () => {
-  describe("#getMarkerIcon(bitmap: string): H.map.Icon", () => {
+import getMarkerIcon, { Icons } from '../../src/utils/get-marker-icon'
 
+describe('<HEREMap />', () => {
+  describe('#getMarkerIcon(bitmap: string): H.map.Icon', () => {
     beforeEach(() => {
-      Icons.clear();
-    });
+      Icons.clear()
+    })
 
-    it("should create a new icon instance if one does not exist", () => {
-      const bitmap: string = "https://josh-es.github.io/react-here-maps/images/map-marker.png";
+    it('should create a new icon instance if one does not exist', () => {
+      const bitmap: string = 'https://josh-es.github.io/react-here-maps/images/map-marker.png'
 
       // test we get an icon instance
-      const icon: H.map.Icon = getMarkerIcon(bitmap);
-      expect(icon).to.be.an.instanceof(H.map.Icon);
-    });
+      const icon: H.map.Icon = getMarkerIcon(bitmap)
+      expect(icon).to.be.an.instanceof(H.map.Icon)
+    })
 
-    it("should add the new icon instance to the map", () => {
-      const bitmap: string = "https://josh-es.github.io/react-here-maps/images/map-marker.png";
+    it('should add the new icon instance to the map', () => {
+      const bitmap: string = 'https://josh-es.github.io/react-here-maps/images/map-marker.png'
 
       // expect the map size to be zero
-      expect(Icons.size).to.equal(0);
+      expect(Icons.size).to.equal(0)
 
       // get an icon instance
-      getMarkerIcon(bitmap);
+      getMarkerIcon(bitmap)
 
       // test that the size has increased by one
-      expect(Icons.size).to.equal(1);
-    });
+      expect(Icons.size).to.equal(1)
+    })
 
-    it("shouldn't create two icons for the same bitmap", () => {
-      const bitmap: string = "https://josh-es.github.io/react-here-maps/images/map-marker.png";
+    it('shouldn\'t create two icons for the same bitmap', () => {
+      const bitmap: string = 'https://josh-es.github.io/react-here-maps/images/map-marker.png'
 
       // get an icon instance
-      getMarkerIcon(bitmap);
+      getMarkerIcon(bitmap)
 
       // test that the size has increased to one
-      expect(Icons.size).to.equal(1);
+      expect(Icons.size).to.equal(1)
 
       // get a second icon instance
-      getMarkerIcon(bitmap);
+      getMarkerIcon(bitmap)
 
       // test that the size is still one
-      expect(Icons.size).to.equal(1);
-    });
-
-  });
-});
+      expect(Icons.size).to.equal(1)
+    })
+  })
+})
diff --git a/test/utils/get-script-map.tests.ts b/test/utils/get-script-map.tests.ts
index 313202d..7444769 100644
--- a/test/utils/get-script-map.tests.ts
+++ b/test/utils/get-script-map.tests.ts
@@ -1,41 +1,39 @@
-import { expect } from "chai";
+import { expect } from 'chai'
 
-import getScriptMap, { ScriptMap } from "../../src/utils/get-script-map";
+import getScriptMap, { ScriptMap } from '../../src/utils/get-script-map'
 
-describe("<HEREMap />", () => {
-  describe("#getScriptMap(secure?: boolean)", () => {
-
-    it("should return all four core HERE Maps JavaScript API scripts", () => {
-      const scriptMap: ScriptMap = getScriptMap();
+describe('<HEREMap />', () => {
+  describe('#getScriptMap(secure?: boolean)', () => {
+    it('should return all four core HERE Maps JavaScript API scripts', () => {
+      const scriptMap: ScriptMap = getScriptMap()
 
       // expect the script map to have all four scripts set as properties
-      expect(scriptMap).to.have.property("coreScript");
-      expect(scriptMap).to.have.property("mapEventsScript");
-      expect(scriptMap).to.have.property("serviceScript");
-      expect(scriptMap).to.have.property("uiScript");
+      expect(scriptMap).to.have.property('coreScript')
+      expect(scriptMap).to.have.property('mapEventsScript')
+      expect(scriptMap).to.have.property('serviceScript')
+      expect(scriptMap).to.have.property('uiScript')
 
       // test the values of the scripts
-      expect(scriptMap.coreScript).to.equal("//js.api.here.com/v3/3.0/mapsjs-core.js");
-      expect(scriptMap.mapEventsScript).to.equal("//js.api.here.com/v3/3.0/mapsjs-mapevents.js");
-      expect(scriptMap.serviceScript).to.equal("//js.api.here.com/v3/3.0/mapsjs-service.js");
-      expect(scriptMap.uiScript).to.equal("//js.api.here.com/v3/3.0/mapsjs-ui.js");
-    });
+      expect(scriptMap.coreScript).to.equal('//js.api.here.com/v3/3.0/mapsjs-core.js')
+      expect(scriptMap.mapEventsScript).to.equal('//js.api.here.com/v3/3.0/mapsjs-mapevents.js')
+      expect(scriptMap.serviceScript).to.equal('//js.api.here.com/v3/3.0/mapsjs-service.js')
+      expect(scriptMap.uiScript).to.equal('//js.api.here.com/v3/3.0/mapsjs-ui.js')
+    })
 
-    it("should force https if secure flag set to true", () => {
-      const scriptMap: ScriptMap = getScriptMap(true);
+    it('should force https if secure flag set to true', () => {
+      const scriptMap: ScriptMap = getScriptMap(true)
 
       // expect the script map to have all four scripts set as properties
-      expect(scriptMap).to.have.property("coreScript");
-      expect(scriptMap).to.have.property("mapEventsScript");
-      expect(scriptMap).to.have.property("serviceScript");
-      expect(scriptMap).to.have.property("uiScript");
+      expect(scriptMap).to.have.property('coreScript')
+      expect(scriptMap).to.have.property('mapEventsScript')
+      expect(scriptMap).to.have.property('serviceScript')
+      expect(scriptMap).to.have.property('uiScript')
 
       // test the values of the scripts have https at the front
-      expect(scriptMap.coreScript).to.equal("https://js.api.here.com/v3/3.0/mapsjs-core.js");
-      expect(scriptMap.mapEventsScript).to.equal("https://js.api.here.com/v3/3.0/mapsjs-mapevents.js");
-      expect(scriptMap.serviceScript).to.equal("https://js.api.here.com/v3/3.0/mapsjs-service.js");
-      expect(scriptMap.uiScript).to.equal("https://js.api.here.com/v3/3.0/mapsjs-ui.js");
-    });
-
-  });
-});
+      expect(scriptMap.coreScript).to.equal('https://js.api.here.com/v3/3.0/mapsjs-core.js')
+      expect(scriptMap.mapEventsScript).to.equal('https://js.api.here.com/v3/3.0/mapsjs-mapevents.js')
+      expect(scriptMap.serviceScript).to.equal('https://js.api.here.com/v3/3.0/mapsjs-service.js')
+      expect(scriptMap.uiScript).to.equal('https://js.api.here.com/v3/3.0/mapsjs-ui.js')
+    })
+  })
+})
diff --git a/test/utils/mixin.tests.ts b/test/utils/mixin.tests.ts
deleted file mode 100644
index 965386f..0000000
--- a/test/utils/mixin.tests.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import * as chai from "chai";
-
-import mixin from "../../src/utils/mixin";
-
-const addMixin = mixin({
-  add(x: number, y: number) {
-    return x + y;
-  },
-}, {
-  COST: 1,
-});
-
-@addMixin
-class Calculator {
-  public static COST: number;
-  public add: (x: number, y: number) => number;
-}
-
-describe("<HEREMap />", () => {
-  describe("#mixin(behavior: any, sharedBehavior: any = {})", () => {
-
-    it("should add behavior to a class where a decorator provided", () => {
-      const calculator = new Calculator();
-
-      const total = calculator.add(10, 10);
-
-      // should add 10 and 10
-      chai.expect(total).to.equal(20);
-    });
-
-    it("should add static behavior to a class when a decorator with such behavior is provided", () => {
-      // should have a static property, COST, equal to 1
-      chai.expect(Calculator.COST).to.equal(1);
-    });
-
-    it("should support the instanceof operator", () => {
-      const calculator = new Calculator();
-      chai.expect(calculator instanceof addMixin).to.equal(true);
-    });
-
-  });
-});
diff --git a/testbench/index.tsx b/testbench/index.tsx
index ec5a85b..636e05d 100644
--- a/testbench/index.tsx
+++ b/testbench/index.tsx
@@ -1,4 +1,4 @@
-import React, { FC } from 'react'
+import React from 'react'
 import ReactDOM from 'react-dom'
 
 import { HEREMap } from '../src/HEREMap'
@@ -19,8 +19,6 @@ ReactDOM.render(
     useVectorTiles
     onMapAvailable={() => console.log('Map is available')}
     disableMapSettings
-  >
-    
-  </HEREMap>,
+  />,
   document.getElementById('root'),
 )
diff --git a/tslint.json b/tslint.json
deleted file mode 100644
index d3371b3..0000000
--- a/tslint.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "extends": ["tslint:latest", "tslint-react"],
-  "rules": {
-    "interface-name": [true, "never-prefix"],
-    "ordered-imports": [true, { "named-imports-order": "lowercase-first" }],
-    "no-unused-variable": [true, "react"],
-    "jsx-no-multiline-js": false,
-    "no-submodule-imports": false
-  }
-}
diff --git a/yarn.lock b/yarn.lock
index 7c67d44..3bf1cf1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
 # yarn lockfile v1
 
 
+"@aashutoshrathi/word-wrap@^1.2.3":
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+  integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
 "@ampproject/remapping@^2.2.0":
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
@@ -24,6 +29,14 @@
   dependencies:
     "@babel/highlight" "^7.18.6"
 
+"@babel/code-frame@^7.23.5":
+  version "7.23.5"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
+  integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+  dependencies:
+    "@babel/highlight" "^7.23.4"
+    chalk "^2.4.2"
+
 "@babel/compat-data@^7.21.5":
   version "7.21.9"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.9.tgz#10a2e7fda4e51742c907938ac3b7229426515514"
@@ -60,6 +73,16 @@
     "@jridgewell/trace-mapping" "^0.3.17"
     jsesc "^2.5.1"
 
+"@babel/generator@^7.23.6":
+  version "7.23.6"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
+  integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
+  dependencies:
+    "@babel/types" "^7.23.6"
+    "@jridgewell/gen-mapping" "^0.3.2"
+    "@jridgewell/trace-mapping" "^0.3.17"
+    jsesc "^2.5.1"
+
 "@babel/helper-compilation-targets@^7.21.5":
   version "7.21.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366"
@@ -76,6 +99,11 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba"
   integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==
 
+"@babel/helper-environment-visitor@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+  integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
 "@babel/helper-function-name@^7.21.0":
   version "7.21.0"
   resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4"
@@ -84,6 +112,14 @@
     "@babel/template" "^7.20.7"
     "@babel/types" "^7.21.0"
 
+"@babel/helper-function-name@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+  integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+  dependencies:
+    "@babel/template" "^7.22.15"
+    "@babel/types" "^7.23.0"
+
 "@babel/helper-hoist-variables@^7.18.6":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
@@ -91,6 +127,13 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
+"@babel/helper-hoist-variables@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+  integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
 "@babel/helper-module-imports@^7.21.4":
   version "7.21.4"
   resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af"
@@ -126,11 +169,23 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
+"@babel/helper-split-export-declaration@^7.22.6":
+  version "7.22.6"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+  integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
 "@babel/helper-string-parser@^7.21.5":
   version "7.21.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd"
   integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==
 
+"@babel/helper-string-parser@^7.23.4":
+  version "7.23.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
+  integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
+
 "@babel/helper-validator-identifier@^7.18.6":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
@@ -141,6 +196,11 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
   integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
 
+"@babel/helper-validator-identifier@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+  integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
 "@babel/helper-validator-option@^7.21.0":
   version "7.21.0"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180"
@@ -164,11 +224,25 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
+"@babel/highlight@^7.23.4":
+  version "7.23.4"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
+  integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.22.20"
+    chalk "^2.4.2"
+    js-tokens "^4.0.0"
+
 "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.21.9":
   version "7.21.9"
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14"
   integrity sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==
 
+"@babel/parser@^7.23.9", "@babel/parser@^7.7.0":
+  version "7.23.9"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b"
+  integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==
+
 "@babel/template@^7.20.7":
   version "7.21.9"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb"
@@ -178,6 +252,15 @@
     "@babel/parser" "^7.21.9"
     "@babel/types" "^7.21.5"
 
+"@babel/template@^7.22.15":
+  version "7.23.9"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a"
+  integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==
+  dependencies:
+    "@babel/code-frame" "^7.23.5"
+    "@babel/parser" "^7.23.9"
+    "@babel/types" "^7.23.9"
+
 "@babel/traverse@^7.21.5":
   version "7.21.5"
   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133"
@@ -194,6 +277,22 @@
     debug "^4.1.0"
     globals "^11.1.0"
 
+"@babel/traverse@^7.7.0":
+  version "7.23.9"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950"
+  integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==
+  dependencies:
+    "@babel/code-frame" "^7.23.5"
+    "@babel/generator" "^7.23.6"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-hoist-variables" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/parser" "^7.23.9"
+    "@babel/types" "^7.23.9"
+    debug "^4.3.1"
+    globals "^11.1.0"
+
 "@babel/types@^7.18.6", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5":
   version "7.21.5"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6"
@@ -203,6 +302,87 @@
     "@babel/helper-validator-identifier" "^7.19.1"
     to-fast-properties "^2.0.0"
 
+"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.7.0":
+  version "7.23.9"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002"
+  integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==
+  dependencies:
+    "@babel/helper-string-parser" "^7.23.4"
+    "@babel/helper-validator-identifier" "^7.22.20"
+    to-fast-properties "^2.0.0"
+
+"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+  integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+  dependencies:
+    eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.0", "@eslint-community/regexpp@^4.6.1":
+  version "4.10.0"
+  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
+  integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+
+"@eslint/eslintrc@^2.1.4":
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+  integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+  dependencies:
+    ajv "^6.12.4"
+    debug "^4.3.2"
+    espree "^9.6.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"
+
+"@eslint/js@8.56.0":
+  version "8.56.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
+  integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
+
+"@humanwhocodes/config-array@^0.11.13":
+  version "0.11.14"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
+  integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
+  dependencies:
+    "@humanwhocodes/object-schema" "^2.0.2"
+    debug "^4.3.1"
+    minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+  integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917"
+  integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==
+
+"@impargo/eslint-config@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@impargo/eslint-config/-/eslint-config-1.4.0.tgz#2e745d4bdb184ec52a3f79156794c04b473c870b"
+  integrity sha512-SeWIGHfjoeo9pvaRMpkhuPA5YRVLU7C2Mulk9YBagY9W7Z0mmokWdzW06/2cZjJWu8XTnCGDnuZPhaonu76ndA==
+  dependencies:
+    "@typescript-eslint/eslint-plugin" "^6.15.0"
+    "@typescript-eslint/parser" "^6.15.0"
+    babel-eslint "^10.1.0"
+    eslint "^8.56.0"
+    eslint-config-standard "^17.1.0"
+    eslint-config-standard-react "^13.0.0"
+    eslint-import-resolver-webpack "^0.13.8"
+    eslint-plugin-import "^2.29.1"
+    eslint-plugin-n "^16.5.0"
+    eslint-plugin-node "^11.1.0"
+    eslint-plugin-promise "^6.1.1"
+    eslint-plugin-react "^7.33.2"
+    eslint-plugin-react-hooks "^4.6.0"
+    eslint-plugin-simple-import-sort "^10.0.0"
+    eslint-plugin-sonarjs "^0.23.0"
+
 "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
   version "0.3.3"
   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
@@ -329,6 +509,27 @@
   resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407"
   integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==
 
+"@nodelib/fs.scandir@2.1.5":
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    fastq "^1.6.0"
+
 "@parcel/bundler-default@2.8.3":
   version "2.8.3"
   resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.8.3.tgz#d64739dbc2dbd59d6629861bf77a8083aced5229"
@@ -940,6 +1141,16 @@
   dependencies:
     "@types/sizzle" "*"
 
+"@types/json-schema@^7.0.12":
+  version "7.0.15"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+  integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/json5@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+  integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
 "@types/loadjs@^4.0.0":
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/@types/loadjs/-/loadjs-4.0.1.tgz#85e77dcad99d58236462393145eccbbc9dad0fe5"
@@ -998,6 +1209,11 @@
   resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
   integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
 
+"@types/semver@^7.5.0":
+  version "7.5.7"
+  resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e"
+  integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==
+
 "@types/sinon@5.0.1":
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-5.0.1.tgz#a15b36ec42f1f53166617491feabd1734cb03e21"
@@ -1008,6 +1224,97 @@
   resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef"
   integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==
 
+"@typescript-eslint/eslint-plugin@^6.15.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3"
+  integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==
+  dependencies:
+    "@eslint-community/regexpp" "^4.5.1"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/type-utils" "6.21.0"
+    "@typescript-eslint/utils" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
+    debug "^4.3.4"
+    graphemer "^1.4.0"
+    ignore "^5.2.4"
+    natural-compare "^1.4.0"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
+
+"@typescript-eslint/parser@^6.15.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b"
+  integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
+  dependencies:
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
+    debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1"
+  integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==
+  dependencies:
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
+
+"@typescript-eslint/type-utils@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e"
+  integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==
+  dependencies:
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    "@typescript-eslint/utils" "6.21.0"
+    debug "^4.3.4"
+    ts-api-utils "^1.0.1"
+
+"@typescript-eslint/types@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d"
+  integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==
+
+"@typescript-eslint/typescript-estree@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46"
+  integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==
+  dependencies:
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
+    debug "^4.3.4"
+    globby "^11.1.0"
+    is-glob "^4.0.3"
+    minimatch "9.0.3"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
+
+"@typescript-eslint/utils@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134"
+  integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.4.0"
+    "@types/json-schema" "^7.0.12"
+    "@types/semver" "^7.5.0"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    semver "^7.5.4"
+
+"@typescript-eslint/visitor-keys@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47"
+  integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==
+  dependencies:
+    "@typescript-eslint/types" "6.21.0"
+    eslint-visitor-keys "^3.4.1"
+
+"@ungap/structured-clone@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+  integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
 JSONStream@^1.0.3:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
@@ -1039,6 +1346,11 @@ accepts@1.3.3:
     mime-types "~2.1.11"
     negotiator "0.6.1"
 
+acorn-jsx@^5.3.2:
+  version "5.3.2"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+  integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
 acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.8.2:
   version "1.8.2"
   resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
@@ -1063,6 +1375,11 @@ acorn@^8.5.0:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
   integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
 
+acorn@^8.9.0:
+  version "8.11.3"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+  integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+
 after@0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
@@ -1078,7 +1395,7 @@ ajv@^5.0.0:
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.3.0"
 
-ajv@^6.12.3:
+ajv@^6.12.3, ajv@^6.12.4:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1240,6 +1557,14 @@ arr-union@^3.1.0:
   resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
   integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
 
+array-buffer-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
+  integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+  dependencies:
+    call-bind "^1.0.5"
+    is-array-buffer "^3.0.4"
+
 array-differ@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
@@ -1255,6 +1580,17 @@ array-find-index@^1.0.1:
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
   integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
 
+array-includes@^3.1.6, array-includes@^3.1.7:
+  version "3.1.7"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda"
+  integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    get-intrinsic "^1.2.1"
+    is-string "^1.0.7"
+
 array-initial@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795"
@@ -1289,6 +1625,11 @@ array-sort@^1.0.0:
     get-value "^2.0.6"
     kind-of "^5.0.2"
 
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
 array-uniq@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -1315,6 +1656,38 @@ array.prototype.filter@^1.0.0:
     es-array-method-boxes-properly "^1.0.0"
     is-string "^1.0.7"
 
+array.prototype.filter@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e"
+  integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    es-array-method-boxes-properly "^1.0.0"
+    is-string "^1.0.7"
+
+array.prototype.find@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.2.2.tgz#e862cf891e725d8f2a10e5e42d750629faaabd32"
+  integrity sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    es-shim-unscopables "^1.0.0"
+
+array.prototype.findlastindex@^1.2.3:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f"
+  integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==
+  dependencies:
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.3.0"
+    es-shim-unscopables "^1.0.2"
+
 array.prototype.flat@^1.2.3:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b"
@@ -1325,6 +1698,51 @@ array.prototype.flat@^1.2.3:
     es-abstract "^1.19.2"
     es-shim-unscopables "^1.0.0"
 
+array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+  integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
+  integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    es-shim-unscopables "^1.0.0"
+
+array.prototype.tosorted@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8"
+  integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==
+  dependencies:
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.1.0"
+    es-shim-unscopables "^1.0.2"
+
+arraybuffer.prototype.slice@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+  integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+  dependencies:
+    array-buffer-byte-length "^1.0.1"
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.2.1"
+    get-intrinsic "^1.2.3"
+    is-array-buffer "^3.0.4"
+    is-shared-array-buffer "^1.0.2"
+
 arraybuffer.slice@0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
@@ -1414,6 +1832,13 @@ async@^2.5.0:
   dependencies:
     lodash "^4.17.14"
 
+asynciterator.prototype@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62"
+  integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==
+  dependencies:
+    has-symbols "^1.0.3"
+
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -1436,6 +1861,13 @@ autoprefixer@^6.3.1:
     postcss "^5.2.16"
     postcss-value-parser "^3.2.3"
 
+available-typed-arrays@^1.0.6, available-typed-arrays@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+  integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+  dependencies:
+    possible-typed-array-names "^1.0.0"
+
 aws-sign2@~0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
@@ -1485,6 +1917,18 @@ babel-core@^6.14.0, babel-core@^6.26.0:
     slash "^1.0.0"
     source-map "^0.5.7"
 
+babel-eslint@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+  integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@babel/parser" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+    eslint-visitor-keys "^1.0.0"
+    resolve "^1.12.0"
+
 babel-generator@^6.18.0, babel-generator@^6.26.0:
   version "6.26.1"
   resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
@@ -2079,6 +2523,13 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
+brace-expansion@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+  integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+  dependencies:
+    balanced-match "^1.0.0"
+
 braces@^0.1.2:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
@@ -2326,16 +2777,23 @@ buffer@~5.2.1:
     base64-js "^1.0.2"
     ieee754 "^1.1.4"
 
-builtin-modules@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
-  integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==
+builtin-modules@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
+  integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
 
 builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
   integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==
 
+builtins@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9"
+  integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==
+  dependencies:
+    semver "^7.0.0"
+
 bytes@3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
@@ -2369,6 +2827,17 @@ call-bind@^1.0.0, call-bind@^1.0.2:
     function-bind "^1.1.1"
     get-intrinsic "^1.0.2"
 
+call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+  integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+  dependencies:
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    set-function-length "^1.2.1"
+
 callsite@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
@@ -2459,7 +2928,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -2468,7 +2937,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
-chalk@^4.1.0:
+chalk@^4.0.0, chalk@^4.1.0:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
   integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -2785,7 +3254,7 @@ commander@2.9.0:
   dependencies:
     graceful-readlink ">= 1.0.0"
 
-commander@^2.12.1, commander@^2.19.0, commander@^2.20.0, commander@^2.9.0:
+commander@^2.19.0, commander@^2.20.0, commander@^2.9.0:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -2972,6 +3441,15 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
+cross-spawn@^7.0.2:
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
 cryptiles@2.x.x:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
@@ -3195,7 +3673,14 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
   dependencies:
     ms "2.0.0"
 
-debug@^4.1.0:
+debug@^3.2.7:
+  version "3.2.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+  integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+  dependencies:
+    ms "^2.1.1"
+
+debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
   integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -3219,7 +3704,7 @@ deep-eql@^3.0.1:
   dependencies:
     type-detect "^4.0.0"
 
-deep-is@~0.1.3:
+deep-is@^0.1.3, deep-is@~0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
   integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
@@ -3236,6 +3721,15 @@ default-resolution@^2.0.0:
   resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684"
   integrity sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==
 
+define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+  integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+  dependencies:
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    gopd "^1.0.1"
+
 define-properties@^1.1.3, define-properties@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
@@ -3244,6 +3738,15 @@ define-properties@^1.1.3, define-properties@^1.1.4:
     has-property-descriptors "^1.0.0"
     object-keys "^1.1.1"
 
+define-properties@^1.2.0, define-properties@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+  integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+  dependencies:
+    define-data-property "^1.0.1"
+    has-property-descriptors "^1.0.0"
+    object-keys "^1.1.1"
+
 define-property@^0.2.5:
   version "0.2.5"
   resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
@@ -3345,11 +3848,6 @@ diff@^3.1.0:
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
   integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
 
-diff@^4.0.1:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
-  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-
 diffie-hellman@^5.0.0:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -3359,11 +3857,32 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+  dependencies:
+    path-type "^4.0.0"
+
 discontinuous-range@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
   integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==
 
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+  dependencies:
+    esutils "^2.0.2"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
+
 dom-serialize@^2.2.0:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
@@ -3576,6 +4095,15 @@ engine.io@1.8.3:
     engine.io-parser "1.3.2"
     ws "1.1.2"
 
+enhanced-resolve@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e"
+  integrity sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.2.0"
+    tapable "^0.1.8"
+
 enhanced-resolve@^3.0.0:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
@@ -3685,11 +4213,100 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19
     string.prototype.trimstart "^1.0.5"
     unbox-primitive "^1.0.2"
 
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4:
+  version "1.22.4"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.4.tgz#26eb2e7538c3271141f5754d31aabfdb215f27bf"
+  integrity sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==
+  dependencies:
+    array-buffer-byte-length "^1.0.1"
+    arraybuffer.prototype.slice "^1.0.3"
+    available-typed-arrays "^1.0.6"
+    call-bind "^1.0.7"
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    es-set-tostringtag "^2.0.2"
+    es-to-primitive "^1.2.1"
+    function.prototype.name "^1.1.6"
+    get-intrinsic "^1.2.4"
+    get-symbol-description "^1.0.2"
+    globalthis "^1.0.3"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.2"
+    has-proto "^1.0.1"
+    has-symbols "^1.0.3"
+    hasown "^2.0.1"
+    internal-slot "^1.0.7"
+    is-array-buffer "^3.0.4"
+    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.13"
+    is-weakref "^1.0.2"
+    object-inspect "^1.13.1"
+    object-keys "^1.1.1"
+    object.assign "^4.1.5"
+    regexp.prototype.flags "^1.5.2"
+    safe-array-concat "^1.1.0"
+    safe-regex-test "^1.0.3"
+    string.prototype.trim "^1.2.8"
+    string.prototype.trimend "^1.0.7"
+    string.prototype.trimstart "^1.0.7"
+    typed-array-buffer "^1.0.1"
+    typed-array-byte-length "^1.0.0"
+    typed-array-byte-offset "^1.0.0"
+    typed-array-length "^1.0.4"
+    unbox-primitive "^1.0.2"
+    which-typed-array "^1.1.14"
+
 es-array-method-boxes-properly@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
   integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
 
+es-define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+  integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+
+es-errors@^1.0.0, es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+  integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-iterator-helpers@^1.0.12:
+  version "1.0.17"
+  resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz#123d1315780df15b34eb181022da43e734388bb8"
+  integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==
+  dependencies:
+    asynciterator.prototype "^1.0.0"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.4"
+    es-errors "^1.3.0"
+    es-set-tostringtag "^2.0.2"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    globalthis "^1.0.3"
+    has-property-descriptors "^1.0.2"
+    has-proto "^1.0.1"
+    has-symbols "^1.0.3"
+    internal-slot "^1.0.7"
+    iterator.prototype "^1.1.2"
+    safe-array-concat "^1.1.0"
+
+es-set-tostringtag@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+  integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+    has-tostringtag "^1.0.2"
+    hasown "^2.0.1"
+
 es-shim-unscopables@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
@@ -3697,6 +4314,13 @@ es-shim-unscopables@^1.0.0:
   dependencies:
     has "^1.0.3"
 
+es-shim-unscopables@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+  integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+  dependencies:
+    hasown "^2.0.0"
+
 es-to-primitive@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -3775,6 +4399,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
 
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
 escodegen@1.8.x:
   version "1.8.1"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
@@ -3787,6 +4416,243 @@ escodegen@1.8.x:
   optionalDependencies:
     source-map "~0.2.0"
 
+eslint-compat-utils@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz#f45e3b5ced4c746c127cf724fb074cd4e730d653"
+  integrity sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==
+
+eslint-config-standard-react@^13.0.0:
+  version "13.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-standard-react/-/eslint-config-standard-react-13.0.0.tgz#dcc85bc3210dac858bc94ac53d024a5488ce5568"
+  integrity sha512-HrVPGj8UncHfV+BsdJTuJpVsomn6AIrke3Af2Fh4XFvQQDU+iO6N2ZL+UsC+scExft4fU3uf7fJwj7PKWnXJDA==
+
+eslint-config-standard@^17.1.0:
+  version "17.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975"
+  integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==
+
+eslint-import-resolver-node@^0.3.9:
+  version "0.3.9"
+  resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
+  integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+  dependencies:
+    debug "^3.2.7"
+    is-core-module "^2.13.0"
+    resolve "^1.22.4"
+
+eslint-import-resolver-webpack@^0.13.8:
+  version "0.13.8"
+  resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.8.tgz#5f64d1d653eefa19cdfd0f0165c996b6be7012f9"
+  integrity sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==
+  dependencies:
+    array.prototype.find "^2.2.2"
+    debug "^3.2.7"
+    enhanced-resolve "^0.9.1"
+    find-root "^1.1.0"
+    hasown "^2.0.0"
+    interpret "^1.4.0"
+    is-core-module "^2.13.1"
+    is-regex "^1.1.4"
+    lodash "^4.17.21"
+    resolve "^2.0.0-next.5"
+    semver "^5.7.2"
+
+eslint-module-utils@^2.8.0:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49"
+  integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==
+  dependencies:
+    debug "^3.2.7"
+
+eslint-plugin-es-x@^7.5.0:
+  version "7.5.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz#d08d9cd155383e35156c48f736eb06561d07ba92"
+  integrity sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.1.2"
+    "@eslint-community/regexpp" "^4.6.0"
+    eslint-compat-utils "^0.1.2"
+
+eslint-plugin-es@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
+  integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
+  dependencies:
+    eslint-utils "^2.0.0"
+    regexpp "^3.0.0"
+
+eslint-plugin-import@^2.29.1:
+  version "2.29.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643"
+  integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
+  dependencies:
+    array-includes "^3.1.7"
+    array.prototype.findlastindex "^1.2.3"
+    array.prototype.flat "^1.3.2"
+    array.prototype.flatmap "^1.3.2"
+    debug "^3.2.7"
+    doctrine "^2.1.0"
+    eslint-import-resolver-node "^0.3.9"
+    eslint-module-utils "^2.8.0"
+    hasown "^2.0.0"
+    is-core-module "^2.13.1"
+    is-glob "^4.0.3"
+    minimatch "^3.1.2"
+    object.fromentries "^2.0.7"
+    object.groupby "^1.0.1"
+    object.values "^1.1.7"
+    semver "^6.3.1"
+    tsconfig-paths "^3.15.0"
+
+eslint-plugin-n@^16.5.0:
+  version "16.6.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz#6a60a1a376870064c906742272074d5d0b412b0b"
+  integrity sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.4.0"
+    builtins "^5.0.1"
+    eslint-plugin-es-x "^7.5.0"
+    get-tsconfig "^4.7.0"
+    globals "^13.24.0"
+    ignore "^5.2.4"
+    is-builtin-module "^3.2.1"
+    is-core-module "^2.12.1"
+    minimatch "^3.1.2"
+    resolve "^1.22.2"
+    semver "^7.5.3"
+
+eslint-plugin-node@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
+  integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
+  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"
+
+eslint-plugin-promise@^6.1.1:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
+  integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
+
+eslint-plugin-react-hooks@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
+  integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
+
+eslint-plugin-react@^7.33.2:
+  version "7.33.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608"
+  integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
+  dependencies:
+    array-includes "^3.1.6"
+    array.prototype.flatmap "^1.3.1"
+    array.prototype.tosorted "^1.1.1"
+    doctrine "^2.1.0"
+    es-iterator-helpers "^1.0.12"
+    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.1"
+    string.prototype.matchall "^4.0.8"
+
+eslint-plugin-simple-import-sort@^10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351"
+  integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==
+
+eslint-plugin-sonarjs@^0.23.0:
+  version "0.23.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz#0265bad801ea210951672ee3cafbcf5d456ada96"
+  integrity sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==
+
+eslint-scope@^7.2.2:
+  version "7.2.2"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+  integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^5.2.0"
+
+eslint-utils@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+  integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+  dependencies:
+    eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+  integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@^8.56.0:
+  version "8.56.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15"
+  integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.2.0"
+    "@eslint-community/regexpp" "^4.6.1"
+    "@eslint/eslintrc" "^2.1.4"
+    "@eslint/js" "8.56.0"
+    "@humanwhocodes/config-array" "^0.11.13"
+    "@humanwhocodes/module-importer" "^1.0.1"
+    "@nodelib/fs.walk" "^1.2.8"
+    "@ungap/structured-clone" "^1.2.0"
+    ajv "^6.12.4"
+    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.2.2"
+    eslint-visitor-keys "^3.4.3"
+    espree "^9.6.1"
+    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"
+    graphemer "^1.4.0"
+    ignore "^5.2.0"
+    imurmurhash "^0.1.4"
+    is-glob "^4.0.0"
+    is-path-inside "^3.0.3"
+    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.3"
+    strip-ansi "^6.0.1"
+    text-table "^0.2.0"
+
+espree@^9.6.0, espree@^9.6.1:
+  version "9.6.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+  integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+  dependencies:
+    acorn "^8.9.0"
+    acorn-jsx "^5.3.2"
+    eslint-visitor-keys "^3.4.1"
+
 esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1:
   version "2.7.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
@@ -3802,11 +4668,30 @@ esprima@~3.1.0:
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
   integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==
 
+esquery@^1.4.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+  integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+  dependencies:
+    estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+  integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+  dependencies:
+    estraverse "^5.2.0"
+
 estraverse@^1.9.1:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
   integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==
 
+estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+  integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
 esutils@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@@ -3973,11 +4858,22 @@ fast-deep-equal@^1.0.0:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
   integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==
 
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
   integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
+fast-glob@^3.2.9:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+  integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+  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"
+
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -3988,7 +4884,7 @@ fast-levenshtein@^1.0.0:
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9"
   integrity sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==
 
-fast-levenshtein@~2.0.6:
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
@@ -4003,6 +4899,13 @@ fastparse@^1.1.1, fastparse@^1.1.2:
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
   integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
 
+fastq@^1.6.0:
+  version "1.17.1"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+  integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+  dependencies:
+    reusify "^1.0.4"
+
 fd-slicer@~1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
@@ -4010,6 +4913,13 @@ fd-slicer@~1.1.0:
   dependencies:
     pend "~1.2.0"
 
+file-entry-cache@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+  integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+  dependencies:
+    flat-cache "^3.0.4"
+
 file-uri-to-path@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
@@ -4070,6 +4980,11 @@ find-cache-dir@^1.0.0:
     make-dir "^1.0.0"
     pkg-dir "^2.0.0"
 
+find-root@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+  integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -4085,6 +5000,14 @@ find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
+find-up@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+  integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+  dependencies:
+    locate-path "^6.0.0"
+    path-exists "^4.0.0"
+
 findup-sync@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
@@ -4128,6 +5051,20 @@ flagged-respawn@^1.0.0:
   resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
   integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
 
+flat-cache@^3.0.4:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+  integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+  dependencies:
+    flatted "^3.2.9"
+    keyv "^4.5.3"
+    rimraf "^3.0.2"
+
+flatted@^3.2.9:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.0.tgz#5fdca2b5e671cd38d1537427a10e02a2caa8257e"
+  integrity sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg==
+
 flatten@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
@@ -4146,6 +5083,13 @@ follow-redirects@^1.0.0:
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
   integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
 
+for-each@^0.3.3:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+  integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+  dependencies:
+    is-callable "^1.1.3"
+
 for-in@^0.1.3:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@@ -4247,6 +5191,11 @@ function-bind@^1.1.1:
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
+function-bind@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
 function.prototype.name@^1.1.2, function.prototype.name@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
@@ -4257,7 +5206,17 @@ function.prototype.name@^1.1.2, function.prototype.name@^1.1.5:
     es-abstract "^1.19.0"
     functions-have-names "^1.2.2"
 
-functions-have-names@^1.2.2:
+function.prototype.name@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+  integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    functions-have-names "^1.2.3"
+
+functions-have-names@^1.2.2, functions-have-names@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
   integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
@@ -4305,6 +5264,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
     has "^1.0.3"
     has-symbols "^1.0.3"
 
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+  integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+  dependencies:
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    has-proto "^1.0.1"
+    has-symbols "^1.0.3"
+    hasown "^2.0.0"
+
 get-port@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119"
@@ -4323,6 +5293,22 @@ get-symbol-description@^1.0.0:
     call-bind "^1.0.2"
     get-intrinsic "^1.1.1"
 
+get-symbol-description@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+  integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+  dependencies:
+    call-bind "^1.0.5"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
+
+get-tsconfig@^4.7.0:
+  version "4.7.2"
+  resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce"
+  integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==
+  dependencies:
+    resolve-pkg-maps "^1.0.0"
+
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -4358,13 +5344,20 @@ glob-parent@^3.0.1, glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@~5.1.2:
+glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
   integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
   dependencies:
     is-glob "^4.0.1"
 
+glob-parent@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+  integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+  dependencies:
+    is-glob "^4.0.3"
+
 glob-stream@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
@@ -4454,6 +5447,13 @@ globals@^11.1.0:
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
+globals@^13.19.0, globals@^13.24.0:
+  version "13.24.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+  integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+  dependencies:
+    type-fest "^0.20.2"
+
 globals@^13.2.0:
   version "13.20.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
@@ -4466,6 +5466,25 @@ globals@^9.18.0:
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
   integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
 
+globalthis@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+  integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+  dependencies:
+    define-properties "^1.1.3"
+
+globby@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+  integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+  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"
+
 glogg@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f"
@@ -4473,6 +5492,13 @@ glogg@^1.0.0:
   dependencies:
     sparkles "^1.0.0"
 
+gopd@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+  integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+  dependencies:
+    get-intrinsic "^1.1.3"
+
 graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
   version "4.2.10"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
@@ -4483,6 +5509,11 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6,
   resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
   integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==
 
+graphemer@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+  integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
 growl@1.9.2:
   version "1.9.2"
   resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
@@ -4683,6 +5714,18 @@ has-property-descriptors@^1.0.0:
   dependencies:
     get-intrinsic "^1.1.1"
 
+has-property-descriptors@^1.0.1, has-property-descriptors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+  integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+  dependencies:
+    es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+  integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
 has-symbols@^1.0.2, has-symbols@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
@@ -4695,6 +5738,13 @@ has-tostringtag@^1.0.0:
   dependencies:
     has-symbols "^1.0.2"
 
+has-tostringtag@^1.0.1, has-tostringtag@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+  integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+  dependencies:
+    has-symbols "^1.0.3"
+
 has-value@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
@@ -4758,6 +5808,13 @@ hasha@^2.2.0:
     is-stream "^1.0.1"
     pinkie-promise "^2.0.0"
 
+hasown@^2.0.0, hasown@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa"
+  integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==
+  dependencies:
+    function-bind "^1.1.2"
+
 hawk@~3.1.3:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
@@ -4955,6 +6012,11 @@ ieee754@^1.1.4:
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
 
+ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
+  integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+
 immutable@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
@@ -4976,6 +6038,11 @@ imports-loader@^0.7.1:
     loader-utils "^1.0.2"
     source-map "^0.5.6"
 
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
 indent-string@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
@@ -5053,6 +6120,15 @@ internal-slot@^1.0.3:
     has "^1.0.3"
     side-channel "^1.0.4"
 
+internal-slot@^1.0.5, internal-slot@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
+  integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+  dependencies:
+    es-errors "^1.3.0"
+    hasown "^2.0.0"
+    side-channel "^1.0.4"
+
 interpret@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
@@ -5097,11 +6173,26 @@ is-accessor-descriptor@^1.0.0:
   dependencies:
     kind-of "^6.0.0"
 
+is-array-buffer@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
+  integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+  dependencies:
+    call-bind "^1.0.2"
+    get-intrinsic "^1.2.1"
+
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
   integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
 
+is-async-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
+  integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
 is-bigint@^1.0.1:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
@@ -5136,11 +6227,30 @@ is-buffer@^1.1.0, is-buffer@^1.1.5:
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
 
+is-builtin-module@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
+  integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==
+  dependencies:
+    builtin-modules "^3.3.0"
+
+is-callable@^1.1.3, is-callable@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+  integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
 is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
   integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
 
+is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.13.1:
+  version "2.13.1"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+  integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+  dependencies:
+    hasown "^2.0.0"
+
 is-core-module@^2.9.0:
   version "2.10.0"
   resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
@@ -5162,7 +6272,7 @@ is-data-descriptor@^1.0.0:
   dependencies:
     kind-of "^6.0.0"
 
-is-date-object@^1.0.1:
+is-date-object@^1.0.1, is-date-object@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
   integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
@@ -5221,6 +6331,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1:
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
   integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
 
+is-finalizationregistry@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6"
+  integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
+  dependencies:
+    call-bind "^1.0.2"
+
 is-finite@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
@@ -5233,6 +6350,13 @@ is-fullwidth-code-point@^1.0.0:
   dependencies:
     number-is-nan "^1.0.0"
 
+is-generator-function@^1.0.10:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+  integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
 is-glob@^2.0.0, is-glob@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -5259,6 +6383,11 @@ is-json@^2.0.1:
   resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff"
   integrity sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==
 
+is-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
+  integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
 is-my-ip-valid@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz#f7220d1146257c98672e6fba097a9f3f2d348442"
@@ -5321,6 +6450,11 @@ is-number@^7.0.0:
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
   integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
 
+is-path-inside@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+  integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
 is-plain-obj@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@@ -5368,6 +6502,11 @@ is-relative@^1.0.0:
   dependencies:
     is-unc-path "^1.0.0"
 
+is-set@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
+  integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
 is-shared-array-buffer@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
@@ -5406,6 +6545,13 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
   dependencies:
     has-symbols "^1.0.2"
 
+is-typed-array@^1.1.13:
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+  integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+  dependencies:
+    which-typed-array "^1.1.14"
+
 is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -5428,6 +6574,11 @@ is-valid-glob@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
   integrity sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==
 
+is-weakmap@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
+  integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+
 is-weakref@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@@ -5435,6 +6586,14 @@ is-weakref@^1.0.2:
   dependencies:
     call-bind "^1.0.2"
 
+is-weakset@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
+  integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+  dependencies:
+    call-bind "^1.0.2"
+    get-intrinsic "^1.1.1"
+
 is-windows@^1.0.1, is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -5450,6 +6609,11 @@ isarray@1.0.0, isarray@~1.0.0:
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
   integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
 
+isarray@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
 isbinaryfile@^3.0.0:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
@@ -5527,6 +6691,17 @@ istanbul@0.4.5, istanbul@^0.4.0, istanbul@^0.4.3, istanbul@^0.4.5:
     which "^1.1.1"
     wordwrap "^1.0.0"
 
+iterator.prototype@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
+  integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+  dependencies:
+    define-properties "^1.2.1"
+    get-intrinsic "^1.2.1"
+    has-symbols "^1.0.3"
+    reflect.getprototypeof "^1.0.4"
+    set-function-name "^2.0.1"
+
 jquery@^3.1.0:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
@@ -5555,7 +6730,7 @@ js-yaml@3.6.1:
     argparse "^1.0.7"
     esprima "^2.6.0"
 
-js-yaml@3.x, js-yaml@^3.13.1:
+js-yaml@3.x:
   version "3.14.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
   integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
@@ -5598,6 +6773,11 @@ jsesc@~0.5.0:
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
   integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
 
+json-buffer@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+  integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
 json-loader@^0.5.4:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
@@ -5657,6 +6837,13 @@ json5@^1.0.1:
   dependencies:
     minimist "^1.2.0"
 
+json5@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+  integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+  dependencies:
+    minimist "^1.2.0"
+
 json5@^2.2.0, json5@^2.2.1, json5@^2.2.2:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
@@ -5694,6 +6881,16 @@ jsprim@^1.2.2:
     json-schema "0.4.0"
     verror "1.10.0"
 
+"jsx-ast-utils@^2.4.1 || ^3.0.0":
+  version "3.3.5"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
+  integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
+  dependencies:
+    array-includes "^3.1.6"
+    array.prototype.flat "^1.3.1"
+    object.assign "^4.1.4"
+    object.values "^1.1.6"
+
 just-debounce@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.1.0.tgz#2f81a3ad4121a76bc7cb45dbf704c0d76a8e5ddf"
@@ -5818,6 +7015,13 @@ kew@^0.7.0:
   resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
   integrity sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==
 
+keyv@^4.5.3:
+  version "4.5.4"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+  integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+  dependencies:
+    json-buffer "3.0.1"
+
 kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -5891,6 +7095,14 @@ lead@^1.0.0:
   dependencies:
     flush-write-stream "^1.0.2"
 
+levn@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+  integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+  dependencies:
+    prelude-ls "^1.2.1"
+    type-check "~0.4.0"
+
 levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -6035,6 +7247,13 @@ locate-path@^2.0.0:
     p-locate "^2.0.0"
     path-exists "^3.0.0"
 
+locate-path@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+  integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+  dependencies:
+    p-locate "^5.0.0"
+
 lodash._baseassign@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
@@ -6163,6 +7382,11 @@ lodash.memoize@~3.0.3:
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
   integrity sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==
 
+lodash.merge@^4.6.2:
+  version "4.6.2"
+  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+  integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
 lodash.restparam@^3.0.0:
   version "3.6.1"
   resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
@@ -6211,7 +7435,7 @@ lodash@^3.8.0:
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
   integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
 
-lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.14, lodash@^4.17.4, lodash@^4.5.0:
+lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.14, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.5.0:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -6283,6 +7507,13 @@ lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
 make-dir@^1.0.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@ -6353,6 +7584,11 @@ media-typer@0.3.0:
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
   integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
 
+memory-fs@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290"
+  integrity sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==
+
 memory-fs@^0.4.0:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -6377,6 +7613,11 @@ meow@^3.3.0:
     redent "^1.0.0"
     trim-newlines "^1.0.0"
 
+merge2@^1.3.0, merge2@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
 micromatch@^2.1.5:
   version "2.3.11"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
@@ -6415,7 +7656,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
-micromatch@^4.0.5:
+micromatch@^4.0.4, micromatch@^4.0.5:
   version "4.0.5"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
   integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
@@ -6458,13 +7699,20 @@ minimalistic-crypto-utils@^1.0.1:
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
   integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
 
-"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1:
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
   integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@9.0.3:
+  version "9.0.3"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
+  integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
@@ -6584,6 +7832,11 @@ ms@2.1.2:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
+ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
 msgpackr-extract@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d"
@@ -6644,6 +7897,11 @@ native-promise-only@^0.8.1:
   resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11"
   integrity sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==
 
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
 nearley@^2.7.10:
   version "2.20.1"
   resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474"
@@ -6823,6 +8081,11 @@ object-inspect@^1.12.0, object-inspect@^1.7.0, object-inspect@^1.9.0:
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
   integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
 
+object-inspect@^1.13.1:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
 object-is@^1.0.2, object-is@^1.1.2:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
@@ -6853,6 +8116,16 @@ object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.2:
     has-symbols "^1.0.3"
     object-keys "^1.1.1"
 
+object.assign@^4.1.4, object.assign@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+  integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+  dependencies:
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    has-symbols "^1.0.3"
+    object-keys "^1.1.1"
+
 object.defaults@^1.0.0, object.defaults@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
@@ -6872,6 +8145,43 @@ object.entries@^1.1.1:
     define-properties "^1.1.3"
     es-abstract "^1.19.1"
 
+object.entries@^1.1.6:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131"
+  integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
+object.fromentries@^2.0.6, object.fromentries@^2.0.7:
+  version "2.0.7"
+  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
+  integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
+object.groupby@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.2.tgz#494800ff5bab78fd0eff2835ec859066e00192ec"
+  integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==
+  dependencies:
+    array.prototype.filter "^1.0.3"
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.0.0"
+
+object.hasown@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae"
+  integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==
+  dependencies:
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
 object.map@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
@@ -6912,6 +8222,15 @@ object.values@^1.1.1:
     define-properties "^1.1.3"
     es-abstract "^1.19.1"
 
+object.values@^1.1.6, object.values@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a"
+  integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
 on-finished@2.4.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
@@ -6953,6 +8272,18 @@ optionator@^0.8.1:
     type-check "~0.3.2"
     word-wrap "~1.2.3"
 
+optionator@^0.9.3:
+  version "0.9.3"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+  integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+  dependencies:
+    "@aashutoshrathi/word-wrap" "^1.2.3"
+    deep-is "^0.1.3"
+    fast-levenshtein "^2.0.6"
+    levn "^0.4.1"
+    prelude-ls "^1.2.1"
+    type-check "^0.4.0"
+
 options@>=0.0.5:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
@@ -7006,6 +8337,13 @@ p-limit@^1.1.0:
   dependencies:
     p-try "^1.0.0"
 
+p-limit@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+  integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+  dependencies:
+    yocto-queue "^0.1.0"
+
 p-locate@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -7013,6 +8351,13 @@ p-locate@^2.0.0:
   dependencies:
     p-limit "^1.1.0"
 
+p-locate@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+  integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+  dependencies:
+    p-limit "^3.0.2"
+
 p-try@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
@@ -7189,11 +8534,21 @@ path-exists@^3.0.0:
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
   integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
 
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
 path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
 
+path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
 path-parse@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -7337,6 +8692,11 @@ posix-character-classes@^0.1.0:
   resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
   integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
 
+possible-typed-array-names@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+  integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
 postcss-calc@^5.2.0:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
@@ -7650,6 +9010,11 @@ posthtml@^0.16.4, posthtml@^0.16.5:
     posthtml-parser "^0.11.0"
     posthtml-render "^3.0.0"
 
+prelude-ls@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+  integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -7695,7 +9060,7 @@ progress@^1.1.8:
   resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
   integrity sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==
 
-prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
   version "15.8.1"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
   integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -7808,6 +9173,11 @@ querystring@0.2.0:
   resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
   integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==
 
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
 raf@^3.4.1:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
@@ -8050,6 +9420,19 @@ reduce-function-call@^1.0.1:
   dependencies:
     balanced-match "^1.0.0"
 
+reflect.getprototypeof@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz#e0bd28b597518f16edaf9c0e292c631eb13e0674"
+  integrity sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==
+  dependencies:
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.0.0"
+    get-intrinsic "^1.2.3"
+    globalthis "^1.0.3"
+    which-builtin-type "^1.1.3"
+
 regenerate@^1.2.1:
   version "1.4.2"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
@@ -8098,6 +9481,21 @@ regexp.prototype.flags@^1.4.3:
     define-properties "^1.1.3"
     functions-have-names "^1.2.2"
 
+regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
+  integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+  dependencies:
+    call-bind "^1.0.6"
+    define-properties "^1.2.1"
+    es-errors "^1.3.0"
+    set-function-name "^2.0.1"
+
+regexpp@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+  integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
 regexpu-core@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
@@ -8298,6 +9696,11 @@ resolve-options@^1.1.0:
   dependencies:
     value-or-function "^3.0.0"
 
+resolve-pkg-maps@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f"
+  integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
+
 resolve-url@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
@@ -8308,7 +9711,7 @@ resolve@1.1.x:
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
   integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==
 
-resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0:
+resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.4.0:
   version "1.22.1"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
   integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@@ -8317,11 +9720,34 @@ resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
+resolve@^1.10.1, resolve@^1.12.0, resolve@^1.22.2, resolve@^1.22.4:
+  version "1.22.8"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+  integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+  dependencies:
+    is-core-module "^2.13.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^2.0.0-next.4, resolve@^2.0.0-next.5:
+  version "2.0.0-next.5"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+  integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
+  dependencies:
+    is-core-module "^2.13.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
+
 ret@~0.1.10:
   version "0.1.15"
   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
   integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
 
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
 rimraf@^2.6.0:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -8329,6 +9755,13 @@ rimraf@^2.6.0:
   dependencies:
     glob "^7.1.3"
 
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
 ripemd160@^2.0.0, ripemd160@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -8345,6 +9778,23 @@ rst-selector-parser@^2.2.3:
     lodash.flattendeep "^4.4.0"
     nearley "^2.7.10"
 
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
+safe-array-concat@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692"
+  integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==
+  dependencies:
+    call-bind "^1.0.5"
+    get-intrinsic "^1.2.2"
+    has-symbols "^1.0.3"
+    isarray "^2.0.5"
+
 safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -8355,6 +9805,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
+safe-regex-test@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+  integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-regex "^1.1.4"
+
 safe-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -8431,11 +9890,28 @@ semver-greatest-satisfied-range@^1.1.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
+semver@^5.7.2:
+  version "5.7.2"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.1.0, semver@^6.3.1:
+  version "6.3.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
 semver@^6.3.0:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
+semver@^7.0.0, semver@^7.5.3, semver@^7.5.4:
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
 semver@~4.3.3:
   version "4.3.6"
   resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
@@ -8446,6 +9922,28 @@ set-blocking@^2.0.0:
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
 
+set-function-length@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425"
+  integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==
+  dependencies:
+    define-data-property "^1.1.2"
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.3"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.1"
+
+set-function-name@^2.0.0, set-function-name@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+  integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+  dependencies:
+    define-data-property "^1.1.4"
+    es-errors "^1.3.0"
+    functions-have-names "^1.2.3"
+    has-property-descriptors "^1.0.2"
+
 set-value@^2.0.0, set-value@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -8493,6 +9991,18 @@ shasum@^1.0.0:
     json-stable-stringify "~0.0.0"
     sha.js "~2.4.4"
 
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
 shell-quote@^1.4.2, shell-quote@^1.6.1:
   version "1.7.3"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
@@ -8536,6 +10046,11 @@ slash@^1.0.0:
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
   integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==
 
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
 snapdragon-node@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -8848,6 +10363,21 @@ string-width@^1.0.1, string-width@^1.0.2:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
+string.prototype.matchall@^4.0.8:
+  version "4.0.10"
+  resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100"
+  integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    get-intrinsic "^1.2.1"
+    has-symbols "^1.0.3"
+    internal-slot "^1.0.5"
+    regexp.prototype.flags "^1.5.0"
+    set-function-name "^2.0.0"
+    side-channel "^1.0.4"
+
 string.prototype.trim@^1.2.1:
   version "1.2.6"
   resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz#824960787db37a9e24711802ed0c1d1c0254f83e"
@@ -8857,6 +10387,15 @@ string.prototype.trim@^1.2.1:
     define-properties "^1.1.4"
     es-abstract "^1.19.5"
 
+string.prototype.trim@^1.2.8:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
+  integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
 string.prototype.trimend@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0"
@@ -8866,6 +10405,15 @@ string.prototype.trimend@^1.0.5:
     define-properties "^1.1.4"
     es-abstract "^1.19.5"
 
+string.prototype.trimend@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
+  integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
 string.prototype.trimstart@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef"
@@ -8875,6 +10423,15 @@ string.prototype.trimstart@^1.0.5:
     define-properties "^1.1.4"
     es-abstract "^1.19.5"
 
+string.prototype.trimstart@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
+  integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+
 string_decoder@^1.1.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -8935,6 +10492,11 @@ strip-bom@^2.0.0:
   dependencies:
     is-utf8 "^0.2.0"
 
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
 strip-indent@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
@@ -8942,6 +10504,11 @@ strip-indent@^1.0.1:
   dependencies:
     get-stdin "^4.0.1"
 
+strip-json-comments@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+  integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
 style-loader@^0.18.2:
   version "0.18.2"
   resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb"
@@ -9036,6 +10603,11 @@ syntax-error@^1.1.1:
   dependencies:
     acorn-node "^1.2.0"
 
+tapable@^0.1.8:
+  version "0.1.10"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4"
+  integrity sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==
+
 tapable@^0.2.7:
   version "0.2.9"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8"
@@ -9061,6 +10633,11 @@ text-encoding@0.6.4:
   resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
   integrity sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==
 
+text-table@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
 throttleit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
@@ -9226,6 +10803,11 @@ trim-right@^1.0.1:
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
   integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==
 
+ts-api-utils@^1.0.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b"
+  integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==
+
 ts-loader@^2.2.2:
   version "2.3.7"
   resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.3.7.tgz#a9028ced473bee12f28a75f9c5b139979d33f2fc"
@@ -9236,49 +10818,21 @@ ts-loader@^2.2.2:
     loader-utils "^1.0.2"
     semver "^5.0.1"
 
-tslib@^1.8.0, tslib@^1.8.1:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
-  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+tsconfig-paths@^3.15.0:
+  version "3.15.0"
+  resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
+  integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
+  dependencies:
+    "@types/json5" "^0.0.29"
+    json5 "^1.0.2"
+    minimist "^1.2.6"
+    strip-bom "^3.0.0"
 
 tslib@^2.4.0:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338"
   integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==
 
-tslint-react@^3.0.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-3.6.0.tgz#7f462c95c4a0afaae82507f06517ff02942196a1"
-  integrity sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==
-  dependencies:
-    tsutils "^2.13.1"
-
-tslint@^5.5.0:
-  version "5.20.1"
-  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d"
-  integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==
-  dependencies:
-    "@babel/code-frame" "^7.0.0"
-    builtin-modules "^1.1.1"
-    chalk "^2.3.0"
-    commander "^2.12.1"
-    diff "^4.0.1"
-    glob "^7.1.1"
-    js-yaml "^3.13.1"
-    minimatch "^3.0.4"
-    mkdirp "^0.5.1"
-    resolve "^1.3.2"
-    semver "^5.3.0"
-    tslib "^1.8.0"
-    tsutils "^2.29.0"
-
-tsutils@^2.13.1, tsutils@^2.29.0:
-  version "2.29.0"
-  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
-  integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
-  dependencies:
-    tslib "^1.8.1"
-
 tty-browserify@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
@@ -9301,6 +10855,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
   integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
 
+type-check@^0.4.0, type-check@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+  integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+  dependencies:
+    prelude-ls "^1.2.1"
+
 type-check@~0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
@@ -9336,6 +10897,50 @@ type@^2.5.0:
   resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
   integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
 
+typed-array-buffer@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+  integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+  integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+  dependencies:
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+  integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+  dependencies:
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5"
+  integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==
+  dependencies:
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+    possible-typed-array-names "^1.0.0"
+
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -9726,11 +11331,50 @@ which-boxed-primitive@^1.0.2:
     is-string "^1.0.5"
     is-symbol "^1.0.3"
 
+which-builtin-type@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b"
+  integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+  dependencies:
+    function.prototype.name "^1.1.5"
+    has-tostringtag "^1.0.0"
+    is-async-function "^2.0.0"
+    is-date-object "^1.0.5"
+    is-finalizationregistry "^1.0.2"
+    is-generator-function "^1.0.10"
+    is-regex "^1.1.4"
+    is-weakref "^1.0.2"
+    isarray "^2.0.5"
+    which-boxed-primitive "^1.0.2"
+    which-collection "^1.0.1"
+    which-typed-array "^1.1.9"
+
+which-collection@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
+  integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+  dependencies:
+    is-map "^2.0.1"
+    is-set "^2.0.1"
+    is-weakmap "^2.0.1"
+    is-weakset "^2.0.1"
+
 which-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
   integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==
 
+which-typed-array@^1.1.14, which-typed-array@^1.1.9:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06"
+  integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==
+  dependencies:
+    available-typed-arrays "^1.0.6"
+    call-bind "^1.0.5"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-tostringtag "^1.0.1"
+
 which@^1.1.1, which@^1.2.10, which@^1.2.14:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -9738,6 +11382,13 @@ which@^1.1.1, which@^1.2.10, which@^1.2.14:
   dependencies:
     isexe "^2.0.0"
 
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
 word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@@ -9809,6 +11460,11 @@ yallist@^3.0.2:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
 
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
 yargs-parser@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.1.tgz#7ede329c1d8cdbbe209bd25cdb990e9b1ebbb394"
@@ -9848,3 +11504,8 @@ yeast@0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
   integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==
+
+yocto-queue@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+  integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==